+// ----- Types -----
+
+// - NOTE -
+// It is possible to change the maximum state and indexing positions of the state machine.
+// This usually affects the SRAM usage quite a bit, so it can be used to fit the code on smaller uCs
+// Or to allow for nearly infinite states.
+// TODO Make selectable from layout variable
+//typedef uint32_t var_uint_t;
+typedef uint16_t var_uint_t;
+//typedef uint8_t var_uint_t;
+
+// - NOTE -
+// Native pointer length
+// This needs to be defined per microcontroller
+// e.g. mk20s -> 32 bit
+// atmega -> 16 bit
+typedef uint32_t nat_ptr_t;
+//typedef uint16_t nat_ptr_t;
+
+
+
// ----- Structs -----
// -- Result Macro
// ResultMacro struct, one is created per ResultMacro, no duplicates
typedef struct ResultMacro {
const uint8_t *guide;
- unsigned int pos;
+ var_uint_t pos;
uint8_t state;
uint8_t stateType;
} ResultMacro;
// TriggerMacro struct, one is created per TriggerMacro, no duplicates
typedef struct TriggerMacro {
const uint8_t *guide;
- unsigned int result;
- unsigned int pos;
+ var_uint_t result;
+ var_uint_t pos;
TriggerMacroState state;
} TriggerMacro;
// * layer - basename of the layer
// * scanCode - Hex value of the scanCode
// * triggerList - Trigger List (see Trigger Lists)
-#define Define_TL( layer, scanCode ) const unsigned int layer##_tl_##scanCode[]
+#define Define_TL( layer, scanCode ) const nat_ptr_t layer##_tl_##scanCode[]
// The name is defined for cli debugging purposes (Null terminated string)
typedef struct Layer {
- const unsigned int **triggerMap;
+ const nat_ptr_t **triggerMap;
const char *name;
const uint8_t max;
uint8_t state;
if ( stateType == 0x00 && ( state == 0x00 || state == 0x02 ) ) // Only pass press or release conditions
return;
- print("YAY");
-
// Get layer index from arguments
// Cast pointer to uint8_t to unsigned int then access that memory location
uint16_t layer = *(uint16_t*)(&args[0]);
// Looks up the trigger list for the given scan code (from the active layer)
// NOTE: Calling function must handle the NULL pointer case
-unsigned int *Macro_layerLookup( uint8_t scanCode )
+nat_ptr_t *Macro_layerLookup( uint8_t scanCode )
{
// If no trigger macro is defined at the given layer, fallthrough to the next layer
for ( unsigned int layerIndex = 0; layerIndex < macroLayerIndexStackSize; layerIndex++ )
if ( (layer->state & 0x01) ^ (latch>>1) ^ ((layer->state & 0x04)>>2) )
{
// Lookup layer
- unsigned int **map = (unsigned int**)layer->triggerMap;
+ nat_ptr_t **map = (nat_ptr_t**)layer->triggerMap;
// Determine if layer has key defined
if ( map != 0 && *map[ scanCode ] != 0 )
}
// Do lookup on default layer
- unsigned int **map = (unsigned int**)LayerIndex[0].triggerMap;
+ nat_ptr_t **map = (nat_ptr_t**)LayerIndex[0].triggerMap;
// Determine if layer has key defined
if ( map == 0 && *map[ scanCode ] == 0 )
continue;
// Lookup Trigger List
- unsigned int *triggerList = Macro_layerLookup( macroTriggerListBuffer[ key ].scanCode );
+ nat_ptr_t *triggerList = Macro_layerLookup( macroTriggerListBuffer[ key ].scanCode );
// Number of Triggers in list
- unsigned int triggerListSize = triggerList[0];
+ nat_ptr_t triggerListSize = triggerList[0];
// Iterate over triggerList to see if any TriggerMacros need to be added
// First item is the number of items in the TriggerList