diff options
| author | Jack Humbert <jack.humb@gmail.com> | 2016-11-17 17:42:14 -0500 |
|---|---|---|
| committer | Jack Humbert <jack.humb@gmail.com> | 2016-11-17 17:42:14 -0500 |
| commit | 3774a7fcdab5544fc787f4c200be05fcd417e31f (patch) | |
| tree | bb1c582d658ec7f19bce9d43f1c536b83066d40b /tmk_core | |
| parent | 530dd3377e4d409a7ca2fee7e47b60b735ebc0fa (diff) | |
| download | qmk_firmware-3774a7fcdab5544fc787f4c200be05fcd417e31f.tar.gz qmk_firmware-3774a7fcdab5544fc787f4c200be05fcd417e31f.zip | |
rgb light through midi
Diffstat (limited to 'tmk_core')
| -rw-r--r-- | tmk_core/protocol/lufa/lufa.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index b628cde37..7eb9be601 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | 51 | ||
| 52 | #include "descriptor.h" | 52 | #include "descriptor.h" |
| 53 | #include "lufa.h" | 53 | #include "lufa.h" |
| 54 | #include "quantum.h" | ||
| 54 | 55 | ||
| 55 | #ifdef NKRO_ENABLE | 56 | #ifdef NKRO_ENABLE |
| 56 | #include "keycode_config.h" | 57 | #include "keycode_config.h" |
| @@ -1111,9 +1112,104 @@ void cc_callback(MidiDevice * device, | |||
| 1111 | #endif | 1112 | #endif |
| 1112 | } | 1113 | } |
| 1113 | 1114 | ||
| 1115 | void send_dword(uint32_t number) { | ||
| 1116 | uint16_t word = (number >> 16); | ||
| 1117 | send_word(word); | ||
| 1118 | send_word(number & 0xFFFFUL); | ||
| 1119 | } | ||
| 1120 | |||
| 1121 | void send_word(uint16_t number) { | ||
| 1122 | uint8_t byte = number >> 8; | ||
| 1123 | send_byte(byte); | ||
| 1124 | send_byte(number & 0xFF); | ||
| 1125 | } | ||
| 1126 | |||
| 1127 | void send_byte(uint8_t number) { | ||
| 1128 | uint8_t nibble = number >> 4; | ||
| 1129 | send_nibble(nibble); | ||
| 1130 | send_nibble(number & 0xF); | ||
| 1131 | } | ||
| 1132 | |||
| 1133 | void send_nibble(uint8_t number) { | ||
| 1134 | switch (number) { | ||
| 1135 | case 0: | ||
| 1136 | register_code(KC_0); | ||
| 1137 | unregister_code(KC_0); | ||
| 1138 | break; | ||
| 1139 | case 1 ... 9: | ||
| 1140 | register_code(KC_1 + (number - 1)); | ||
| 1141 | unregister_code(KC_1 + (number - 1)); | ||
| 1142 | break; | ||
| 1143 | case 0xA ... 0xF: | ||
| 1144 | register_code(KC_A + (number - 0xA)); | ||
| 1145 | unregister_code(KC_A + (number - 0xA)); | ||
| 1146 | break; | ||
| 1147 | } | ||
| 1148 | } | ||
| 1149 | |||
| 1150 | uint8_t midi_buffer[16] = {0}; | ||
| 1151 | |||
| 1114 | void sysex_callback(MidiDevice * device, | 1152 | void sysex_callback(MidiDevice * device, |
| 1115 | uint16_t start, uint8_t length, uint8_t * data) { | 1153 | uint16_t start, uint8_t length, uint8_t * data) { |
| 1116 | // for (int i = 0; i < length; i++) | 1154 | // for (int i = 0; i < length; i++) |
| 1117 | // midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i)); | 1155 | // midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i)); |
| 1156 | // if (start == 0x27) { | ||
| 1157 | // SEND_STRING("\n"); | ||
| 1158 | // send_word(start); | ||
| 1159 | // SEND_STRING(": "); | ||
| 1160 | for (uint8_t place = 0; place < length; place++) { | ||
| 1161 | // send_byte(*data); | ||
| 1162 | midi_buffer[start + place] = *data; | ||
| 1163 | if (*data == 0xF7) | ||
| 1164 | sysex_buffer_callback(start + place, &midi_buffer); | ||
| 1165 | // SEND_STRING(" "); | ||
| 1166 | data++; | ||
| 1167 | } | ||
| 1168 | // } | ||
| 1169 | |||
| 1170 | } | ||
| 1171 | |||
| 1172 | void sysex_buffer_callback(uint8_t length, uint8_t * data) { | ||
| 1173 | uint8_t * pointer_copy = data; | ||
| 1174 | |||
| 1175 | if (*data++ != 0xF0) | ||
| 1176 | return | ||
| 1177 | data++; | ||
| 1178 | data++; | ||
| 1179 | data++; | ||
| 1180 | data++; | ||
| 1181 | |||
| 1182 | switch (*data++) { | ||
| 1183 | case 0x27: ; // RGB LED functions | ||
| 1184 | switch (*data++) | ||
| 1185 | case 0x00: ; // Update HSV | ||
| 1186 | uint32_t part1 = *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); | ||
| 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; | ||
| 1202 | case 0x01: ; // Update RGB | ||
| 1203 | break; | ||
| 1204 | break; | ||
| 1205 | } | ||
| 1206 | |||
| 1207 | // SEND_STRING("\nDATA:\n"); | ||
| 1208 | // while (*pointer_copy != 0xF7) { | ||
| 1209 | // send_byte(*pointer_copy++); | ||
| 1210 | // SEND_STRING(" "); | ||
| 1211 | // } | ||
| 1212 | |||
| 1118 | } | 1213 | } |
| 1214 | |||
| 1119 | #endif | 1215 | #endif |
