changeset 297:c86eb7d0a693

Fixing releasing Function key and holding layered key - Pressed key will remain on the same layer until released regardless of the layer changes that happen in the meantime
author Jacob Alexander <haata@kiibohd.com>
date Sun, 01 Mar 2015 21:04:33 -0800
parents 413c6b2b21d0
children 39f84a603350
files LoadFile/load.dfu Macro/PartialMap/macro.c
diffstat 2 files changed, 29 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/LoadFile/load.dfu	Sun Mar 01 00:28:48 2015 -0800
+++ b/LoadFile/load.dfu	Sun Mar 01 21:04:33 2015 -0800
@@ -49,7 +49,7 @@
 if [[ "$SERIAL_PORT" != "" ]] && [[ -e "$SERIAL_PORT" ]]; then
 	echo "NOTE: This may fail if the uC is in a bad state or does not support remote flashing"
 	printf "reload\r" > $SERIAL_PORT
-	sleep 1
+	sleep 2
 fi
 
 # Load via dfu-util
--- a/Macro/PartialMap/macro.c	Sun Mar 01 00:28:48 2015 -0800
+++ b/Macro/PartialMap/macro.c	Sun Mar 01 21:04:33 2015 -0800
@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 by Jacob Alexander
+/* Copyright (C) 2014-2015 by Jacob Alexander
  *
  * This file is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -121,9 +121,11 @@
 uint16_t macroStepCounter = 0;
 
 
-// Key Trigger List Buffer
+// Key Trigger List Buffer and Layer Cache
+// The layer cache is set on press only, hold and release events refer to the value set on press
 TriggerGuide macroTriggerListBuffer[ MaxScanCode ];
 uint8_t macroTriggerListBufferSize = 0;
+var_uint_t macroTriggerListLayerCache[ MaxScanCode ];
 
 // Pending Trigger Macro Index List
 //  * Any trigger macros that need processing from a previous macro processing loop
@@ -311,8 +313,24 @@
 
 // Looks up the trigger list for the given scan code (from the active layer)
 // NOTE: Calling function must handle the NULL pointer case
-nat_ptr_t *Macro_layerLookup( uint8_t scanCode, uint8_t latch_expire )
+nat_ptr_t *Macro_layerLookup( TriggerGuide *guide, uint8_t latch_expire )
 {
+	uint8_t scanCode = guide->scanCode;
+
+	// TODO Analog
+	// If a normal key, and not pressed, do a layer cache lookup
+	if ( guide->type == 0x00 && guide->state != 0x01 )
+	{
+		// Cached layer
+		var_uint_t cachedLayer = macroTriggerListLayerCache[ scanCode ];
+
+		// Lookup map, then layer
+		nat_ptr_t **map = (nat_ptr_t**)LayerIndex[ cachedLayer ].triggerMap;
+		const Layer *layer = &LayerIndex[ cachedLayer ];
+
+		return map[ scanCode - layer->first ];
+	}
+
 	// If no trigger macro is defined at the given layer, fallthrough to the next layer
 	for ( uint16_t layerIndex = 0; layerIndex < macroLayerIndexStackSize; layerIndex++ )
 	{
@@ -342,6 +360,9 @@
 			  && scanCode >= layer->first
 			  && *map[ scanCode - layer->first ] != 0 )
 			{
+				// Set the layer cache
+				macroTriggerListLayerCache[ scanCode ] = macroLayerIndexStack[ layerIndex ];
+
 				return map[ scanCode - layer->first ];
 			}
 		}
@@ -359,6 +380,9 @@
 	  && scanCode >= layer->first
 	  && *map[ scanCode - layer->first ] != 0 )
 	{
+		// Set the layer cache to default map
+		macroTriggerListLayerCache[ scanCode ] = 0;
+
 		return map[ scanCode - layer->first ];
 	}
 
@@ -836,7 +860,7 @@
 		uint8_t latch_expire = macroTriggerListBuffer[ key ].state == 0x03;
 
 		// Lookup Trigger List
-		nat_ptr_t *triggerList = Macro_layerLookup( macroTriggerListBuffer[ key ].scanCode, latch_expire );
+		nat_ptr_t *triggerList = Macro_layerLookup( &macroTriggerListBuffer[ key ], latch_expire );
 
 		// Number of Triggers in list
 		nat_ptr_t triggerListSize = triggerList[0];