From c6d9875d5db72201307b0bd665cd6ba98727d8e0 Mon Sep 17 00:00:00 2001 From: Ben Blazak Date: Thu, 4 Apr 2013 01:20:19 -0700 Subject: [PATCH] (working on key definitions) --- .../keyboard/ergodox/layout/default/keys.h | 93 +++++- firmware/lib/layout/keys.h | 282 +++++++++--------- 2 files changed, 218 insertions(+), 157 deletions(-) diff --git a/firmware/keyboard/ergodox/layout/default/keys.h b/firmware/keyboard/ergodox/layout/default/keys.h index ef69108..efb4a2e 100644 --- a/firmware/keyboard/ergodox/layout/default/keys.h +++ b/firmware/keyboard/ergodox/layout/default/keys.h @@ -20,24 +20,85 @@ // ---------------------------------------------------------------------------- -// `keys__` macros (needed by ".../lib/layout/keys.h") +// note: needed by ".../lib/layout/keys.h" +#define KEYS__DEFAULT(name, value) \ + void keys__press__##name (void) { kf__press(value); } \ + void keys__release__##name (void) { kf__release(value); } -#define KEYS__DEFAULT(name, value) \ - KEY_T name = { \ - .press_function = &kf__press, \ - .press_value = value, \ - .release_function = &kf__release, \ - .release_value = value } +// note: needed by ".../lib/layout/keys.h" +#define KEYS__SHIFTED(name, value) \ + void keys__press__##name (void) { kf__press(KEY__LeftShift); \ + kf__press(value); } \ + void keys__release__##name (void) { kf__release(value); \ + kf__release(KEY__LeftShift); } + +// TODO: this probably isn't right... +#define KEYS__CHORD__SETUP(chordname, init, comparison, threshold) \ + bool keys__chord__##chordname (bool pressed) { \ + static counter = (init); \ + if (pressed) counter++; \ + if (counter comparison (threshold)) \ + return true; \ + if (!pressed) counter--; \ + } + +// TODO: this probably isn't either +#define KEYS__CHORD(chordname, keyname, value) \ + void keys__press__##name (void) { \ + if (keys__chord__##chordname(true)) \ + kf__press(value); \ + } \ + void keys__release__##name (void) { \ + if (keys__chord__##chordname(false)) \ + kf__release(value); \ + } + +// TODO: dunno if this is how we want to do things (or if it would even work) +#define KEYS__MACRO(name, pressfunctions, releasefunctions) \ + void keys__press__##name (void) { pressfunctions } \ + void keys__release__##name (void) { releasefunctions } \ + +// the whole key +#define K(name) { &keys__press__##name, &keys__release__##name } + +// just the press function of the key (without the preceding '&') +#define KP(name) keys__press__##name + +// just the release function of the key (without the preceding '&') +#define KR(name) keys__release__##name + +// TODO: and we could do a lot better than this too. lol +void keys__chord__2kcaps(pressed, keycode) { // TODO: check + static counter = 0; + if (pressed) { + counter++; + kf__press(keycode); + } + if (counter == 2) { + kf__toggle_capslock(); + } + if (!pressed) { + counter--; + kf__release(keycode); + } +} +void keys__press__shL2kcaps(void) { + keys__chord__2kcaps(true); + kf__press(KEY__LeftShift); +} +void keys__release__shL2kcaps(void) { + keys__chord__2kcaps(false); + kf__release(KEY__LeftShift); +} +void keys__press__shR2kcaps(void) { + keys__chord__2kcaps(true); + kf__press(KEY__RightShift); +} +void keys__release__shR2kcaps(void) { + keys__chord__2kcaps(false); + kf__release(KEY__RightShift); +} -#define KEYS__SHIFTED(name, value) \ - const uint16_t PROGMEM name##__press[] = { \ - 2, &kf__press, KEY__LeftShift, \ - &kf__press, value }; \ - const uint16_t PROGMEM name##__release[] = { \ - 2, &kf__release, value, \ - &kf__release, KEY__LeftShift }; \ - KEY_T name = { &kf__macro__progmem, &name##__press, \ - &kf__macro__progmem, &name##__release } // other `keys__` macros (in the `keys__` namespace for consistency) diff --git a/firmware/lib/layout/keys.h b/firmware/lib/layout/keys.h index 9fa17d9..abd9d91 100644 --- a/firmware/lib/layout/keys.h +++ b/firmware/lib/layout/keys.h @@ -38,93 +38,93 @@ // ---------------------------------------------------------------------------- // letters -KEYS__DEFAULT( A, KEY__a_A ); -KEYS__DEFAULT( B, KEY__b_B ); -KEYS__DEFAULT( C, KEY__c_C ); -KEYS__DEFAULT( D, KEY__d_D ); -KEYS__DEFAULT( E, KEY__e_E ); -KEYS__DEFAULT( F, KEY__f_F ); -KEYS__DEFAULT( G, KEY__g_G ); -KEYS__DEFAULT( H, KEY__h_H ); -KEYS__DEFAULT( I, KEY__i_I ); -KEYS__DEFAULT( J, KEY__j_J ); -KEYS__DEFAULT( K, KEY__k_K ); -KEYS__DEFAULT( L, KEY__l_L ); -KEYS__DEFAULT( M, KEY__m_M ); -KEYS__DEFAULT( N, KEY__n_N ); -KEYS__DEFAULT( O, KEY__o_O ); -KEYS__DEFAULT( P, KEY__p_P ); -KEYS__DEFAULT( Q, KEY__q_Q ); -KEYS__DEFAULT( R, KEY__r_R ); -KEYS__DEFAULT( S, KEY__s_S ); -KEYS__DEFAULT( T, KEY__t_T ); -KEYS__DEFAULT( U, KEY__u_U ); -KEYS__DEFAULT( V, KEY__v_V ); -KEYS__DEFAULT( W, KEY__w_W ); -KEYS__DEFAULT( X, KEY__x_X ); -KEYS__DEFAULT( Y, KEY__y_Y ); -KEYS__DEFAULT( Z, KEY__z_Z ); +KEYS__DEFAULT( a, KEY__a_A ); +KEYS__DEFAULT( b, KEY__b_B ); +KEYS__DEFAULT( c, KEY__c_C ); +KEYS__DEFAULT( d, KEY__d_D ); +KEYS__DEFAULT( e, KEY__e_E ); +KEYS__DEFAULT( f, KEY__f_F ); +KEYS__DEFAULT( g, KEY__g_G ); +KEYS__DEFAULT( h, KEY__h_H ); +KEYS__DEFAULT( i, KEY__i_I ); +KEYS__DEFAULT( j, KEY__j_J ); +KEYS__DEFAULT( k, KEY__k_K ); +KEYS__DEFAULT( l, KEY__l_L ); +KEYS__DEFAULT( m, KEY__m_M ); +KEYS__DEFAULT( n, KEY__n_N ); +KEYS__DEFAULT( o, KEY__o_O ); +KEYS__DEFAULT( p, KEY__p_P ); +KEYS__DEFAULT( q, KEY__q_Q ); +KEYS__DEFAULT( r, KEY__r_R ); +KEYS__DEFAULT( s, KEY__s_S ); +KEYS__DEFAULT( t, KEY__t_T ); +KEYS__DEFAULT( u, KEY__u_U ); +KEYS__DEFAULT( v, KEY__v_V ); +KEYS__DEFAULT( w, KEY__w_W ); +KEYS__DEFAULT( x, KEY__x_X ); +KEYS__DEFAULT( y, KEY__y_Y ); +KEYS__DEFAULT( z, KEY__z_Z ); // --- (shifted) --- -KEYS__SHIFTED( CA, KEY__a_A ); -KEYS__SHIFTED( CB, KEY__b_B ); -KEYS__SHIFTED( CC, KEY__c_C ); -KEYS__SHIFTED( CD, KEY__d_D ); -KEYS__SHIFTED( CE, KEY__e_E ); -KEYS__SHIFTED( CF, KEY__f_F ); -KEYS__SHIFTED( CG, KEY__g_G ); -KEYS__SHIFTED( CH, KEY__h_H ); -KEYS__SHIFTED( CI, KEY__i_I ); -KEYS__SHIFTED( CJ, KEY__j_J ); -KEYS__SHIFTED( CK, KEY__k_K ); -KEYS__SHIFTED( CL, KEY__l_L ); -KEYS__SHIFTED( CM, KEY__m_M ); -KEYS__SHIFTED( CN, KEY__n_N ); -KEYS__SHIFTED( CO, KEY__o_O ); -KEYS__SHIFTED( CP, KEY__p_P ); -KEYS__SHIFTED( CQ, KEY__q_Q ); -KEYS__SHIFTED( CR, KEY__r_R ); -KEYS__SHIFTED( CS, KEY__s_S ); -KEYS__SHIFTED( CT, KEY__t_T ); -KEYS__SHIFTED( CU, KEY__u_U ); -KEYS__SHIFTED( CV, KEY__v_V ); -KEYS__SHIFTED( CW, KEY__w_W ); -KEYS__SHIFTED( CX, KEY__x_X ); -KEYS__SHIFTED( CY, KEY__y_Y ); -KEYS__SHIFTED( CZ, KEY__z_Z ); +KEYS__SHIFTED( A, KEY__a_A ); +KEYS__SHIFTED( B, KEY__b_B ); +KEYS__SHIFTED( C, KEY__c_C ); +KEYS__SHIFTED( D, KEY__d_D ); +KEYS__SHIFTED( E, KEY__e_E ); +KEYS__SHIFTED( F, KEY__f_F ); +KEYS__SHIFTED( G, KEY__g_G ); +KEYS__SHIFTED( H, KEY__h_H ); +KEYS__SHIFTED( I, KEY__i_I ); +KEYS__SHIFTED( J, KEY__j_J ); +KEYS__SHIFTED( K, KEY__k_K ); +KEYS__SHIFTED( L, KEY__l_L ); +KEYS__SHIFTED( M, KEY__m_M ); +KEYS__SHIFTED( N, KEY__n_N ); +KEYS__SHIFTED( O, KEY__o_O ); +KEYS__SHIFTED( P, KEY__p_P ); +KEYS__SHIFTED( Q, KEY__q_Q ); +KEYS__SHIFTED( R, KEY__r_R ); +KEYS__SHIFTED( S, KEY__s_S ); +KEYS__SHIFTED( T, KEY__t_T ); +KEYS__SHIFTED( U, KEY__u_U ); +KEYS__SHIFTED( V, KEY__v_V ); +KEYS__SHIFTED( W, KEY__w_W ); +KEYS__SHIFTED( X, KEY__x_X ); +KEYS__SHIFTED( Y, KEY__y_Y ); +KEYS__SHIFTED( Z, KEY__z_Z ); // numbers -KEYS__DEFAULT( K0, KEY__0_RightParenthesis ); -KEYS__DEFAULT( K1, KEY__1_Exclamation ); -KEYS__DEFAULT( K2, KEY__2_At ); -KEYS__DEFAULT( K3, KEY__3_Pound ); -KEYS__DEFAULT( K4, KEY__4_Dollar ); -KEYS__DEFAULT( K5, KEY__5_Percent ); -KEYS__DEFAULT( K6, KEY__6_Caret ); -KEYS__DEFAULT( K7, KEY__7_Ampersand ); -KEYS__DEFAULT( K8, KEY__8_Asterisk ); -KEYS__DEFAULT( K9, KEY__9_LeftParenthesis ); +KEYS__DEFAULT( 0, KEY__0_RightParenthesis ); +KEYS__DEFAULT( 1, KEY__1_Exclamation ); +KEYS__DEFAULT( 2, KEY__2_At ); +KEYS__DEFAULT( 3, KEY__3_Pound ); +KEYS__DEFAULT( 4, KEY__4_Dollar ); +KEYS__DEFAULT( 5, KEY__5_Percent ); +KEYS__DEFAULT( 6, KEY__6_Caret ); +KEYS__DEFAULT( 7, KEY__7_Ampersand ); +KEYS__DEFAULT( 8, KEY__8_Asterisk ); +KEYS__DEFAULT( 9, KEY__9_LeftParenthesis ); // --- (shifted) --- -KEYS__SHIFTED( ParenR, KEY__0_RightParenthesis ); -KEYS__SHIFTED( Exclam, KEY__1_Exclamation ); -KEYS__SHIFTED( At, KEY__2_At ); -KEYS__SHIFTED( Pound, KEY__3_Pound ); -KEYS__SHIFTED( Dollar, KEY__4_Dollar ); -KEYS__SHIFTED( Percent, KEY__5_Percent ); -KEYS__SHIFTED( Caret, KEY__6_Caret ); -KEYS__SHIFTED( Amp, KEY__7_Ampersand ); -KEYS__SHIFTED( Asterisk, KEY__8_Asterisk ); -KEYS__SHIFTED( ParenL, KEY__9_LeftParenthesis ); +KEYS__SHIFTED( parenR, KEY__0_RightParenthesis ); +KEYS__SHIFTED( exclam, KEY__1_Exclamation ); +KEYS__SHIFTED( at, KEY__2_At ); +KEYS__SHIFTED( pound, KEY__3_Pound ); +KEYS__SHIFTED( dollar, KEY__4_Dollar ); +KEYS__SHIFTED( percent, KEY__5_Percent ); +KEYS__SHIFTED( caret, KEY__6_Caret ); +KEYS__SHIFTED( amp, KEY__7_Ampersand ); +KEYS__SHIFTED( asterisk, KEY__8_Asterisk ); +KEYS__SHIFTED( parenL, KEY__9_LeftParenthesis ); // --- (keypad) --- -KEYS__DEFAULT( KP0, KEYPAD__0_Insert ); -KEYS__DEFAULT( KP1, KEYPAD__1_End ); -KEYS__DEFAULT( KP2, KEYPAD__2_DownArrow ); -KEYS__DEFAULT( KP3, KEYPAD__3_PageDown ); -KEYS__DEFAULT( KP4, KEYPAD__4_LeftArrow ); -KEYS__DEFAULT( KP5, KEYPAD__5 ); -KEYS__DEFAULT( KP6, KEYPAD__6_RightArrow ); -KEYS__DEFAULT( KP7, KEYPAD__7_Home ); -KEYS__DEFAULT( KP8, KEYPAD__8_UpArrow ); -KEYS__DEFAULT( KP9, KEYPAD__9_PageUp ); +KEYS__DEFAULT( kp0, KEYPAD__0_Insert ); +KEYS__DEFAULT( kp1, KEYPAD__1_End ); +KEYS__DEFAULT( kp2, KEYPAD__2_DownArrow ); +KEYS__DEFAULT( kp3, KEYPAD__3_PageDown ); +KEYS__DEFAULT( kp4, KEYPAD__4_LeftArrow ); +KEYS__DEFAULT( kp5, KEYPAD__5 ); +KEYS__DEFAULT( kp6, KEYPAD__6_RightArrow ); +KEYS__DEFAULT( kp7, KEYPAD__7_Home ); +KEYS__DEFAULT( kp8, KEYPAD__8_UpArrow ); +KEYS__DEFAULT( kp9, KEYPAD__9_PageUp ); // function KEYS__DEFAULT( F1, KEY__F1 ); @@ -141,81 +141,81 @@ KEYS__DEFAULT( F11, KEY__F11 ); KEYS__DEFAULT( F12, KEY__F12 ); // whitespace and symbols -KEYS__DEFAULT( Enter, KEY__ReturnEnter ); -KEYS__DEFAULT( Space, KEY__Spacebar ); -KEYS__DEFAULT( Tab, KEY__Tab ); +KEYS__DEFAULT( enter, KEY__ReturnEnter ); +KEYS__DEFAULT( space, KEY__Spacebar ); +KEYS__DEFAULT( tab, KEY__Tab ); // --- -KEYS__DEFAULT( Bkslash, KEY__Backslash_Pipe ); -KEYS__DEFAULT( BrktL, KEY__LeftBracket_LeftBrace ); -KEYS__DEFAULT( BrktR, KEY__RightBracket_RightBrace ); -KEYS__DEFAULT( Comma, KEY__Comma_LessThan ); -KEYS__DEFAULT( Dash, KEY__Dash_Underscore ); -KEYS__DEFAULT( Equal, KEY__Equal_Plus ); -KEYS__DEFAULT( Grave, KEY__GraveAccent_Tilde ); -KEYS__DEFAULT( Period, KEY__Period_GreaterThan ); -KEYS__DEFAULT( Quote, KEY__SingleQuote_DoubleQuote ); -KEYS__DEFAULT( Semicol, KEY__Semicolon_Colon ); -KEYS__DEFAULT( Slash, KEY__Slash_Question ); +KEYS__DEFAULT( bkslash, KEY__Backslash_Pipe ); +KEYS__DEFAULT( brktL, KEY__LeftBracket_LeftBrace ); +KEYS__DEFAULT( brktR, KEY__RightBracket_RightBrace ); +KEYS__DEFAULT( comma, KEY__Comma_LessThan ); +KEYS__DEFAULT( dash, KEY__Dash_Underscore ); +KEYS__DEFAULT( equal, KEY__Equal_Plus ); +KEYS__DEFAULT( grave, KEY__GraveAccent_Tilde ); +KEYS__DEFAULT( period, KEY__Period_GreaterThan ); +KEYS__DEFAULT( quote, KEY__SingleQuote_DoubleQuote ); +KEYS__DEFAULT( semicol, KEY__Semicolon_Colon ); +KEYS__DEFAULT( slash, KEY__Slash_Question ); // --- (shifted) --- -KEYS__SHIFTED( Pipe, KEY__Backslash_Pipe ); -KEYS__SHIFTED( BraceL, KEY__LeftBracket_LeftBrace ); -KEYS__SHIFTED( BraceR, KEY__RightBracket_RightBrace ); -KEYS__SHIFTED( LessThan, KEY__Comma_LessThan ); -KEYS__SHIFTED( Undersc, KEY__Dash_Underscore ); -KEYS__SHIFTED( Plus, KEY__Equal_Plus ); -KEYS__SHIFTED( Tilde, KEY__GraveAccent_Tilde ); -KEYS__SHIFTED( GrtrThan, KEY__Period_GreaterThan ); -KEYS__SHIFTED( DblQuote, KEY__SingleQuote_DoubleQuote ); -KEYS__SHIFTED( Colon, KEY__Semicolon_Colon ); -KEYS__SHIFTED( Question, KEY__Slash_Question ); +KEYS__SHIFTED( pipe, KEY__Backslash_Pipe ); +KEYS__SHIFTED( braceL, KEY__LeftBracket_LeftBrace ); +KEYS__SHIFTED( braceR, KEY__RightBracket_RightBrace ); +KEYS__SHIFTED( lessThan, KEY__Comma_LessThan ); +KEYS__SHIFTED( undersc, KEY__Dash_Underscore ); +KEYS__SHIFTED( plus, KEY__Equal_Plus ); +KEYS__SHIFTED( tilde, KEY__GraveAccent_Tilde ); +KEYS__SHIFTED( grtrThan, KEY__Period_GreaterThan ); +KEYS__SHIFTED( dblQuote, KEY__SingleQuote_DoubleQuote ); +KEYS__SHIFTED( colon, KEY__Semicolon_Colon ); +KEYS__SHIFTED( question, KEY__Slash_Question ); // --- (keypad) --- -KEYS__DEFAULT( KPEnter, KEYPAD__Enter ); +KEYS__DEFAULT( kpEnter, KEYPAD__Enter ); // --- -KEYS__DEFAULT( KPDec, KEYPAD__Period_Delete ); +KEYS__DEFAULT( kpDec, KEYPAD__Period_Delete ); // --- -KEYS__DEFAULT( KPAdd, KEYPAD__Plus ); -KEYS__DEFAULT( KPSub, KEYPAD__Minus ); -KEYS__DEFAULT( KPMul, KEYPAD__Asterisk ); -KEYS__DEFAULT( KPDiv, KEYPAD__Slash ); +KEYS__DEFAULT( kpAdd, KEYPAD__Plus ); +KEYS__DEFAULT( kpSub, KEYPAD__Minus ); +KEYS__DEFAULT( kpMul, KEYPAD__Asterisk ); +KEYS__DEFAULT( kpDiv, KEYPAD__Slash ); // text control -KEYS__DEFAULT( ArrowU, KEY__UpArrow ); -KEYS__DEFAULT( ArrowD, KEY__DownArrow ); -KEYS__DEFAULT( ArrowL, KEY__LeftArrow ); -KEYS__DEFAULT( ArrowR, KEY__RightArrow ); -KEYS__DEFAULT( Bs, KEY__DeleteBackspace ); -KEYS__DEFAULT( Del, KEY__DeleteForward ); -KEYS__DEFAULT( End, KEY__End ); -KEYS__DEFAULT( Esc, KEY__Escape ); -KEYS__DEFAULT( Home, KEY__Home ); -KEYS__DEFAULT( Ins, KEY__Insert ); -KEYS__DEFAULT( PageU, KEY__PageUp ); -KEYS__DEFAULT( PageD, KEY__PageDown ); +KEYS__DEFAULT( arrowU, KEY__UpArrow ); +KEYS__DEFAULT( arrowD, KEY__DownArrow ); +KEYS__DEFAULT( arrowL, KEY__LeftArrow ); +KEYS__DEFAULT( arrowR, KEY__RightArrow ); +KEYS__DEFAULT( bs, KEY__DeleteBackspace ); +KEYS__DEFAULT( del, KEY__DeleteForward ); +KEYS__DEFAULT( end, KEY__End ); +KEYS__DEFAULT( esc, KEY__Escape ); +KEYS__DEFAULT( home, KEY__Home ); +KEYS__DEFAULT( ins, KEY__Insert ); +KEYS__DEFAULT( pageU, KEY__PageUp ); +KEYS__DEFAULT( pageD, KEY__PageDown ); // modifier -KEYS__DEFAULT( AltR, KEY__RightAlt ); -KEYS__DEFAULT( AltL, KEY__LeftAlt ); -KEYS__DEFAULT( CtrlL, KEY__LeftControl ); -KEYS__DEFAULT( CtrlR, KEY__RightControl ); -KEYS__DEFAULT( GUIL, KEY__LeftGUI ); -KEYS__DEFAULT( GUIR, KEY__RightGUI ); -KEYS__DEFAULT( ShiftL, KEY__LeftShift ); -KEYS__DEFAULT( ShiftR, KEY__RightShift ); +KEYS__DEFAULT( altR, KEY__RightAlt ); +KEYS__DEFAULT( altL, KEY__LeftAlt ); +KEYS__DEFAULT( ctrlL, KEY__LeftControl ); +KEYS__DEFAULT( ctrlR, KEY__RightControl ); +KEYS__DEFAULT( guiL, KEY__LeftGUI ); +KEYS__DEFAULT( guiR, KEY__RightGUI ); +KEYS__DEFAULT( shiftL, KEY__LeftShift ); +KEYS__DEFAULT( shiftR, KEY__RightShift ); // lock -KEYS__DEFAULT( Caps, KEY__CapsLock ); -KEYS__DEFAULT( Scrl, KEY__ScrollLock ); +KEYS__DEFAULT( caps, KEY__CapsLock ); +KEYS__DEFAULT( scrl, KEY__ScrollLock ); // --- (keypad) --- -KEYS__DEFAULT( Num, KEYPAD__NumLock_Clear ); +KEYS__DEFAULT( num, KEYPAD__NumLock_Clear ); // special function -KEYS__DEFAULT( App, KEY__Application ); -KEYS__DEFAULT( Pause, KEY__Pause ); -KEYS__DEFAULT( PrScr, KEY__PrintScreen ); +KEYS__DEFAULT( app, KEY__Application ); +KEYS__DEFAULT( pause, KEY__Pause ); +KEYS__DEFAULT( prScr, KEY__PrintScreen ); // international and language -KEYS__DEFAULT( NonUSBackslash, KEY__NonUS_Backslash_Pipe ); -KEYS__DEFAULT( NonUSPound, KEY__NonUS_Pound_Tilde ); +KEYS__DEFAULT( nonUSBkslash, KEY__NonUS_Backslash_Pipe ); +KEYS__DEFAULT( nonUSPound, KEY__NonUS_Pound_Tilde ); // ----------------------------------------------------------------------------