qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

action_code.h (9590B)


      1 /*
      2 Copyright 2013 Jun Wako <wakojun@gmail.com>
      3 
      4 This program is free software: you can redistribute it and/or modify
      5 it under the terms of the GNU General Public License as published by
      6 the Free Software Foundation, either version 2 of the License, or
      7 (at your option) any later version.
      8 
      9 This program is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 GNU General Public License for more details.
     13 
     14 You should have received a copy of the GNU General Public License
     15 along 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  */
     85 enum 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  */
    119 typedef 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 
    165 enum 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  */
    178 enum 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  */
    189 enum layer_param_on {
    190     ON_PRESS   = 1,
    191     ON_RELEASE = 2,
    192     ON_BOTH    = 3,
    193 };
    194 
    195 /** \brief Layer Actions
    196  */
    197 enum 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  */
    206 enum 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 */
    246 enum 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)