at master 264 lines 9.6 kB view raw
1/* 2Copyright 2013 Jun Wako <wakojun@gmail.com> 3 4This program is free software: you can redistribute it and/or modify 5it under the terms of the GNU General Public License as published by 6the Free Software Foundation, either version 2 of the License, or 7(at your option) any later version. 8 9This program is distributed in the hope that it will be useful, 10but WITHOUT ANY WARRANTY; without even the implied warranty of 11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12GNU General Public License for more details. 13 14You should have received a copy of the GNU General Public License 15along with this program. If not, see <http://www.gnu.org/licenses/>. 16*/ 17 18#pragma once 19 20#include "modifiers.h" 21 22/** \brief Action codes 23 * 24 * 16bit code: action_kind(4bit) + action_parameter(12bit) 25 * 26 * Key Actions(00xx) 27 * ----------------- 28 * ACT_MODS(000r): 29 * 000r|0000|0000 0000 No action code 30 * 000r|0000|0000 0001 Transparent code 31 * 000r|0000| keycode Key 32 * 000r|mods|0000 0000 Modifiers 33 * 000r|mods| keycode Modifiers+Key(Modified key) 34 * r: Left/Right flag(Left:0, Right:1) 35 * 36 * ACT_MODS_TAP(001r): 37 * 001r|mods|0000 0000 Modifiers with OneShot 38 * 001r|mods|0000 0001 Modifiers with tap toggle 39 * 001r|mods|0000 00xx (reserved) 40 * 001r|mods| keycode Modifiers with Tap Key(Dual role) 41 * 42 * Other Keys(01xx) 43 * ---------------- 44 * ACT_USAGE(0100): TODO: Not needed? 45 * 0100|00| usage(10) System control(0x80) - General Desktop page(0x01) 46 * 0100|01| usage(10) Consumer control(0x01) - Consumer page(0x0C) 47 * 0100|10| usage(10) (reserved) 48 * 0100|11| usage(10) (reserved) 49 * 50 * ACT_MOUSEKEY(0101): TODO: Merge these two actions to conserve space? 51 * 0101|xxxx| keycode Mouse key 52 * 53 * ACT_SWAP_HANDS(0110): 54 * 0110|xxxx| keycode Swap hands (keycode on tap, or options) 55 * 56 * 0111|xxxx xxxx xxxx (reserved) 57 * 58 * Layer Actions(10xx) 59 * ------------------- 60 * ACT_LAYER(1000): 61 * 1000|oo00|pppE BBBB Default Layer Bitwise operation 62 * oo: operation(00:AND, 01:OR, 10:XOR, 11:SET) 63 * ppp: 4-bit chunk part(0-7) 64 * EBBBB: bits and extra bit 65 * 1000|ooee|pppE BBBB Layer Bitwise Operation 66 * oo: operation(00:AND, 01:OR, 10:XOR, 11:SET) 67 * ppp: 4-bit chunk part(0-7) 68 * EBBBB: bits and extra bit 69 * ee: on event(01:press, 10:release, 11:both) 70 * 71 * ACT_LAYER_MODS(1001): 72 * 1001|LLLL| mods Layer with modifiers held 73 * 74 * ACT_LAYER_TAP(101x): 75 * 101E|LLLL| keycode On/Off with tap key (0x00-DF)[TAP] 76 * 101E|LLLL|1110 mods On/Off with modifiers (0xE0-EF)[NOT TAP] 77 * 101E|LLLL|1111 0000 Invert with tap toggle (0xF0) [TAP] 78 * 101E|LLLL|1111 0001 On/Off (0xF1) [NOT TAP] 79 * 101E|LLLL|1111 0010 Off/On (0xF2) [NOT TAP] 80 * 101E|LLLL|1111 0011 Set/Clear (0xF3) [NOT TAP] 81 * 101E|LLLL|1111 0100 One Shot Layer (0xF4) [TAP] 82 * 101E|LLLL|1111 xxxx Reserved (0xF5-FF) 83 * ELLLL: layer 0-31(E: extra bit for layer 16-31) 84 */ 85enum action_kind_id { 86 /* Key Actions */ 87 ACT_MODS = 0b0000, 88 ACT_LMODS = 0b0000, 89 ACT_RMODS = 0b0001, 90 ACT_MODS_TAP = 0b0010, 91 ACT_LMODS_TAP = 0b0010, 92 ACT_RMODS_TAP = 0b0011, 93 /* Other Keys */ 94 ACT_USAGE = 0b0100, 95 ACT_MOUSEKEY = 0b0101, 96 /* One-hand Support */ 97 ACT_SWAP_HANDS = 0b0110, 98 /* Layer Actions */ 99 ACT_LAYER = 0b1000, 100 ACT_LAYER_MODS = 0b1001, 101 ACT_LAYER_TAP = 0b1010, /* Layer 0-15 */ 102 ACT_LAYER_TAP_EXT = 0b1011, /* Layer 16-31 */ 103}; 104 105/** \brief Action Code Struct 106 * 107 * NOTE: 108 * In avr-gcc bit field seems to be assigned from LSB(bit0) to MSB(bit15). 109 * AVR looks like a little endian in avr-gcc. 110 * Not portable across compiler/endianness? 111 * 112 * Byte order and bit order of 0x1234: 113 * Big endian: Little endian: 114 * -------------------- -------------------- 115 * FEDC BA98 7654 3210 0123 4567 89AB CDEF 116 * 0001 0010 0011 0100 0010 1100 0100 1000 117 * 0x12 0x34 0x34 0x12 118 */ 119typedef union { 120 uint16_t code; 121 struct action_kind { 122 uint16_t param : 12; 123 uint8_t id : 4; 124 } kind; 125 struct action_key { 126 uint8_t code : 8; 127 uint8_t mods : 4; 128 uint8_t kind : 4; 129 } key; 130 struct action_layer_bitop { 131 uint8_t bits : 4; 132 uint8_t xbit : 1; 133 uint8_t part : 3; 134 uint8_t on : 2; 135 uint8_t op : 2; 136 uint8_t kind : 4; 137 } layer_bitop; 138 struct action_layer_mods { 139 uint8_t mods : 8; 140 uint8_t layer : 4; 141 uint8_t kind : 4; 142 } layer_mods; 143 struct action_layer_tap { 144 uint8_t code : 8; 145 uint8_t val : 5; 146 uint8_t kind : 3; 147 } layer_tap; 148 struct action_usage { 149 uint16_t code : 10; 150 uint8_t page : 2; 151 uint8_t kind : 4; 152 } usage; 153 struct action_swap { 154 uint8_t code : 8; 155 uint8_t opt : 4; 156 uint8_t kind : 4; 157 } swap; 158} action_t; 159 160/* action utility */ 161#define ACTION_NO 0 162#define ACTION_TRANSPARENT 1 163#define ACTION(kind, param) ((kind) << 12 | (param)) 164 165enum mods_codes { 166 MODS_ONESHOT = 0x00, 167 MODS_TAP_TOGGLE = 0x01, 168}; 169#define ACTION_KEY(key) ACTION(ACT_MODS, (key)) 170#define ACTION_MODS(mods) ACTION(ACT_MODS, ((mods) & 0x1f) << 8 | 0) 171#define ACTION_MODS_KEY(mods, key) ACTION(ACT_MODS, ((mods) & 0x1f) << 8 | (key)) 172#define ACTION_MODS_TAP_KEY(mods, key) ACTION(ACT_MODS_TAP, ((mods) & 0x1f) << 8 | (key)) 173#define ACTION_MODS_ONESHOT(mods) ACTION(ACT_MODS_TAP, ((mods) & 0x1f) << 8 | MODS_ONESHOT) 174#define ACTION_MODS_TAP_TOGGLE(mods) ACTION(ACT_MODS_TAP, ((mods) & 0x1f) << 8 | MODS_TAP_TOGGLE) 175 176/** \brief Other Keys 177 */ 178enum usage_pages { 179 PAGE_SYSTEM, 180 PAGE_CONSUMER, 181}; 182 183#define ACTION_USAGE_SYSTEM(id) ACTION(ACT_USAGE, PAGE_SYSTEM << 10 | (id)) 184#define ACTION_USAGE_CONSUMER(id) ACTION(ACT_USAGE, PAGE_CONSUMER << 10 | (id)) 185#define ACTION_MOUSEKEY(key) ACTION(ACT_MOUSEKEY, key) 186 187/** \brief Layer Actions 188 */ 189enum layer_param_on { 190 ON_PRESS = 1, 191 ON_RELEASE = 2, 192 ON_BOTH = 3, 193}; 194 195/** \brief Layer Actions 196 */ 197enum layer_param_bit_op { 198 OP_BIT_AND = 0, 199 OP_BIT_OR = 1, 200 OP_BIT_XOR = 2, 201 OP_BIT_SET = 3, 202}; 203 204/** \brief Layer Actions 205 */ 206enum layer_param_tap_op { 207 OP_TAP_TOGGLE = 0xF0, 208 OP_ON_OFF, 209 OP_OFF_ON, 210 OP_SET_CLEAR, 211 OP_ONESHOT, 212}; 213#define ACTION_LAYER_BITOP(op, part, bits, on) ACTION(ACT_LAYER, (op) << 10 | (on) << 8 | (part) << 5 | ((bits) & 0x1f)) 214#define ACTION_LAYER_TAP(layer, key) ACTION(ACT_LAYER_TAP, (layer) << 8 | (key)) 215/* Default Layer */ 216#define ACTION_DEFAULT_LAYER_SET(layer) ACTION_DEFAULT_LAYER_BIT_SET((layer) / 4, 1 << ((layer) % 4)) 217/* Layer Operation */ 218#define ACTION_LAYER_CLEAR(on) ACTION_LAYER_BIT_AND(0, 0, (on)) 219#define ACTION_LAYER_MOMENTARY(layer) ACTION_LAYER_ON_OFF(layer) 220#define ACTION_LAYER_TOGGLE(layer) ACTION_LAYER_INVERT(layer, ON_RELEASE) 221#define ACTION_LAYER_INVERT(layer, on) ACTION_LAYER_BIT_XOR((layer) / 4, 1 << ((layer) % 4), (on)) 222#define ACTION_LAYER_ON(layer, on) ACTION_LAYER_BIT_OR((layer) / 4, 1 << ((layer) % 4), (on)) 223#define ACTION_LAYER_OFF(layer, on) ACTION_LAYER_BIT_AND((layer) / 4, ~(1 << ((layer) % 4)), (on)) 224#define ACTION_LAYER_GOTO(layer) ACTION_LAYER_SET(layer, ON_PRESS) 225#define ACTION_LAYER_SET(layer, on) ACTION_LAYER_BIT_SET((layer) / 4, 1 << ((layer) % 4), (on)) 226#define ACTION_LAYER_ON_OFF(layer) ACTION_LAYER_TAP((layer), OP_ON_OFF) 227#define ACTION_LAYER_OFF_ON(layer) ACTION_LAYER_TAP((layer), OP_OFF_ON) 228#define ACTION_LAYER_SET_CLEAR(layer) ACTION_LAYER_TAP((layer), OP_SET_CLEAR) 229#define ACTION_LAYER_ONESHOT(layer) ACTION_LAYER_TAP((layer), OP_ONESHOT) 230#define ACTION_LAYER_MODS(layer, mods) ACTION(ACT_LAYER_MODS, (layer) << 8 | (mods)) 231/* With Tapping */ 232#define ACTION_LAYER_TAP_KEY(layer, key) ACTION_LAYER_TAP((layer), (key)) 233#define ACTION_LAYER_TAP_TOGGLE(layer) ACTION_LAYER_TAP((layer), OP_TAP_TOGGLE) 234/* Bitwise Operation */ 235#define ACTION_LAYER_BIT_AND(part, bits, on) ACTION_LAYER_BITOP(OP_BIT_AND, (part), (bits), (on)) 236#define ACTION_LAYER_BIT_OR(part, bits, on) ACTION_LAYER_BITOP(OP_BIT_OR, (part), (bits), (on)) 237#define ACTION_LAYER_BIT_XOR(part, bits, on) ACTION_LAYER_BITOP(OP_BIT_XOR, (part), (bits), (on)) 238#define ACTION_LAYER_BIT_SET(part, bits, on) ACTION_LAYER_BITOP(OP_BIT_SET, (part), (bits), (on)) 239/* Default Layer Bitwise Operation */ 240#define ACTION_DEFAULT_LAYER_BIT_AND(part, bits) ACTION_LAYER_BITOP(OP_BIT_AND, (part), (bits), 0) 241#define ACTION_DEFAULT_LAYER_BIT_OR(part, bits) ACTION_LAYER_BITOP(OP_BIT_OR, (part), (bits), 0) 242#define ACTION_DEFAULT_LAYER_BIT_XOR(part, bits) ACTION_LAYER_BITOP(OP_BIT_XOR, (part), (bits), 0) 243#define ACTION_DEFAULT_LAYER_BIT_SET(part, bits) ACTION_LAYER_BITOP(OP_BIT_SET, (part), (bits), 0) 244 245/* OneHand Support */ 246enum swap_hands_param_tap_op { 247 OP_SH_TOGGLE = 0xF0, 248 OP_SH_TAP_TOGGLE, 249 OP_SH_ON_OFF, 250 OP_SH_OFF_ON, 251 OP_SH_OFF, 252 OP_SH_ON, 253 OP_SH_ONESHOT, 254}; 255 256#define ACTION_SWAP_HANDS() ACTION_SWAP_HANDS_ON_OFF() 257#define ACTION_SWAP_HANDS_TOGGLE() ACTION(ACT_SWAP_HANDS, OP_SH_TOGGLE) 258#define ACTION_SWAP_HANDS_TAP_TOGGLE() ACTION(ACT_SWAP_HANDS, OP_SH_TAP_TOGGLE) 259#define ACTION_SWAP_HANDS_ONESHOT() ACTION(ACT_SWAP_HANDS, OP_SH_ONESHOT) 260#define ACTION_SWAP_HANDS_TAP_KEY(key) ACTION(ACT_SWAP_HANDS, key) 261#define ACTION_SWAP_HANDS_ON_OFF() ACTION(ACT_SWAP_HANDS, OP_SH_ON_OFF) 262#define ACTION_SWAP_HANDS_OFF_ON() ACTION(ACT_SWAP_HANDS, OP_SH_OFF_ON) 263#define ACTION_SWAP_HANDS_ON() ACTION(ACT_SWAP_HANDS, OP_SH_ON) 264#define ACTION_SWAP_HANDS_OFF() ACTION(ACT_SWAP_HANDS, OP_SH_OFF)