]> git.donarmstrong.com Git - kiibohd-controller.git/commitdiff
Initial UARTConnect scancode support
authorJacob Alexander <haata@kiibohd.com>
Sun, 9 Aug 2015 07:20:41 +0000 (00:20 -0700)
committerJacob Alexander <haata@kiibohd.com>
Sun, 9 Aug 2015 07:20:41 +0000 (00:20 -0700)
- 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
Scan/MDErgo1/defaultMap.kll
Scan/UARTConnect/capabilities.kll
Scan/UARTConnect/connect_scan.c
Scan/UARTConnect/connect_scan.h

index bc2d7d68643078ae25f04d55869398e0948c2baa..3122519f9b4252aabfd947bd51545366f98a9918 100644 (file)
 #include "usb_hid.h"
 #include <generatedKeymap.h> // Generated using kll at compile time, in build directory
 
+// Connect Includes
+#if defined(ConnectEnabled_define)
+#include <connect_scan.h>
+#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;
index ac6158c7adf67c783be239914964f3b90fe88a0e..94038e8220970a815ee9a0ded98600448eb68d64 100644 (file)
@@ -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 */
index f02c111e49a4d50e9f992259008704aa3aa4867f..b907221bd4503a28a6607ae35aece2592d20acd7 100644 (file)
@@ -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;
+
index 587a5e7c3b0ed783f79c1854c6fc2a16a8472d7b..89bb7729a670bee1ee83d832ba5e5dd3e4bf31f6 100644 (file)
 // 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;
index c2daca580ebbbf3af96bee894f450d0446a8c3a1..1b752e6b4006a0850ee2e06f31b90118e65fb853 100644 (file)
@@ -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 );
+