# HG changeset patch # User Jacob Alexander # Date 1410458278 25200 # Node ID 11f9e038812c590464691b4dec38e56d36202b9d # Parent 048c8a266a084ddeb2818971083bcd83d944e7d0# Parent 1a68a9a04ad3e8c4fdd5425259577c6dba48e380 Merge branch 'test' diff -r 048c8a266a08 -r 11f9e038812c Macro/PartialMap/kll.h --- a/Macro/PartialMap/kll.h Thu Sep 11 10:57:30 2014 -0700 +++ b/Macro/PartialMap/kll.h Thu Sep 11 10:57:58 2014 -0700 @@ -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 @@ // 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 @@ // * 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 @@ // 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; diff -r 048c8a266a08 -r 11f9e038812c Macro/PartialMap/macro.c --- a/Macro/PartialMap/macro.c Thu Sep 11 10:57:30 2014 -0700 +++ b/Macro/PartialMap/macro.c Thu Sep 11 10:57:58 2014 -0700 @@ -202,6 +202,12 @@ return; } + // Only use capability on press or release + // TODO Analog + // XXX This may cause issues, might be better to implement state table here to decide -HaaTa + if ( stateType == 0x00 && state == 0x02 ) // Hold condition + return; + // 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]); @@ -224,6 +230,12 @@ return; } + // Only use capability on press + // TODO Analog + // XXX To make sense, this code be on press or release. Or it could even be a sticky shift (why? dunno) -HaaTa + if ( stateType == 0x00 && state != 0x01 ) // All normal key conditions except press + return; + // 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]); @@ -243,6 +255,12 @@ return; } + // Only use capability on press + // TODO Analog + // XXX Could also be on release, but that's sorta dumb -HaaTa + if ( stateType == 0x00 && state != 0x01 ) // All normal key conditions except press + return; + // 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]); @@ -262,6 +280,11 @@ return; } + // Only use capability on press or release + // TODO Analog + if ( stateType == 0x00 && ( state == 0x00 || state == 0x02 ) ) // Only pass press or release conditions + return; + // 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]); @@ -275,7 +298,7 @@ // 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++ ) @@ -297,7 +320,7 @@ 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 ) @@ -306,7 +329,7 @@ } // 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 ) @@ -704,10 +727,10 @@ return TriggerMacroEval_Remove; } // Otherwise, just remove the macro on key release - // XXX Might cause some issues + // One more result has to be called to indicate to the ResultMacro that the key transitioned to the release state else if ( overallVote & TriggerMacroVote_Release ) { - return TriggerMacroEval_Remove; + return TriggerMacroEval_DoResultAndRemove; } // If this is a short macro, just remove it @@ -781,10 +804,10 @@ 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 diff -r 048c8a266a08 -r 11f9e038812c Output/pjrcUSB/output_com.c --- a/Output/pjrcUSB/output_com.c Thu Sep 11 10:57:30 2014 -0700 +++ b/Output/pjrcUSB/output_com.c Thu Sep 11 10:57:58 2014 -0700 @@ -110,6 +110,11 @@ return; } + // TODO Analog inputs + // Only send keypresses if press or hold state + if ( stateType == 0x00 && state == 0x03 ) // Release state + return; + // Get the keycode from arguments uint8_t key = args[0];