+uint16_t macroResultMacroPendingList[ ResultMacroNum ] = { 0 };
+uint16_t macroResultMacroPendingListSize = 0;
+
+// Interconnect ScanCode Cache
+#if defined(ConnectEnabled_define)
+// TODO This can be shrunk by the size of the max node 0 ScanCode
+TriggerGuide macroInterconnectCache[ MaxScanCode ];
+uint8_t macroInterconnectCacheSize = 0;
+#endif
+
+
+
+// ----- Capabilities -----
+
+// 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 )
+ return;
+
+ // Is layer in the LayerIndexStack?
+ uint8_t inLayerIndexStack = 0;
+ uint16_t stackItem = 0;
+ while ( stackItem < macroLayerIndexStackSize )
+ {
+ // Flag if layer is already in the LayerIndexStack
+ if ( macroLayerIndexStack[ stackItem ] == layer )
+ {
+ inLayerIndexStack = 1;
+ break;
+ }
+
+ // Increment to next item
+ stackItem++;
+ }
+
+ // Toggle Layer State Byte
+ if ( LayerState[ layer ] & layerState )
+ {
+ // Unset
+ LayerState[ layer ] &= ~layerState;
+ }
+ else
+ {
+ // Set
+ LayerState[ layer ] |= layerState;
+ }
+
+ // If the layer was not in the LayerIndexStack add it
+ if ( !inLayerIndexStack )
+ {
+ macroLayerIndexStack[ macroLayerIndexStackSize++ ] = layer;
+ }
+
+ // If the layer is in the LayerIndexStack and the state is 0x00, remove
+ if ( LayerState[ layer ] == 0x00 && inLayerIndexStack )
+ {
+ // Remove the layer from the LayerIndexStack
+ // Using the already positioned stackItem variable from the loop above
+ while ( stackItem < macroLayerIndexStackSize )
+ {
+ macroLayerIndexStack[ stackItem ] = macroLayerIndexStack[ stackItem + 1 ];
+ stackItem++;
+ }
+
+ // Reduce LayerIndexStack size
+ macroLayerIndexStackSize--;
+ }
+
+ // Layer Debug Mode
+ if ( layerDebugMode )
+ {
+ dbug_msg("Layer ");
+
+ // Iterate over each of the layers displaying the state as a hex value
+ for ( uint16_t index = 0; index < LayerNum; index++ )
+ {
+ printHex_op( LayerState[ index ], 0 );
+ }
+
+ // Always show the default layer (it's always 0)
+ print(" 0");
+
+ // Iterate over the layer stack starting from the bottom of the stack
+ for ( uint16_t index = macroLayerIndexStackSize; index > 0; index-- )
+ {
+ print(":");
+ printHex_op( macroLayerIndexStack[ index - 1 ], 0 );
+ }
+
+ print( NL );
+ }
+}
+
+// Modifies the specified Layer control byte
+// Argument #1: Layer Index -> uint16_t
+// Argument #2: Layer State -> uint8_t
+void Macro_layerState_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+ // Display capability name
+ if ( stateType == 0xFF && state == 0xFF )
+ {
+ print("Macro_layerState(layerIndex,layerState)");
+ return;
+ }
+
+ // Only use capability on press or release
+ // TODO Analog
+ // XXX This may cause issues, might be better to implement state table here to decide -HaaTa
+ if ( stateType == 0x00 && state == 0x02 ) // Hold condition
+ return;
+
+ // Get layer index from arguments
+ // Cast pointer to uint8_t to uint16_t then access that memory location
+ uint16_t layer = *(uint16_t*)(&args[0]);
+
+ // Get layer toggle byte
+ uint8_t layerState = args[ sizeof(uint16_t) ];
+
+ Macro_layerState( state, stateType, layer, layerState );
+}
+
+
+// Latches given layer
+// Argument #1: Layer Index -> uint16_t
+void Macro_layerLatch_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+ // Display capability name
+ if ( stateType == 0xFF && state == 0xFF )
+ {
+ print("Macro_layerLatch(layerIndex)");
+ return;
+ }
+
+ // Only use capability on press
+ // TODO Analog
+ if ( stateType == 0x00 && state != 0x03 ) // Only on release
+ return;
+
+ // Get layer index from arguments
+ // Cast pointer to uint8_t to uint16_t then access that memory location
+ uint16_t layer = *(uint16_t*)(&args[0]);
+
+ Macro_layerState( state, stateType, layer, 0x02 );
+}
+
+
+// Locks given layer
+// Argument #1: Layer Index -> uint16_t
+void Macro_layerLock_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+ // Display capability name
+ if ( stateType == 0xFF && state == 0xFF )
+ {
+ print("Macro_layerLock(layerIndex)");
+ 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;
+
+ // Get layer index from arguments
+ // Cast pointer to uint8_t to uint16_t then access that memory location
+ uint16_t layer = *(uint16_t*)(&args[0]);
+
+ Macro_layerState( state, stateType, layer, 0x04 );
+}
+
+
+// Shifts given layer
+// Argument #1: Layer Index -> uint16_t
+void Macro_layerShift_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+ // Display capability name
+ if ( stateType == 0xFF && state == 0xFF )
+ {
+ print("Macro_layerShift(layerIndex)");
+ return;
+ }
+
+ // Only use capability on press or release
+ // TODO Analog
+ if ( stateType == 0x00 && ( state == 0x00 || state == 0x02 ) ) // Only pass press or release conditions
+ return;
+
+ // Get layer index from arguments
+ // Cast pointer to uint8_t to uint16_t then access that memory location
+ uint16_t layer = *(uint16_t*)(&args[0]);
+
+ Macro_layerState( state, stateType, layer, 0x01 );
+}