X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Macro%2FPartialMap%2Fmacro.c;h=7161fbf9e495d92eb9ec5d6c42f50afae355555a;hb=51486bc4e16830c16c30f696b3a4f84c93a5baf8;hp=3122519f9b4252aabfd947bd51545366f98a9918;hpb=ecd9923926af0f500e8f65e665687b7d99219118;p=kiibohd-controller.git diff --git a/Macro/PartialMap/macro.c b/Macro/PartialMap/macro.c index 3122519..7161fbf 100644 --- a/Macro/PartialMap/macro.c +++ b/Macro/PartialMap/macro.c @@ -156,6 +156,13 @@ uint16_t macroLayerIndexStackSize = 0; 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 ----- @@ -367,7 +374,7 @@ nat_ptr_t *Macro_layerLookup( TriggerGuide *guide, uint8_t latch_expire ) } // If no trigger macro is defined at the given layer, fallthrough to the next layer - for ( uint16_t layerIndex = 0; layerIndex < macroLayerIndexStackSize; layerIndex++ ) + for ( uint16_t layerIndex = macroLayerIndexStackSize; layerIndex != 0xFFFF; layerIndex-- ) { // Lookup Layer const Layer *layer = &LayerIndex[ macroLayerIndexStack[ layerIndex ] ]; @@ -424,18 +431,80 @@ nat_ptr_t *Macro_layerLookup( TriggerGuide *guide, uint8_t latch_expire ) // Otherwise no defined Trigger Macro erro_msg("Scan Code has no defined Trigger Macro: "); printHex( scanCode ); + print( NL ); return 0; } -// Update the scancode using a list of TriggerGuides -// TODO Handle led state and analog -inline void Macro_triggerState( void *triggers, uint8_t num ) +// Add an interconnect ScanCode +// These are handled differently (less information is sent, hold/off states must be assumed) +#if defined(ConnectEnabled_define) +inline void Macro_interconnectAdd( void *trigger_ptr ) { - // Copy each of the TriggerGuides to the TriggerListBuffer - for ( uint8_t c = 0; c < num; c++ ) - macroTriggerListBuffer[ macroTriggerListBufferSize++ ] = ((TriggerGuide*)triggers)[ c ]; + TriggerGuide *trigger = (TriggerGuide*)trigger_ptr; + + // Error checking + uint8_t error = 0; + switch ( trigger->type ) + { + case 0x00: // Normal key + switch ( trigger->state ) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + break; + default: + erro_msg("Invalid key state - "); + error = 1; + break; + } + break; + + // Invalid TriggerGuide type + default: + erro_msg("Invalid type - "); + error = 1; + break; + } + + // Check if ScanCode is out of range + if ( trigger->scanCode > MaxScanCode ) + { + warn_msg("ScanCode is out of range/not defined - "); + error = 1; + } + + // Display TriggerGuide + if ( error ) + { + printHex( trigger->type ); + print(" "); + printHex( trigger->state ); + print(" "); + printHex( trigger->scanCode ); + print( NL ); + return; + } + + // Add trigger to the Interconnect Cache + // During each processing loop, a scancode may be re-added depending on it's state + for ( uint8_t c = 0; c < macroInterconnectCacheSize; c++ ) + { + // Check if the same ScanCode + if ( macroInterconnectCache[ c ].scanCode == trigger->scanCode ) + { + // Update the state + macroInterconnectCache[ c ].state = trigger->state; + return; + } + } + + // If not in the list, add it + macroInterconnectCache[ macroInterconnectCacheSize++ ] = *trigger; } +#endif // Update the scancode key state @@ -447,12 +516,35 @@ inline void Macro_triggerState( void *triggers, uint8_t num ) // * 0x04 - Unpressed (this is currently ignored) inline void Macro_keyState( uint8_t scanCode, uint8_t state ) { +#if defined(ConnectEnabled_define) + // Only compile in if a Connect node module is available + if ( !Connect_master ) + { + // ScanCodes are only added if there was a state change (on/off) + switch ( state ) + { + case 0x00: // Off + case 0x02: // Held + return; + } + } +#endif + // Only add to macro trigger list if one of three states switch ( state ) { case 0x01: // Pressed case 0x02: // Held case 0x03: // Released + // Check if ScanCode is out of range + if ( scanCode > MaxScanCode ) + { + warn_msg("ScanCode is out of range/not defined: "); + printHex( scanCode ); + print( NL ); + return; + } + macroTriggerListBuffer[ macroTriggerListBufferSize ].scanCode = scanCode; macroTriggerListBuffer[ macroTriggerListBufferSize ].state = state; macroTriggerListBuffer[ macroTriggerListBufferSize ].type = 0x00; // Normal key @@ -470,8 +562,18 @@ inline void Macro_keyState( uint8_t scanCode, uint8_t state ) inline void Macro_analogState( uint8_t scanCode, uint8_t state ) { // Only add to macro trigger list if non-off + // TODO Handle change for interconnect if ( state != 0x00 ) { + // Check if ScanCode is out of range + if ( scanCode > MaxScanCode ) + { + warn_msg("ScanCode is out of range/not defined: "); + printHex( scanCode ); + print( NL ); + return; + } + macroTriggerListBuffer[ macroTriggerListBufferSize ].scanCode = scanCode; macroTriggerListBuffer[ macroTriggerListBufferSize ].state = state; macroTriggerListBuffer[ macroTriggerListBufferSize ].type = 0x02; // Analog key @@ -487,8 +589,12 @@ inline void Macro_analogState( uint8_t scanCode, uint8_t state ) inline void Macro_ledState( uint8_t ledCode, uint8_t state ) { // Only add to macro trigger list if non-off + // TODO Handle change for interconnect if ( state != 0x00 ) { + // Check if LedCode is out of range + // TODO + macroTriggerListBuffer[ macroTriggerListBufferSize ].scanCode = ledCode; macroTriggerListBuffer[ macroTriggerListBufferSize ].state = state; macroTriggerListBuffer[ macroTriggerListBufferSize ].type = 0x01; // LED key @@ -907,6 +1013,10 @@ inline void Macro_updateTriggerMacroPendingList() // Lookup Trigger List nat_ptr_t *triggerList = Macro_layerLookup( ¯oTriggerListBuffer[ key ], latch_expire ); + // If there was an error during lookup, skip + if ( triggerList == 0 ) + continue; + // Number of Triggers in list nat_ptr_t triggerListSize = triggerList[0]; @@ -953,10 +1063,7 @@ inline void Macro_process() { if ( macroTriggerListBufferSize > 0 ) { - dbug_msg("Yuh"); - printHex( macroTriggerListBufferSize ); - print( NL ); - //Connect_send_ScanCode( Connect_id, macroTriggerListBuffer, macroTriggerListBufferSize ); + Connect_send_ScanCode( Connect_id, macroTriggerListBuffer, macroTriggerListBufferSize ); macroTriggerListBufferSize = 0; } return; @@ -967,6 +1074,41 @@ inline void Macro_process() if ( USBKeys_Sent != 0 ) return; +#if defined(ConnectEnabled_define) + // Check if there are any ScanCodes in the interconnect cache to process + if ( Connect_master && macroInterconnectCacheSize > 0 ) + { + // Iterate over all the cache ScanCodes + uint8_t currentInterconnectCacheSize = macroInterconnectCacheSize; + macroInterconnectCacheSize = 0; + for ( uint8_t c = 0; c < currentInterconnectCacheSize; c++ ) + { + // Add to the trigger list + macroTriggerListBuffer[ macroTriggerListBufferSize++ ] = macroInterconnectCache[ c ]; + + // TODO Handle other TriggerGuide types (e.g. analog) + switch ( macroInterconnectCache[ c ].type ) + { + // Normal (Press/Hold/Release) + case 0x00: + // Decide what to do based on the current state + switch ( macroInterconnectCache[ c ].state ) + { + // Re-add to interconnect cache in hold state + case 0x01: // Press + //case 0x02: // Hold // XXX Why does this not work? -HaaTa + macroInterconnectCache[ c ].state = 0x02; + macroInterconnectCache[ macroInterconnectCacheSize++ ] = macroInterconnectCache[ c ]; + break; + case 0x03: // Remove + break; + // Otherwise, do not re-add + } + } + } + } +#endif + // If the pause flag is set, only process if the step counter is non-zero if ( macroPauseMode ) {