Browse Source

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
simple
Jacob Alexander 9 years ago
parent
commit
f07e9342dd
2 changed files with 29 additions and 5 deletions
  1. 1
    1
      LoadFile/load.dfu
  2. 28
    4
      Macro/PartialMap/macro.c

+ 1
- 1
LoadFile/load.dfu View File

if [[ "$SERIAL_PORT" != "" ]] && [[ -e "$SERIAL_PORT" ]]; then 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" echo "NOTE: This may fail if the uC is in a bad state or does not support remote flashing"
printf "reload\r" > $SERIAL_PORT printf "reload\r" > $SERIAL_PORT
sleep 1
sleep 2
fi fi


# Load via dfu-util # Load via dfu-util

+ 28
- 4
Macro/PartialMap/macro.c View File

/* 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 * 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 * it under the terms of the GNU General Public License as published by
uint16_t macroStepCounter = 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 ]; TriggerGuide macroTriggerListBuffer[ MaxScanCode ];
uint8_t macroTriggerListBufferSize = 0; uint8_t macroTriggerListBufferSize = 0;
var_uint_t macroTriggerListLayerCache[ MaxScanCode ];


// Pending Trigger Macro Index List // Pending Trigger Macro Index List
// * Any trigger macros that need processing from a previous macro processing loop // * Any trigger macros that need processing from a previous macro processing loop


// Looks up the trigger list for the given scan code (from the active layer) // Looks up the trigger list for the given scan code (from the active layer)
// NOTE: Calling function must handle the NULL pointer case // 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 // If no trigger macro is defined at the given layer, fallthrough to the next layer
for ( uint16_t layerIndex = 0; layerIndex < macroLayerIndexStackSize; layerIndex++ ) for ( uint16_t layerIndex = 0; layerIndex < macroLayerIndexStackSize; layerIndex++ )
{ {
&& scanCode >= layer->first && scanCode >= layer->first
&& *map[ scanCode - layer->first ] != 0 ) && *map[ scanCode - layer->first ] != 0 )
{ {
// Set the layer cache
macroTriggerListLayerCache[ scanCode ] = macroLayerIndexStack[ layerIndex ];

return map[ scanCode - layer->first ]; return map[ scanCode - layer->first ];
} }
} }
&& scanCode >= layer->first && scanCode >= layer->first
&& *map[ scanCode - layer->first ] != 0 ) && *map[ scanCode - layer->first ] != 0 )
{ {
// Set the layer cache to default map
macroTriggerListLayerCache[ scanCode ] = 0;

return map[ scanCode - layer->first ]; return map[ scanCode - layer->first ];
} }


uint8_t latch_expire = macroTriggerListBuffer[ key ].state == 0x03; uint8_t latch_expire = macroTriggerListBuffer[ key ].state == 0x03;


// Lookup Trigger List // 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 // Number of Triggers in list
nat_ptr_t triggerListSize = triggerList[0]; nat_ptr_t triggerListSize = triggerList[0];