via_extras.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /* Copyright 2020 Jay Greco
  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 "via_extras.h"
  17. // Encoder Behavior
  18. extern uint8_t encoder_value;
  19. extern uint8_t encoder_mode;
  20. extern uint8_t enabled_encoder_modes;
  21. void raw_hid_receive_kb( uint8_t *data, uint8_t length )
  22. {
  23. uint8_t *command_id = &(data[0]);
  24. uint8_t *command_data = &(data[1]);
  25. dprintf("raw hid recv! command_id: %u\n",*command_id);
  26. switch ( *command_id )
  27. {
  28. case id_get_keyboard_value:
  29. {
  30. switch( command_data[0])
  31. {
  32. case id_encoder_modes:
  33. {
  34. command_data[1] = enabled_encoder_modes;
  35. dprintf("[read] enabled_encoder_modes: %u\n", enabled_encoder_modes);
  36. }
  37. break;
  38. case id_encoder_custom:
  39. {
  40. uint8_t custom_encoder_idx = command_data[1];
  41. uint16_t keycode = retrieve_custom_encoder_config(custom_encoder_idx, ENC_CUSTOM_CW);
  42. command_data[2] = keycode >> 8;
  43. command_data[3] = keycode & 0xFF;
  44. keycode = retrieve_custom_encoder_config(custom_encoder_idx, ENC_CUSTOM_CCW);
  45. command_data[4] = keycode >> 8;
  46. command_data[5] = keycode & 0xFF;
  47. keycode = retrieve_custom_encoder_config(custom_encoder_idx, ENC_CUSTOM_PRESS);
  48. command_data[6] = keycode >> 8;
  49. command_data[7] = keycode & 0xFF;
  50. }
  51. break;
  52. default:
  53. {
  54. *command_id = id_unhandled;
  55. }
  56. break;
  57. }
  58. }
  59. break;
  60. case id_set_keyboard_value:
  61. {
  62. switch(command_data[0]){
  63. case id_encoder_modes:
  64. {
  65. enabled_encoder_modes = command_data[1];
  66. dprintf("[write] enabled_encoder_modes: %u\n", enabled_encoder_modes);
  67. eeprom_update_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES, enabled_encoder_modes);
  68. }
  69. break;
  70. case id_encoder_custom:
  71. {
  72. uint8_t custom_encoder_idx = command_data[1];
  73. uint8_t encoder_behavior = command_data[2];
  74. uint16_t keycode = (command_data[3] << 8) | command_data[4];
  75. set_custom_encoder_config(custom_encoder_idx, encoder_behavior, keycode);
  76. }
  77. break;
  78. default:
  79. {
  80. *command_id = id_unhandled;
  81. }
  82. break;
  83. }
  84. }
  85. break;
  86. default:
  87. {
  88. // Unhandled message.
  89. *command_id = id_unhandled;
  90. }
  91. break;
  92. }
  93. }
  94. void encoder_update_kb(uint8_t index, bool clockwise) {
  95. if (layer_state_is(1)) {
  96. change_encoder_mode(clockwise);
  97. return;
  98. }
  99. uint16_t mapped_code = 0;
  100. if (clockwise) {
  101. mapped_code = handle_encoder_cw();
  102. } else {
  103. mapped_code = handle_encoder_ccw();
  104. }
  105. if(mapped_code != 0){
  106. tap_code16(mapped_code);
  107. }
  108. }
  109. void custom_config_load(void){
  110. #ifdef DYNAMIC_KEYMAP_ENABLE
  111. enabled_encoder_modes = eeprom_read_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES);
  112. #endif
  113. }
  114. void via_init_kb(void)
  115. {
  116. dprintf("VIA is enabled.\n");
  117. custom_config_load();
  118. }