- When changing the mode, a key buffer flush is required (might confuse the OS temporarily)simple
Name = pjrcUSBCapabilities; | Name = pjrcUSBCapabilities; | ||||
Version = 0.2; | |||||
Version = 0.3; | |||||
Author = "HaaTa (Jacob Alexander) 2014"; | Author = "HaaTa (Jacob Alexander) 2014"; | ||||
KLL = 0.3; | KLL = 0.3; | ||||
# Modified Date | # 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 ); | consCtrlOut => Output_consCtrlSend_capability( consCode : 2 ); | ||||
sysCtrlOut => Output_sysCtrlSend_capability( sysCode : 1 ); | sysCtrlOut => Output_sysCtrlSend_capability( sysCode : 1 ); | ||||
usbKeyOut => Output_usbCodeSend_capability( usbCode : 1 ); | usbKeyOut => Output_usbCodeSend_capability( usbCode : 1 ); | ||||
# Configuration capabilities | |||||
kbdProtocolBoot => Output_kbdProtocolBoot_capability(); | |||||
kbdProtocolNKRO => Output_kbdProtocolNKRO_capability(); | |||||
// ----- Capabilities ----- | // ----- 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 | // Sends a Consumer Control code to the USB Output buffer | ||||
void Output_consCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ) | void Output_consCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ) | ||||
{ | { | ||||
// ----- Functions ----- | // ----- 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 | // USB Module Setup | ||||
inline void Output_setup() | inline void Output_setup() | ||||
{ | { | ||||
// Register USB Output CLI dictionary | // Register USB Output CLI dictionary | ||||
CLI_registerDictionary( outputCLIDict, outputCLIDictName ); | 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(); | |||||
} | } | ||||
// ----- Capabilities ----- | // ----- Capabilities ----- | ||||
// Output capabilities | |||||
void Output_consCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ); | 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_sysCtrlSend_capability( uint8_t state, uint8_t stateType, uint8_t *args ); | ||||
void Output_usbCodeSend_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 ----- | // ----- Functions ----- | ||||
void Output_setup(); | void Output_setup(); | ||||
void Output_send(); | void Output_send(); | ||||
void Output_flushBuffers(); | |||||
void Output_firmwareReload(); | void Output_firmwareReload(); | ||||
void Output_softReset(); | void Output_softReset(); | ||||