Mercurial > louis > kiibohd-controller
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( ¯oTriggerListBuffer[ key ], latch_expire ); // Number of Triggers in list nat_ptr_t triggerListSize = triggerList[0];