Mercurial > louis > kiibohd-controller
diff Scan/UARTConnect/connect_scan.c @ 360:dbefb68411e1
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
author | Jacob Alexander <haata@kiibohd.com> |
---|---|
date | Sun, 09 Aug 2015 00:20:41 -0700 |
parents | 86b937945313 |
children | 7c6ac7b88cda |
line wrap: on
line diff
--- a/Scan/UARTConnect/connect_scan.c Thu Aug 06 00:36:37 2015 -0700 +++ b/Scan/UARTConnect/connect_scan.c Sun Aug 09 00:20:41 2015 -0700 @@ -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 @@ 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 @@ { \ 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 @@ 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 @@ 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 @@ // 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ // 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 @@ // 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 @@ // 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 @@ 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 @@ 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;