Name = PartialMapCapabilities;
-Version = 0.1;
-Author = "HaaTa (Jacob Alexander) 2014";
-KLL = 0.3a;
+Version = 0.2;
+Author = "HaaTa (Jacob Alexander) 2014-2015";
+KLL = 0.3b;
# Modified Date
-Date = 2014-11-21;
+Date = 2015-09-24;
# Capabilties available to the PartialMap module
-layerState => Macro_layerState_capability( layer : 2, state : 1 );
-layerLatch => Macro_layerLatch_capability( layer : 2 );
-layerLock => Macro_layerLock_capability( layer : 2 );
-layerShift => Macro_layerShift_capability( layer : 2 );
+layerState => Macro_layerState_capability( layer : 2, state : 1 );
+layerLatch => Macro_layerLatch_capability( layer : 2 );
+layerLock => Macro_layerLock_capability( layer : 2 );
+layerShift => Macro_layerShift_capability( layer : 2 );
+# By default, rotate to the next layer
+# The current rotating layer is stored separately to the layer stack
+# But still sets the layer stack using the layerLock/unlock mechanism
+# Argument 0 -> Next, 1 -> Previous
+layerRotate => Macro_layerRotate_capability( previous : 1 );
# Defines available to the PartialMap module
stateWordSize => StateWordSize_define;
// Sets the given layer with the specified layerState
void Macro_layerState( uint8_t state, uint8_t stateType, uint16_t layer, uint8_t layerState )
{
- // Ignore if layer does not exist
- if ( layer >= LayerNum )
+ // Ignore if layer does not exist or trying to manipulate layer 0/Default layer
+ if ( layer >= LayerNum || layer == 0 )
return;
// Is layer in the LayerIndexStack?
}
+// Rotate layer to next/previous
+// Uses state variable to keep track of the current layer position
+// Layers are still evaluated using the layer stack
+uint16_t Macro_rotationLayer;
+void Macro_layerRotate_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+ // Display capability name
+ if ( stateType == 0xFF && state == 0xFF )
+ {
+ print("Macro_layerRotate(previous)");
+ return;
+ }
+
+ // Only use capability on press
+ // TODO Analog
+ // XXX Could also be on release, but that's sorta dumb -HaaTa
+ if ( stateType == 0x00 && state != 0x01 ) // All normal key conditions except press
+ return;
+
+ // Unset previous rotation layer if not 0
+ if ( Macro_rotationLayer != 0 )
+ {
+ Macro_layerState( state, stateType, Macro_rotationLayer, 0x04 );
+ }
+
+ // Get direction of rotation, 0, next, non-zero previous
+ uint8_t direction = *args;
+
+ // Next
+ if ( !direction )
+ {
+ Macro_rotationLayer++;
+
+ // Invalid layer
+ if ( Macro_rotationLayer >= LayerNum )
+ Macro_rotationLayer = 0;
+ }
+ // Previous
+ else
+ {
+ Macro_rotationLayer--;
+
+ // Layer wrap
+ if ( Macro_rotationLayer >= LayerNum )
+ Macro_rotationLayer = LayerNum - 1;
+ }
+
+ // Toggle the computed layer rotation
+ Macro_layerState( state, stateType, Macro_rotationLayer, 0x04 );
+}
+
+
// ----- Functions -----
// Determine if layer has key defined
// Make sure scanCode is between layer first and last scancodes
if ( map != 0
- && scanCode <= layer->last
- && scanCode >= layer->first
- && *map[ scanCode - layer->first ] != 0 )
+ && scanCode <= layer->last
+ && scanCode >= layer->first
+ && *map[ scanCode - layer->first ] != 0 )
{
// Set the layer cache
macroTriggerListLayerCache[ scanCode ] = macroLayerIndexStack[ layerIndex ];
// Make sure scanCode is between layer first and last scancodes
if ( map != 0
- && scanCode <= layer->last
- && scanCode >= layer->first
- && *map[ scanCode - layer->first ] != 0 )
+ && scanCode <= layer->last
+ && scanCode >= layer->first
+ && *map[ scanCode - layer->first ] != 0 )
{
// Set the layer cache to default map
macroTriggerListLayerCache[ scanCode ] = 0;
}
// If passing and in Waiting state, set macro state to Press
else if ( overallVote & TriggerMacroVote_Pass
- && ( record->state == TriggerMacro_Waiting || record->state == TriggerMacro_Press ) )
+ && ( record->state == TriggerMacro_Waiting || record->state == TriggerMacro_Press ) )
{
record->state = TriggerMacro_Press;
// Make sure macro trigger buffer is empty
macroTriggerListBufferSize = 0;
+ // Set the current rotated layer to 0
+ Macro_rotationLayer = 0;
+
// Initialize TriggerMacro states
for ( var_uint_t macro = 0; macro < TriggerMacroNum; macro++ )
{
// ----- Capabilities -----
uint16_t LCD_layerStack_prevSize = 0;
+uint16_t LCD_layerStack_prevTop = 0;
void LCD_layerStack_capability( uint8_t state, uint8_t stateType, uint8_t *args )
{
// Display capability name
extern uint16_t macroLayerIndexStack[];
extern uint16_t macroLayerIndexStackSize;
- // Only process if the stack size has changed
- if ( macroLayerIndexStackSize == LCD_layerStack_prevSize )
+ // Ignore if the stack size hasn't changed and the top of the stack is the same
+ if ( macroLayerIndexStackSize == LCD_layerStack_prevSize
+ && macroLayerIndexStack[macroLayerIndexStackSize - 1] == LCD_layerStack_prevTop )
{
return;
}
LCD_layerStack_prevSize = macroLayerIndexStackSize;
+ LCD_layerStack_prevTop = macroLayerIndexStack[macroLayerIndexStackSize - 1];
// Number data for LCD
const uint8_t numbers[10][128] = {