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
This commit is contained in:
		
							parent
							
								
									a737e36b3b
								
							
						
					
					
						commit
						f07e9342dd
					
				
					 2 changed files with 29 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue