aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2013-02-01 14:48:11 +0900
committertmk <nobody@nowhere>2013-02-01 14:48:11 +0900
commit1d7962ba8a20323dc13cc913381608e117afaeb4 (patch)
tree7f345a164f79364a3d7178be8b828d648b3e6c8a /common
parentd95463f2e0369dc0e28497bb923b3012fb09e900 (diff)
downloadqmk_firmware-1d7962ba8a20323dc13cc913381608e117afaeb4.tar.gz
qmk_firmware-1d7962ba8a20323dc13cc913381608e117afaeb4.zip
Add user defined function to action.
Diffstat (limited to 'common')
-rw-r--r--common/action.c46
-rw-r--r--common/action.h47
-rw-r--r--common/keyboard.h1
-rw-r--r--common/keymap.c2
-rw-r--r--common/keymap.h8
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
113static bool waiting_buffer_has_anykey_pressed(void) 113bool 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 */
25void action_exec(keyevent_t event);
26
27
28/* Struct to record event and tap count */
29typedef 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 */
72typedef struct {
73 keyevent_t event;
74 uint8_t tap_count;
75} keyrecord_t;
76
77
78/* execute action per keyevent */
79void action_exec(keyevent_t event);
80typedef void (*action_func_t)(keyevent_t event, uint8_t opt); // TODO:no need?
81void 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);
94bool sending_anykey(void); 92bool sending_anykey(void);
95void layer_switch(uint8_t new_layer); 93void layer_switch(uint8_t new_layer);
96bool is_tap_key(key_t key); 94bool is_tap_key(key_t key);
95bool waiting_buffer_has_anykey_pressed(void);
97 96
98 97
99 98
@@ -203,9 +202,6 @@ ACT_FUNCTION(1111):
2031111| address(12) Function? 2021111| address(12) Function?
2041111|opt | id(8) Function? 2031111|opt | id(8) Function?
205 204
206TODO: 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 */
210enum action_kind_id { 206enum 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
229enum acion_param { 225enum params {
230 ONE_SHOT = 0x00, 226 P_ONESHOT = 0x00,
227};
228
229enum 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?
35typedef union { 36typedef 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))
71void action_call_function(keyevent_t event, uint8_t id) 71void 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;
29extern uint8_t default_layer; 29extern 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 */
35action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col); 34action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col);
36 35
36/* user defined special function */
37void 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 */