]> git.donarmstrong.com Git - kiibohd-controller.git/blobdiff - Output/pjrcUSB/output_com.c
Adding NKRO and Boot mode capabilities.
[kiibohd-controller.git] / Output / pjrcUSB / output_com.c
index 6bc027591199cc593780af012e4e619f086a76fd..e29cd30b230077935d1e7146274b4180db711d15 100644 (file)
@@ -106,7 +106,7 @@ volatile uint8_t  USBKeys_LEDs = 0;
 // Protocol setting from the host.
 // 0 - Boot Mode
 // 1 - NKRO Mode (Default, unless set by a BIOS or boot interface)
-volatile uint8_t  USBKeys_Protocol = 0;
+volatile uint8_t  USBKeys_Protocol = 1;
 
 // Indicate if USB should send update
 // OS only needs update if there has been a change in state
@@ -123,6 +123,60 @@ USBKeyChangeState USBKeys_Changed = USBKeyChangeState_None;
 
 // ----- 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 @@ void Output_usbCodeSend_capability( uint8_t state, uint8_t stateType, uint8_t *a
 
 // ----- 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 @@ inline void Output_setup()
        // 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();
 }