# HG changeset patch # User Jacob Alexander # Date 1425272673 28800 # Node ID c86eb7d0a693a4564274d2fe08a22a2c67a83ed6 # Parent 413c6b2b21d096409d6c6e37bd8b397357dbc2de 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 diff -r 413c6b2b21d0 -r c86eb7d0a693 LoadFile/load.dfu --- 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 diff -r 413c6b2b21d0 -r c86eb7d0a693 Macro/PartialMap/macro.c --- 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( ¯oTriggerListBuffer[ key ], latch_expire ); // Number of Triggers in list nat_ptr_t triggerListSize = triggerList[0];