changeset 234:aaf14110ea7b

Adding NKRO and Boot mode capabilities. - When changing the mode, a key buffer flush is required (might confuse the OS temporarily)
author Jacob Alexander <haata@kiibohd.com>
date Wed, 01 Oct 2014 23:44:12 -0700
parents 757e06368d0f
children decebaeea692
files Output/pjrcUSB/capabilities.kll Output/pjrcUSB/output_com.c Output/pjrcUSB/output_com.h
diffstat 3 files changed, 84 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/Output/pjrcUSB/capabilities.kll	Wed Oct 01 00:16:14 2014 -0700
+++ b/Output/pjrcUSB/capabilities.kll	Wed Oct 01 23:44:12 2014 -0700
@@ -1,14 +1,18 @@
 Name = pjrcUSBCapabilities;
-Version = 0.2;
+Version = 0.3;
 Author = "HaaTa (Jacob Alexander) 2014";
 KLL = 0.3;
 
 # Modified Date
-Date = 2014-09-20;
+Date = 2014-10-01;
 
 
-# Capabilties available to the pjrcUSB output module
+# Output capabilities
 consCtrlOut => Output_consCtrlSend_capability( consCode : 2 );
 sysCtrlOut  => Output_sysCtrlSend_capability( sysCode : 1 );
 usbKeyOut   => Output_usbCodeSend_capability( usbCode : 1 );
 
+# Configuration capabilities
+kbdProtocolBoot => Output_kbdProtocolBoot_capability();
+kbdProtocolNKRO => Output_kbdProtocolNKRO_capability();
+
--- a/Output/pjrcUSB/output_com.c	Wed Oct 01 00:16:14 2014 -0700
+++ b/Output/pjrcUSB/output_com.c	Wed Oct 01 23:44:12 2014 -0700
@@ -123,6 +123,60 @@
 
 // ----- Capabilities -----
 
+// Set Boot Keyboard Protocol
+void Output_kbdProtocolBoot_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+	// Display capability name
+	if ( stateType == 0xFF && state == 0xFF )
+	{
+		print("Output_kbdProtocolBoot()");
+		return;
+	}
+
+	// Only set if necessary
+	if ( USBKeys_Protocol == 0 )
+		return;
+
+	// TODO Analog inputs
+	// Only set on key press
+	if ( stateType != 0x01 )
+		return;
+
+	// Flush the key buffers
+	Output_flushBuffers();
+
+	// Set the keyboard protocol to Boot Mode
+	USBKeys_Protocol = 0;
+}
+
+
+// Set NKRO Keyboard Protocol
+void Output_kbdProtocolNKRO_capability( uint8_t state, uint8_t stateType, uint8_t *args )
+{
+	// Display capability name
+	if ( stateType == 0xFF && state == 0xFF )
+	{
+		print("Output_kbdProtocolNKRO()");
+		return;
+	}
+
+	// Only set if necessary
+	if ( USBKeys_Protocol == 1 )
+		return;
+
+	// TODO Analog inputs
+	// Only set on key press
+	if ( stateType != 0x01 )
+		return;
+
+	// Flush the key buffers
+	Output_flushBuffers();
+
+	// Set the keyboard protocol to NKRO Mode
+	USBKeys_Protocol = 1;
+}
+
+
 // Sends a Consumer Control code to the USB Output buffer
 void Output_consCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args )
 {
@@ -358,6 +412,20 @@
 
 // ----- Functions -----
 
+// Flush Key buffers
+void Output_flushBuffers()
+{
+	// Zero out USBKeys_Keys array
+	for ( uint8_t c = 0; c < USB_NKRO_BITFIELD_SIZE_KEYS; c++ )
+		USBKeys_Keys[ c ] = 0;
+
+	// Zero out other key buffers
+	USBKeys_ConsCtrl = 0;
+	USBKeys_Modifiers = 0;
+	USBKeys_SysCtrl = 0;
+}
+
+
 // USB Module Setup
 inline void Output_setup()
 {
@@ -370,9 +438,8 @@
 	// Register USB Output CLI dictionary
 	CLI_registerDictionary( outputCLIDict, outputCLIDictName );
 
-	// Zero out USBKeys_Keys array
-	for ( uint8_t c = 0; c < USB_NKRO_BITFIELD_SIZE_KEYS; c++ )
-		USBKeys_Keys[ c ] = 0;
+	// Flush key buffers
+	Output_flushBuffers();
 }
 
 
--- a/Output/pjrcUSB/output_com.h	Wed Oct 01 00:16:14 2014 -0700
+++ b/Output/pjrcUSB/output_com.h	Wed Oct 01 23:44:12 2014 -0700
@@ -80,10 +80,15 @@
 
 // ----- Capabilities -----
 
+// Output capabilities
 void Output_consCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args );
 void Output_sysCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args );
 void Output_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *args );
 
+// Configuration capabilities
+void Output_kbdProtocolBoot_capability( uint8_t state, uint8_t stateType, uint8_t *args );
+void Output_kbdProtocolNKRO_capability( uint8_t state, uint8_t stateType, uint8_t *args );
+
 
 
 // ----- Functions -----
@@ -91,6 +96,8 @@
 void Output_setup();
 void Output_send();
 
+void Output_flushBuffers();
+
 void Output_firmwareReload();
 void Output_softReset();