From fe545d83d677814eca3caeca09327874e3a7bbf4 Mon Sep 17 00:00:00 2001 From: Ben Blazak Date: Fri, 15 Jun 2012 16:39:33 -0700 Subject: [PATCH] test: using indices to an array of fn ptrs in layout matrices so that _kb_layout_press... and ...release... are of type uint8_t instead of kbfun_funptr_t (saving 1 byte per key per layer per matrix = 40% of the total layout size). this brings the total firmware size with 10 layers to 6574 bytes instead of 8302 bytes. the teensy 2.0 has 32256 bytes of flash. i'm going to revert to the old way. partly because the space savings don't seem consequential compared to what we have to work with. mostly because doing it with an array separates the function pointer to macro (or const var) correlation in qwerty.c, and because i then have to extern the _kb_layout_functions[6] array in layout.h (or qwerty.h). also, using an enum instead of macros with manually assigned numbers corresponding to the array indices would be more error prone, i think, because (since it has to be visible outside qwerty.c) it would have to be declared in a header. hopefully all that makes sense. i'm in a bit of a hurry. but look at the code: i think, even with a bit of formatting help, it'd still look less clean --- src/keyboard/ergodox/layout.h | 26 ++++++++++----- src/keyboard/ergodox/layout/qwerty.c | 47 ++++++++++++++++++---------- 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/src/keyboard/ergodox/layout.h b/src/keyboard/ergodox/layout.h index e58eb51..c5c9a0f 100644 --- a/src/keyboard/ergodox/layout.h +++ b/src/keyboard/ergodox/layout.h @@ -71,23 +71,33 @@ #endif #ifndef kb_layout_press_get - extern kbfun_funptr_t PROGMEM \ + extern kbfun_funptr_t PROGMEM _kb_layout_functions[6]; + extern uint8_t PROGMEM \ _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS]; #define kb_layout_press_get(layer,row,column) \ - ( (kbfun_funptr_t) \ - pgm_read_word(&( \ - _kb_layout_press[layer][row][column] )) ) + ( (kbfun_funptr_t) \ + pgm_read_word(&( \ + _kb_layout_functions[ \ + ( (uint8_t) \ + pgm_read_byte(&( \ + _kb_layout_press[layer][row][column] \ + )) ) ] )) ) #endif #ifndef kb_layout_release_get - extern kbfun_funptr_t PROGMEM \ + extern kbfun_funptr_t PROGMEM _kb_layout_functions[6]; + extern uint8_t PROGMEM \ _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS]; #define kb_layout_release_get(layer,row,column) \ - ( (kbfun_funptr_t) \ - pgm_read_word(&( \ - _kb_layout_release[layer][row][column] )) ) + ( (kbfun_funptr_t) \ + pgm_read_word(&( \ + _kb_layout_functions[ \ + ( (uint8_t) \ + pgm_read_byte(&( \ + _kb_layout_release[layer][row][column] \ + )) ) ] )) ) #endif diff --git a/src/keyboard/ergodox/layout/qwerty.c b/src/keyboard/ergodox/layout/qwerty.c index 8169a27..3b5d3c8 100644 --- a/src/keyboard/ergodox/layout/qwerty.c +++ b/src/keyboard/ergodox/layout/qwerty.c @@ -19,14 +19,27 @@ #include "../layout.h" -#include "../../../lib/key-functions.h" // aliases -#define f_press &kbfun_press -#define f_relea &kbfun_release -#define f_l_set &kbfun_layer_set -#define f_l_inc &kbfun_layer_inc -#define f_l_dec &kbfun_layer_dec -#define f_2kcap &kbfun_2_keys_capslock_press_release +// #define f_press &kbfun_press +// #define f_relea &kbfun_release +// #define f_l_set &kbfun_layer_set +// #define f_l_inc &kbfun_layer_inc +// #define f_l_dec &kbfun_layer_dec +// #define f_2kcap &kbfun_2_keys_capslock_press_release +kbfun_funptr_t PROGMEM _kb_layout_functions[6] = { + &kbfun_press, + &kbfun_release, + &kbfun_layer_set, + &kbfun_layer_inc, + &kbfun_layer_dec, + &kbfun_2_keys_capslock_press_release +}; +#define f_press 0 +#define f_relea 1 +#define f_l_set 2 +#define f_l_inc 3 +#define f_l_dec 4 +#define f_2kcap 5 uint8_t PROGMEM _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { @@ -78,11 +91,11 @@ _altR, _pageU, _pageD ) }; -kbfun_funptr_t PROGMEM _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { +uint8_t PROGMEM _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { // ---------------------------------------------------------------------------- LAYER( // layer 0: default // unused -NULL, + 0, // left hand f_press,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press,f_press, @@ -104,12 +117,12 @@ f_press,f_press,f_press ), // ---------------------------------------------------------------------------- LAYER( // layer 1: function and symbol keys // unused -NULL, + 0, // left hand f_press,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press, -f_press,f_press,f_press,f_press,f_press,f_press, NULL, +f_press,f_press,f_press,f_press,f_press,f_press, 0, f_press,f_press,f_press,f_press,f_press, f_press, f_press, f_press, @@ -118,7 +131,7 @@ f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press, - NULL,f_press,f_press,f_press,f_press,f_press,f_press, + 0,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press, f_press, f_press, f_press, @@ -127,11 +140,11 @@ f_press,f_press,f_press ) }; -kbfun_funptr_t PROGMEM _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { +uint8_t PROGMEM _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { // ---------------------------------------------------------------------------- LAYER( // layer 0: default // unused -NULL, + 0, // left hand f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, @@ -153,12 +166,12 @@ f_relea,f_relea,f_relea ), // ---------------------------------------------------------------------------- LAYER( // layer 1: function and symbol keys // unused -NULL, + 0, // left hand f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, -f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, NULL, +f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, 0, f_relea,f_relea,f_relea,f_relea,f_relea, f_relea, f_relea, f_relea, @@ -167,7 +180,7 @@ f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, - NULL,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, + 0,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea, f_relea, f_relea, f_relea,