diff options
Diffstat (limited to 'tmk_core')
| -rw-r--r-- | tmk_core/protocol/lufa/lufa.c | 62 | ||||
| -rw-r--r-- | tmk_core/protocol/lufa/lufa.h | 1 |
2 files changed, 46 insertions, 17 deletions
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 7eb9be601..ae9cc2f96 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c | |||
| @@ -1161,7 +1161,7 @@ void sysex_callback(MidiDevice * device, | |||
| 1161 | // send_byte(*data); | 1161 | // send_byte(*data); |
| 1162 | midi_buffer[start + place] = *data; | 1162 | midi_buffer[start + place] = *data; |
| 1163 | if (*data == 0xF7) | 1163 | if (*data == 0xF7) |
| 1164 | sysex_buffer_callback(start + place, &midi_buffer); | 1164 | sysex_buffer_callback(device, start + place, &midi_buffer); |
| 1165 | // SEND_STRING(" "); | 1165 | // SEND_STRING(" "); |
| 1166 | data++; | 1166 | data++; |
| 1167 | } | 1167 | } |
| @@ -1169,7 +1169,24 @@ void sysex_callback(MidiDevice * device, | |||
| 1169 | 1169 | ||
| 1170 | } | 1170 | } |
| 1171 | 1171 | ||
| 1172 | void sysex_buffer_callback(uint8_t length, uint8_t * data) { | 1172 | uint32_t decode_4byte_chunk(uint8_t * data) { |
| 1173 | uint32_t part1 = *data++; | ||
| 1174 | uint32_t part2 = *data++; | ||
| 1175 | uint32_t part3 = *data++; | ||
| 1176 | uint32_t part4 = *data++; | ||
| 1177 | uint32_t part5 = *data++; | ||
| 1178 | return ((part1 & 0x1FUL) << 28) | (part2 << 21) | (part3 << 14) | (part4 << 7) | part5; | ||
| 1179 | } | ||
| 1180 | |||
| 1181 | void encode_4byte_chunk(uint32_t data, uint8_t * pointer) { | ||
| 1182 | *pointer++ = (data >> 28) & 0x7F; | ||
| 1183 | *pointer++ = (data >> 21) & 0x7F; | ||
| 1184 | *pointer++ = (data >> 14) & 0x7F; | ||
| 1185 | *pointer++ = (data >> 7) & 0x7F; | ||
| 1186 | *pointer++ = (data) & 0x7F; | ||
| 1187 | } | ||
| 1188 | |||
| 1189 | void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) { | ||
| 1173 | uint8_t * pointer_copy = data; | 1190 | uint8_t * pointer_copy = data; |
| 1174 | 1191 | ||
| 1175 | if (*data++ != 0xF0) | 1192 | if (*data++ != 0xF0) |
| @@ -1180,28 +1197,31 @@ void sysex_buffer_callback(uint8_t length, uint8_t * data) { | |||
| 1180 | data++; | 1197 | data++; |
| 1181 | 1198 | ||
| 1182 | switch (*data++) { | 1199 | switch (*data++) { |
| 1200 | case 0x13: ; // Get info from keyboard | ||
| 1201 | switch (*data++) { | ||
| 1202 | case 0x00: ; // Get layer state | ||
| 1203 | // send_dword(layer_state); | ||
| 1204 | uint8_t chunk[5]; | ||
| 1205 | encode_4byte_chunk(layer_state | default_layer_state, &chunk); | ||
| 1206 | |||
| 1207 | uint8_t array[] = {0xF0, 0x00, 0x00, 0x00, 0x00, chunk[0], chunk[1], chunk[2], chunk[3], chunk[4], 0xF7}; | ||
| 1208 | midi_send_array(&midi_device, 11, &array); | ||
| 1209 | // midi_send_data(device, 3, 0x00, layer_state >> 24 & 0x7f, layer_state >> 16 & 0x7f); | ||
| 1210 | // midi_send_data(device, 6, layer_state >> 8 & 0x7f, layer_state & 0x7f, 0xF7); | ||
| 1211 | break; | ||
| 1212 | } | ||
| 1213 | #ifdef RGBLIGHT_ENABLE | ||
| 1183 | case 0x27: ; // RGB LED functions | 1214 | case 0x27: ; // RGB LED functions |
| 1184 | switch (*data++) | 1215 | switch (*data++) { |
| 1185 | case 0x00: ; // Update HSV | 1216 | case 0x00: ; // Update HSV |
| 1186 | uint32_t part1 = *data++; | 1217 | uint32_t chunk = decode_4byte_chunk(data); |
| 1187 | uint32_t part2 = *data++; | ||
| 1188 | uint32_t part3 = *data++; | ||
| 1189 | uint32_t part4 = *data++; | ||
| 1190 | uint32_t part5 = *data++; | ||
| 1191 | uint32_t chunk = ((part1 & 0x1FUL) << 28) | (part2 << 21) | (part3 << 14) | (part4 << 7) | part5; | ||
| 1192 | // SEND_STRING("\nCHUNK: "); | ||
| 1193 | // send_dword(chunk); | ||
| 1194 | rgblight_sethsv(((chunk >> 16) & 0xFFFF) % 360, (chunk >> 8) & 0xFF, chunk & 0xFF); | 1218 | rgblight_sethsv(((chunk >> 16) & 0xFFFF) % 360, (chunk >> 8) & 0xFF, chunk & 0xFF); |
| 1195 | // SEND_STRING("\nHUE: "); | ||
| 1196 | // send_word(((chunk >> 16) & 0xFFFF) % 360); | ||
| 1197 | // SEND_STRING("\nSAT: "); | ||
| 1198 | // send_word((chunk >> 8) & 0xFF); | ||
| 1199 | // SEND_STRING("\nVAL: "); | ||
| 1200 | // send_word(chunk & 0xFF); | ||
| 1201 | break; | 1219 | break; |
| 1202 | case 0x01: ; // Update RGB | 1220 | case 0x01: ; // Update RGB |
| 1203 | break; | 1221 | break; |
| 1222 | } | ||
| 1204 | break; | 1223 | break; |
| 1224 | #endif | ||
| 1205 | } | 1225 | } |
| 1206 | 1226 | ||
| 1207 | // SEND_STRING("\nDATA:\n"); | 1227 | // SEND_STRING("\nDATA:\n"); |
| @@ -1212,4 +1232,12 @@ void sysex_buffer_callback(uint8_t length, uint8_t * data) { | |||
| 1212 | 1232 | ||
| 1213 | } | 1233 | } |
| 1214 | 1234 | ||
| 1235 | void send_unicode_midi(uint32_t unicode) { | ||
| 1236 | uint8_t chunk[5]; | ||
| 1237 | encode_4byte_chunk(unicode, &chunk); | ||
| 1238 | |||
| 1239 | uint8_t array[] = {0xF0, 0x00, 0x00, 0x00, 0x05, chunk[0], chunk[1], chunk[2], chunk[3], chunk[4], 0xF7}; | ||
| 1240 | midi_send_array(&midi_device, 11, &array); | ||
| 1241 | } | ||
| 1242 | |||
| 1215 | #endif | 1243 | #endif |
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h index aad08d640..3fec797b6 100644 --- a/tmk_core/protocol/lufa/lufa.h +++ b/tmk_core/protocol/lufa/lufa.h | |||
| @@ -70,6 +70,7 @@ typedef struct { | |||
| 70 | #ifdef MIDI_ENABLE | 70 | #ifdef MIDI_ENABLE |
| 71 | void MIDI_Task(void); | 71 | void MIDI_Task(void); |
| 72 | MidiDevice midi_device; | 72 | MidiDevice midi_device; |
| 73 | void send_unicode_midi(uint32_t unicode); | ||
| 73 | #endif | 74 | #endif |
| 74 | 75 | ||
| 75 | // #if LUFA_VERSION_INTEGER < 0x120730 | 76 | // #if LUFA_VERSION_INTEGER < 0x120730 |
