Keyboard firmwares for Atmel AVR and Cortex-M
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.

key_process.c 9.1KB

13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
13 vuotta sitten
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. #include <stdbool.h>
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include "print.h"
  5. #include "debug.h"
  6. #include "timer.h"
  7. #include "util.h"
  8. #include "jump_bootloader.h"
  9. #include "usb_keyboard.h"
  10. #include "usb_mouse.h"
  11. #include "usb_extra.h"
  12. #include "usb_keycodes.h"
  13. #include "usb.h"
  14. #include "layer.h"
  15. #include "matrix_skel.h"
  16. #include "keymap_skel.h"
  17. #include "controller.h"
  18. #include "key_process.h"
  19. #define MOUSE_MOVE_UNIT 10
  20. #define MOUSE_MOVE_ACCEL (mouse_repeat < 50 ? mouse_repeat/5 : 10)
  21. #ifndef MOUSE_DELAY_TIME
  22. # define MOUSE_DELAY_TIME 255
  23. #endif
  24. #define MOUSE_DELAY_MS (MOUSE_DELAY_TIME >> (mouse_repeat < 5 ? mouse_repeat : 4))
  25. // TODO: refactoring
  26. void proc_matrix(void) {
  27. static int mouse_repeat = 0;
  28. bool modified = false;
  29. int key_index = 0;
  30. uint8_t mouse_btn = 0;
  31. int8_t mouse_x = 0;
  32. int8_t mouse_y = 0;
  33. int8_t mouse_vwheel = 0;
  34. int8_t mouse_hwheel = 0;
  35. uint8_t fn_bits = 0;
  36. matrix_scan();
  37. modified = matrix_is_modified();
  38. if (modified) {
  39. if (debug_matrix) matrix_print();
  40. #ifdef DEBUG_LED
  41. // LED flash for debug
  42. DEBUG_LED_CONFIG;
  43. DEBUG_LED_ON;
  44. #endif
  45. }
  46. if (matrix_has_ghost()) {
  47. // should send error?
  48. debug("matrix has ghost!!\n");
  49. return;
  50. }
  51. usb_keyboard_clear_report();
  52. for (int row = 0; row < matrix_rows(); row++) {
  53. for (int col = 0; col < matrix_cols(); col++) {
  54. if (!matrix_is_on(row, col)) continue;
  55. // TODO: clean code
  56. uint8_t code = layer_get_keycode(row, col);
  57. if (code == KB_NO) {
  58. // do nothing
  59. } else if (IS_MOD(code)) {
  60. usb_keyboard_mods |= MOD_BIT(code);
  61. } else if (IS_FN(code)) {
  62. fn_bits |= FN_BIT(code);
  63. } else if (IS_MOUSE(code)) {
  64. if (code == MS_UP) mouse_y -= MOUSE_MOVE_UNIT + MOUSE_MOVE_ACCEL;
  65. if (code == MS_DOWN) mouse_y += MOUSE_MOVE_UNIT + MOUSE_MOVE_ACCEL;
  66. if (code == MS_LEFT) mouse_x -= MOUSE_MOVE_UNIT + MOUSE_MOVE_ACCEL;
  67. if (code == MS_RGHT) mouse_x += MOUSE_MOVE_UNIT + MOUSE_MOVE_ACCEL;
  68. if (code == MS_BTN1) mouse_btn |= BIT_BTN1;
  69. if (code == MS_BTN2) mouse_btn |= BIT_BTN2;
  70. if (code == MS_BTN3) mouse_btn |= BIT_BTN3;
  71. if (code == MS_BTN4) mouse_btn |= BIT_BTN4;
  72. if (code == MS_BTN5) mouse_btn |= BIT_BTN5;
  73. if (code == MS_WH_U) mouse_vwheel += 1;
  74. if (code == MS_WH_D) mouse_vwheel -= 1;
  75. if (code == MS_WH_L) mouse_hwheel -= 1;
  76. if (code == MS_WH_R) mouse_hwheel += 1;
  77. }
  78. // audio control & system control
  79. else if (code == KB_MUTE) {
  80. usb_extra_audio_send(AUDIO_MUTE);
  81. usb_extra_audio_send(0);
  82. _delay_ms(500);
  83. } else if (code == KB_VOLU) {
  84. usb_extra_audio_send(AUDIO_VOL_UP);
  85. usb_extra_audio_send(0);
  86. _delay_ms(100);
  87. } else if (code == KB_VOLD) {
  88. usb_extra_audio_send(AUDIO_VOL_DOWN);
  89. usb_extra_audio_send(0);
  90. _delay_ms(100);
  91. } else if (code == KB_PWR) {
  92. if (suspend && remote_wakeup) {
  93. usb_remote_wakeup();
  94. } else {
  95. usb_extra_system_send(SYSTEM_POWER_DOWN);
  96. }
  97. _delay_ms(1000);
  98. }
  99. // normal keys
  100. else {
  101. if (key_index < 6)
  102. usb_keyboard_keys[key_index] = code;
  103. key_index++;
  104. }
  105. }
  106. }
  107. if (modified) {
  108. #ifdef DEBUG_LED
  109. // LED flash for debug
  110. DEBUG_LED_CONFIG;
  111. DEBUG_LED_OFF;
  112. #endif
  113. }
  114. layer_switching(fn_bits);
  115. // TODO: clean code
  116. // when 4 left modifier keys down
  117. if (keymap_is_special_mode(fn_bits)) {
  118. switch (usb_keyboard_keys[0]) {
  119. case KB_H: // help
  120. print_enable = true;
  121. print("b: jump to bootloader\n");
  122. print("d: debug print toggle\n");
  123. print("x: matrix debug toggle\n");
  124. print("k: keyboard debug toggle\n");
  125. print("m: mouse debug toggle\n");
  126. print("p: print enable toggle\n");
  127. print("v: print version\n");
  128. print("t: print timer count\n");
  129. print("r: print registers\n");
  130. print("ESC: power down/wake up\n");
  131. _delay_ms(500);
  132. print_enable = false;
  133. break;
  134. case KB_B: // bootloader
  135. usb_keyboard_clear_report();
  136. usb_keyboard_send();
  137. print_enable = true;
  138. print("jump to bootloader...\n");
  139. _delay_ms(1000);
  140. jump_bootloader(); // not return
  141. break;
  142. case KB_D: // debug all toggle
  143. usb_keyboard_clear_report();
  144. usb_keyboard_send();
  145. debug_enable = !debug_enable;
  146. if (debug_enable) {
  147. print_enable = true;
  148. print("debug enabled.\n");
  149. debug_matrix = true;
  150. debug_keyboard = true;
  151. debug_mouse = true;
  152. } else {
  153. print("debug disabled.\n");
  154. print_enable = false;
  155. debug_matrix = false;
  156. debug_keyboard = false;
  157. debug_mouse = false;
  158. }
  159. _delay_ms(1000);
  160. break;
  161. case KB_X: // debug matrix toggle
  162. usb_keyboard_clear_report();
  163. usb_keyboard_send();
  164. debug_matrix = !debug_matrix;
  165. if (debug_matrix)
  166. print("debug matrix enabled.\n");
  167. else
  168. print("debug matrix disabled.\n");
  169. _delay_ms(1000);
  170. break;
  171. case KB_K: // debug keyboard toggle
  172. usb_keyboard_clear_report();
  173. usb_keyboard_send();
  174. debug_keyboard = !debug_keyboard;
  175. if (debug_keyboard)
  176. print("debug keyboard enabled.\n");
  177. else
  178. print("debug keyboard disabled.\n");
  179. _delay_ms(1000);
  180. break;
  181. case KB_M: // debug mouse toggle
  182. usb_keyboard_clear_report();
  183. usb_keyboard_send();
  184. debug_mouse = !debug_mouse;
  185. if (debug_mouse)
  186. print("debug mouse enabled.\n");
  187. else
  188. print("debug mouse disabled.\n");
  189. _delay_ms(1000);
  190. break;
  191. case KB_V: // print version & information
  192. usb_keyboard_clear_report();
  193. usb_keyboard_send();
  194. print_enable = true;
  195. print(STR(DESCRIPTION) "\n");
  196. _delay_ms(1000);
  197. break;
  198. case KB_T: // print timer
  199. usb_keyboard_clear_report();
  200. usb_keyboard_send();
  201. print_enable = true;
  202. print("timer: "); phex16(timer_count); print("\n");
  203. _delay_ms(500);
  204. break;
  205. case KB_P: // print toggle
  206. usb_keyboard_clear_report();
  207. usb_keyboard_send();
  208. if (print_enable) {
  209. print("print disabled.\n");
  210. print_enable = false;
  211. } else {
  212. print_enable = true;
  213. print("print enabled.\n");
  214. }
  215. _delay_ms(1000);
  216. break;
  217. case KB_R:
  218. usb_keyboard_clear_report();
  219. usb_keyboard_send();
  220. print("UDIEN: "); phex(UDIEN); print("\n");
  221. print("UDINT: "); phex(UDINT); print("\n");
  222. _delay_ms(1000);
  223. break;
  224. case KB_ESC:
  225. usb_keyboard_clear_report();
  226. usb_keyboard_send();
  227. if (suspend && remote_wakeup) {
  228. usb_remote_wakeup();
  229. } else {
  230. usb_extra_system_send(SYSTEM_POWER_DOWN);
  231. }
  232. _delay_ms(1000);
  233. break;
  234. }
  235. }
  236. // send mouse packet to host
  237. if (mouse_x || mouse_y || mouse_vwheel || mouse_hwheel || mouse_btn != mouse_buttons) {
  238. mouse_buttons = mouse_btn;
  239. if (mouse_x && mouse_y)
  240. usb_mouse_move(mouse_x*0.7, mouse_y*0.7, mouse_vwheel, mouse_hwheel);
  241. else
  242. usb_mouse_move(mouse_x, mouse_y, mouse_vwheel, mouse_hwheel);
  243. usb_mouse_print(mouse_x, mouse_y, mouse_vwheel, mouse_hwheel);
  244. // acceleration
  245. _delay_ms(MOUSE_DELAY_MS);
  246. mouse_repeat++;
  247. } else {
  248. mouse_repeat = 0;
  249. }
  250. // send key packet to host
  251. if (modified) {
  252. if (key_index > 6) {
  253. //Rollover
  254. }
  255. usb_keyboard_send();
  256. }
  257. }