From f07e9342ddebebc1ca78033e86f132dbf1f89cd7 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sun, 1 Mar 2015 21:04:33 -0800 Subject: [PATCH] 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 --- LoadFile/load.dfu | 2 +- Macro/PartialMap/macro.c | 32 ++++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/LoadFile/load.dfu b/LoadFile/load.dfu index 7f55c2c..d99c5e6 100755 --- a/LoadFile/load.dfu +++ b/LoadFile/load.dfu @@ -49,7 +49,7 @@ done 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 diff --git a/Macro/PartialMap/macro.c b/Macro/PartialMap/macro.c index 0be5c77..5f2cf77 100644 --- a/Macro/PartialMap/macro.c +++ b/Macro/PartialMap/macro.c @@ -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 @@ uint8_t macroPauseMode = 0; 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 @@ 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 -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 @@ nat_ptr_t *Macro_layerLookup( uint8_t scanCode, uint8_t latch_expire ) && 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 @@ nat_ptr_t *Macro_layerLookup( uint8_t scanCode, uint8_t latch_expire ) && 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 @@ inline void Macro_updateTriggerMacroPendingList() 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( ¯oTriggerListBuffer[ key ], latch_expire ); // Number of Triggers in list nat_ptr_t triggerListSize = triggerList[0];