# HG changeset patch # User Jacob Alexander # Date 1443495519 25200 # Node ID dbbdedccc275b983eb8bff305466688f1daa3a52 # Parent 47f89f1bfdb7a5397d242110b6c825ce84e9f091 Adding layer rotation (next/prev) capability - Requires kll update - Including udev id update diff -r 47f89f1bfdb7 -r dbbdedccc275 98-kiibohd.rules --- a/98-kiibohd.rules Sun Sep 20 18:47:10 2015 -0700 +++ b/98-kiibohd.rules Mon Sep 28 19:58:39 2015 -0700 @@ -5,6 +5,7 @@ # Kiibohd Serial Interface KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789]?", MODE:="0666" KERNEL=="ttyACM*", ATTRS{idVendor}=="1c11", ATTRS{idProduct}=="b04d", MODE:="0666" +KERNEL=="ttyACM*", ATTRS{idVendor}=="1c11", ATTRS{idProduct}=="f05c", MODE:="0666" # Kiibohd Device SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", ATTRS{idProduct}=="b04d", MODE:="0666" # DFU Bootloader (MCHCK) diff -r 47f89f1bfdb7 -r dbbdedccc275 Macro/PartialMap/capabilities.kll --- a/Macro/PartialMap/capabilities.kll Sun Sep 20 18:47:10 2015 -0700 +++ b/Macro/PartialMap/capabilities.kll Mon Sep 28 19:58:39 2015 -0700 @@ -1,17 +1,22 @@ 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; diff -r 47f89f1bfdb7 -r dbbdedccc275 Macro/PartialMap/macro.c --- 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++ ) { diff -r 47f89f1bfdb7 -r dbbdedccc275 Scan/STLcd/lcd_scan.c --- a/Scan/STLcd/lcd_scan.c Sun Sep 20 18:47:10 2015 -0700 +++ b/Scan/STLcd/lcd_scan.c Mon Sep 28 19:58:39 2015 -0700 @@ -345,6 +345,7 @@ // ----- 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 @@ -358,12 +359,14 @@ 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] = {