Adding variable width state variable width.
- Allows for RAM space savings on small microcontrollers at the expense of macro length and number of macros/key assignments
This commit is contained in:
		
							parent
							
								
									c169097ccf
								
							
						
					
					
						commit
						c7934c7224
					
				
					 2 changed files with 31 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -30,6 +30,27 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// ----- 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
 | 
			
		||||
| 
						 | 
				
			
			@ -47,7 +68,7 @@
 | 
			
		|||
// 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;
 | 
			
		||||
| 
						 | 
				
			
			@ -94,8 +115,8 @@ typedef enum TriggerMacroState {
 | 
			
		|||
// 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;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -168,7 +189,7 @@ typedef struct Capability {
 | 
			
		|||
//  * 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[]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -192,7 +213,7 @@ typedef struct Capability {
 | 
			
		|||
// 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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -285,8 +285,6 @@ void Macro_layerShift_capability( uint8_t state, uint8_t stateType, uint8_t *arg
 | 
			
		|||
	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]);
 | 
			
		||||
| 
						 | 
				
			
			@ -300,7 +298,7 @@ void Macro_layerShift_capability( uint8_t state, uint8_t stateType, uint8_t *arg
 | 
			
		|||
 | 
			
		||||
// 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++ )
 | 
			
		||||
| 
						 | 
				
			
			@ -322,7 +320,7 @@ unsigned int *Macro_layerLookup( uint8_t scanCode )
 | 
			
		|||
		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 )
 | 
			
		||||
| 
						 | 
				
			
			@ -331,7 +329,7 @@ unsigned int *Macro_layerLookup( uint8_t scanCode )
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// 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 )
 | 
			
		||||
| 
						 | 
				
			
			@ -806,10 +804,10 @@ inline void Macro_updateTriggerMacroPendingList()
 | 
			
		|||
			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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue