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
partial-rewrite
Ben Blazak 2012-06-15 16:39:33 -07:00
parent 068a3546f6
commit fe545d83d6
2 changed files with 48 additions and 25 deletions

View File

@ -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

View File

@ -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,