diff options
| author | tmk <nobody@nowhere> | 2013-02-01 14:48:11 +0900 |
|---|---|---|
| committer | tmk <nobody@nowhere> | 2013-02-01 14:48:11 +0900 |
| commit | 1d7962ba8a20323dc13cc913381608e117afaeb4 (patch) | |
| tree | 7f345a164f79364a3d7178be8b828d648b3e6c8a /common | |
| parent | d95463f2e0369dc0e28497bb923b3012fb09e900 (diff) | |
| download | qmk_firmware-1d7962ba8a20323dc13cc913381608e117afaeb4.tar.gz qmk_firmware-1d7962ba8a20323dc13cc913381608e117afaeb4.zip | |
Add user defined function to action.
Diffstat (limited to 'common')
| -rw-r--r-- | common/action.c | 46 | ||||
| -rw-r--r-- | common/action.h | 47 | ||||
| -rw-r--r-- | common/keyboard.h | 1 | ||||
| -rw-r--r-- | common/keymap.c | 2 | ||||
| -rw-r--r-- | common/keymap.h | 8 |
5 files changed, 54 insertions, 50 deletions
diff --git a/common/action.c b/common/action.c index d1f493fe0..cb44e272a 100644 --- a/common/action.c +++ b/common/action.c | |||
| @@ -110,7 +110,7 @@ static bool waiting_buffer_typed(keyevent_t event) | |||
| 110 | } | 110 | } |
| 111 | #endif | 111 | #endif |
| 112 | 112 | ||
| 113 | static bool waiting_buffer_has_anykey_pressed(void) | 113 | bool waiting_buffer_has_anykey_pressed(void) |
| 114 | { | 114 | { |
| 115 | for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) { | 115 | for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) { |
| 116 | if (waiting_buffer[i].event.pressed) return true; | 116 | if (waiting_buffer[i].event.pressed) return true; |
| @@ -256,7 +256,7 @@ static void process_action(keyrecord_t *record) | |||
| 256 | debug("MODS_TAP: Oneshot: start\n"); | 256 | debug("MODS_TAP: Oneshot: start\n"); |
| 257 | oneshot_start(mods, event.time); | 257 | oneshot_start(mods, event.time); |
| 258 | } | 258 | } |
| 259 | else if (tap_count == 5) { | 259 | else if (tap_count == TAPPING_TOGGLE) { |
| 260 | debug("MODS_TAP: Oneshot: toggle\n"); | 260 | debug("MODS_TAP: Oneshot: toggle\n"); |
| 261 | oneshot_toggle(); | 261 | oneshot_toggle(); |
| 262 | } | 262 | } |
| @@ -356,7 +356,7 @@ static void process_action(keyrecord_t *record) | |||
| 356 | switch (action.layer.code) { | 356 | switch (action.layer.code) { |
| 357 | case 0x00: | 357 | case 0x00: |
| 358 | if (event.pressed) { | 358 | if (event.pressed) { |
| 359 | layer_switch(action.layer.opt); | 359 | layer_switch(action.layer.val); |
| 360 | } | 360 | } |
| 361 | //TODO: this is ok? | 361 | //TODO: this is ok? |
| 362 | else { | 362 | else { |
| @@ -367,19 +367,19 @@ static void process_action(keyrecord_t *record) | |||
| 367 | // tap toggle | 367 | // tap toggle |
| 368 | if (event.pressed) { | 368 | if (event.pressed) { |
| 369 | if (tap_count < TAPPING_TOGGLE) { | 369 | if (tap_count < TAPPING_TOGGLE) { |
| 370 | layer_switch(action.layer.opt); | 370 | layer_switch(action.layer.val); |
| 371 | } | 371 | } |
| 372 | } else { | 372 | } else { |
| 373 | if (tap_count >= TAPPING_TOGGLE) { | 373 | if (tap_count >= TAPPING_TOGGLE) { |
| 374 | debug("LAYER_PRESSED: tap toggle.\n"); | 374 | debug("LAYER_PRESSED: tap toggle.\n"); |
| 375 | layer_switch(action.layer.opt); | 375 | layer_switch(action.layer.val); |
| 376 | } | 376 | } |
| 377 | } | 377 | } |
| 378 | break; | 378 | break; |
| 379 | case 0xFF: | 379 | case 0xFF: |
| 380 | // change default layer | 380 | // change default layer |
| 381 | if (event.pressed) { | 381 | if (event.pressed) { |
| 382 | default_layer = action.layer.opt; | 382 | default_layer = action.layer.val; |
| 383 | layer_switch(default_layer); | 383 | layer_switch(default_layer); |
| 384 | } | 384 | } |
| 385 | break; | 385 | break; |
| @@ -391,7 +391,7 @@ static void process_action(keyrecord_t *record) | |||
| 391 | register_code(action.layer.code); | 391 | register_code(action.layer.code); |
| 392 | } else { | 392 | } else { |
| 393 | debug("LAYER_PRESSED: No tap: layer_switch\n"); | 393 | debug("LAYER_PRESSED: No tap: layer_switch\n"); |
| 394 | layer_switch(action.layer.opt); | 394 | layer_switch(action.layer.val); |
| 395 | } | 395 | } |
| 396 | } else { | 396 | } else { |
| 397 | if (tap_count > 0) { | 397 | if (tap_count > 0) { |
| @@ -411,7 +411,7 @@ static void process_action(keyrecord_t *record) | |||
| 411 | switch (action.layer.code) { | 411 | switch (action.layer.code) { |
| 412 | case 0x00: | 412 | case 0x00: |
| 413 | if (!event.pressed) { | 413 | if (!event.pressed) { |
| 414 | layer_switch(action.layer.opt); | 414 | layer_switch(action.layer.val); |
| 415 | } | 415 | } |
| 416 | break; | 416 | break; |
| 417 | case 0xF0: | 417 | case 0xF0: |
| @@ -419,18 +419,18 @@ static void process_action(keyrecord_t *record) | |||
| 419 | if (event.pressed) { | 419 | if (event.pressed) { |
| 420 | if (tap_count >= TAPPING_TOGGLE) { | 420 | if (tap_count >= TAPPING_TOGGLE) { |
| 421 | debug("LAYER_RELEASED: tap toggle.\n"); | 421 | debug("LAYER_RELEASED: tap toggle.\n"); |
| 422 | layer_switch(action.layer.opt); | 422 | layer_switch(action.layer.val); |
| 423 | } | 423 | } |
| 424 | } else { | 424 | } else { |
| 425 | if (tap_count < TAPPING_TOGGLE) { | 425 | if (tap_count < TAPPING_TOGGLE) { |
| 426 | layer_switch(action.layer.opt); | 426 | layer_switch(action.layer.val); |
| 427 | } | 427 | } |
| 428 | } | 428 | } |
| 429 | break; | 429 | break; |
| 430 | case 0xFF: | 430 | case 0xFF: |
| 431 | // change default layer | 431 | // change default layer |
| 432 | if (!event.pressed) { | 432 | if (!event.pressed) { |
| 433 | default_layer = action.layer.opt; | 433 | default_layer = action.layer.val; |
| 434 | layer_switch(default_layer); | 434 | layer_switch(default_layer); |
| 435 | } | 435 | } |
| 436 | break; | 436 | break; |
| @@ -449,7 +449,7 @@ static void process_action(keyrecord_t *record) | |||
| 449 | unregister_code(action.layer.code); | 449 | unregister_code(action.layer.code); |
| 450 | } else { | 450 | } else { |
| 451 | debug("LAYER_RELEASED: No tap: layer_switch\n"); | 451 | debug("LAYER_RELEASED: No tap: layer_switch\n"); |
| 452 | layer_switch(action.layer.opt); | 452 | layer_switch(action.layer.val); |
| 453 | } | 453 | } |
| 454 | } | 454 | } |
| 455 | break; | 455 | break; |
| @@ -459,9 +459,9 @@ static void process_action(keyrecord_t *record) | |||
| 459 | switch (action.layer.code) { | 459 | switch (action.layer.code) { |
| 460 | case 0x00: | 460 | case 0x00: |
| 461 | if (event.pressed) { | 461 | if (event.pressed) { |
| 462 | layer_switch(current_layer ^ action.layer.opt); | 462 | layer_switch(current_layer ^ action.layer.val); |
| 463 | } else { | 463 | } else { |
| 464 | layer_switch(current_layer ^ action.layer.opt); | 464 | layer_switch(current_layer ^ action.layer.val); |
| 465 | } | 465 | } |
| 466 | break; | 466 | break; |
| 467 | case 0xF0: | 467 | case 0xF0: |
| @@ -469,22 +469,22 @@ static void process_action(keyrecord_t *record) | |||
| 469 | if (event.pressed) { | 469 | if (event.pressed) { |
| 470 | if (tap_count < TAPPING_TOGGLE) { | 470 | if (tap_count < TAPPING_TOGGLE) { |
| 471 | debug("LAYER_BIT: tap toggle(press).\n"); | 471 | debug("LAYER_BIT: tap toggle(press).\n"); |
| 472 | layer_switch(current_layer ^ action.layer.opt); | 472 | layer_switch(current_layer ^ action.layer.val); |
| 473 | } | 473 | } |
| 474 | } else { | 474 | } else { |
| 475 | if (tap_count <= TAPPING_TOGGLE) { | 475 | if (tap_count <= TAPPING_TOGGLE) { |
| 476 | debug("LAYER_BIT: tap toggle(release).\n"); | 476 | debug("LAYER_BIT: tap toggle(release).\n"); |
| 477 | layer_switch(current_layer ^ action.layer.opt); | 477 | layer_switch(current_layer ^ action.layer.val); |
| 478 | } | 478 | } |
| 479 | } | 479 | } |
| 480 | break; | 480 | break; |
| 481 | case 0xFF: | 481 | case 0xFF: |
| 482 | // change default layer | 482 | // change default layer |
| 483 | if (event.pressed) { | 483 | if (event.pressed) { |
| 484 | default_layer = current_layer ^ action.layer.opt; | 484 | default_layer = current_layer ^ action.layer.val; |
| 485 | layer_switch(default_layer); | 485 | layer_switch(default_layer); |
| 486 | } else { | 486 | } else { |
| 487 | default_layer = current_layer ^ action.layer.opt; | 487 | default_layer = current_layer ^ action.layer.val; |
| 488 | layer_switch(default_layer); | 488 | layer_switch(default_layer); |
| 489 | } | 489 | } |
| 490 | break; | 490 | break; |
| @@ -496,7 +496,7 @@ static void process_action(keyrecord_t *record) | |||
| 496 | register_code(action.layer.code); | 496 | register_code(action.layer.code); |
| 497 | } else { | 497 | } else { |
| 498 | debug("LAYER_BIT: No tap: layer_switch(bit on)\n"); | 498 | debug("LAYER_BIT: No tap: layer_switch(bit on)\n"); |
| 499 | layer_switch(current_layer ^ action.layer.opt); | 499 | layer_switch(current_layer ^ action.layer.val); |
| 500 | } | 500 | } |
| 501 | } else { | 501 | } else { |
| 502 | if (IS_TAPPING_KEY(event.key) && tap_count > 0) { | 502 | if (IS_TAPPING_KEY(event.key) && tap_count > 0) { |
| @@ -504,14 +504,14 @@ static void process_action(keyrecord_t *record) | |||
| 504 | unregister_code(action.layer.code); | 504 | unregister_code(action.layer.code); |
| 505 | } else { | 505 | } else { |
| 506 | debug("LAYER_BIT: No tap: layer_switch(bit off)\n"); | 506 | debug("LAYER_BIT: No tap: layer_switch(bit off)\n"); |
| 507 | layer_switch(current_layer ^ action.layer.opt); | 507 | layer_switch(current_layer ^ action.layer.val); |
| 508 | } | 508 | } |
| 509 | } | 509 | } |
| 510 | break; | 510 | break; |
| 511 | } | 511 | } |
| 512 | break; | 512 | break; |
| 513 | case ACT_LAYER_EXT: | 513 | case ACT_LAYER_EXT: |
| 514 | switch (action.layer.opt) { | 514 | switch (action.layer.val) { |
| 515 | case 0x00: | 515 | case 0x00: |
| 516 | // set default layer when pressed | 516 | // set default layer when pressed |
| 517 | switch (action.layer.code) { | 517 | switch (action.layer.code) { |
| @@ -620,7 +620,7 @@ static void process_action(keyrecord_t *record) | |||
| 620 | break; | 620 | break; |
| 621 | case ACT_FUNCTION: | 621 | case ACT_FUNCTION: |
| 622 | // TODO | 622 | // TODO |
| 623 | action_call_function(event, action.func.id); | 623 | keymap_call_function(record, action.func.id); |
| 624 | break; | 624 | break; |
| 625 | default: | 625 | default: |
| 626 | break; | 626 | break; |
| @@ -944,7 +944,7 @@ bool is_tap_key(key_t key) | |||
| 944 | } | 944 | } |
| 945 | return false; | 945 | return false; |
| 946 | case ACT_FUNCTION: | 946 | case ACT_FUNCTION: |
| 947 | if (action.func.opt & 0x1) { | 947 | if (action.func.opt & O_TAP) { |
| 948 | return true; | 948 | return true; |
| 949 | } | 949 | } |
| 950 | return false; | 950 | return false; |
diff --git a/common/action.h b/common/action.h index d6530df42..b657aa540 100644 --- a/common/action.h +++ b/common/action.h | |||
| @@ -21,6 +21,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 21 | #include "keycode.h" | 21 | #include "keycode.h" |
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | /* Execute action per keyevent */ | ||
| 25 | void action_exec(keyevent_t event); | ||
| 26 | |||
| 27 | |||
| 28 | /* Struct to record event and tap count */ | ||
| 29 | typedef struct { | ||
| 30 | keyevent_t event; | ||
| 31 | uint8_t tap_count; | ||
| 32 | } keyrecord_t; | ||
| 33 | |||
| 24 | /* Action struct. | 34 | /* Action struct. |
| 25 | * | 35 | * |
| 26 | * In avr-gcc bit field seems to be assigned from LSB(bit0) to MSB(bit15). | 36 | * In avr-gcc bit field seems to be assigned from LSB(bit0) to MSB(bit15). |
| @@ -48,7 +58,7 @@ typedef union { | |||
| 48 | } key; | 58 | } key; |
| 49 | struct action_layer { | 59 | struct action_layer { |
| 50 | uint16_t code :8; | 60 | uint16_t code :8; |
| 51 | uint16_t opt :4; | 61 | uint16_t val :4; |
| 52 | uint16_t kind :4; | 62 | uint16_t kind :4; |
| 53 | } layer; | 63 | } layer; |
| 54 | struct action_usage { | 64 | struct action_usage { |
| @@ -58,7 +68,7 @@ typedef union { | |||
| 58 | } usage; | 68 | } usage; |
| 59 | struct action_command { | 69 | struct action_command { |
| 60 | uint16_t id :8; | 70 | uint16_t id :8; |
| 61 | uint16_t option :4; | 71 | uint16_t opt :4; |
| 62 | uint16_t kind :4; | 72 | uint16_t kind :4; |
| 63 | } command; | 73 | } command; |
| 64 | struct action_function { | 74 | struct action_function { |
| @@ -68,18 +78,6 @@ typedef union { | |||
| 68 | } func; | 78 | } func; |
| 69 | } action_t; | 79 | } action_t; |
| 70 | 80 | ||
| 71 | /* Struct to record action and tap count */ | ||
| 72 | typedef struct { | ||
| 73 | keyevent_t event; | ||
| 74 | uint8_t tap_count; | ||
| 75 | } keyrecord_t; | ||
| 76 | |||
| 77 | |||
| 78 | /* execute action per keyevent */ | ||
| 79 | void action_exec(keyevent_t event); | ||
| 80 | typedef void (*action_func_t)(keyevent_t event, uint8_t opt); // TODO:no need? | ||
| 81 | void action_call_function(keyevent_t event, uint8_t id); // TODO: action function | ||
| 82 | |||
| 83 | 81 | ||
| 84 | /* | 82 | /* |
| 85 | * Utilities for actions. | 83 | * Utilities for actions. |
| @@ -94,6 +92,7 @@ void clear_keyboard_but_mods(void); | |||
| 94 | bool sending_anykey(void); | 92 | bool sending_anykey(void); |
| 95 | void layer_switch(uint8_t new_layer); | 93 | void layer_switch(uint8_t new_layer); |
| 96 | bool is_tap_key(key_t key); | 94 | bool is_tap_key(key_t key); |
| 95 | bool waiting_buffer_has_anykey_pressed(void); | ||
| 97 | 96 | ||
| 98 | 97 | ||
| 99 | 98 | ||
| @@ -203,9 +202,6 @@ ACT_FUNCTION(1111): | |||
| 203 | 1111| address(12) Function? | 202 | 1111| address(12) Function? |
| 204 | 1111|opt | id(8) Function? | 203 | 1111|opt | id(8) Function? |
| 205 | 204 | ||
| 206 | TODO: modifier + function by tap? | ||
| 207 | for example: LShift + '('[Shift+9] and RShift + ')'[Shift+0] | ||
| 208 | http://deskthority.net/workshop-f7/tmk-keyboard-firmware-collection-t4478.html#p90052 | ||
| 209 | */ | 205 | */ |
| 210 | enum action_kind_id { | 206 | enum action_kind_id { |
| 211 | ACT_LMODS = 0b0000, | 207 | ACT_LMODS = 0b0000, |
| @@ -226,8 +222,12 @@ enum action_kind_id { | |||
| 226 | ACT_FUNCTION = 0b1111 | 222 | ACT_FUNCTION = 0b1111 |
| 227 | }; | 223 | }; |
| 228 | 224 | ||
| 229 | enum acion_param { | 225 | enum params { |
| 230 | ONE_SHOT = 0x00, | 226 | P_ONESHOT = 0x00, |
| 227 | }; | ||
| 228 | |||
| 229 | enum options { | ||
| 230 | O_TAP = 0x8, | ||
| 231 | }; | 231 | }; |
| 232 | 232 | ||
| 233 | 233 | ||
| @@ -251,14 +251,14 @@ enum acion_param { | |||
| 251 | 251 | ||
| 252 | /* Mods + Tap key */ | 252 | /* Mods + Tap key */ |
| 253 | #define ACTION_LMODS_TAP_KEY(mods, key) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | (key)) | 253 | #define ACTION_LMODS_TAP_KEY(mods, key) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | (key)) |
| 254 | #define ACTION_LMODS_ONESHOT(mods) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | ONE_SHOT) | 254 | #define ACTION_LMODS_ONESHOT(mods) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | P_ONESHOT) |
| 255 | #define ACTION_RMODS_TAP_KEY(mods, key) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | (key)) | 255 | #define ACTION_RMODS_TAP_KEY(mods, key) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | (key)) |
| 256 | #define ACTION_RMODS_ONESHOT(mods) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | ONE_SHOT) | 256 | #define ACTION_RMODS_ONESHOT(mods) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | P_ONESHOT) |
| 257 | /* Mod + Tap key */ | 257 | /* Mod + Tap key */ |
| 258 | #define ACTION_LMOD_TAP_KEY(mod, key) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key)) | 258 | #define ACTION_LMOD_TAP_KEY(mod, key) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key)) |
| 259 | #define ACTION_LMOD_ONESHOT(mod) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | ONE_SHOT) | 259 | #define ACTION_LMOD_ONESHOT(mod) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | P_ONESHOT) |
| 260 | #define ACTION_RMOD_TAP_KEY(mod, key) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key)) | 260 | #define ACTION_RMOD_TAP_KEY(mod, key) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key)) |
| 261 | #define ACTION_RMOD_ONESHOT(mod) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | ONE_SHOT) | 261 | #define ACTION_RMOD_ONESHOT(mod) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | P_ONESHOT) |
| 262 | 262 | ||
| 263 | // TODO: contemplate about layer action | 263 | // TODO: contemplate about layer action |
| 264 | /* Switch current layer */ | 264 | /* Switch current layer */ |
| @@ -304,5 +304,6 @@ enum acion_param { | |||
| 304 | 304 | ||
| 305 | /* Function */ | 305 | /* Function */ |
| 306 | #define ACTION_FUNCTION(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | id) | 306 | #define ACTION_FUNCTION(id, opt) ACTION(ACT_FUNCTION, (opt)<<8 | id) |
| 307 | #define ACTION_FUNCTION_TAP(id) ACTION(ACT_FUNCTION, O_TAP<<8 | id) | ||
| 307 | 308 | ||
| 308 | #endif /* ACTION_H */ | 309 | #endif /* ACTION_H */ |
diff --git a/common/keyboard.h b/common/keyboard.h index 32c1bf464..e1cab3119 100644 --- a/common/keyboard.h +++ b/common/keyboard.h | |||
| @@ -32,6 +32,7 @@ typedef struct { | |||
| 32 | uint8_t row; | 32 | uint8_t row; |
| 33 | } keypos_t; | 33 | } keypos_t; |
| 34 | 34 | ||
| 35 | // TODO: need raw? keypos_t -> key_t? | ||
| 35 | typedef union { | 36 | typedef union { |
| 36 | uint16_t raw; | 37 | uint16_t raw; |
| 37 | keypos_t pos; | 38 | keypos_t pos; |
diff --git a/common/keymap.c b/common/keymap.c index 415121308..40d20f684 100644 --- a/common/keymap.c +++ b/common/keymap.c | |||
| @@ -68,6 +68,6 @@ action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) | |||
| 68 | #endif | 68 | #endif |
| 69 | 69 | ||
| 70 | __attribute__ ((weak)) | 70 | __attribute__ ((weak)) |
| 71 | void action_call_function(keyevent_t event, uint8_t id) | 71 | void keymap_call_function(keyrecord_t *event, uint8_t id) |
| 72 | { | 72 | { |
| 73 | } | 73 | } |
diff --git a/common/keymap.h b/common/keymap.h index 748761551..e0fafeaf2 100644 --- a/common/keymap.h +++ b/common/keymap.h | |||
| @@ -29,11 +29,13 @@ extern uint8_t current_layer; | |||
| 29 | extern uint8_t default_layer; | 29 | extern uint8_t default_layer; |
| 30 | 30 | ||
| 31 | 31 | ||
| 32 | /* | 32 | /* action for key */ |
| 33 | * new keymap interface: action | 33 | // TODO: should use struct key_t? |
| 34 | */ | ||
| 35 | action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col); | 34 | action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col); |
| 36 | 35 | ||
| 36 | /* user defined special function */ | ||
| 37 | void keymap_call_function(keyrecord_t *record, uint8_t id); | ||
| 38 | |||
| 37 | 39 | ||
| 38 | #ifndef NO_LEGACY_KEYMAP_SUPPORT | 40 | #ifndef NO_LEGACY_KEYMAP_SUPPORT |
| 39 | /* keycode of key */ | 41 | /* keycode of key */ |
