Mercurial > louis > kiibohd-controller
diff Macro/PartialMap/macro.c @ 377:dbbdedccc275
Adding layer rotation (next/prev) capability
- Requires kll update
- Including udev id update
author | Jacob Alexander <haata@kiibohd.com> |
---|---|
date | Mon, 28 Sep 2015 19:58:39 -0700 |
parents | 23104e8e24f4 |
children | 5f085e29a66c |
line wrap: on
line diff
--- a/Macro/PartialMap/macro.c Sun Sep 20 18:47:10 2015 -0700 +++ b/Macro/PartialMap/macro.c Mon Sep 28 19:58:39 2015 -0700 @@ -170,8 +170,8 @@ // 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? @@ -350,6 +350,58 @@ } +// 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 ----- @@ -398,9 +450,9 @@ // 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 ]; @@ -418,9 +470,9 @@ // 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; @@ -892,7 +944,7 @@ } // 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; @@ -1212,6 +1264,9 @@ // 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++ ) {