X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=common%2Faction.h;h=4892cc7fd9bb7dc74f0b2e24045c1ee2d25fa2ae;hb=0368936060fbc32395508b09c76b620828d36db1;hp=ed3fff6c290c91056c5449b1b935f7af4fcbca70;hpb=1e3e41a2c9ed8b2f7d44be0aed5d96ed557fa13d;p=max%2Ftmk_keyboard.git diff --git a/common/action.h b/common/action.h index ed3fff6c..4892cc7f 100644 --- a/common/action.h +++ b/common/action.h @@ -18,11 +18,18 @@ along with this program. If not, see . #define ACTION_H #include "keyboard.h" +#include "keycode.h" +/* Struct to record event and tap count */ +typedef struct { + keyevent_t event; + uint8_t tap_count; +} 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? @@ -38,27 +45,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; @@ -67,18 +74,16 @@ 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); + +/* user defined special function */ +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt); /* * Utilities for actions. @@ -93,7 +98,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); @@ -102,101 +107,101 @@ 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 -0010|mods|000000|00 Left mods Momentary -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 Momentary -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 ----------- -ACT_MOUSEKEY(0110): -0101|XXXX| keycode Mouse key - - -Layer Actions -------------- -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 + * ------------- + * 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 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 + * ---------- + * ACT_MOUSEKEY(0110): + * 0101|XXXX| keycode Mouse key + * + * + * Layer Actions + * ------------- + * 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) +#define MODS4(mods) (((mods)>>4 | (mods)) & 0x0F) -/* Key & Mods */ +/* + * Key + */ #define ACTION_KEY(key) ACTION(ACT_LMODS, 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)) - -/* Mods + Tap key */ -#define ACTION_LMODS_TAP(mods, key) ACTION(ACT_LMODS_TAP, MOD_BITS(mods)<<8 | (key)) -#define ACTION_LMODS_ONESHOT(mods) ACTION(ACT_LMODS_TAP, MOD_BITS(mods)<<8 | ONE_SHOT) -#define ACTION_RMODS_TAP(mods, key) ACTION(ACT_RMODS_TAP, MOD_BITS(mods)<<8 | (key)) -#define ACTION_RMODS_ONESHOT(mods) ACTION(ACT_RMODS_TAP, MOD_BITS(mods)<<8 | ONE_SHOT) - -/* Switch current layer */ -#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, (layer)<<8 | 0x00) -#define ACTION_LAYER_TO_DEFAULT_ON_PRESSED ACTION(ACT_LAYER_EXT, 0x0<<8 | 0x00) -#define ACTION_LAYER_TO_DEFAULT_ON_RELEASED ACTION(ACT_LAYER_EXT, 0x1<<8 | 0x00) -/* Switch default layer */ -#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, (layer)<<8 | (key)) -#define ACTION_LAYER_DEFAULT_SET_TAP_KEY(key) ACTION(ACT_LAYER_EXT, 0x0<<8 | (key)) -/* 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) - -/* 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)) +/* Mods & 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)) +/* 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 | 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 | 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 | 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 | MODS_ONESHOT) + + +/* Layer Operation: + * Invert layer ^= (1<