changeset 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 b4f66a698f36
children 7c6ac7b88cda
files Macro/PartialMap/macro.c Scan/MDErgo1/defaultMap.kll Scan/UARTConnect/capabilities.kll Scan/UARTConnect/connect_scan.c Scan/UARTConnect/connect_scan.h
diffstat 5 files changed, 81 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/Macro/PartialMap/macro.c	Thu Aug 06 00:36:37 2015 -0700
+++ b/Macro/PartialMap/macro.c	Sun Aug 09 00:20:41 2015 -0700
@@ -29,6 +29,11 @@
 #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 @@
 // 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;
--- a/Scan/MDErgo1/defaultMap.kll	Thu Aug 06 00:36:37 2015 -0700
+++ b/Scan/MDErgo1/defaultMap.kll	Sun Aug 09 00:20:41 2015 -0700
@@ -36,7 +36,7 @@
 	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 */
--- a/Scan/UARTConnect/capabilities.kll	Thu Aug 06 00:36:37 2015 -0700
+++ b/Scan/UARTConnect/capabilities.kll	Sun Aug 09 00:20:41 2015 -0700
@@ -39,3 +39,8 @@
 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;
+
--- 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;
--- a/Scan/UARTConnect/connect_scan.h	Thu Aug 06 00:36:37 2015 -0700
+++ b/Scan/UARTConnect/connect_scan.h	Sun Aug 09 00:20:41 2015 -0700
@@ -148,8 +148,17 @@
 
 
 
+// ----- 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 );
+