diff options
| author | Jack Humbert <jack.humb@gmail.com> | 2016-11-26 15:37:46 -0500 |
|---|---|---|
| committer | Jack Humbert <jack.humb@gmail.com> | 2016-11-26 15:38:44 -0500 |
| commit | 7edac212c8ed8442bf4207e70dc8194631b2bf27 (patch) | |
| tree | fd1905e1a24c237daa0e3e4172fe74f273d6b646 | |
| parent | f25596b8dc2f15f620c07164d871023d9284618c (diff) | |
| download | qmk_firmware-7edac212c8ed8442bf4207e70dc8194631b2bf27.tar.gz qmk_firmware-7edac212c8ed8442bf4207e70dc8194631b2bf27.zip | |
separated into api files/folder
| -rw-r--r-- | build_keyboard.mk | 8 | ||||
| -rw-r--r-- | common.mk | 1 | ||||
| -rw-r--r-- | keyboards/ergodox/keymaps/jack/keymap.c | 2 | ||||
| -rw-r--r-- | keyboards/ergodox/rules.mk | 1 | ||||
| -rw-r--r-- | keyboards/planck/rules.mk | 1 | ||||
| -rw-r--r-- | keyboards/preonic/keymaps/default/Makefile | 22 | ||||
| -rw-r--r-- | keyboards/preonic/rules.mk | 3 | ||||
| -rw-r--r-- | quantum/api.c | 178 | ||||
| -rw-r--r-- | quantum/api.h | 59 | ||||
| -rw-r--r-- | quantum/api/api_sysex.c | 29 | ||||
| -rw-r--r-- | quantum/api/api_sysex.h | 10 | ||||
| -rw-r--r-- | quantum/quantum.c | 6 | ||||
| -rw-r--r-- | quantum/quantum.h | 2 | ||||
| -rw-r--r-- | tmk_core/protocol/lufa/lufa.c | 203 | ||||
| -rw-r--r-- | tmk_core/protocol/lufa/lufa.h | 61 |
15 files changed, 303 insertions, 283 deletions
diff --git a/build_keyboard.mk b/build_keyboard.mk index 42f8f8ac7..c1e554003 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk | |||
| @@ -131,6 +131,14 @@ ifndef CUSTOM_MATRIX | |||
| 131 | SRC += $(QUANTUM_DIR)/matrix.c | 131 | SRC += $(QUANTUM_DIR)/matrix.c |
| 132 | endif | 132 | endif |
| 133 | 133 | ||
| 134 | ifeq ($(strip $(API_SYSEX_ENABLE)), yes) | ||
| 135 | OPT_DEFS += -DAPI_SYSEX_ENABLE | ||
| 136 | SRC += $(QUANTUM_DIR)/api/api_sysex.c | ||
| 137 | OPT_DEFS += -DAPI_ENABLE | ||
| 138 | SRC += $(QUANTUM_DIR)/api.c | ||
| 139 | MIDI_ENABLE=yes | ||
| 140 | endif | ||
| 141 | |||
| 134 | ifeq ($(strip $(MIDI_ENABLE)), yes) | 142 | ifeq ($(strip $(MIDI_ENABLE)), yes) |
| 135 | OPT_DEFS += -DMIDI_ENABLE | 143 | OPT_DEFS += -DMIDI_ENABLE |
| 136 | SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c | 144 | SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c |
| @@ -23,4 +23,5 @@ COMMON_VPATH += $(QUANTUM_PATH) | |||
| 23 | COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras | 23 | COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras |
| 24 | COMMON_VPATH += $(QUANTUM_PATH)/audio | 24 | COMMON_VPATH += $(QUANTUM_PATH)/audio |
| 25 | COMMON_VPATH += $(QUANTUM_PATH)/process_keycode | 25 | COMMON_VPATH += $(QUANTUM_PATH)/process_keycode |
| 26 | COMMON_VPATH += $(QUANTUM_PATH)/api | ||
| 26 | COMMON_VPATH += $(SERIAL_PATH) \ No newline at end of file | 27 | COMMON_VPATH += $(SERIAL_PATH) \ No newline at end of file |
diff --git a/keyboards/ergodox/keymaps/jack/keymap.c b/keyboards/ergodox/keymaps/jack/keymap.c index eb41f1212..9cb80c59d 100644 --- a/keyboards/ergodox/keymaps/jack/keymap.c +++ b/keyboards/ergodox/keymaps/jack/keymap.c | |||
| @@ -91,7 +91,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | |||
| 91 | break; | 91 | break; |
| 92 | case 2: | 92 | case 2: |
| 93 | if (record->event.pressed) { // For resetting EEPROM | 93 | if (record->event.pressed) { // For resetting EEPROM |
| 94 | send_unicode_midi(0x0CA0); | 94 | api_send_unicode(0x0CA0); |
| 95 | } | 95 | } |
| 96 | break; | 96 | break; |
| 97 | } | 97 | } |
diff --git a/keyboards/ergodox/rules.mk b/keyboards/ergodox/rules.mk index add64ec76..2e501e81b 100644 --- a/keyboards/ergodox/rules.mk +++ b/keyboards/ergodox/rules.mk | |||
| @@ -24,6 +24,5 @@ COMMAND_ENABLE ?= yes # Commands for debug and configuration | |||
| 24 | CUSTOM_MATRIX ?= yes # Custom matrix file for the ErgoDox EZ | 24 | CUSTOM_MATRIX ?= yes # Custom matrix file for the ErgoDox EZ |
| 25 | SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend | 25 | SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend |
| 26 | NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work | 26 | NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work |
| 27 | MIDI_ENABLE ?= no # MIDI controls | ||
| 28 | UNICODE_ENABLE ?= yes # Unicode | 27 | UNICODE_ENABLE ?= yes # Unicode |
| 29 | ONEHAND_ENABLE ?= yes # Allow swapping hands of keyboard | 28 | ONEHAND_ENABLE ?= yes # Allow swapping hands of keyboard |
diff --git a/keyboards/planck/rules.mk b/keyboards/planck/rules.mk index 25db53a31..ccee97271 100644 --- a/keyboards/planck/rules.mk +++ b/keyboards/planck/rules.mk | |||
| @@ -62,6 +62,7 @@ AUDIO_ENABLE ?= no # Audio output on port C6 | |||
| 62 | UNICODE_ENABLE ?= no # Unicode | 62 | UNICODE_ENABLE ?= no # Unicode |
| 63 | BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID | 63 | BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID |
| 64 | RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. | 64 | RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. |
| 65 | API_SYSEX_ENABLE = yes | ||
| 65 | 66 | ||
| 66 | # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE | 67 | # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE |
| 67 | SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend \ No newline at end of file | 68 | SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend \ No newline at end of file |
diff --git a/keyboards/preonic/keymaps/default/Makefile b/keyboards/preonic/keymaps/default/Makefile index 581e08cd0..3d4659ceb 100644 --- a/keyboards/preonic/keymaps/default/Makefile +++ b/keyboards/preonic/keymaps/default/Makefile | |||
| @@ -1,25 +1,3 @@ | |||
| 1 | |||
| 2 | |||
| 3 | # Build Options | ||
| 4 | # change to "no" to disable the options, or define them in the Makefile in | ||
| 5 | # the appropriate keymap folder that will get included automatically | ||
| 6 | # | ||
| 7 | BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) | ||
| 8 | MOUSEKEY_ENABLE = yes # Mouse keys(+4700) | ||
| 9 | EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | ||
| 10 | CONSOLE_ENABLE = no # Console for debug(+400) | ||
| 11 | COMMAND_ENABLE = yes # Commands for debug and configuration | ||
| 12 | NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work | ||
| 13 | BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality | ||
| 14 | MIDI_ENABLE = no # MIDI controls | ||
| 15 | AUDIO_ENABLE = yes # Audio output on port C6 | ||
| 16 | UNICODE_ENABLE = no # Unicode | ||
| 17 | BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID | ||
| 18 | RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. | ||
| 19 | |||
| 20 | # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE | ||
| 21 | SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend | ||
| 22 | |||
| 23 | ifndef QUANTUM_DIR | 1 | ifndef QUANTUM_DIR |
| 24 | include ../../../../Makefile | 2 | include ../../../../Makefile |
| 25 | endif \ No newline at end of file | 3 | endif \ No newline at end of file |
diff --git a/keyboards/preonic/rules.mk b/keyboards/preonic/rules.mk index d0f3a3a1c..c4ce2aacc 100644 --- a/keyboards/preonic/rules.mk +++ b/keyboards/preonic/rules.mk | |||
| @@ -53,7 +53,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 | |||
| 53 | # the appropriate keymap folder that will get included automatically | 53 | # the appropriate keymap folder that will get included automatically |
| 54 | # | 54 | # |
| 55 | BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) | 55 | BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) |
| 56 | MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) | 56 | MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) |
| 57 | EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) | 57 | EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) |
| 58 | CONSOLE_ENABLE ?= no # Console for debug(+400) | 58 | CONSOLE_ENABLE ?= no # Console for debug(+400) |
| 59 | COMMAND_ENABLE ?= yes # Commands for debug and configuration | 59 | COMMAND_ENABLE ?= yes # Commands for debug and configuration |
| @@ -64,6 +64,7 @@ AUDIO_ENABLE ?= no # Audio output on port C6 | |||
| 64 | UNICODE_ENABLE ?= no # Unicode | 64 | UNICODE_ENABLE ?= no # Unicode |
| 65 | BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID | 65 | BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID |
| 66 | RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. | 66 | RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. |
| 67 | API_SYSEX_ENABLE ?= yes | ||
| 67 | 68 | ||
| 68 | # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE | 69 | # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE |
| 69 | SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend \ No newline at end of file | 70 | SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend \ No newline at end of file |
diff --git a/quantum/api.c b/quantum/api.c new file mode 100644 index 000000000..4ca3b9676 --- /dev/null +++ b/quantum/api.c | |||
| @@ -0,0 +1,178 @@ | |||
| 1 | #include "api.h" | ||
| 2 | #include "quantum.h" | ||
| 3 | |||
| 4 | void dword_to_bytes(uint32_t dword, uint8_t * bytes) { | ||
| 5 | bytes[0] = (dword >> 24) & 0xFF; | ||
| 6 | bytes[1] = (dword >> 16) & 0xFF; | ||
| 7 | bytes[2] = (dword >> 8) & 0xFF; | ||
| 8 | bytes[3] = (dword >> 0) & 0xFF; | ||
| 9 | } | ||
| 10 | |||
| 11 | uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index) { | ||
| 12 | return ((uint32_t)bytes[index + 0] << 24) | ((uint32_t)bytes[index + 1] << 16) | ((uint32_t)bytes[index + 2] << 8) | (uint32_t)bytes[index + 3]; | ||
| 13 | } | ||
| 14 | |||
| 15 | __attribute__ ((weak)) | ||
| 16 | bool process_api_quantum(uint8_t length, uint8_t * data) { | ||
| 17 | return process_api_keyboard(length, data); | ||
| 18 | } | ||
| 19 | |||
| 20 | __attribute__ ((weak)) | ||
| 21 | bool process_api_keyboard(uint8_t length, uint8_t * data) { | ||
| 22 | return process_api_user(length, data); | ||
| 23 | } | ||
| 24 | |||
| 25 | __attribute__ ((weak)) | ||
| 26 | bool process_api_user(uint8_t length, uint8_t * data) { | ||
| 27 | return true; | ||
| 28 | } | ||
| 29 | |||
| 30 | void process_api(uint16_t length, uint8_t * data) { | ||
| 31 | // SEND_STRING("\nRX: "); | ||
| 32 | // for (uint8_t i = 0; i < length; i++) { | ||
| 33 | // send_byte(data[i]); | ||
| 34 | // SEND_STRING(" "); | ||
| 35 | // } | ||
| 36 | if (!process_api_quantum(length, data)) | ||
| 37 | return; | ||
| 38 | |||
| 39 | switch (data[0]) { | ||
| 40 | case MT_SET_DATA: | ||
| 41 | switch (data[1]) { | ||
| 42 | case DT_DEFAULT_LAYER: { | ||
| 43 | eeconfig_update_default_layer(data[2]); | ||
| 44 | default_layer_set((uint32_t)(data[2])); | ||
| 45 | break; | ||
| 46 | } | ||
| 47 | case DT_KEYMAP_OPTIONS: { | ||
| 48 | eeconfig_update_keymap(data[2]); | ||
| 49 | break; | ||
| 50 | } | ||
| 51 | case DT_RGBLIGHT: { | ||
| 52 | #ifdef RGBLIGHT_ENABLE | ||
| 53 | uint32_t rgblight = bytes_to_dword(data, 2); | ||
| 54 | rgblight_update_dword(rgblight); | ||
| 55 | #endif | ||
| 56 | break; | ||
| 57 | } | ||
| 58 | } | ||
| 59 | case MT_GET_DATA: | ||
| 60 | switch (data[1]) { | ||
| 61 | case DT_HANDSHAKE: { | ||
| 62 | MT_GET_DATA_ACK(DT_HANDSHAKE, NULL, 0); | ||
| 63 | break; | ||
| 64 | } | ||
| 65 | case DT_DEBUG: { | ||
| 66 | uint8_t debug_bytes[1] = { eeprom_read_byte(EECONFIG_DEBUG) }; | ||
| 67 | MT_GET_DATA_ACK(DT_DEBUG, debug_bytes, 1); | ||
| 68 | break; | ||
| 69 | } | ||
| 70 | case DT_DEFAULT_LAYER: { | ||
| 71 | uint8_t default_bytes[1] = { eeprom_read_byte(EECONFIG_DEFAULT_LAYER) }; | ||
| 72 | MT_GET_DATA_ACK(DT_DEFAULT_LAYER, default_bytes, 1); | ||
| 73 | break; | ||
| 74 | } | ||
| 75 | case DT_CURRENT_LAYER: { | ||
| 76 | uint8_t layer_state_bytes[4]; | ||
| 77 | dword_to_bytes(layer_state, layer_state_bytes); | ||
| 78 | MT_GET_DATA_ACK(DT_CURRENT_LAYER, layer_state_bytes, 4); | ||
| 79 | break; | ||
| 80 | } | ||
| 81 | case DT_AUDIO: { | ||
| 82 | #ifdef AUDIO_ENABLE | ||
| 83 | uint8_t audio_bytes[1] = { eeprom_read_byte(EECONFIG_AUDIO) }; | ||
| 84 | MT_GET_DATA_ACK(DT_AUDIO, audio_bytes, 1); | ||
| 85 | #else | ||
| 86 | MT_GET_DATA_ACK(DT_AUDIO, NULL, 0); | ||
| 87 | #endif | ||
| 88 | break; | ||
| 89 | } | ||
| 90 | case DT_BACKLIGHT: { | ||
| 91 | #ifdef BACKLIGHT_ENABLE | ||
| 92 | uint8_t backlight_bytes[1] = { eeprom_read_byte(EECONFIG_BACKLIGHT) }; | ||
| 93 | MT_GET_DATA_ACK(DT_BACKLIGHT, backlight_bytes, 1); | ||
| 94 | #else | ||
| 95 | MT_GET_DATA_ACK(DT_BACKLIGHT, NULL, 0); | ||
| 96 | #endif | ||
| 97 | break; | ||
| 98 | } | ||
| 99 | case DT_RGBLIGHT: { | ||
| 100 | #ifdef RGBLIGHT_ENABLE | ||
| 101 | uint8_t rgblight_bytes[4]; | ||
| 102 | dword_to_bytes(eeconfig_read_rgblight(), rgblight_bytes); | ||
| 103 | MT_GET_DATA_ACK(DT_RGBLIGHT, rgblight_bytes, 4); | ||
| 104 | #else | ||
| 105 | MT_GET_DATA_ACK(DT_RGBLIGHT, NULL, 0); | ||
| 106 | #endif | ||
| 107 | break; | ||
| 108 | } | ||
| 109 | case DT_KEYMAP_OPTIONS: { | ||
| 110 | uint8_t keymap_bytes[1] = { eeconfig_read_keymap() }; | ||
| 111 | MT_GET_DATA_ACK(DT_KEYMAP_OPTIONS, keymap_bytes, 1); | ||
| 112 | break; | ||
| 113 | } | ||
| 114 | case DT_KEYMAP_SIZE: { | ||
| 115 | uint8_t keymap_size[2] = {MATRIX_ROWS, MATRIX_COLS}; | ||
| 116 | MT_GET_DATA_ACK(DT_KEYMAP_SIZE, keymap_size, 2); | ||
| 117 | break; | ||
| 118 | } | ||
| 119 | case DT_KEYMAP: { | ||
| 120 | uint8_t keymap_data[MATRIX_ROWS * MATRIX_COLS * 4 + 3]; | ||
| 121 | keymap_data[0] = data[2]; | ||
| 122 | keymap_data[1] = MATRIX_ROWS; | ||
| 123 | keymap_data[2] = MATRIX_COLS; | ||
| 124 | for (int i = 0; i < MATRIX_ROWS; i++) { | ||
| 125 | for (int j = 0; j < MATRIX_COLS; j++) { | ||
| 126 | keymap_data[3 + (i*MATRIX_COLS*2) + (j*2)] = pgm_read_word(&keymaps[data[2]][i][j]) >> 8; | ||
| 127 | keymap_data[3 + (i*MATRIX_COLS*2) + (j*2) + 1] = pgm_read_word(&keymaps[data[2]][i][j]) & 0xFF; | ||
| 128 | } | ||
| 129 | } | ||
| 130 | MT_GET_DATA_ACK(DT_KEYMAP, keymap_data, MATRIX_ROWS * MATRIX_COLS * 4 + 3); | ||
| 131 | // uint8_t keymap_data[5]; | ||
| 132 | // keymap_data[0] = data[2]; | ||
| 133 | // keymap_data[1] = data[3]; | ||
| 134 | // keymap_data[2] = data[4]; | ||
| 135 | // keymap_data[3] = pgm_read_word(&keymaps[data[2]][data[3]][data[4]]) >> 8; | ||
| 136 | // keymap_data[4] = pgm_read_word(&keymaps[data[2]][data[3]][data[4]]) & 0xFF; | ||
| 137 | |||
| 138 | // MT_GET_DATA_ACK(DT_KEYMAP, keymap_data, 5); | ||
| 139 | break; | ||
| 140 | } | ||
| 141 | default: | ||
| 142 | break; | ||
| 143 | } | ||
| 144 | break; | ||
| 145 | case MT_SET_DATA_ACK: | ||
| 146 | case MT_GET_DATA_ACK: | ||
| 147 | break; | ||
| 148 | case MT_SEND_DATA: | ||
| 149 | break; | ||
| 150 | case MT_SEND_DATA_ACK: | ||
| 151 | break; | ||
| 152 | case MT_EXE_ACTION: | ||
| 153 | break; | ||
| 154 | case MT_EXE_ACTION_ACK: | ||
| 155 | break; | ||
| 156 | case MT_TYPE_ERROR: | ||
| 157 | break; | ||
| 158 | default: ; // command not recognised | ||
| 159 | SEND_BYTES(MT_TYPE_ERROR, DT_NONE, data, length); | ||
| 160 | break; | ||
| 161 | |||
| 162 | // #ifdef RGBLIGHT_ENABLE | ||
| 163 | // case 0x27: ; // RGB LED functions | ||
| 164 | // switch (*data++) { | ||
| 165 | // case 0x00: ; // Update HSV | ||
| 166 | // rgblight_sethsv((data[0] << 8 | data[1]) % 360, data[2], data[3]); | ||
| 167 | // break; | ||
| 168 | // case 0x01: ; // Update RGB | ||
| 169 | // break; | ||
| 170 | // case 0x02: ; // Update mode | ||
| 171 | // rgblight_mode(data[0]); | ||
| 172 | // break; | ||
| 173 | // } | ||
| 174 | // break; | ||
| 175 | // #endif | ||
| 176 | } | ||
| 177 | |||
| 178 | } \ No newline at end of file | ||
diff --git a/quantum/api.h b/quantum/api.h new file mode 100644 index 000000000..00dcdb895 --- /dev/null +++ b/quantum/api.h | |||
| @@ -0,0 +1,59 @@ | |||
| 1 | #ifndef _API_H_ | ||
| 2 | #define _API_H_ | ||
| 3 | |||
| 4 | #include "lufa.h" | ||
| 5 | |||
| 6 | enum MESSAGE_TYPE { | ||
| 7 | MT_GET_DATA = 0x10, // Get data from keyboard | ||
| 8 | MT_GET_DATA_ACK = 0x11, // returned data to process (ACK) | ||
| 9 | MT_SET_DATA = 0x20, // Set data on keyboard | ||
| 10 | MT_SET_DATA_ACK = 0x21, // returned data to confirm (ACK) | ||
| 11 | MT_SEND_DATA = 0x30, // Sending data/action from keyboard | ||
| 12 | MT_SEND_DATA_ACK = 0x31, // returned data/action confirmation (ACK) | ||
| 13 | MT_EXE_ACTION = 0x40, // executing actions on keyboard | ||
| 14 | MT_EXE_ACTION_ACK =0x41, // return confirmation/value (ACK) | ||
| 15 | MT_TYPE_ERROR = 0x80 // type not recofgnised (ACK) | ||
| 16 | }; | ||
| 17 | |||
| 18 | enum DATA_TYPE { | ||
| 19 | DT_NONE = 0x00, | ||
| 20 | DT_HANDSHAKE, | ||
| 21 | DT_DEFAULT_LAYER, | ||
| 22 | DT_CURRENT_LAYER, | ||
| 23 | DT_KEYMAP_OPTIONS, | ||
| 24 | DT_BACKLIGHT, | ||
| 25 | DT_RGBLIGHT, | ||
| 26 | DT_UNICODE, | ||
| 27 | DT_DEBUG, | ||
| 28 | DT_AUDIO, | ||
| 29 | DT_QUANTUM_ACTION, | ||
| 30 | DT_KEYBOARD_ACTION, | ||
| 31 | DT_USER_ACTION, | ||
| 32 | DT_KEYMAP_SIZE, | ||
| 33 | DT_KEYMAP | ||
| 34 | }; | ||
| 35 | |||
| 36 | void dword_to_bytes(uint32_t dword, uint8_t * bytes); | ||
| 37 | uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index); | ||
| 38 | |||
| 39 | #define MT_GET_DATA(data_type, data, length) SEND_BYTES(MT_GET_DATA, data_type, data, length) | ||
| 40 | #define MT_GET_DATA_ACK(data_type, data, length) SEND_BYTES(MT_GET_DATA_ACK, data_type, data, length) | ||
| 41 | #define MT_SET_DATA(data_type, data, length) SEND_BYTES(MT_SET_DATA, data_type, data, length) | ||
| 42 | #define MT_SET_DATA_ACK(data_type, data, length) SEND_BYTES(MT_SET_DATA_ACK, data_type, data, length) | ||
| 43 | #define MT_SEND_DATA(data_type, data, length) SEND_BYTES(MT_SEND_DATA, data_type, data, length) | ||
| 44 | #define MT_SEND_DATA_ACK(data_type, data, length) SEND_BYTES(MT_SEND_DATA_ACK, data_type, data, length) | ||
| 45 | #define MT_EXE_ACTION(data_type, data, length) SEND_BYTES(MT_EXE_ACTION, data_type, data, length) | ||
| 46 | #define MT_EXE_ACTION_ACK(data_type, data, length) SEND_BYTES(MT_EXE_ACTION_ACK, data_type, data, length) | ||
| 47 | |||
| 48 | void process_api(uint16_t length, uint8_t * data); | ||
| 49 | |||
| 50 | __attribute__ ((weak)) | ||
| 51 | bool process_api_quantum(uint8_t length, uint8_t * data); | ||
| 52 | |||
| 53 | __attribute__ ((weak)) | ||
| 54 | bool process_api_keyboard(uint8_t length, uint8_t * data); | ||
| 55 | |||
| 56 | __attribute__ ((weak)) | ||
| 57 | bool process_api_user(uint8_t length, uint8_t * data); | ||
| 58 | |||
| 59 | #endif \ No newline at end of file | ||
diff --git a/quantum/api/api_sysex.c b/quantum/api/api_sysex.c new file mode 100644 index 000000000..a4a554e76 --- /dev/null +++ b/quantum/api/api_sysex.c | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | #include "api_sysex.h" | ||
| 2 | |||
| 3 | void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint16_t length) { | ||
| 4 | // SEND_STRING("\nTX: "); | ||
| 5 | // for (uint8_t i = 0; i < length; i++) { | ||
| 6 | // send_byte(bytes[i]); | ||
| 7 | // SEND_STRING(" "); | ||
| 8 | // } | ||
| 9 | uint8_t * precode = malloc(sizeof(uint8_t) * (length + 2)); | ||
| 10 | precode[0] = message_type; | ||
| 11 | precode[1] = data_type; | ||
| 12 | memcpy(precode + 2, bytes, length); | ||
| 13 | uint8_t * encoded = malloc(sizeof(uint8_t) * (sysex_encoded_length(length + 2))); | ||
| 14 | uint16_t encoded_length = sysex_encode(encoded, precode, length + 2); | ||
| 15 | uint8_t * array = malloc(sizeof(uint8_t) * (encoded_length + 5)); | ||
| 16 | array[0] = 0xF0; | ||
| 17 | array[1] = 0x00; | ||
| 18 | array[2] = 0x00; | ||
| 19 | array[3] = 0x00; | ||
| 20 | array[encoded_length + 4] = 0xF7; | ||
| 21 | memcpy(array + 4, encoded, encoded_length); | ||
| 22 | midi_send_array(&midi_device, encoded_length + 5, array); | ||
| 23 | |||
| 24 | // SEND_STRING("\nTD: "); | ||
| 25 | // for (uint8_t i = 0; i < encoded_length + 5; i++) { | ||
| 26 | // send_byte(array[i]); | ||
| 27 | // SEND_STRING(" "); | ||
| 28 | // } | ||
| 29 | } \ No newline at end of file | ||
diff --git a/quantum/api/api_sysex.h b/quantum/api/api_sysex.h new file mode 100644 index 000000000..b947b60e5 --- /dev/null +++ b/quantum/api/api_sysex.h | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | #ifndef _API_SYSEX_H_ | ||
| 2 | #define _API_SYSEX_H_ | ||
| 3 | |||
| 4 | #include "api.h" | ||
| 5 | |||
| 6 | void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint16_t length); | ||
| 7 | |||
| 8 | #define SEND_BYTES(mt, dt, b, l) send_bytes_sysex(mt, dt, b, l) | ||
| 9 | |||
| 10 | #endif \ No newline at end of file | ||
diff --git a/quantum/quantum.c b/quantum/quantum.c index 8372a7adc..f653564a6 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c | |||
| @@ -847,12 +847,12 @@ void send_nibble(uint8_t number) { | |||
| 847 | } | 847 | } |
| 848 | } | 848 | } |
| 849 | 849 | ||
| 850 | void send_unicode_midi(uint32_t unicode) { | 850 | void api_send_unicode(uint32_t unicode) { |
| 851 | #ifdef MIDI_ENABLE | 851 | #ifdef API_ENABLE |
| 852 | uint8_t chunk[4]; | 852 | uint8_t chunk[4]; |
| 853 | dword_to_bytes(unicode, chunk); | 853 | dword_to_bytes(unicode, chunk); |
| 854 | MT_SEND_DATA(DT_UNICODE, chunk, 5); | 854 | MT_SEND_DATA(DT_UNICODE, chunk, 5); |
| 855 | #endif | 855 | #endif |
| 856 | } | 856 | } |
| 857 | 857 | ||
| 858 | __attribute__ ((weak)) | 858 | __attribute__ ((weak)) |
diff --git a/quantum/quantum.h b/quantum/quantum.h index 316da15b9..e6adf974a 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h | |||
| @@ -119,6 +119,6 @@ void send_nibble(uint8_t number); | |||
| 119 | void led_set_user(uint8_t usb_led); | 119 | void led_set_user(uint8_t usb_led); |
| 120 | void led_set_kb(uint8_t usb_led); | 120 | void led_set_kb(uint8_t usb_led); |
| 121 | 121 | ||
| 122 | void send_unicode_midi(uint32_t unicode); | 122 | void api_send_unicode(uint32_t unicode); |
| 123 | 123 | ||
| 124 | #endif | 124 | #endif |
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index aa2e781c8..39d4824b6 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c | |||
| @@ -1091,37 +1091,17 @@ void fallthrough_callback(MidiDevice * device, | |||
| 1091 | #endif | 1091 | #endif |
| 1092 | } | 1092 | } |
| 1093 | 1093 | ||
| 1094 | #ifdef RGB_MIDI | ||
| 1095 | rgblight_config_t rgblight_config; | ||
| 1096 | #endif | ||
| 1097 | 1094 | ||
| 1098 | void cc_callback(MidiDevice * device, | 1095 | void cc_callback(MidiDevice * device, |
| 1099 | uint8_t chan, uint8_t num, uint8_t val) { | 1096 | uint8_t chan, uint8_t num, uint8_t val) { |
| 1100 | //sending it back on the next channel | 1097 | //sending it back on the next channel |
| 1101 | // midi_send_cc(device, (chan + 1) % 16, num, val); | 1098 | // midi_send_cc(device, (chan + 1) % 16, num, val); |
| 1102 | #ifdef RGB_MIDI | ||
| 1103 | rgblight_config.raw = eeconfig_read_rgblight(); | ||
| 1104 | switch (num) { | ||
| 1105 | case 14: | ||
| 1106 | rgblight_config.hue = val * 360 / 127; | ||
| 1107 | break; | ||
| 1108 | case 15: | ||
| 1109 | rgblight_config.sat = val << 1; | ||
| 1110 | break; | ||
| 1111 | case 16: | ||
| 1112 | rgblight_config.val = val << 1; | ||
| 1113 | break; | ||
| 1114 | } | ||
| 1115 | rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val); | ||
| 1116 | #endif | ||
| 1117 | } | 1099 | } |
| 1118 | 1100 | ||
| 1119 | uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0}; | 1101 | uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0}; |
| 1120 | 1102 | ||
| 1121 | void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data) { | 1103 | void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data) { |
| 1122 | // for (int i = 0; i < length; i++) | 1104 | #ifdef API_SYSEX_ENABLE |
| 1123 | // midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i)); | ||
| 1124 | // if (start == 0x27) { | ||
| 1125 | // SEND_STRING("\n"); | 1105 | // SEND_STRING("\n"); |
| 1126 | // send_word(start); | 1106 | // send_word(start); |
| 1127 | // SEND_STRING(": "); | 1107 | // SEND_STRING(": "); |
| @@ -1136,190 +1116,13 @@ void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t | |||
| 1136 | // } | 1116 | // } |
| 1137 | uint8_t * decoded = malloc(sizeof(uint8_t) * (sysex_decoded_length(start + place - 4))); | 1117 | uint8_t * decoded = malloc(sizeof(uint8_t) * (sysex_decoded_length(start + place - 4))); |
| 1138 | uint16_t decode_length = sysex_decode(decoded, midi_buffer + 4, start + place - 4); | 1118 | uint16_t decode_length = sysex_decode(decoded, midi_buffer + 4, start + place - 4); |
| 1139 | sysex_buffer_callback(device, decode_length, decoded); | 1119 | process_api(decode_length, decoded); |
| 1140 | } | 1120 | } |
| 1141 | // SEND_STRING(" "); | 1121 | // SEND_STRING(" "); |
| 1142 | data++; | 1122 | data++; |
| 1143 | } | 1123 | } |
| 1144 | // } | 1124 | #endif |
| 1145 | |||
| 1146 | } | ||
| 1147 | |||
| 1148 | void dword_to_bytes(uint32_t dword, uint8_t * bytes) { | ||
| 1149 | bytes[0] = (dword >> 24) & 0xFF; | ||
| 1150 | bytes[1] = (dword >> 16) & 0xFF; | ||
| 1151 | bytes[2] = (dword >> 8) & 0xFF; | ||
| 1152 | bytes[3] = (dword >> 0) & 0xFF; | ||
| 1153 | } | ||
| 1154 | |||
| 1155 | uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index) { | ||
| 1156 | return ((uint32_t)bytes[index + 0] << 24) | ((uint32_t)bytes[index + 1] << 16) | ((uint32_t)bytes[index + 2] << 8) | (uint32_t)bytes[index + 3]; | ||
| 1157 | } | ||
| 1158 | |||
| 1159 | void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint8_t length) { | ||
| 1160 | // SEND_STRING("\nTX: "); | ||
| 1161 | // for (uint8_t i = 0; i < length; i++) { | ||
| 1162 | // send_byte(bytes[i]); | ||
| 1163 | // SEND_STRING(" "); | ||
| 1164 | // } | ||
| 1165 | uint8_t * precode = malloc(sizeof(uint8_t) * (length + 2)); | ||
| 1166 | precode[0] = message_type; | ||
| 1167 | precode[1] = data_type; | ||
| 1168 | memcpy(precode + 2, bytes, length); | ||
| 1169 | uint8_t * encoded = malloc(sizeof(uint8_t) * (sysex_encoded_length(length + 2))); | ||
| 1170 | uint16_t encoded_length = sysex_encode(encoded, precode, length + 2); | ||
| 1171 | uint8_t * array = malloc(sizeof(uint8_t) * (encoded_length + 5)); | ||
| 1172 | array[0] = 0xF0; | ||
| 1173 | array[1] = 0x00; | ||
| 1174 | array[2] = 0x00; | ||
| 1175 | array[3] = 0x00; | ||
| 1176 | array[encoded_length + 4] = 0xF7; | ||
| 1177 | memcpy(array + 4, encoded, encoded_length); | ||
| 1178 | midi_send_array(&midi_device, encoded_length + 5, array); | ||
| 1179 | |||
| 1180 | // SEND_STRING("\nTD: "); | ||
| 1181 | // for (uint8_t i = 0; i < encoded_length + 5; i++) { | ||
| 1182 | // send_byte(array[i]); | ||
| 1183 | // SEND_STRING(" "); | ||
| 1184 | // } | ||
| 1185 | } | ||
| 1186 | |||
| 1187 | __attribute__ ((weak)) | ||
| 1188 | bool sysex_process_quantum(uint8_t length, uint8_t * data) { | ||
| 1189 | return sysex_process_keyboard(length, data); | ||
| 1190 | } | ||
| 1191 | |||
| 1192 | __attribute__ ((weak)) | ||
| 1193 | bool sysex_process_keyboard(uint8_t length, uint8_t * data) { | ||
| 1194 | return sysex_process_user(length, data); | ||
| 1195 | } | ||
| 1196 | |||
| 1197 | __attribute__ ((weak)) | ||
| 1198 | bool sysex_process_user(uint8_t length, uint8_t * data) { | ||
| 1199 | return true; | ||
| 1200 | } | 1125 | } |
| 1201 | 1126 | ||
| 1202 | void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data) { | ||
| 1203 | // SEND_STRING("\nRX: "); | ||
| 1204 | // for (uint8_t i = 0; i < length; i++) { | ||
| 1205 | // send_byte(data[i]); | ||
| 1206 | // SEND_STRING(" "); | ||
| 1207 | // } | ||
| 1208 | if (!sysex_process_quantum(length, data)) | ||
| 1209 | return; | ||
| 1210 | |||
| 1211 | switch (data[0]) { | ||
| 1212 | case MT_SET_DATA: | ||
| 1213 | switch (data[1]) { | ||
| 1214 | case DT_DEFAULT_LAYER: { | ||
| 1215 | eeconfig_update_default_layer(data[2]); | ||
| 1216 | default_layer_set((uint32_t)(data[2])); | ||
| 1217 | break; | ||
| 1218 | } | ||
| 1219 | case DT_KEYMAP_OPTIONS: { | ||
| 1220 | eeconfig_update_keymap(data[2]); | ||
| 1221 | break; | ||
| 1222 | } | ||
| 1223 | case DT_RGBLIGHT: { | ||
| 1224 | #ifdef RGBLIGHT_ENABLE | ||
| 1225 | uint32_t rgblight = bytes_to_dword(data, 2); | ||
| 1226 | rgblight_update_dword(rgblight); | ||
| 1227 | #endif | ||
| 1228 | break; | ||
| 1229 | } | ||
| 1230 | } | ||
| 1231 | case MT_GET_DATA: | ||
| 1232 | switch (data[1]) { | ||
| 1233 | case DT_HANDSHAKE: { | ||
| 1234 | MT_GET_DATA_ACK(DT_HANDSHAKE, NULL, 0); | ||
| 1235 | break; | ||
| 1236 | } | ||
| 1237 | case DT_DEBUG: { | ||
| 1238 | uint8_t debug_bytes[1] = { eeprom_read_byte(EECONFIG_DEBUG) }; | ||
| 1239 | MT_GET_DATA_ACK(DT_DEBUG, debug_bytes, 1); | ||
| 1240 | break; | ||
| 1241 | } | ||
| 1242 | case DT_DEFAULT_LAYER: { | ||
| 1243 | uint8_t default_bytes[1] = { eeprom_read_byte(EECONFIG_DEFAULT_LAYER) }; | ||
| 1244 | MT_GET_DATA_ACK(DT_DEFAULT_LAYER, default_bytes, 1); | ||
| 1245 | break; | ||
| 1246 | } | ||
| 1247 | case DT_CURRENT_LAYER: { | ||
| 1248 | uint8_t layer_state_bytes[4]; | ||
| 1249 | dword_to_bytes(layer_state, layer_state_bytes); | ||
| 1250 | MT_GET_DATA_ACK(DT_CURRENT_LAYER, layer_state_bytes, 4); | ||
| 1251 | break; | ||
| 1252 | } | ||
| 1253 | case DT_AUDIO: { | ||
| 1254 | #ifdef AUDIO_ENABLE | ||
| 1255 | uint8_t audio_bytes[1] = { eeprom_read_byte(EECONFIG_AUDIO) }; | ||
| 1256 | MT_GET_DATA_ACK(DT_AUDIO, audio_bytes, 1); | ||
| 1257 | #else | ||
| 1258 | MT_GET_DATA_ACK(DT_AUDIO, NULL, 0); | ||
| 1259 | #endif | ||
| 1260 | break; | ||
| 1261 | } | ||
| 1262 | case DT_BACKLIGHT: { | ||
| 1263 | #ifdef BACKLIGHT_ENABLE | ||
| 1264 | uint8_t backlight_bytes[1] = { eeprom_read_byte(EECONFIG_BACKLIGHT) }; | ||
| 1265 | MT_GET_DATA_ACK(DT_BACKLIGHT, backlight_bytes, 1); | ||
| 1266 | #else | ||
| 1267 | MT_GET_DATA_ACK(DT_BACKLIGHT, NULL, 0); | ||
| 1268 | #endif | ||
| 1269 | break; | ||
| 1270 | } | ||
| 1271 | case DT_RGBLIGHT: { | ||
| 1272 | #ifdef RGBLIGHT_ENABLE | ||
| 1273 | uint8_t rgblight_bytes[4]; | ||
| 1274 | dword_to_bytes(eeconfig_read_rgblight(), rgblight_bytes); | ||
| 1275 | MT_GET_DATA_ACK(DT_RGBLIGHT, rgblight_bytes, 4); | ||
| 1276 | #else | ||
| 1277 | MT_GET_DATA_ACK(DT_RGBLIGHT, NULL, 0); | ||
| 1278 | #endif | ||
| 1279 | break; | ||
| 1280 | } | ||
| 1281 | case DT_KEYMAP_OPTIONS: { | ||
| 1282 | uint8_t keymap_bytes[1] = { eeconfig_read_keymap() }; | ||
| 1283 | MT_GET_DATA_ACK(DT_KEYMAP_OPTIONS, keymap_bytes, 1); | ||
| 1284 | break; | ||
| 1285 | } | ||
| 1286 | default: | ||
| 1287 | break; | ||
| 1288 | } | ||
| 1289 | break; | ||
| 1290 | case MT_SET_DATA_ACK: | ||
| 1291 | case MT_GET_DATA_ACK: | ||
| 1292 | break; | ||
| 1293 | case MT_SEND_DATA: | ||
| 1294 | break; | ||
| 1295 | case MT_SEND_DATA_ACK: | ||
| 1296 | break; | ||
| 1297 | case MT_EXE_ACTION: | ||
| 1298 | break; | ||
| 1299 | case MT_EXE_ACTION_ACK: | ||
| 1300 | break; | ||
| 1301 | case MT_TYPE_ERROR: | ||
| 1302 | break; | ||
| 1303 | default: ; // command not recognised | ||
| 1304 | send_bytes_sysex(MT_TYPE_ERROR, DT_NONE, data, length); | ||
| 1305 | break; | ||
| 1306 | |||
| 1307 | // #ifdef RGBLIGHT_ENABLE | ||
| 1308 | // case 0x27: ; // RGB LED functions | ||
| 1309 | // switch (*data++) { | ||
| 1310 | // case 0x00: ; // Update HSV | ||
| 1311 | // rgblight_sethsv((data[0] << 8 | data[1]) % 360, data[2], data[3]); | ||
| 1312 | // break; | ||
| 1313 | // case 0x01: ; // Update RGB | ||
| 1314 | // break; | ||
| 1315 | // case 0x02: ; // Update mode | ||
| 1316 | // rgblight_mode(data[0]); | ||
| 1317 | // break; | ||
| 1318 | // } | ||
| 1319 | // break; | ||
| 1320 | // #endif | ||
| 1321 | } | ||
| 1322 | |||
| 1323 | } | ||
| 1324 | 1127 | ||
| 1325 | #endif | 1128 | #endif |
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h index 0962dda8d..b11854101 100644 --- a/tmk_core/protocol/lufa/lufa.h +++ b/tmk_core/protocol/lufa/lufa.h | |||
| @@ -68,64 +68,17 @@ typedef struct { | |||
| 68 | } __attribute__ ((packed)) report_extra_t; | 68 | } __attribute__ ((packed)) report_extra_t; |
| 69 | 69 | ||
| 70 | #ifdef MIDI_ENABLE | 70 | #ifdef MIDI_ENABLE |
| 71 | #define MIDI_SYSEX_BUFFER 16 | ||
| 72 | void MIDI_Task(void); | 71 | void MIDI_Task(void); |
| 73 | MidiDevice midi_device; | 72 | MidiDevice midi_device; |
| 73 | #define MIDI_SYSEX_BUFFER 32 | ||
| 74 | #endif | ||
| 74 | 75 | ||
| 75 | void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data); | 76 | #ifdef API_ENABLE |
| 76 | void sysex_buffer_callback(MidiDevice * device, uint8_t length, uint8_t * data); | 77 | #include "api.h" |
| 77 | void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, uint8_t length); | 78 | #endif |
| 78 | void dword_to_bytes(uint32_t dword, uint8_t * bytes); | ||
| 79 | uint32_t bytes_to_dword(uint8_t * bytes, uint8_t index); | ||
| 80 | |||
| 81 | __attribute__ ((weak)) | ||
| 82 | bool sysex_process_quantum(uint8_t length, uint8_t * data); | ||
| 83 | |||
| 84 | __attribute__ ((weak)) | ||
| 85 | bool sysex_process_keyboard(uint8_t length, uint8_t * data); | ||
| 86 | |||
| 87 | __attribute__ ((weak)) | ||
| 88 | bool sysex_process_user(uint8_t length, uint8_t * data); | ||
| 89 | |||
| 90 | enum MESSAGE_TYPE { | ||
| 91 | MT_GET_DATA = 0x10, // Get data from keyboard | ||
| 92 | MT_GET_DATA_ACK = 0x11, // returned data to process (ACK) | ||
| 93 | MT_SET_DATA = 0x20, // Set data on keyboard | ||
| 94 | MT_SET_DATA_ACK = 0x21, // returned data to confirm (ACK) | ||
| 95 | MT_SEND_DATA = 0x30, // Sending data/action from keyboard | ||
| 96 | MT_SEND_DATA_ACK = 0x31, // returned data/action confirmation (ACK) | ||
| 97 | MT_EXE_ACTION = 0x40, // executing actions on keyboard | ||
| 98 | MT_EXE_ACTION_ACK =0x41, // return confirmation/value (ACK) | ||
| 99 | MT_TYPE_ERROR = 0x80 // type not recofgnised (ACK) | ||
| 100 | }; | ||
| 101 | |||
| 102 | enum DATA_TYPE { | ||
| 103 | DT_NONE = 0x00, | ||
| 104 | DT_HANDSHAKE, | ||
| 105 | DT_DEFAULT_LAYER, | ||
| 106 | DT_CURRENT_LAYER, | ||
| 107 | DT_KEYMAP_OPTIONS, | ||
| 108 | DT_BACKLIGHT, | ||
| 109 | DT_RGBLIGHT, | ||
| 110 | DT_UNICODE, | ||
| 111 | DT_DEBUG, | ||
| 112 | DT_AUDIO, | ||
| 113 | DT_QUANTUM_ACTION, | ||
| 114 | DT_KEYBOARD_ACTION, | ||
| 115 | DT_USER_ACTION, | ||
| 116 | |||
| 117 | }; | ||
| 118 | |||
| 119 | |||
| 120 | #define MT_GET_DATA(data_type, data, length) send_bytes_sysex(MT_GET_DATA, data_type, data, length) | ||
| 121 | #define MT_GET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_GET_DATA_ACK, data_type, data, length) | ||
| 122 | #define MT_SET_DATA(data_type, data, length) send_bytes_sysex(MT_SET_DATA, data_type, data, length) | ||
| 123 | #define MT_SET_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SET_DATA_ACK, data_type, data, length) | ||
| 124 | #define MT_SEND_DATA(data_type, data, length) send_bytes_sysex(MT_SEND_DATA, data_type, data, length) | ||
| 125 | #define MT_SEND_DATA_ACK(data_type, data, length) send_bytes_sysex(MT_SEND_DATA_ACK, data_type, data, length) | ||
| 126 | #define MT_EXE_ACTION(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION, data_type, data, length) | ||
| 127 | #define MT_EXE_ACTION_ACK(data_type, data, length) send_bytes_sysex(MT_EXE_ACTION_ACK, data_type, data, length) | ||
| 128 | 79 | ||
| 80 | #ifdef API_SYSEX_ENABLE | ||
| 81 | #include "api_sysex.h" | ||
| 129 | #endif | 82 | #endif |
| 130 | 83 | ||
| 131 | // #if LUFA_VERSION_INTEGER < 0x120730 | 84 | // #if LUFA_VERSION_INTEGER < 0x120730 |
