changeset 203:11f9e038812c

Merge branch 'test'
author Jacob Alexander <haata@kiibohd.com>
date Thu, 11 Sep 2014 10:57:58 -0700
parents 048c8a266a08 (current diff) 1a68a9a04ad3 (diff)
children b718fdb741c3
files
diffstat 3 files changed, 61 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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
--- 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];