X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=common%2Faction.h;h=ead917983cb646c20430ceb486b8f451fa60fc00;hb=9a106537f64fe61af6048b41262f002ce6a716d9;hp=d6530df42ee48fabaf37e750643e67b699baf4d6;hpb=d95463f2e0369dc0e28497bb923b3012fb09e900;p=max%2Ftmk_keyboard.git diff --git a/common/action.h b/common/action.h index d6530df4..ead91798 100644 --- a/common/action.h +++ b/common/action.h @@ -19,11 +19,28 @@ along with this program. If not, see . #include "keyboard.h" #include "keycode.h" +#include "action_macro.h" +/* Struct to record event and tap count */ +typedef union { + struct { + bool interrupted :1; + bool reserved2 :1; + bool reserved1 :1; + bool reserved0 :1; + uint8_t count :4; + }; +} tap_t; + +typedef struct { + keyevent_t event; + tap_t tap; +} keyrecord_t; + /* Action struct. * - * In avr-gcc bit field seems to be assigned from LSB(bit0) to MSB(bit15). + * In avr-gcc bit field seems to be assigned from LSB(bit0) to MSB(bit15). * AVR looks like a little endian in avr-gcc. * * NOTE: not portable across compiler/endianness? @@ -39,27 +56,27 @@ typedef union { uint16_t code; struct action_kind { uint16_t param :12; - uint16_t id :4; + uint8_t id :4; } kind; struct action_key { - uint16_t code :8; - uint16_t mods :4; - uint16_t kind :4; + uint8_t code :8; + uint8_t mods :4; + uint8_t kind :4; } key; struct action_layer { - uint16_t code :8; - uint16_t opt :4; - uint16_t kind :4; + uint8_t code :8; + uint8_t val :4; + uint8_t kind :4; } layer; struct action_usage { uint16_t code :10; - uint16_t page :2; - uint16_t kind :4; + uint8_t page :2; + uint8_t kind :4; } usage; struct action_command { - uint16_t id :8; - uint16_t option :4; - uint16_t kind :4; + uint8_t id :8; + uint8_t opt :4; + uint8_t kind :4; } command; struct action_function { uint8_t id :8; @@ -68,18 +85,19 @@ typedef union { } func; } action_t; -/* Struct to record action and tap count */ -typedef struct { - keyevent_t event; - uint8_t tap_count; -} keyrecord_t; -/* execute action per keyevent */ +/* Execute action per keyevent */ void action_exec(keyevent_t event); -typedef void (*action_func_t)(keyevent_t event, uint8_t opt); // TODO:no need? -void action_call_function(keyevent_t event, uint8_t id); // TODO: action function +/* action for key */ +action_t action_for_key(uint8_t layer, key_t key); + +/* macro */ +const prog_macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt); + +/* user defined special function */ +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt); /* * Utilities for actions. @@ -94,7 +112,7 @@ void clear_keyboard_but_mods(void); bool sending_anykey(void); void layer_switch(uint8_t new_layer); bool is_tap_key(key_t key); - +bool waiting_buffer_has_anykey_pressed(void); @@ -103,109 +121,96 @@ bool is_tap_key(key_t key); * ============ * 16bit code: action_kind(4bit) + action_parameter(12bit) * -Keyboard Keys -------------- -ACT_LMODS(0000): -0000|0000|000000|00 No action -0000|0000| keycode Key -0000|mods|000000|00 Left mods -0000|mods| keycode Key & Left mods - -ACT_RMODS(0001): -0001|0000|000000|00 No action -0001|0000| keycode Key(no used) -0001|mods|000000|00 Right mods -0001|mods| keycode Key & Right mods - -ACT_LMODS_TAP(0010): -0010|mods|000000|00 Left mods OneShot -0010|mods|000000|01 (reserved) -0010|mods|000000|10 (reserved) -0010|mods|000000|11 (reserved) -0010|mods| keycode Left mods + tap Key - -ACT_RMODS_TAP(0011): -0011|mods|000000|00 Right mods OneShot -0011|mods|000000|01 (reserved) -0011|mods|000000|10 (reserved) -0011|mods|000000|11 (reserved) -0011|mods| keycode Right mods + tap Key - - -Other HID Usage ---------------- -This action handles other usages than keyboard. -ACT_USAGE(0100): -0100|00| usage(10) System control(0x80) - General Desktop page(0x01) -0100|01| usage(10) Consumer control(0x01) - Consumer page(0x0C) -0100|10| usage(10) (reserved) -0100|11| usage(10) (reserved) - - -Mouse Keys ----------- -TODO: can be combined with 'Other HID Usage'? to save action kind id. -ACT_MOUSEKEY(0110): -0101|XXXX| keycode Mouse key - - -Layer Actions -------------- -TODO: reconsider layer methods. -1 momemtary + tap key up: L, down: default -1 bitwise + tap key up: xor B, down: xor B -3 momemtary go + tap key? up: X, down: -3 toggle(mementary back) + tap key? up: down: Y -3 no tap up: X, down: Y - -ACT_LAYER_PRESSED(1000): Set layer on key pressed -ACT_LAYER_RELEASED(1001): Set layer on key released -ACT_LAYER_BIT(1010): On/Off layer bit -ACT_LAYER_EXT(1011): Extentions - -1000|LLLL|0000 0000 set layer L when pressed -1001|LLLL|0000 0000 set layer L when released -1010|BBBB|0000 0000 on/off bit B when pressed/released -1011|0000|0000 0000 set default layer when pressed -1011|0001|0000 0000 set default layer when released - -1000|LLLL|1111 0000 set layer L when pressed + tap toggle -1001|LLLL|1111 0000 set layer L when released + tap toggle -1010|BBBB|1111 0000 on/off bit B when pressed/released + tap toggle -1011|0000|1111 0000 set default layer when pressed + tap toggle -1011|0001|1111 0000 set default layer when released + tap toggle - -1000|LLLL|1111 1111 set L to default layer when pressed -1001|LLLL|1111 1111 set L to default layer when released -1010|BBBB|1111 1111 on/off bit B of default layer when pressed/released -1011|0000|1111 1111 set current to default layer when pressed -1011|0001|1111 1111 set current to default layer when released - -1000|LLLL| keycode set layer L when pressed + tap key -1001|LLLL| keyocde set layer L when released + tap key -1010|BBBB| keyocde on/off bit B when pressed/released + tap key -1011|0000| keyocde set default layer when pressed + tap key -1011|0001| keyocde set default layer when released + tap key - - -Extensions(11XX) ----------------- -NOTE: NOT FIXED - -ACT_MACRO(1100): -1100|opt | id(8) Macro play? -1100|1111| id(8) Macro record? - -ACT_COMMAND(1110): -1110|opt | id(8) Built-in Command exec - -ACT_FUNCTION(1111): -1111| address(12) Function? -1111|opt | id(8) Function? - -TODO: modifier + function by tap? - for example: LShift + '('[Shift+9] and RShift + ')'[Shift+0] - http://deskthority.net/workshop-f7/tmk-keyboard-firmware-collection-t4478.html#p90052 + * Keyboard Keys(00XX) + * ------------------- + * ACT_LMODS(0000): + * 0000|0000|000000|00 No action + * 0000|0000|000000|01 Transparent + * 0000|0000| keycode Key + * 0000|mods|000000|00 Left mods + * 0000|mods| keycode Key & Left mods + * + * ACT_RMODS(0001): + * 0001|0000|000000|00 No action(not used) + * 0001|0000|000000|01 Transparent(not used) + * 0001|0000| keycode Key(no used) + * 0001|mods|000000|00 Right mods + * 0001|mods| keycode Key & Right mods + * + * ACT_LMODS_TAP(0010): + * 0010|mods|000000|00 Left mods OneShot + * 0010|mods|000000|01 (reserved) + * 0010|mods|000000|10 (reserved) + * 0010|mods|000000|11 (reserved) + * 0010|mods| keycode Left mods + tap Key + * + * ACT_RMODS_TAP(0011): + * 0011|mods|000000|00 Right mods OneShot + * 0011|mods|000000|01 (reserved) + * 0011|mods|000000|10 (reserved) + * 0011|mods|000000|11 (reserved) + * 0011|mods| keycode Right mods + tap Key + * + * + * Other keys(01XX) + * -------------------- + * This action handles other usages than keyboard. + * ACT_USAGE(0100): + * 0100|00| usage(10) System control(0x80) - General Desktop page(0x01) + * 0100|01| usage(10) Consumer control(0x01) - Consumer page(0x0C) + * 0100|10| usage(10) (reserved) + * 0100|11| usage(10) (reserved) + * + * ACT_MOUSEKEY(0110): + * 0101|XXXX| keycode Mouse key + * + * + * Layer Actions(10XX) + * ------------------- + * ACT_KEYMAP: + * 1000|--xx|0000 0000 Clear keyamp and overlay + * 1000|LLLL|0000 00xx Reset default layer and clear keymap and overlay + * 1000|LLLL| keycode Invert with tap key + * 1000|LLLL|1111 0000 Invert with tap toggle + * 1000|LLLL|1111 00xx Invert[^= 1<>4 | (mods)) & 0x0F) -/* Key */ +/* + * Key + */ #define ACTION_KEY(key) ACTION(ACT_LMODS, key) /* Mods & key */ -#define ACTION_LMODS(mods) ACTION(ACT_LMODS, (mods)<<8 | 0x00) -#define ACTION_LMODS_KEY(mods, key) ACTION(ACT_LMODS, (mods)<<8 | (key)) -#define ACTION_RMODS(mods) ACTION(ACT_RMODS, (mods)<<8 | 0x00) -#define ACTION_RMODS_KEY(mods, key) ACTION(ACT_RMODS, (mods)<<8 | (key)) -/* Mod & key */ +#define ACTION_LMODS(mods) ACTION(ACT_LMODS, MODS4(mods)<<8 | 0x00) +#define ACTION_LMODS_KEY(mods, key) ACTION(ACT_LMODS, MODS4(mods)<<8 | (key)) +#define ACTION_RMODS(mods) ACTION(ACT_RMODS, MODS4(mods)<<8 | 0x00) +#define ACTION_RMODS_KEY(mods, key) ACTION(ACT_RMODS, MODS4(mods)<<8 | (key)) #define ACTION_LMOD(mod) ACTION(ACT_LMODS, MODS4(MOD_BIT(mod))<<8 | 0x00) #define ACTION_LMOD_KEY(mod, key) ACTION(ACT_LMODS, MODS4(MOD_BIT(mod))<<8 | (key)) #define ACTION_RMOD(mod) ACTION(ACT_RMODS, MODS4(MOD_BIT(mod))<<8 | 0x00) #define ACTION_RMOD_KEY(mod, key) ACTION(ACT_RMODS, MODS4(MOD_BIT(mod))<<8 | (key)) - -/* Mods + Tap key */ +/* Tap key */ +enum mods_codes { + MODS_ONESHOT = 0x00, +}; #define ACTION_LMODS_TAP_KEY(mods, key) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | (key)) -#define ACTION_LMODS_ONESHOT(mods) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | ONE_SHOT) +#define ACTION_LMODS_ONESHOT(mods) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | MODS_ONESHOT) #define ACTION_RMODS_TAP_KEY(mods, key) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | (key)) -#define ACTION_RMODS_ONESHOT(mods) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | ONE_SHOT) -/* Mod + Tap key */ +#define ACTION_RMODS_ONESHOT(mods) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | MODS_ONESHOT) #define ACTION_LMOD_TAP_KEY(mod, key) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key)) -#define ACTION_LMOD_ONESHOT(mod) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | ONE_SHOT) +#define ACTION_LMOD_ONESHOT(mod) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | MODS_ONESHOT) #define ACTION_RMOD_TAP_KEY(mod, key) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key)) -#define ACTION_RMOD_ONESHOT(mod) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | ONE_SHOT) - -// TODO: contemplate about layer action -/* Switch current layer */ -#define ACTION_LAYER_SET(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0x00) -#define ACTION_LAYER_SET_ON_PRESSED(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0x00) -#define ACTION_LAYER_SET_ON_RELEASED(layer) ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0x00) -#define ACTION_LAYER_BIT(bits) ACTION(ACT_LAYER_BIT, (bits)<<8 | 0x00) -#define ACTION_LAYER_SET_DEFAULT ACTION(ACT_LAYER_EXT, 0x0<<8 | 0x00) -#define ACTION_LAYER_RETURN_DEFAULT ACTION(ACT_LAYER_EXT, 0x1<<8 | 0x00) -#define ACTION_LAYER_SET_DEFAULT_ON_PRESSED ACTION(ACT_LAYER_EXT, 0x0<<8 | 0x00) -#define ACTION_LAYER_SET_DEFAULT_ON_RELEASED ACTION(ACT_LAYER_EXT, 0x1<<8 | 0x00) -/* Switch default layer */ -#define ACTION_LAYER_DEFAULT_SET(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0xFF) -#define ACTION_LAYER_DEFAULT_SET_ON_PRESSED(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0xFF) -#define ACTION_LAYER_DEFAULT_SET_ON_RELEASED(layer) ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0xFF) -#define ACTION_LAYER_DEFAULT_BIT(bits) ACTION(ACT_LAYER_BIT, (bits)<<8 | 0xFF) -#define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_PRESSED ACTION(ACT_LAYER_EXT, 0x0<<8 | 0xFF) -#define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_RELEASED ACTION(ACT_LAYER_EXT, 0x1<<8 | 0xFF) -/* Layer switch with tap key */ -#define ACTION_LAYER_SET_TAP_KEY(layer, key) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | (key)) -#define ACTION_LAYER_BIT_TAP_KEY(bits, key) ACTION(ACT_LAYER_BIT, (bits)<<8 | (key)) -#define ACTION_LAYER_DEFAULT_SET_TAP_KEY(key) ACTION(ACT_LAYER_EXT, 0x0<<8 | (key)) -/* Layer switch with tap toggle */ -#define ACTION_LAYER_SET_ON_PRESSED_TAP_TOGGLE(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0xF0) -#define ACTION_LAYER_SET_ON_RELEASED_TAP_TOGGLE(layer) ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0xF0) -#define ACTION_LAYER_BIT_TAP_TOGGLE(layer) ACTION(ACT_LAYER_BIT, (layer)<<8 | 0xF0) -#define ACTION_LAYER_DEFAULT_TAP_TOGGLE ACTION(ACT_LAYER_EXT, 0x0<<8 | 0xF0) +#define ACTION_RMOD_ONESHOT(mod) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | MODS_ONESHOT) /* HID Usage */ -#define ACTION_USAGE_PAGE_SYSTEM 0 -#define ACTION_USAGE_PAGE_CONSUMER 1 -#define ACTION_USAGE_SYSTEM(id) ACTION(ACT_USAGE, ACTION_USAGE_PAGE_SYSTEM<<10 | (id)) -#define ACTION_USAGE_CONSUMER(id) ACTION(ACT_USAGE, ACTION_USAGE_PAGE_CONSUMER<<10 | (id)) +enum usage_pages { + PAGE_SYSTEM, + PAGE_CONSUMER +}; +#define ACTION_USAGE_SYSTEM(id) ACTION(ACT_USAGE, PAGE_SYSTEM<<10 | (id)) +#define ACTION_USAGE_CONSUMER(id) ACTION(ACT_USAGE, PAGE_CONSUMER<<10 | (id)) /* Mousekey */ #define ACTION_MOUSEKEY(key) ACTION(ACT_MOUSEKEY, key) + + +/* Layer Actions: + * Invert layer ^= (1<