From ecd9923926af0f500e8f65e665687b7d99219118 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sun, 9 Aug 2015 00:20:41 -0700 Subject: [PATCH] Initial UARTConnect scancode support - Still some issues - Will require some changes to MatrixARM and PartialMap * Currently state information is passed around too frequently * Needs to be reduced to state changes only --- Macro/PartialMap/macro.c | 22 +++++++++++ Scan/MDErgo1/defaultMap.kll | 2 +- Scan/UARTConnect/capabilities.kll | 5 +++ Scan/UARTConnect/connect_scan.c | 62 ++++++++++++++++++++++--------- Scan/UARTConnect/connect_scan.h | 9 +++++ 5 files changed, 81 insertions(+), 19 deletions(-) diff --git a/Macro/PartialMap/macro.c b/Macro/PartialMap/macro.c index bc2d7d6..3122519 100644 --- a/Macro/PartialMap/macro.c +++ b/Macro/PartialMap/macro.c @@ -29,6 +29,11 @@ #include "usb_hid.h" #include // Generated using kll at compile time, in build directory +// Connect Includes +#if defined(ConnectEnabled_define) +#include +#endif + // Local Includes #include "macro.h" @@ -941,6 +946,23 @@ inline void Macro_updateTriggerMacroPendingList() // Called once per USB buffer send inline void Macro_process() { +#if defined(ConnectEnabled_define) + // Only compile in if a Connect node module is available + // If this is a interconnect slave node, send all scancodes to master node + if ( !Connect_master ) + { + if ( macroTriggerListBufferSize > 0 ) + { + dbug_msg("Yuh"); + printHex( macroTriggerListBufferSize ); + print( NL ); + //Connect_send_ScanCode( Connect_id, macroTriggerListBuffer, macroTriggerListBufferSize ); + macroTriggerListBufferSize = 0; + } + return; + } +#endif + // Only do one round of macro processing between Output Module timer sends if ( USBKeys_Sent != 0 ) return; diff --git a/Scan/MDErgo1/defaultMap.kll b/Scan/MDErgo1/defaultMap.kll index ac6158c..94038e8 100644 --- a/Scan/MDErgo1/defaultMap.kll +++ b/Scan/MDErgo1/defaultMap.kll @@ -36,7 +36,7 @@ ISSILedMask1 = " 0xFF, 0x00, /* C2-1 -> C2-16 */ 0xFF, 0x00, /* C3-1 -> C3-16 */ 0xFF, 0x00, /* C4-1 -> C4-16 */ - 0xFC, 0x00, /* C5-1 -> C5-16 */ + 0x3F, 0x00, /* C5-1 -> C5-16 */ 0x00, 0x00, /* C6-1 -> C6-16 */ 0x00, 0x00, /* C7-1 -> C7-16 */ 0x00, 0x00, /* C8-1 -> C8-16 */ diff --git a/Scan/UARTConnect/capabilities.kll b/Scan/UARTConnect/capabilities.kll index f02c111..b907221 100644 --- a/Scan/UARTConnect/capabilities.kll +++ b/Scan/UARTConnect/capabilities.kll @@ -39,3 +39,8 @@ UARTConnectBaudFine = 0x0; UARTConnectCableCheckLength => UARTConnectCableCheckLength_define; UARTConnectCableCheckLength = 2; +# Connect Enable +# Define used to indicate to non-connect modules that support should be compiled in +ConnectEnabled => ConnectEnabled_define; +ConnectEnabled = 1; + diff --git a/Scan/UARTConnect/connect_scan.c b/Scan/UARTConnect/connect_scan.c index 587a5e7..89bb772 100644 --- a/Scan/UARTConnect/connect_scan.c +++ b/Scan/UARTConnect/connect_scan.c @@ -36,11 +36,13 @@ // Macro for adding to each uart Tx ring buffer #define uart_addTxBuffer( uartNum ) \ case uartNum: \ + /* Delay UART copy until there's some space left */ \ while ( uart##uartNum##_buffer_items + count > uart_buffer_size ) \ { \ warn_msg("Too much data to send on UART0, waiting..."); \ delay( 1 ); \ } \ + /* Append data to ring buffer */ \ for ( uint8_t c = 0; c < count; c++ ) \ { \ if ( Connect_debug ) \ @@ -88,6 +90,7 @@ case uartNum: \ UART##uartNum##_CFIFO = UART_CFIFO_RXFLUSH; \ return; \ } \ + /* Process each byte in the UART buffer */ \ while ( available-- > 0 ) \ { \ uint8_t byteRead = UART##uartNum##_D; \ @@ -152,6 +155,7 @@ case uartNum: \ { \ print(" CMD "); \ } \ + /* Call specific UARTConnect command receive function */ \ uint8_t (*rcvFunc)(uint8_t, uint16_t(*), uint8_t) = (uint8_t(*)(uint8_t, uint16_t(*), uint8_t))(Connect_receiveFunctions[ uart##uartNum##_rx_command ]); \ if ( rcvFunc( byteRead, (uint16_t*)&uart##uartNum##_rx_bytes_waiting, uartNum ) ) \ uart##uartNum##_rx_status = UARTStatus_Wait; \ @@ -426,7 +430,7 @@ uint32_t Connect_cableFaultsSlave = 0; uint8_t Connect_cableOkMaster = 0; uint8_t Connect_cableOkSlave = 0; -uint8_t Connect_receive_CableCheck( uint8_t byte, uint16_t *pending_bytes, uint8_t to_master ) +uint8_t Connect_receive_CableCheck( uint8_t byte, uint16_t *pending_bytes, uint8_t to_slave ) { // Check if this is the first byte if ( *pending_bytes == 0xFFFF ) @@ -453,7 +457,7 @@ uint8_t Connect_receive_CableCheck( uint8_t byte, uint16_t *pending_bytes, uint8 warn_print("Cable Fault!"); // Check which side of the chain - if ( to_master ) + if ( to_slave ) { Connect_cableFaultsMaster++; Connect_cableOkMaster = 0; @@ -476,7 +480,7 @@ uint8_t Connect_receive_CableCheck( uint8_t byte, uint16_t *pending_bytes, uint8 // If cable check was successful, set cable ok if ( *pending_bytes == 0 ) { - if ( to_master ) + if ( to_slave ) { Connect_cableOkMaster = 1; } @@ -499,11 +503,11 @@ uint8_t Connect_receive_CableCheck( uint8_t byte, uint16_t *pending_bytes, uint8 return *pending_bytes == 0 ? 1 : 0; } -uint8_t Connect_receive_IdRequest( uint8_t byte, uint16_t *pending_bytes, uint8_t to_master ) +uint8_t Connect_receive_IdRequest( uint8_t byte, uint16_t *pending_bytes, uint8_t to_slave ) { dbug_print("IdRequest"); // Check the directionality - if ( to_master ) + if ( to_slave ) { erro_print("Invalid IdRequest direction..."); } @@ -524,11 +528,11 @@ uint8_t Connect_receive_IdRequest( uint8_t byte, uint16_t *pending_bytes, uint8_ return 1; } -uint8_t Connect_receive_IdEnumeration( uint8_t id, uint16_t *pending_bytes, uint8_t to_master ) +uint8_t Connect_receive_IdEnumeration( uint8_t id, uint16_t *pending_bytes, uint8_t to_slave ) { dbug_print("IdEnumeration"); // Check the directionality - if ( !to_master ) + if ( !to_slave ) { erro_print("Invalid IdEnumeration direction..."); } @@ -548,11 +552,11 @@ uint8_t Connect_receive_IdEnumeration( uint8_t id, uint16_t *pending_bytes, uint return 1; } -uint8_t Connect_receive_IdReport( uint8_t id, uint16_t *pending_bytes, uint8_t to_master ) +uint8_t Connect_receive_IdReport( uint8_t id, uint16_t *pending_bytes, uint8_t to_slave ) { dbug_print("IdReport"); // Check the directionality - if ( to_master ) + if ( to_slave ) { erro_print("Invalid IdRequest direction..."); } @@ -580,11 +584,11 @@ TriggerGuide Connect_receive_ScanCodeBuffer; uint8_t Connect_receive_ScanCodeBufferPos; uint8_t Connect_receive_ScanCodeDeviceId; -uint8_t Connect_receive_ScanCode( uint8_t byte, uint16_t *pending_bytes, uint8_t to_master ) +uint8_t Connect_receive_ScanCode( uint8_t byte, uint16_t *pending_bytes, uint8_t to_slave ) { dbug_print("ScanCode"); // Check the directionality - if ( !to_master ) + if ( to_slave ) { erro_print("Invalid ScanCode direction..."); } @@ -592,12 +596,13 @@ uint8_t Connect_receive_ScanCode( uint8_t byte, uint16_t *pending_bytes, uint8_t // Master node, trigger scan codes if ( Connect_master ) switch ( (*pending_bytes)-- ) { + // Byte count always starts at 0xFFFF case 0xFFFF: // Device Id Connect_receive_ScanCodeDeviceId = byte; break; case 0xFFFE: // Number of TriggerGuides in bytes (byte * 3) - *pending_bytes = byte * 3; + *pending_bytes = byte * sizeof( TriggerGuide ); Connect_receive_ScanCodeBufferPos = 0; break; @@ -605,12 +610,32 @@ uint8_t Connect_receive_ScanCode( uint8_t byte, uint16_t *pending_bytes, uint8_t // Set the specific TriggerGuide entry ((uint8_t*)&Connect_receive_ScanCodeBuffer)[ Connect_receive_ScanCodeBufferPos++ ] = byte; - // Reset the BufferPos if higher than 3 + // Reset the BufferPos if higher than sizeof TriggerGuide // And send the TriggerGuide to the Macro Module - if ( Connect_receive_ScanCodeBufferPos > 3 ) + if ( Connect_receive_ScanCodeBufferPos > sizeof( TriggerGuide ) ) { Connect_receive_ScanCodeBufferPos = 0; - Macro_triggerState( &Connect_receive_ScanCodeBuffer, 1 ); + + // Adjust ScanCode offset + if ( Connect_receive_ScanCodeDeviceId > 0 ) + { + // This variable is in generatedKeymaps.h + extern uint8_t InterconnectOffsetList[]; + Connect_receive_ScanCodeBuffer.scanCode = Connect_receive_ScanCodeBuffer.scanCode + InterconnectOffsetList[ Connect_receive_ScanCodeDeviceId - 1 ]; + } + + // ScanCode receive debug + dbug_print(""); + printHex( Connect_receive_ScanCodeBuffer.type ); + print(" "); + printHex( Connect_receive_ScanCodeBuffer.state ); + print(" "); + printHex( Connect_receive_ScanCodeBuffer.scanCode ); + print( NL ); + + // Send ScanCode to macro module + // TODO + //Macro_triggerState( &Connect_receive_ScanCodeBuffer, 1 ); } break; @@ -618,6 +643,7 @@ uint8_t Connect_receive_ScanCode( uint8_t byte, uint16_t *pending_bytes, uint8_t // Propagate ScanCode packet else switch ( (*pending_bytes)-- ) { + // Byte count always starts at 0xFFFF case 0xFFFF: // Device Id { Connect_receive_ScanCodeDeviceId = byte; @@ -630,8 +656,8 @@ uint8_t Connect_receive_ScanCode( uint8_t byte, uint16_t *pending_bytes, uint8_t Connect_addBytes( header, sizeof( header ), 1 ); // Master break; } - case 0xFFFE: // Number of TriggerGuides in bytes (byte * 3) - *pending_bytes = byte * 3; + case 0xFFFE: // Number of TriggerGuides in bytes + *pending_bytes = byte * sizeof( TriggerGuide ); Connect_receive_ScanCodeBufferPos = 0; // Pass through byte @@ -652,7 +678,7 @@ uint8_t Connect_receive_ScanCode( uint8_t byte, uint16_t *pending_bytes, uint8_t return *pending_bytes == 0 ? 1 : 0; } -uint8_t Connect_receive_Animation( uint8_t byte, uint16_t *pending_bytes, uint8_t to_master ) +uint8_t Connect_receive_Animation( uint8_t byte, uint16_t *pending_bytes, uint8_t to_slave ) { dbug_print("Animation"); return 1; diff --git a/Scan/UARTConnect/connect_scan.h b/Scan/UARTConnect/connect_scan.h index c2daca5..1b752e6 100644 --- a/Scan/UARTConnect/connect_scan.h +++ b/Scan/UARTConnect/connect_scan.h @@ -148,8 +148,17 @@ typedef struct RemoteInputCommand { +// ----- Variables ----- + +extern uint8_t Connect_id; +extern uint8_t Connect_master; // Set if master + + + // ----- Functions ----- void Connect_setup( uint8_t master ); void Connect_scan(); +void Connect_send_ScanCode( uint8_t id, TriggerGuide *scanCodeStateList, uint8_t numScanCodes ); + -- 2.39.2