@ -71,6 +71,103 @@ void Macros_::play(const macro_t *macro_p) {
delay ( interval ) ;
delay ( interval ) ;
}
}
}
}
static const Key ascii_to_key_map [ ] PROGMEM = {
// 0x21 - 0x30
LSHIFT ( Key_1 ) ,
LSHIFT ( Key_Quote ) ,
LSHIFT ( Key_3 ) ,
LSHIFT ( Key_4 ) ,
LSHIFT ( Key_5 ) ,
LSHIFT ( Key_7 ) ,
Key_Quote ,
LSHIFT ( Key_9 ) ,
LSHIFT ( Key_0 ) ,
LSHIFT ( Key_8 ) ,
LSHIFT ( Key_Equals ) ,
Key_Comma ,
Key_Minus ,
Key_Period ,
Key_Slash ,
Key_0 ,
// 0x3a ... 0x40
LSHIFT ( Key_Semicolon ) ,
Key_Semicolon ,
LSHIFT ( Key_Comma ) ,
Key_Equals ,
LSHIFT ( Key_Period ) ,
LSHIFT ( Key_Slash ) ,
LSHIFT ( Key_2 ) ,
// 0x5b ... 0x5f
Key_LeftBracket ,
Key_Backslash ,
Key_RightBracket ,
LSHIFT ( Key_6 ) ,
LSHIFT ( Key_Minus ) ,
Key_Backtick ,
// 0x7b ... 0x7e
LSHIFT ( Key_LeftBracket ) ,
LSHIFT ( Key_Backslash ) ,
LSHIFT ( Key_RightBracket ) ,
LSHIFT ( Key_Backtick ) ,
} ;
void Macros_ : : type ( const char * string ) {
while ( true ) {
uint8_t ascii_code = pgm_read_byte ( string + + ) ;
if ( ! ascii_code )
break ;
Key key = Key_NoKey ;
switch ( ascii_code ) {
case 0x08 . . . 0x09 :
key . keyCode = Key_Backspace . keyCode + ascii_code - 0x08 ;
break ;
case 0x0A :
key . keyCode = Key_Enter . keyCode ;
break ;
case 0x1B :
key . keyCode = Key_Escape . keyCode ;
break ;
case 0x20 :
key . keyCode = Key_Spacebar . keyCode ;
break ;
case 0x21 . . . 0x30 :
key . raw = pgm_read_word ( & ascii_to_key_map [ ascii_code - 0x21 ] ) ;
break ;
case 0x31 . . . 0x39 :
key . keyCode = Key_1 . keyCode + ascii_code - 0x31 ;
break ;
case 0x3A . . . 0x40 :
key . raw = pgm_read_word ( & ascii_to_key_map [ ascii_code - 0x3A + 16 ] ) ;
break ;
case 0x41 . . . 0x5A :
key . flags = SHIFT_HELD ;
key . keyCode = Key_A . keyCode + ascii_code - 0x41 ;
break ;
case 0x5B . . . 0x5F :
key . raw = pgm_read_word ( & ascii_to_key_map [ ascii_code - 0x5B + 23 ] ) ;
break ;
case 0x61 . . . 0x7A :
key . keyCode = Key_A . keyCode + ascii_code - 0x61 ;
break ;
case 0x7B . . . 0x7E :
key . raw = pgm_read_word ( & ascii_to_key_map [ ascii_code - 0x7B + 29 ] ) ;
break ;
}
if ( key . raw = = Key_NoKey . raw )
continue ;
handle_keyswitch_event ( key , UNKNOWN_KEYSWITCH_LOCATION , IS_PRESSED | INJECTED ) ;
Keyboard . sendReport ( ) ;
handle_keyswitch_event ( key , UNKNOWN_KEYSWITCH_LOCATION , WAS_PRESSED | INJECTED ) ;
Keyboard . sendReport ( ) ;
}
}
static Key handleMacroEvent ( Key mappedKey , byte row , byte col , uint8_t keyState ) {
static Key handleMacroEvent ( Key mappedKey , byte row , byte col , uint8_t keyState ) {
if ( mappedKey . flags ! = ( SYNTHETIC | IS_MACRO ) )
if ( mappedKey . flags ! = ( SYNTHETIC | IS_MACRO ) )