Add support for macro media/system keys
This commit is contained in:
		
							parent
							
								
									25aec56c08
								
							
						
					
					
						commit
						6aaa6e0ef9
					
				
					 7 changed files with 88 additions and 84 deletions
				
			
		|  | @ -373,6 +373,12 @@ void register_code(uint8_t code) | |||
|         host_add_mods(MOD_BIT(code)); | ||||
|         host_send_keyboard_report(); | ||||
|     } | ||||
|     else if IS_SYSTEM(code) { | ||||
|         host_system_send(KEYCODE2SYSTEM(code)); | ||||
|     } | ||||
|     else if IS_CONSUMER(code) { | ||||
|         host_consumer_send(KEYCODE2CONSUMER(code)); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void unregister_code(uint8_t code) | ||||
|  | @ -400,6 +406,12 @@ void unregister_code(uint8_t code) | |||
|         host_del_mods(MOD_BIT(code)); | ||||
|         host_send_keyboard_report(); | ||||
|     } | ||||
|     else if IS_SYSTEM(code) { | ||||
|         host_system_send(0); | ||||
|     } | ||||
|     else if IS_CONSUMER(code) { | ||||
|         host_consumer_send(0); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void add_mods(uint8_t mods) | ||||
|  |  | |||
|  | @ -33,9 +33,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | |||
|  *   r: Left/Right flag(Left:0, Right:1) | ||||
|  * | ||||
|  * ACT_MODS_TAP(001r): | ||||
|  * 0010|mods|0000 0000    Modifiers with OneShot | ||||
|  * 0010|mods|0000 00xx    (reserved) | ||||
|  * 0010|mods| keycode     Modifiers with Tap Key | ||||
|  * 001r|mods|0000 0000    Modifiers with OneShot | ||||
|  * 001r|mods|0000 00xx    (reserved) | ||||
|  * 001r|mods| keycode     Modifiers with Tap Key | ||||
|  * | ||||
|  * | ||||
|  * Other Keys(01xx) | ||||
|  |  | |||
|  | @ -36,31 +36,31 @@ void action_macro_play(const macro_t *macro_p) | |||
|     if (!macro_p) return; | ||||
|     while (true) { | ||||
|         switch (MACRO_READ()) { | ||||
|             case INTERVAL: | ||||
|                 interval = MACRO_READ(); | ||||
|                 debug("INTERVAL("); debug_dec(interval); debug(")\n"); | ||||
|             case KEY_DOWN: | ||||
|                 MACRO_READ(); | ||||
|                 dprintf("KEY_DOWN(%02X)\n", macro); | ||||
|                 register_code(macro); | ||||
|                 break; | ||||
|             case KEY_UP: | ||||
|                 MACRO_READ(); | ||||
|                 dprintf("KEY_UP(%02X)\n", macro); | ||||
|                 unregister_code(macro); | ||||
|                 break; | ||||
|             case WAIT: | ||||
|                 MACRO_READ(); | ||||
|                 debug("WAIT("); debug_dec(macro); debug(")\n"); | ||||
|                 dprintf("WAIT(%u)\n", macro); | ||||
|                 { uint8_t ms = macro; while (ms--) _delay_ms(1); } | ||||
|                 break; | ||||
|             case MODS_DOWN: | ||||
|                 MACRO_READ(); | ||||
|                 debug("MODS_DOWN("); debug_hex(macro); debug(")\n"); | ||||
|                 add_mods(macro); | ||||
|                 break; | ||||
|             case MODS_UP: | ||||
|                 MACRO_READ(); | ||||
|                 debug("MODS_UP("); debug_hex(macro); debug(")\n"); | ||||
|                 del_mods(macro); | ||||
|             case INTERVAL: | ||||
|                 interval = MACRO_READ(); | ||||
|                 dprintf("INTERVAL(%u)\n", interval); | ||||
|                 break; | ||||
|             case 0x04 ... 0x73: | ||||
|                 debug("DOWN("); debug_hex(macro); debug(")\n"); | ||||
|                 dprintf("DOWN(%02X)\n", macro); | ||||
|                 register_code(macro); | ||||
|                 break; | ||||
|             case 0x84 ... 0xF3: | ||||
|                 debug("UP("); debug_hex(macro); debug(")\n"); | ||||
|                 dprintf("UP(%02X)\n", macro); | ||||
|                 unregister_code(macro&0x7F); | ||||
|                 break; | ||||
|             case END: | ||||
|  |  | |||
|  | @ -35,80 +35,68 @@ void action_macro_play(const macro_t *macro_p); | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* TODO: NOT FINISHED 
 | ||||
| normal mode command: | ||||
|     key(down):      0x04-7f/73(F24) | ||||
|     key(up):        0x84-ff | ||||
| command:        0x00-03, 0x80-83(0x74-7f, 0xf4-ff) | ||||
|     mods down   0x00 | ||||
|     mods up     0x01 | ||||
|     wait        0x02 | ||||
|     interval    0x03 | ||||
|     extkey down 0x80 | ||||
|     extkey up   0x81 | ||||
|     ext commad  0x82 | ||||
|     ext mode    0x83 | ||||
|     end         0xff | ||||
| 
 | ||||
| extension mode command: NOT IMPLEMENTED | ||||
|     key down            0x00 | ||||
|     key up              0x01 | ||||
|     key down + wait | ||||
|     key up   + wait | ||||
|     mods push | ||||
|     mods pop | ||||
|     wait | ||||
|     interval | ||||
|     if | ||||
|     loop | ||||
|     push | ||||
|     pop | ||||
|     all up | ||||
|     end | ||||
| */ | ||||
| /* Macro commands
 | ||||
|  *   code(0x04-73)                      // key down(1byte)
 | ||||
|  *   code(0x04-73) | 0x80               // key up(1byte)
 | ||||
|  *   { KEY_DOWN, code(0x04-0xff) }      // key down(2bytes)
 | ||||
|  *   { KEY_UP,   code(0x04-0xff) }      // key up(2bytes)
 | ||||
|  *   WAIT                               // wait milli-seconds
 | ||||
|  *   INTERVAL                           // set interval between macro commands
 | ||||
|  *   END                                // stop macro execution
 | ||||
|  * | ||||
|  * Ideas(Not implemented): | ||||
|  *   modifiers | ||||
|  *   system usage | ||||
|  *   consumer usage | ||||
|  *   unicode usage | ||||
|  *   function call | ||||
|  *   conditionals | ||||
|  *   loop | ||||
|  */ | ||||
| enum macro_command_id{ | ||||
|     /* 0x00 - 0x03 */ | ||||
|     END                 = 0x00, | ||||
|     MODS_DOWN           = 0x01, | ||||
|     MODS_UP             = 0x02, | ||||
|     MODS_SET, | ||||
|     MODS_PUSH, | ||||
|     MODS_POP, | ||||
|     KEY_DOWN, | ||||
|     KEY_UP, | ||||
| 
 | ||||
|     /* 0x04 - 0x73 (reserved for keycode down) */ | ||||
| 
 | ||||
|     /* 0x74 - 0x83 */ | ||||
|     WAIT                = 0x74, | ||||
|     INTERVAL, | ||||
|     /* 0x74 - 0x7f */ | ||||
|     /* 0x80 - 0x84 */ | ||||
| 
 | ||||
|     EXT_DOWN, | ||||
|     EXT_UP, | ||||
|     EXT_WAIT, | ||||
|     EXT_INTERVAL, | ||||
|     COMPRESSION_MODE, | ||||
|     /* 0x84 - 0xf3 (reserved for keycode up) */ | ||||
| 
 | ||||
|     EXTENSION_MODE      = 0xff, | ||||
|     /* 0xf4 - 0xff */ | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /* normal mode */ | ||||
| #define DOWN(key)       (key) | ||||
| #define UP(key)         ((key) | 0x80) | ||||
| #define TYPE(key)       (key), (key | 0x80) | ||||
| #define MODS_DOWN(mods) MODS_DOWN, (mods) | ||||
| #define MODS_UP(mods)   MODS_UP, (mods) | ||||
| /* TODO: keycode:0x04-0x73 can be handled by 1byte command  else 2bytes are needed
 | ||||
|  * if keycode between 0x04 and 0x73 | ||||
|  *      keycode / (keycode|0x80) | ||||
|  * else | ||||
|  *      {KEY_DOWN, keycode} / {KEY_UP, keycode} | ||||
| */ | ||||
| #define DOWN(key)       KEY_DOWN, (key) | ||||
| #define UP(key)         KEY_UP, (key) | ||||
| #define TYPE(key)       DOWN(key), UP(key) | ||||
| #define WAIT(ms)        WAIT, (ms) | ||||
| #define INTERVAL(ms)    INTERVAL, (ms) | ||||
| 
 | ||||
| /* key down */ | ||||
| #define D(key)          DOWN(KC_##key) | ||||
| /* key up */ | ||||
| #define U(key)          UP(KC_##key) | ||||
| /* key type */ | ||||
| #define T(key)          TYPE(KC_##key) | ||||
| #define MD(key)         MODS_DOWN(MOD_BIT(KC_##key)) | ||||
| #define MU(key)         MODS_UP(MOD_BIT(KC_##key)) | ||||
| /* wait */ | ||||
| #define W(ms)           WAIT(ms) | ||||
| /* interval */ | ||||
| #define I(ms)           INTERVAL(ms) | ||||
| 
 | ||||
| 
 | ||||
| /* extension mode */ | ||||
| /* for backward comaptibility */ | ||||
| #define MD(key)         DOWN(KC_##key) | ||||
| #define MU(key)         UP(KC_##key) | ||||
| 
 | ||||
| 
 | ||||
| #endif /* ACTION_MACRO_H */ | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | |||
| 
 | ||||
| 
 | ||||
| #define IS_SPECIAL(code)         ((0xA5 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF)) | ||||
| #define IS_SYSTEM(code)          (KC_POWER     <= (code) && (code) <= KC_WAKE) | ||||
| #define IS_SYSTEM(code)          (KC_PWR       <= (code) && (code) <= KC_WAKE) | ||||
| #define IS_CONSUMER(code)        (KC_MUTE      <= (code) && (code) <= KC_WFAV) | ||||
| #define IS_FN(code)              (KC_FN0       <= (code) && (code) <= KC_FN31) | ||||
| #define IS_MOUSEKEY(code)        (KC_MS_UP     <= (code) && (code) <= KC_MS_ACCEL2) | ||||
|  |  | |||
|  | @ -363,21 +363,19 @@ Default Layer also has bitwise operations, they are executed when key is release | |||
| 
 | ||||
| `Macro` action indicates complex key strokes. | ||||
|   | ||||
|     MACRO( MD(LSHIFT), D(D), END ) | ||||
|     MACRO( U(D), MU(LSHIFT), END ) | ||||
|     MACRO( D(LSHIFT), D(D), END ) | ||||
|     MACRO( U(D), U(LSHIFT), END ) | ||||
|     MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ) | ||||
| 
 | ||||
| #### 2.3.1 Normal mode | ||||
| #### 2.3.1 Macro Commands | ||||
| - **I()**   change interavl of stroke. | ||||
| - **D()**   press key | ||||
| - **U()**   release key | ||||
| - **T()**   type key(press and release) | ||||
| - **W()**   wait | ||||
| - **MD()**  modifier down | ||||
| - **MU()**  modifier up | ||||
| - **END**   end mark | ||||
| 
 | ||||
| #### 2.3.2 Extended mode | ||||
| #### 2.3.2 Examples | ||||
| 
 | ||||
| ***TODO: sample impl*** | ||||
| See `keyboard/hhkb/keymap.c` for sample. | ||||
|  |  | |||
|  | @ -67,7 +67,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
|            TAB, Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,   LBRC,RBRC,BSPC, \ | ||||
|            LCTL,A,   S,   D,   F,   G,   H,   J,   K,   L,   FN3, QUOT,FN4, \ | ||||
|             FN5,Z,   X,   C,   V,   B,   N,   M,   COMM,DOT, FN2, RSFT,FN1, \ | ||||
|                 LGUI,LALT,          FN6,                RALT,NO), | ||||
|                 LGUI,LALT,          FN6,                RALT,RGUI), | ||||
| 
 | ||||
|     /* Layer 1: HHKB mode (HHKB Fn)
 | ||||
|      * ,-----------------------------------------------------------. | ||||
|  | @ -179,6 +179,7 @@ enum macro_id { | |||
|     LSHIFT_PAREN, | ||||
|     RSHIFT_PAREN, | ||||
|     HELLO, | ||||
|     VOLUP, | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -203,6 +204,7 @@ static const uint16_t PROGMEM fn_actions[] = { | |||
| //  [13] = ACTION_MACRO_TAP(LSHIFT_PAREN),             // Macro: LShift with tap '('
 | ||||
| //  [14] = ACTION_MACRO_TAP(RSHIFT_PAREN),             // Macro: RShift with tap ')'
 | ||||
| //  [15] = ACTION_MACRO(HELLO),                        // Macro: say hello
 | ||||
| //  [9] = ACTION_MACRO(VOLUP),                         // Macro: media key
 | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -218,23 +220,27 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) | |||
|         case LSHIFT_PAREN: | ||||
|             if (tap.count > 0 && !tap.interrupted) { | ||||
|                 return (event.pressed ? | ||||
|                         MACRO( MD(LSHIFT), D(9), U(9), MU(LSHIFT), END ) : MACRO_NONE); | ||||
|                         MACRO( D(LSHIFT), D(9), U(9), U(LSHIFT), END ) : MACRO_NONE); | ||||
|             } else { | ||||
|                 return (event.pressed ? | ||||
|                         MACRO( MD(LSHIFT), END ) : MACRO( MU(LSHIFT), END ) ); | ||||
|                         MACRO( D(LSHIFT), END ) : MACRO( U(LSHIFT), END ) ); | ||||
|             } | ||||
|         case RSHIFT_PAREN: | ||||
|             if (tap.count > 0 && !tap.interrupted) { | ||||
|                 return (event.pressed ? | ||||
|                         MACRO( MD(RSHIFT), D(0), U(0), MU(RSHIFT), END ) : MACRO_NONE); | ||||
|                         MACRO( D(RSHIFT), D(0), U(0), U(RSHIFT), END ) : MACRO_NONE); | ||||
|             } else { | ||||
|                 return (event.pressed ? | ||||
|                         MACRO( MD(RSHIFT), END ) : MACRO( MU(RSHIFT), END ) ); | ||||
|                         MACRO( D(RSHIFT), END ) : MACRO( U(RSHIFT), END ) ); | ||||
|             } | ||||
|         case HELLO: | ||||
|             return (event.pressed ? | ||||
|                     MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) : | ||||
|                     MACRO_NONE ); | ||||
|         case VOLUP: | ||||
|             return (event.pressed ? | ||||
|                     MACRO( D(VOLU), U(VOLU), END ) : | ||||
|                     MACRO_NONE ); | ||||
|     } | ||||
|     return MACRO_NONE; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 tmk
						tmk