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++ )
 	{