diff options
Diffstat (limited to 'common/keyboard.c')
| -rw-r--r-- | common/keyboard.c | 122 |
1 files changed, 106 insertions, 16 deletions
diff --git a/common/keyboard.c b/common/keyboard.c index b7063a264..328941df3 100644 --- a/common/keyboard.c +++ b/common/keyboard.c | |||
| @@ -41,8 +41,6 @@ typedef enum keykind { | |||
| 41 | FNK_DOWN, FNK_UP, | 41 | FNK_DOWN, FNK_UP, |
| 42 | KEY_DOWN, KEY_UP, | 42 | KEY_DOWN, KEY_UP, |
| 43 | MOD_DOWN, MOD_UP, | 43 | MOD_DOWN, MOD_UP, |
| 44 | MOUSEKEY_DOWN, MOUSEKEY_UP, | ||
| 45 | DELAY | ||
| 46 | } keykind_t; | 44 | } keykind_t; |
| 47 | 45 | ||
| 48 | typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t; | 46 | typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t; |
| @@ -69,15 +67,17 @@ static const char *state_str(kbdstate_t state) | |||
| 69 | 67 | ||
| 70 | static inline keykind_t get_keykind(uint8_t code, bool pressed) | 68 | static inline keykind_t get_keykind(uint8_t code, bool pressed) |
| 71 | { | 69 | { |
| 72 | if IS_KEY(code) return (pressed ? KEY_DOWN : KEY_UP); | 70 | if IS_KEY(code) return (pressed ? KEY_DOWN : KEY_UP); |
| 73 | if IS_MOD(code) return (pressed ? MOD_DOWN : MOD_UP); | 71 | if IS_MOD(code) return (pressed ? MOD_DOWN : MOD_UP); |
| 74 | if IS_FN(code) { | 72 | if IS_FN(code) { |
| 75 | if (keymap_fn_keycode(FN_INDEX(code))) | 73 | if (keymap_fn_keycode(FN_INDEX(code))) |
| 76 | return (pressed ? FNK_DOWN : FNK_UP); | 74 | return (pressed ? FNK_DOWN : FNK_UP); |
| 77 | else | 75 | else |
| 78 | return (pressed ? FN_DOWN : FN_UP); | 76 | return (pressed ? FN_DOWN : FN_UP); |
| 79 | } | 77 | } |
| 80 | if IS_MOUSEKEY(code) return (pressed ? MOUSEKEY_DOWN : MOUSEKEY_UP); | 78 | if IS_MOUSEKEY(code) return (pressed ? KEY_DOWN : KEY_UP); |
| 79 | if IS_SYSTEM(code) return (pressed ? KEY_DOWN : KEY_UP); | ||
| 80 | if IS_CONSUMER(code) return (pressed ? KEY_DOWN : KEY_UP); | ||
| 81 | return NONE; | 81 | return NONE; |
| 82 | } | 82 | } |
| 83 | 83 | ||
| @@ -86,7 +86,13 @@ static void layer_switch_on(uint8_t code) | |||
| 86 | if (!IS_FN(code)) return; | 86 | if (!IS_FN(code)) return; |
| 87 | fn_state_bits |= FN_BIT(code); | 87 | fn_state_bits |= FN_BIT(code); |
| 88 | if (current_layer != keymap_fn_layer(FN_INDEX(code))) { | 88 | if (current_layer != keymap_fn_layer(FN_INDEX(code))) { |
| 89 | //TODO: clear all key execpt Mod key | 89 | // clear all key execpt Mod key |
| 90 | host_clear_all_keys_but_mods(); | ||
| 91 | host_system_send(0); | ||
| 92 | host_consumer_send(0); | ||
| 93 | mousekey_clear(); | ||
| 94 | mousekey_send(); | ||
| 95 | |||
| 90 | debug("Layer Switch(on): "); debug_hex(current_layer); | 96 | debug("Layer Switch(on): "); debug_hex(current_layer); |
| 91 | current_layer = keymap_fn_layer(FN_INDEX(code)); | 97 | current_layer = keymap_fn_layer(FN_INDEX(code)); |
| 92 | debug(" -> "); debug_hex(current_layer); debug("\n"); | 98 | debug(" -> "); debug_hex(current_layer); debug("\n"); |
| @@ -98,7 +104,13 @@ static void layer_switch_off(uint8_t code) | |||
| 98 | if (!IS_FN(code)) return; | 104 | if (!IS_FN(code)) return; |
| 99 | fn_state_bits &= ~FN_BIT(code); | 105 | fn_state_bits &= ~FN_BIT(code); |
| 100 | if (current_layer != keymap_fn_layer(biton(fn_state_bits))) { | 106 | if (current_layer != keymap_fn_layer(biton(fn_state_bits))) { |
| 101 | //TODO: clear all key execpt Mod key | 107 | // clear all key execpt Mod key |
| 108 | host_clear_all_keys_but_mods(); | ||
| 109 | host_system_send(0); | ||
| 110 | host_consumer_send(0); | ||
| 111 | mousekey_clear(); | ||
| 112 | mousekey_send(); | ||
| 113 | |||
| 102 | debug("Layer Switch(off): "); debug_hex(current_layer); | 114 | debug("Layer Switch(off): "); debug_hex(current_layer); |
| 103 | current_layer = keymap_fn_layer(biton(fn_state_bits)); | 115 | current_layer = keymap_fn_layer(biton(fn_state_bits)); |
| 104 | debug(" -> "); debug_hex(current_layer); debug("\n"); | 116 | debug(" -> "); debug_hex(current_layer); debug("\n"); |
| @@ -128,6 +140,7 @@ static inline bool is_anykey_down(void) | |||
| 128 | 140 | ||
| 129 | static void register_code(uint8_t code) | 141 | static void register_code(uint8_t code) |
| 130 | { | 142 | { |
| 143 | debug("register_code\n"); | ||
| 131 | if IS_KEY(code) { | 144 | if IS_KEY(code) { |
| 132 | host_add_key(code); | 145 | host_add_key(code); |
| 133 | host_send_keyboard_report(); | 146 | host_send_keyboard_report(); |
| @@ -140,6 +153,84 @@ static void register_code(uint8_t code) | |||
| 140 | mousekey_on(code); | 153 | mousekey_on(code); |
| 141 | mousekey_send(); | 154 | mousekey_send(); |
| 142 | } | 155 | } |
| 156 | else if IS_CONSUMER(code) { | ||
| 157 | debug("consumer\n"); | ||
| 158 | uint16_t usage = 0; | ||
| 159 | switch (code) { | ||
| 160 | case KB_AUDIO_MUTE: | ||
| 161 | usage = AUDIO_MUTE; | ||
| 162 | break; | ||
| 163 | case KB_AUDIO_VOL_UP: | ||
| 164 | usage = AUDIO_VOL_UP; | ||
| 165 | break; | ||
| 166 | case KB_AUDIO_VOL_DOWN: | ||
| 167 | usage = AUDIO_VOL_DOWN; | ||
| 168 | break; | ||
| 169 | case KB_MEDIA_NEXT_TRACK: | ||
| 170 | usage = TRANSPORT_NEXT_TRACK; | ||
| 171 | break; | ||
| 172 | case KB_MEDIA_PREV_TRACK: | ||
| 173 | usage = TRANSPORT_PREV_TRACK; | ||
| 174 | break; | ||
| 175 | case KB_MEDIA_STOP: | ||
| 176 | usage = TRANSPORT_STOP; | ||
| 177 | break; | ||
| 178 | case KB_MEDIA_PLAY_PAUSE: | ||
| 179 | usage = TRANSPORT_PLAY_PAUSE; | ||
| 180 | break; | ||
| 181 | case KB_MEDIA_SELECT: | ||
| 182 | usage = AL_CC_CONFIG; | ||
| 183 | break; | ||
| 184 | case KB_MAIL: | ||
| 185 | usage = AL_EMAIL; | ||
| 186 | break; | ||
| 187 | case KB_CALCULATOR: | ||
| 188 | usage = AL_CALCULATOR; | ||
| 189 | break; | ||
| 190 | case KB_MY_COMPUTER: | ||
| 191 | usage = AL_LOCAL_BROWSER; | ||
| 192 | break; | ||
| 193 | case KB_WWW_SEARCH: | ||
| 194 | usage = AC_SEARCH; | ||
| 195 | break; | ||
| 196 | case KB_WWW_HOME: | ||
| 197 | usage = AC_HOME; | ||
| 198 | break; | ||
| 199 | case KB_WWW_BACK: | ||
| 200 | usage = AC_BACK; | ||
| 201 | break; | ||
| 202 | case KB_WWW_FORWARD: | ||
| 203 | usage = AC_FORWARD; | ||
| 204 | break; | ||
| 205 | case KB_WWW_STOP: | ||
| 206 | usage = AC_STOP; | ||
| 207 | break; | ||
| 208 | case KB_WWW_REFRESH: | ||
| 209 | usage = AC_REFRESH; | ||
| 210 | break; | ||
| 211 | case KB_WWW_FAVORITES: | ||
| 212 | usage = AC_BOOKMARKS; | ||
| 213 | break; | ||
| 214 | } | ||
| 215 | debug("usage: "); phex16(usage); debug("\n"); | ||
| 216 | host_consumer_send(usage); | ||
| 217 | } | ||
| 218 | else if IS_SYSTEM(code) { | ||
| 219 | uint16_t usage = 0; | ||
| 220 | switch (code) { | ||
| 221 | case KB_SYSTEM_POWER: | ||
| 222 | usage = SYSTEM_POWER_DOWN; | ||
| 223 | break; | ||
| 224 | case KB_SYSTEM_SLEEP: | ||
| 225 | usage = SYSTEM_SLEEP; | ||
| 226 | break; | ||
| 227 | case KB_SYSTEM_WAKE: | ||
| 228 | usage = SYSTEM_WAKE_UP; | ||
| 229 | break; | ||
| 230 | } | ||
| 231 | host_system_send(usage); | ||
| 232 | } | ||
| 233 | |||
| 143 | } | 234 | } |
| 144 | 235 | ||
| 145 | static void unregister_code(uint8_t code) | 236 | static void unregister_code(uint8_t code) |
| @@ -156,6 +247,12 @@ static void unregister_code(uint8_t code) | |||
| 156 | mousekey_off(code); | 247 | mousekey_off(code); |
| 157 | mousekey_send(); | 248 | mousekey_send(); |
| 158 | } | 249 | } |
| 250 | else if IS_CONSUMER(code) { | ||
| 251 | host_consumer_send(0x0000); | ||
| 252 | } | ||
| 253 | else if IS_SYSTEM(code) { | ||
| 254 | host_system_send(0x0000); | ||
| 255 | } | ||
| 159 | } | 256 | } |
| 160 | 257 | ||
| 161 | /* | 258 | /* |
| @@ -254,7 +351,6 @@ static inline void process_key(keyevent_t event) | |||
| 254 | layer_switch_off(code); | 351 | layer_switch_off(code); |
| 255 | break; | 352 | break; |
| 256 | case KEY_DOWN: | 353 | case KEY_DOWN: |
| 257 | case MOUSEKEY_DOWN: | ||
| 258 | register_code(code); | 354 | register_code(code); |
| 259 | NEXT(PRESSING); | 355 | NEXT(PRESSING); |
| 260 | break; | 356 | break; |
| @@ -262,7 +358,6 @@ static inline void process_key(keyevent_t event) | |||
| 262 | register_code(code); | 358 | register_code(code); |
| 263 | break; | 359 | break; |
| 264 | case KEY_UP: | 360 | case KEY_UP: |
| 265 | case MOUSEKEY_UP: | ||
| 266 | case MOD_UP: | 361 | case MOD_UP: |
| 267 | unregister_code(code); | 362 | unregister_code(code); |
| 268 | break; | 363 | break; |
| @@ -283,16 +378,16 @@ static inline void process_key(keyevent_t event) | |||
| 283 | register_code(keymap_fn_keycode(FN_INDEX(code))); | 378 | register_code(keymap_fn_keycode(FN_INDEX(code))); |
| 284 | break; | 379 | break; |
| 285 | case FNK_UP: | 380 | case FNK_UP: |
| 381 | // can't know whether layer switched or not | ||
| 382 | layer_switch_off(code); | ||
| 286 | unregister_code(keymap_fn_keycode(FN_INDEX(code))); | 383 | unregister_code(keymap_fn_keycode(FN_INDEX(code))); |
| 287 | break; | 384 | break; |
| 288 | case KEY_DOWN: | 385 | case KEY_DOWN: |
| 289 | case MOD_DOWN: | 386 | case MOD_DOWN: |
| 290 | case MOUSEKEY_DOWN: | ||
| 291 | register_code(code); | 387 | register_code(code); |
| 292 | break; | 388 | break; |
| 293 | case KEY_UP: | 389 | case KEY_UP: |
| 294 | case MOD_UP: | 390 | case MOD_UP: |
| 295 | case MOUSEKEY_UP: | ||
| 296 | unregister_code(code); | 391 | unregister_code(code); |
| 297 | // no key registered? mousekey, mediakey, systemkey | 392 | // no key registered? mousekey, mediakey, systemkey |
| 298 | if (!host_has_anykey()) | 393 | if (!host_has_anykey()) |
| @@ -307,7 +402,6 @@ static inline void process_key(keyevent_t event) | |||
| 307 | case FN_DOWN: | 402 | case FN_DOWN: |
| 308 | case FNK_DOWN: | 403 | case FNK_DOWN: |
| 309 | case KEY_DOWN: | 404 | case KEY_DOWN: |
| 310 | case MOUSEKEY_DOWN: | ||
| 311 | waiting_key = (keyrecord_t) { | 405 | waiting_key = (keyrecord_t) { |
| 312 | .event = event, | 406 | .event = event, |
| 313 | .code = code, | 407 | .code = code, |
| @@ -339,7 +433,6 @@ static inline void process_key(keyevent_t event) | |||
| 339 | } | 433 | } |
| 340 | break; | 434 | break; |
| 341 | case KEY_UP: | 435 | case KEY_UP: |
| 342 | case MOUSEKEY_UP: | ||
| 343 | unregister_code(code); | 436 | unregister_code(code); |
| 344 | NEXT(IDLE); | 437 | NEXT(IDLE); |
| 345 | break; | 438 | break; |
| @@ -355,7 +448,6 @@ static inline void process_key(keyevent_t event) | |||
| 355 | case FN_DOWN: | 448 | case FN_DOWN: |
| 356 | case FNK_DOWN: | 449 | case FNK_DOWN: |
| 357 | case KEY_DOWN: | 450 | case KEY_DOWN: |
| 358 | case MOUSEKEY_DOWN: | ||
| 359 | tmp_mods = keyboard_report->mods; | 451 | tmp_mods = keyboard_report->mods; |
| 360 | host_set_mods(delayed_fn.mods); | 452 | host_set_mods(delayed_fn.mods); |
| 361 | register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code))); | 453 | register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code))); |
| @@ -389,7 +481,6 @@ static inline void process_key(keyevent_t event) | |||
| 389 | } | 481 | } |
| 390 | break; | 482 | break; |
| 391 | case KEY_UP: | 483 | case KEY_UP: |
| 392 | case MOUSEKEY_UP: | ||
| 393 | if (code == waiting_key.code) { | 484 | if (code == waiting_key.code) { |
| 394 | layer_switch_on(delayed_fn.code); | 485 | layer_switch_on(delayed_fn.code); |
| 395 | NEXT(IDLE); | 486 | NEXT(IDLE); |
| @@ -444,7 +535,6 @@ void keyboard_task(void) | |||
| 444 | matrix_row = matrix_get_row(r); | 535 | matrix_row = matrix_get_row(r); |
| 445 | matrix_change = matrix_row ^ matrix_prev[r]; | 536 | matrix_change = matrix_row ^ matrix_prev[r]; |
| 446 | if (matrix_change) { | 537 | if (matrix_change) { |
| 447 | // TODO: print once per scan | ||
| 448 | if (debug_matrix) matrix_print(); | 538 | if (debug_matrix) matrix_print(); |
| 449 | 539 | ||
| 450 | for (int c = 0; c < MATRIX_COLS; c++) { | 540 | for (int c = 0; c < MATRIX_COLS; c++) { |
