You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
7.2 KiB

  1. /* Copyright 2016 Jack Humbert
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "api.h"
  17. #include "quantum.h"
  18. void dword_to_bytes(uint32_t dword, uint8_t* bytes) {
  19. bytes[0] = (dword >> 24) & 0xFF;
  20. bytes[1] = (dword >> 16) & 0xFF;
  21. bytes[2] = (dword >> 8) & 0xFF;
  22. bytes[3] = (dword >> 0) & 0xFF;
  23. }
  24. uint32_t bytes_to_dword(uint8_t* bytes, uint8_t index) { return ((uint32_t)bytes[index + 0] << 24) | ((uint32_t)bytes[index + 1] << 16) | ((uint32_t)bytes[index + 2] << 8) | (uint32_t)bytes[index + 3]; }
  25. __attribute__((weak)) bool process_api_quantum(uint8_t length, uint8_t* data) { return process_api_keyboard(length, data); }
  26. __attribute__((weak)) bool process_api_keyboard(uint8_t length, uint8_t* data) { return process_api_user(length, data); }
  27. __attribute__((weak)) bool process_api_user(uint8_t length, uint8_t* data) { return true; }
  28. void process_api(uint16_t length, uint8_t* data) {
  29. // SEND_STRING("\nRX: ");
  30. // for (uint8_t i = 0; i < length; i++) {
  31. // send_byte(data[i]);
  32. // SEND_STRING(" ");
  33. // }
  34. if (!process_api_quantum(length, data)) return;
  35. switch (data[0]) {
  36. case MT_SET_DATA:
  37. switch (data[1]) {
  38. case DT_DEFAULT_LAYER: {
  39. eeconfig_update_default_layer(data[2]);
  40. default_layer_set((uint32_t)(data[2]));
  41. break;
  42. }
  43. case DT_KEYMAP_OPTIONS: {
  44. eeconfig_update_keymap(data[2]);
  45. break;
  46. }
  47. case DT_RGBLIGHT: {
  48. #ifdef RGBLIGHT_ENABLE
  49. uint32_t rgblight = bytes_to_dword(data, 2);
  50. eeconfig_update_rgblight(rgblight);
  51. #endif
  52. break;
  53. }
  54. }
  55. case MT_GET_DATA:
  56. switch (data[1]) {
  57. case DT_HANDSHAKE: {
  58. MT_GET_DATA_ACK(DT_HANDSHAKE, NULL, 0);
  59. break;
  60. }
  61. case DT_DEBUG: {
  62. uint8_t debug_bytes[1] = {eeprom_read_byte(EECONFIG_DEBUG)};
  63. MT_GET_DATA_ACK(DT_DEBUG, debug_bytes, 1);
  64. break;
  65. }
  66. case DT_DEFAULT_LAYER: {
  67. uint8_t default_bytes[1] = {eeprom_read_byte(EECONFIG_DEFAULT_LAYER)};
  68. MT_GET_DATA_ACK(DT_DEFAULT_LAYER, default_bytes, 1);
  69. break;
  70. }
  71. case DT_CURRENT_LAYER: {
  72. uint8_t layer_state_bytes[4];
  73. dword_to_bytes(layer_state, layer_state_bytes);
  74. MT_GET_DATA_ACK(DT_CURRENT_LAYER, layer_state_bytes, 4);
  75. break;
  76. }
  77. case DT_AUDIO: {
  78. #ifdef AUDIO_ENABLE
  79. uint8_t audio_bytes[1] = {eeprom_read_byte(EECONFIG_AUDIO)};
  80. MT_GET_DATA_ACK(DT_AUDIO, audio_bytes, 1);
  81. #else
  82. MT_GET_DATA_ACK(DT_AUDIO, NULL, 0);
  83. #endif
  84. break;
  85. }
  86. case DT_BACKLIGHT: {
  87. #ifdef BACKLIGHT_ENABLE
  88. uint8_t backlight_bytes[1] = {eeprom_read_byte(EECONFIG_BACKLIGHT)};
  89. MT_GET_DATA_ACK(DT_BACKLIGHT, backlight_bytes, 1);
  90. #else
  91. MT_GET_DATA_ACK(DT_BACKLIGHT, NULL, 0);
  92. #endif
  93. break;
  94. }
  95. case DT_RGBLIGHT: {
  96. #ifdef RGBLIGHT_ENABLE
  97. uint8_t rgblight_bytes[4];
  98. dword_to_bytes(eeconfig_read_rgblight(), rgblight_bytes);
  99. MT_GET_DATA_ACK(DT_RGBLIGHT, rgblight_bytes, 4);
  100. #else
  101. MT_GET_DATA_ACK(DT_RGBLIGHT, NULL, 0);
  102. #endif
  103. break;
  104. }
  105. case DT_KEYMAP_OPTIONS: {
  106. uint8_t keymap_bytes[1] = {eeconfig_read_keymap()};
  107. MT_GET_DATA_ACK(DT_KEYMAP_OPTIONS, keymap_bytes, 1);
  108. break;
  109. }
  110. case DT_KEYMAP_SIZE: {
  111. uint8_t keymap_size[2] = {MATRIX_ROWS, MATRIX_COLS};
  112. MT_GET_DATA_ACK(DT_KEYMAP_SIZE, keymap_size, 2);
  113. break;
  114. }
  115. // This may be too much
  116. // case DT_KEYMAP: {
  117. // uint8_t keymap_data[MATRIX_ROWS * MATRIX_COLS * 4 + 3];
  118. // keymap_data[0] = data[2];
  119. // keymap_data[1] = MATRIX_ROWS;
  120. // keymap_data[2] = MATRIX_COLS;
  121. // for (int i = 0; i < MATRIX_ROWS; i++) {
  122. // for (int j = 0; j < MATRIX_COLS; j++) {
  123. // keymap_data[3 + (i*MATRIX_COLS*2) + (j*2)] = pgm_read_word(&keymaps[data[2]][i][j]) >> 8;
  124. // keymap_data[3 + (i*MATRIX_COLS*2) + (j*2) + 1] = pgm_read_word(&keymaps[data[2]][i][j]) & 0xFF;
  125. // }
  126. // }
  127. // MT_GET_DATA_ACK(DT_KEYMAP, keymap_data, MATRIX_ROWS * MATRIX_COLS * 4 + 3);
  128. // // uint8_t keymap_data[5];
  129. // // keymap_data[0] = data[2];
  130. // // keymap_data[1] = data[3];
  131. // // keymap_data[2] = data[4];
  132. // // keymap_data[3] = pgm_read_word(&keymaps[data[2]][data[3]][data[4]]) >> 8;
  133. // // keymap_data[4] = pgm_read_word(&keymaps[data[2]][data[3]][data[4]]) & 0xFF;
  134. // // MT_GET_DATA_ACK(DT_KEYMAP, keymap_data, 5);
  135. // break;
  136. // }
  137. default:
  138. break;
  139. }
  140. break;
  141. case MT_SET_DATA_ACK:
  142. case MT_GET_DATA_ACK:
  143. break;
  144. case MT_SEND_DATA:
  145. break;
  146. case MT_SEND_DATA_ACK:
  147. break;
  148. case MT_EXE_ACTION:
  149. break;
  150. case MT_EXE_ACTION_ACK:
  151. break;
  152. case MT_TYPE_ERROR:
  153. break;
  154. default:; // command not recognised
  155. SEND_BYTES(MT_TYPE_ERROR, DT_NONE, data, length);
  156. break;
  157. // #ifdef RGBLIGHT_ENABLE
  158. // case 0x27: ; // RGB LED functions
  159. // switch (*data++) {
  160. // case 0x00: ; // Update HSV
  161. // rgblight_sethsv((data[0] << 8 | data[1]) % 360, data[2], data[3]);
  162. // break;
  163. // case 0x01: ; // Update RGB
  164. // break;
  165. // case 0x02: ; // Update mode
  166. // rgblight_mode(data[0]);
  167. // break;
  168. // }
  169. // break;
  170. // #endif
  171. }
  172. }