HID support added

This commit is contained in:
Oleg Mazurov 2011-10-11 12:37:54 -06:00
parent f1a569f18c
commit d8596b0077
12 changed files with 5540 additions and 0 deletions

View file

@ -0,0 +1,96 @@
#include <avr/pgmspace.h>
#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <avr/pgmspace.h>
#include <address.h>
#include <hidboot.h>
#include <printhex.h>
#include <message.h>
#include <hexdump.h>
#include <parsetools.h>
class KbdRptParser : public KeyboardReportParser
{
void PrintKey(uint8_t mod, uint8_t key);
protected:
virtual void OnKeyDown (uint8_t mod, uint8_t key);
virtual void OnKeyUp (uint8_t mod, uint8_t key);
virtual void OnKeyPressed(uint8_t key);
};
void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
MODIFIERKEYS mod;
*((uint8_t*)&mod) = m;
Serial.print((mod.bmLeftCtrl == 1) ? "C" : " ");
Serial.print((mod.bmLeftShift == 1) ? "S" : " ");
Serial.print((mod.bmLeftAlt == 1) ? "A" : " ");
Serial.print((mod.bmLeftGUI == 1) ? "G" : " ");
Serial.print(" >");
PrintHex<uint8_t>(key);
Serial.print("< ");
Serial.print((mod.bmRightCtrl == 1) ? "C" : " ");
Serial.print((mod.bmRightShift == 1) ? "S" : " ");
Serial.print((mod.bmRightAlt == 1) ? "A" : " ");
Serial.println((mod.bmRightGUI == 1) ? "G" : " ");
};
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
Serial.print("DN ");
PrintKey(mod, key);
uint8_t c = OemToAscii(mod, key);
if (c)
OnKeyPressed(c);
}
void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key)
{
Serial.print("UP ");
PrintKey(mod, key);
}
void KbdRptParser::OnKeyPressed(uint8_t key)
{
Serial.print("ASCII: ");
Serial.println(key);
};
USB Usb;
//USBHub Hub(&Usb);
HIDBoot<HID_PROTOCOL_KEYBOARD> Keyboard(&Usb);
uint32_t next_time;
KbdRptParser Prs;
void setup()
{
Serial.begin( 115200 );
Serial.println("Start");
if (Usb.Init() == -1)
Serial.println("OSC did not start.");
delay( 200 );
next_time = millis() + 5000;
Keyboard.SetReportParser(0, (HIDReportParser*)&Prs);
}
void loop()
{
Usb.Task();
}

View file

@ -0,0 +1,87 @@
#include <avr/pgmspace.h>
#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <avr/pgmspace.h>
#include <address.h>
#include <hidboot.h>
#include <printhex.h>
#include <message.h>
#include <hexdump.h>
#include <parsetools.h>
class MouseRptParser : public MouseReportParser
{
protected:
virtual void OnMouseMove (MOUSEINFO *mi);
virtual void OnLeftButtonUp (MOUSEINFO *mi);
virtual void OnLeftButtonDown (MOUSEINFO *mi);
virtual void OnRightButtonUp (MOUSEINFO *mi);
virtual void OnRightButtonDown (MOUSEINFO *mi);
virtual void OnMiddleButtonUp (MOUSEINFO *mi);
virtual void OnMiddleButtonDown (MOUSEINFO *mi);
};
void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{
Serial.print("dx=");
Serial.print(mi->dX, DEC);
Serial.print(" dy=");
Serial.println(mi->dY, DEC);
};
void MouseRptParser::OnLeftButtonUp (MOUSEINFO *mi)
{
Serial.println("L Butt Up");
};
void MouseRptParser::OnLeftButtonDown (MOUSEINFO *mi)
{
Serial.println("L Butt Dn");
};
void MouseRptParser::OnRightButtonUp (MOUSEINFO *mi)
{
Serial.println("R Butt Up");
};
void MouseRptParser::OnRightButtonDown (MOUSEINFO *mi)
{
Serial.println("R Butt Dn");
};
void MouseRptParser::OnMiddleButtonUp (MOUSEINFO *mi)
{
Serial.println("M Butt Up");
};
void MouseRptParser::OnMiddleButtonDown (MOUSEINFO *mi)
{
Serial.println("M Butt Dn");
};
USB Usb;
//USBHub Hub(&Usb);
HIDBoot<HID_PROTOCOL_MOUSE> Mouse(&Usb);
uint32_t next_time;
MouseRptParser Prs;
void setup()
{
Serial.begin( 115200 );
Serial.println("Start");
if (Usb.Init() == -1)
Serial.println("OSC did not start.");
delay( 200 );
next_time = millis() + 5000;
Mouse.SetReportParser(0, (HIDReportParser*)&Prs);
}
void loop()
{
Usb.Task();
}

View file

@ -0,0 +1,347 @@
#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <avr/pgmspace.h>
#include <address.h>
#include "pgmstrings.h"
USB Usb;
USBHub Hub1(&Usb);
USBHub Hub2(&Usb);
USBHub Hub3(&Usb);
USBHub Hub4(&Usb);
USBHub Hub5(&Usb);
USBHub Hub6(&Usb);
USBHub Hub7(&Usb);
uint32_t next_time;
void PrintAllAddresses(UsbDevice *pdev)
{
UsbDeviceAddress adr;
adr.devAddress = pdev->address;
Serial.print("\r\nAddr:");
Serial.print(adr.devAddress, HEX);
Serial.print("(");
Serial.print(adr.bmHub, HEX);
Serial.print(".");
Serial.print(adr.bmParent, HEX);
Serial.print(".");
Serial.print(adr.bmAddress, HEX);
Serial.println(")");
}
void PrintAddress(uint8_t addr)
{
UsbDeviceAddress adr;
adr.devAddress = addr;
Serial.print("\r\nADDR:\t");
Serial.println(adr.devAddress,HEX);
Serial.print("DEV:\t");
Serial.println(adr.bmAddress,HEX);
Serial.print("PRNT:\t");
Serial.println(adr.bmParent,HEX);
Serial.print("HUB:\t");
Serial.println(adr.bmHub,HEX);
}
void setup()
{
Serial.begin( 115200 );
Serial.println("Start");
if (Usb.Init() == -1)
Serial.println("OSC did not start.");
delay( 200 );
next_time = millis() + 10000;
}
byte getdevdescr( byte addr, byte &num_conf );
void PrintDescriptors(uint8_t addr)
{
uint8_t rcode = 0;
byte num_conf = 0;
rcode = getdevdescr( (byte)addr, num_conf );
if( rcode )
{
printProgStr(Gen_Error_str);
print_hex( rcode, 8 );
}
Serial.print("\r\n");
for (int i=0; i<num_conf; i++)
{
rcode = getconfdescr( addr, i ); // get configuration descriptor
if( rcode )
{
printProgStr(Gen_Error_str);
print_hex(rcode, 8);
}
Serial.println("\r\n");
}
}
void PrintAllDescriptors(UsbDevice *pdev)
{
Serial.println("\r\n");
print_hex(pdev->address, 8);
Serial.println("\r\n--");
PrintDescriptors( pdev->address );
}
void loop()
{
Usb.Task();
if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
{
//if (millis() >= next_time)
{
Usb.ForEachUsbDevice(&PrintAllDescriptors);
Usb.ForEachUsbDevice(&PrintAllAddresses);
while( 1 ); //stop
}
}
}
byte getdevdescr( byte addr, byte &num_conf )
{
USB_DEVICE_DESCRIPTOR buf;
byte rcode;
rcode = Usb.getDevDescr( addr, 0, 0x12, ( uint8_t *)&buf );
if( rcode ) {
return( rcode );
}
printProgStr(Dev_Header_str);
printProgStr(Dev_Length_str);
print_hex( buf.bLength, 8 );
printProgStr(Dev_Type_str);
print_hex( buf.bDescriptorType, 8 );
printProgStr(Dev_Version_str);
print_hex( buf.bcdUSB, 16 );
printProgStr(Dev_Class_str);
print_hex( buf.bDeviceClass, 8 );
printProgStr(Dev_Subclass_str);
print_hex( buf.bDeviceSubClass, 8 );
printProgStr(Dev_Protocol_str);
print_hex( buf.bDeviceProtocol, 8 );
printProgStr(Dev_Pktsize_str);
print_hex( buf.bMaxPacketSize0, 8 );
printProgStr(Dev_Vendor_str);
print_hex( buf.idVendor, 16 );
printProgStr(Dev_Product_str);
print_hex( buf.idProduct, 16 );
printProgStr(Dev_Revision_str);
print_hex( buf.bcdDevice, 16 );
printProgStr(Dev_Mfg_str);
print_hex( buf.iManufacturer, 8 );
printProgStr(Dev_Prod_str);
print_hex( buf.iProduct, 8 );
printProgStr(Dev_Serial_str);
print_hex( buf.iSerialNumber, 8 );
printProgStr(Dev_Nconf_str);
print_hex( buf.bNumConfigurations, 8 );
num_conf = buf.bNumConfigurations;
return( 0 );
}
void printhubdescr(uint8_t *descrptr, uint8_t addr)
{
HubDescriptor *pHub = (HubDescriptor*) descrptr;
uint8_t len = *((uint8_t*)descrptr);
printProgStr(PSTR("\r\n\r\nHub Descriptor:\r\n"));
printProgStr(PSTR("bDescLength:\t\t"));
Serial.println(pHub->bDescLength, HEX);
printProgStr(PSTR("bDescriptorType:\t"));
Serial.println(pHub->bDescriptorType, HEX);
printProgStr(PSTR("bNbrPorts:\t\t"));
Serial.println(pHub->bNbrPorts, HEX);
printProgStr(PSTR("LogPwrSwitchMode:\t"));
Serial.println(pHub->LogPwrSwitchMode, BIN);
printProgStr(PSTR("CompoundDevice:\t\t"));
Serial.println(pHub->CompoundDevice, BIN);
printProgStr(PSTR("OverCurrentProtectMode:\t"));
Serial.println(pHub->OverCurrentProtectMode, BIN);
printProgStr(PSTR("TTThinkTime:\t\t"));
Serial.println(pHub->TTThinkTime, BIN);
printProgStr(PSTR("PortIndicatorsSupported:"));
Serial.println(pHub->PortIndicatorsSupported, BIN);
printProgStr(PSTR("Reserved:\t\t"));
Serial.println(pHub->Reserved, HEX);
printProgStr(PSTR("bPwrOn2PwrGood:\t\t"));
Serial.println(pHub->bPwrOn2PwrGood, HEX);
printProgStr(PSTR("bHubContrCurrent:\t"));
Serial.println(pHub->bHubContrCurrent, HEX);
for (uint8_t i=7; i<len; i++)
print_hex(descrptr[i], 8);
//for (uint8_t i=1; i<=pHub->bNbrPorts; i++)
// PrintHubPortStatus(&Usb, addr, i, 1);
}
byte getconfdescr( byte addr, byte conf )
{
uint8_t buf[ BUFSIZE ];
uint8_t* buf_ptr = buf;
byte rcode;
byte descr_length;
byte descr_type;
unsigned int total_length;
rcode = Usb.getConfDescr( addr, 0, 4, conf, buf ); //get total length
LOBYTE( total_length ) = buf[ 2 ];
HIBYTE( total_length ) = buf[ 3 ];
if( total_length > 256 ) { //check if total length is larger than buffer
printProgStr(Conf_Trunc_str);
total_length = 256;
}
rcode = Usb.getConfDescr( addr, 0, total_length, conf, buf ); //get the whole descriptor
while( buf_ptr < buf + total_length ) { //parsing descriptors
descr_length = *( buf_ptr );
descr_type = *( buf_ptr + 1 );
switch( descr_type ) {
case( USB_DESCRIPTOR_CONFIGURATION ):
printconfdescr( buf_ptr );
break;
case( USB_DESCRIPTOR_INTERFACE ):
printintfdescr( buf_ptr );
break;
case( USB_DESCRIPTOR_ENDPOINT ):
printepdescr( buf_ptr );
break;
case 0x29:
printhubdescr( buf_ptr, addr );
break;
default:
printunkdescr( buf_ptr );
break;
}//switch( descr_type
buf_ptr = ( buf_ptr + descr_length ); //advance buffer pointer
}//while( buf_ptr <=...
return( 0 );
}
/* prints hex numbers with leading zeroes */
// copyright, Peter H Anderson, Baltimore, MD, Nov, '07
// source: http://www.phanderson.com/arduino/arduino_display.html
void print_hex(int v, int num_places)
{
int mask=0, n, num_nibbles, digit;
for (n=1; n<=num_places; n++) {
mask = (mask << 1) | 0x0001;
}
v = v & mask; // truncate v to specified number of places
num_nibbles = num_places / 4;
if ((num_places % 4) != 0) {
++num_nibbles;
}
do {
digit = ((v >> (num_nibbles-1) * 4)) & 0x0f;
Serial.print(digit, HEX);
}
while(--num_nibbles);
}
/* function to print configuration descriptor */
void printconfdescr( uint8_t* descr_ptr )
{
USB_CONFIGURATION_DESCRIPTOR* conf_ptr = ( USB_CONFIGURATION_DESCRIPTOR* )descr_ptr;
printProgStr(Conf_Header_str);
printProgStr(Conf_Totlen_str);
print_hex( conf_ptr->wTotalLength, 16 );
printProgStr(Conf_Nint_str);
print_hex( conf_ptr->bNumInterfaces, 8 );
printProgStr(Conf_Value_str);
print_hex( conf_ptr->bConfigurationValue, 8 );
printProgStr(Conf_String_str);
print_hex( conf_ptr->iConfiguration, 8 );
printProgStr(Conf_Attr_str);
print_hex( conf_ptr->bmAttributes, 8 );
printProgStr(Conf_Pwr_str);
print_hex( conf_ptr->bMaxPower, 8 );
return;
}
/* function to print interface descriptor */
void printintfdescr( uint8_t* descr_ptr )
{
USB_INTERFACE_DESCRIPTOR* intf_ptr = ( USB_INTERFACE_DESCRIPTOR* )descr_ptr;
printProgStr(Int_Header_str);
printProgStr(Int_Number_str);
print_hex( intf_ptr->bInterfaceNumber, 8 );
printProgStr(Int_Alt_str);
print_hex( intf_ptr->bAlternateSetting, 8 );
printProgStr(Int_Endpoints_str);
print_hex( intf_ptr->bNumEndpoints, 8 );
printProgStr(Int_Class_str);
print_hex( intf_ptr->bInterfaceClass, 8 );
printProgStr(Int_Subclass_str);
print_hex( intf_ptr->bInterfaceSubClass, 8 );
printProgStr(Int_Protocol_str);
print_hex( intf_ptr->bInterfaceProtocol, 8 );
printProgStr(Int_String_str);
print_hex( intf_ptr->iInterface, 8 );
return;
}
/* function to print endpoint descriptor */
void printepdescr( uint8_t* descr_ptr )
{
USB_ENDPOINT_DESCRIPTOR* ep_ptr = ( USB_ENDPOINT_DESCRIPTOR* )descr_ptr;
printProgStr(End_Header_str);
printProgStr(End_Address_str);
print_hex( ep_ptr->bEndpointAddress, 8 );
printProgStr(End_Attr_str);
print_hex( ep_ptr->bmAttributes, 8 );
printProgStr(End_Pktsize_str);
print_hex( ep_ptr->wMaxPacketSize, 16 );
printProgStr(End_Interval_str);
print_hex( ep_ptr->bInterval, 8 );
return;
}
/*function to print unknown descriptor */
void printunkdescr( uint8_t* descr_ptr )
{
byte length = *descr_ptr;
byte i;
printProgStr(Unk_Header_str);
printProgStr(Unk_Length_str);
print_hex( *descr_ptr, 8 );
printProgStr(Unk_Type_str);
print_hex( *(descr_ptr + 1 ), 8 );
printProgStr(Unk_Contents_str);
descr_ptr += 2;
for( i = 0; i < length; i++ ) {
print_hex( *descr_ptr, 8 );
descr_ptr++;
}
}
/* Print a string from Program Memory directly to save RAM */
void printProgStr(const prog_char str[])
{
char c;
if(!str) return;
while((c = pgm_read_byte(str++)))
Serial.print(c,BYTE);
}

View file

@ -0,0 +1,52 @@
#if !defined(__PGMSTRINGS_H__)
#define __PGMSTRINGS_H__
#define LOBYTE(x) ((char*)(&(x)))[0]
#define HIBYTE(x) ((char*)(&(x)))[1]
#define BUFSIZE 256 //buffer size
/* Print strings in Program Memory */
const char Gen_Error_str[] PROGMEM = "\r\nRequest error. Error code:\t";
const char Dev_Header_str[] PROGMEM ="\r\nDevice descriptor: ";
const char Dev_Length_str[] PROGMEM ="\r\nDescriptor Length:\t";
const char Dev_Type_str[] PROGMEM ="\r\nDescriptor type:\t";
const char Dev_Version_str[] PROGMEM ="\r\nUSB version:\t\t";
const char Dev_Class_str[] PROGMEM ="\r\nDevice class:\t\t";
const char Dev_Subclass_str[] PROGMEM ="\r\nDevice Subclass:\t";
const char Dev_Protocol_str[] PROGMEM ="\r\nDevice Protocol:\t";
const char Dev_Pktsize_str[] PROGMEM ="\r\nMax.packet size:\t";
const char Dev_Vendor_str[] PROGMEM ="\r\nVendor ID:\t\t";
const char Dev_Product_str[] PROGMEM ="\r\nProduct ID:\t\t";
const char Dev_Revision_str[] PROGMEM ="\r\nRevision ID:\t\t";
const char Dev_Mfg_str[] PROGMEM ="\r\nMfg.string index:\t";
const char Dev_Prod_str[] PROGMEM ="\r\nProd.string index:\t";
const char Dev_Serial_str[] PROGMEM ="\r\nSerial number index:\t";
const char Dev_Nconf_str[] PROGMEM ="\r\nNumber of conf.:\t";
const char Conf_Trunc_str[] PROGMEM ="Total length truncated to 256 bytes";
const char Conf_Header_str[] PROGMEM ="\r\nConfiguration descriptor:";
const char Conf_Totlen_str[] PROGMEM ="\r\nTotal length:\t\t";
const char Conf_Nint_str[] PROGMEM ="\r\nNum.intf:\t\t";
const char Conf_Value_str[] PROGMEM ="\r\nConf.value:\t\t";
const char Conf_String_str[] PROGMEM ="\r\nConf.string:\t\t";
const char Conf_Attr_str[] PROGMEM ="\r\nAttr.:\t\t\t";
const char Conf_Pwr_str[] PROGMEM ="\r\nMax.pwr:\t\t";
const char Int_Header_str[] PROGMEM ="\r\n\r\nInterface descriptor:";
const char Int_Number_str[] PROGMEM ="\r\nIntf.number:\t\t";
const char Int_Alt_str[] PROGMEM ="\r\nAlt.:\t\t\t";
const char Int_Endpoints_str[] PROGMEM ="\r\nEndpoints:\t\t";
const char Int_Class_str[] PROGMEM ="\r\nIntf. Class:\t\t";
const char Int_Subclass_str[] PROGMEM ="\r\nIntf. Subclass:\t\t";
const char Int_Protocol_str[] PROGMEM ="\r\nIntf. Protocol:\t\t";
const char Int_String_str[] PROGMEM ="\r\nIntf.string:\t\t";
const char End_Header_str[] PROGMEM ="\r\n\r\nEndpoint descriptor:";
const char End_Address_str[] PROGMEM ="\r\nEndpoint address:\t";
const char End_Attr_str[] PROGMEM ="\r\nAttr.:\t\t\t";
const char End_Pktsize_str[] PROGMEM ="\r\nMax.pkt size:\t\t";
const char End_Interval_str[] PROGMEM ="\r\nPolling interval:\t";
const char Unk_Header_str[] PROGMEM = "\r\nUnknown descriptor:";
const char Unk_Length_str[] PROGMEM ="\r\nLength:\t\t";
const char Unk_Type_str[] PROGMEM ="\r\nType:\t\t";
const char Unk_Contents_str[] PROGMEM ="\r\nContents:\t";
#endif // __PGMSTRINGS_H__

111
hid.cpp Normal file
View file

@ -0,0 +1,111 @@
/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#include "hid.h"
//const uint16_t HID::maxHidInterfaces = 3;
//const uint16_t HID::maxEpPerInterface = 2;
const uint8_t HID::epInterruptInIndex = 1;
const uint8_t HID::epInterruptOutIndex = 2;
//get HID report descriptor
uint8_t HID::GetReportDescr( uint8_t ep, USBReadParser *parser )
{
const uint8_t constBufLen = 64;
uint8_t buf[constBufLen];
//HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
//return( pUsb->ctrlReq( bAddress, ep, /*bmREQ_HIDREPORT*/0x81, USB_REQUEST_GET_DESCRIPTOR, 0x00,
// HID_DESCRIPTOR_REPORT, 0x0000, constBufLen, constBufLen, buf, NULL ));
uint8_t rcode = pUsb->ctrlReq( bAddress, ep, /*bmREQ_HIDREPORT*/0x81, USB_REQUEST_GET_DESCRIPTOR, 0x00,
HID_DESCRIPTOR_REPORT, 0x0000, 0x4C1, constBufLen, buf, (USBReadParser*)parser );
//return ((rcode != hrSTALL) ? rcode : 0);
return rcode;
}
//uint8_t HID::getHidDescr( uint8_t ep, uint16_t nbytes, uint8_t* dataptr )
//{
// return( pUsb->ctrlReq( bAddress, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, HID_DESCRIPTOR_HID, 0x0000, nbytes, dataptr ));
//}
uint8_t HID::SetReport( uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr )
{
return( pUsb->ctrlReq( bAddress, ep, bmREQ_HIDOUT, HID_REQUEST_SET_REPORT, report_id, report_type, iface, nbytes, nbytes, dataptr, NULL ));
}
uint8_t HID::GetReport( uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr )
{
return( pUsb->ctrlReq( bAddress, ep, bmREQ_HIDIN, HID_REQUEST_GET_REPORT, report_id, report_type, iface, nbytes, nbytes, dataptr, NULL ));
}
uint8_t HID::GetIdle( uint8_t iface, uint8_t reportID, uint8_t* dataptr )
{
return( pUsb->ctrlReq( bAddress, 0, bmREQ_HIDIN, HID_REQUEST_GET_IDLE, reportID, 0, iface, 0x0001, 0x0001, dataptr, NULL ));
}
uint8_t HID::SetIdle( uint8_t iface, uint8_t reportID, uint8_t duration )
{
return( pUsb->ctrlReq( bAddress, 0, bmREQ_HIDOUT, HID_REQUEST_SET_IDLE, reportID, duration, iface, 0x0000, 0x0000, NULL, NULL ));
}
uint8_t HID::SetProtocol( uint8_t iface, uint8_t protocol )
{
return( pUsb->ctrlReq( bAddress, 0, bmREQ_HIDOUT, HID_REQUEST_SET_PROTOCOL, protocol, 0x00, iface, 0x0000, 0x0000, NULL, NULL ));
}
uint8_t HID::GetProtocol( uint8_t iface, uint8_t* dataptr )
{
return( pUsb->ctrlReq( bAddress, 0, bmREQ_HIDIN, HID_REQUEST_GET_PROTOCOL, 0x00, 0x00, iface, 0x0001, 0x0001, dataptr, NULL ));
}
void HID::PrintEndpointDescriptor( const USB_ENDPOINT_DESCRIPTOR* ep_ptr )
{
Notify(PSTR("Endpoint descriptor:"));
Notify(PSTR("\r\nLength:\t\t"));
PrintHex<uint8_t>(ep_ptr->bLength);
Notify(PSTR("\r\nType:\t\t"));
PrintHex<uint8_t>(ep_ptr->bDescriptorType);
Notify(PSTR("\r\nAddress:\t"));
PrintHex<uint8_t>(ep_ptr->bEndpointAddress);
Notify(PSTR("\r\nAttributes:\t"));
PrintHex<uint8_t>(ep_ptr->bmAttributes);
Notify(PSTR("\r\nMaxPktSize:\t"));
PrintHex<uint16_t>(ep_ptr->wMaxPacketSize);
Notify(PSTR("\r\nPoll Intrv:\t"));
PrintHex<uint8_t>(ep_ptr->bInterval);
}
void HID::PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)
{
Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"));
Notify(PSTR("bDescLength:\t\t"));
PrintHex<uint8_t>(pDesc->bLength);
Notify(PSTR("\r\nbDescriptorType:\t"));
PrintHex<uint8_t>(pDesc->bDescriptorType);
Notify(PSTR("\r\nbcdHID:\t\t\t"));
PrintHex<uint16_t>(pDesc->bcdHID);
Notify(PSTR("\r\nbCountryCode:\t\t"));
PrintHex<uint8_t>(pDesc->bCountryCode);
Notify(PSTR("\r\nbNumDescriptors:\t"));
PrintHex<uint8_t>(pDesc->bNumDescriptors);
Notify(PSTR("\r\nbDescrType:\t\t"));
PrintHex<uint8_t>(pDesc->bDescrType);
Notify(PSTR("\r\nwDescriptorLength:\t"));
PrintHex<uint16_t>(pDesc->wDescriptorLength);
}

215
hid.h Normal file
View file

@ -0,0 +1,215 @@
/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(__HID_H__)
#define __HID_H__
#include <inttypes.h>
#include <avr/pgmspace.h>
#include "avrpins.h"
#include "max3421e.h"
#include "usbhost.h"
#include "usb_ch9.h"
#include "Usb.h"
#include <WProgram.h>
#include "printhex.h"
#include "hexdump.h"
#include "message.h"
#include "confdescparser.h"
#include "hidusagestr.h"
#define DATA_SIZE_MASK 0x03
#define TYPE_MASK 0x0C
#define TAG_MASK 0xF0
#define DATA_SIZE_0 0x00
#define DATA_SIZE_1 0x01
#define DATA_SIZE_2 0x02
#define DATA_SIZE_4 0x03
#define TYPE_MAIN 0x00
#define TYPE_GLOBAL 0x04
#define TYPE_LOCAL 0x08
#define TAG_MAIN_INPUT 0x80
#define TAG_MAIN_OUTPUT 0x90
#define TAG_MAIN_COLLECTION 0xA0
#define TAG_MAIN_FEATURE 0xB0
#define TAG_MAIN_ENDCOLLECTION 0xC0
#define TAG_GLOBAL_USAGEPAGE 0x00
#define TAG_GLOBAL_LOGICALMIN 0x10
#define TAG_GLOBAL_LOGICALMAX 0x20
#define TAG_GLOBAL_PHYSMIN 0x30
#define TAG_GLOBAL_PHYSMAX 0x40
#define TAG_GLOBAL_UNITEXP 0x50
#define TAG_GLOBAL_UNIT 0x60
#define TAG_GLOBAL_REPORTSIZE 0x70
#define TAG_GLOBAL_REPORTID 0x80
#define TAG_GLOBAL_REPORTCOUNT 0x90
#define TAG_GLOBAL_PUSH 0xA0
#define TAG_GLOBAL_POP 0xB0
#define TAG_LOCAL_USAGE 0x00
#define TAG_LOCAL_USAGEMIN 0x10
#define TAG_LOCAL_USAGEMAX 0x20
/* HID requests */
#define bmREQ_HIDOUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
#define bmREQ_HIDIN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
#define bmREQ_HIDREPORT USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_INTERFACE
/* HID constants. Not part of chapter 9 */
/* Class-Specific Requests */
#define HID_REQUEST_GET_REPORT 0x01
#define HID_REQUEST_GET_IDLE 0x02
#define HID_REQUEST_GET_PROTOCOL 0x03
#define HID_REQUEST_SET_REPORT 0x09
#define HID_REQUEST_SET_IDLE 0x0A
#define HID_REQUEST_SET_PROTOCOL 0x0B
/* Class Descriptor Types */
#define HID_DESCRIPTOR_HID 0x21
#define HID_DESCRIPTOR_REPORT 0x22
#define HID_DESRIPTOR_PHY 0x23
/* Protocol Selection */
#define HID_BOOT_PROTOCOL 0x00
#define HID_RPT_PROTOCOL 0x01
/* HID Interface Class Code */
#define HID_INTF 0x03
/* HID Interface Class SubClass Codes */
#define HID_BOOT_INTF_SUBCLASS 0x01
/* HID Interface Class Protocol Codes */
#define HID_PROTOCOL_NONE 0x00
#define HID_PROTOCOL_KEYBOARD 0x01
#define HID_PROTOCOL_MOUSE 0x02
///* HID descriptor */
//typedef struct
//{
// uint8_t bLength;
// uint8_t bDescriptorType;
// uint16_t bcdHID; // HID class specification release
// uint8_t bCountryCode;
// uint8_t bNumDescriptors; // Number of additional class specific descriptors
// uint8_t bDescrType; // Type of class descriptor
// uint16_t wDescriptorLength; // Total size of the Report descriptor
//} USB_HID_DESCRIPTOR;
//
//typedef struct
//{
// uint8_t bDescrType; // Type of class descriptor
// uint16_t wDescriptorLength; // Total size of the Report descriptor
//} HID_CLASS_DESCRIPTOR_LEN_AND_TYPE;
struct HidItemPrefix
{
uint8_t bSize : 2;
uint8_t bType : 2;
uint8_t bTag : 4;
};
#define HID_ITEM_TYPE_MAIN 0
#define HID_ITEM_TYPE_GLOBAL 1
#define HID_ITEM_TYPE_LOCAL 2
#define HID_ITEM_TYPE_RESERVED 3
#define HID_LONG_ITEM_PREFIX 0xfe // Long item prefix value
#define bmHID_MAIN_ITEM_TAG 0xfc // Main item tag mask
#define bmHID_MAIN_ITEM_INPUT 0x80 // Main item Input tag value
#define bmHID_MAIN_ITEM_OUTPUT 0x90 // Main item Output tag value
#define bmHID_MAIN_ITEM_FEATURE 0xb0 // Main item Feature tag value
#define bmHID_MAIN_ITEM_COLLECTION 0xa0 // Main item Collection tag value
#define bmHID_MAIN_ITEM_END_COLLECTION 0xce // Main item End Collection tag value
#define HID_MAIN_ITEM_COLLECTION_PHYSICAL 0
#define HID_MAIN_ITEM_COLLECTION_APPLICATION 1
#define HID_MAIN_ITEM_COLLECTION_LOGICAL 2
#define HID_MAIN_ITEM_COLLECTION_REPORT 3
#define HID_MAIN_ITEM_COLLECTION_NAMED_ARRAY 4
#define HID_MAIN_ITEM_COLLECTION_USAGE_SWITCH 5
#define HID_MAIN_ITEM_COLLECTION_USAGE_MODIFIER 6
struct MainItemIOFeature
{
uint8_t bmIsConstantOrData : 1;
uint8_t bmIsArrayOrVariable : 1;
uint8_t bmIsRelativeOrAbsolute : 1;
uint8_t bmIsWrapOrNoWrap : 1;
uint8_t bmIsNonLonearOrLinear : 1;
uint8_t bmIsNoPreferedOrPrefered : 1;
uint8_t bmIsNullOrNoNull : 1;
uint8_t bmIsVolatileOrNonVolatile : 1;
};
class HID;
class HIDReportParser
{
public:
virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) = 0;
};
#define MAX_REPORT_PARSERS 2
#define maxHidInterfaces 3
#define maxEpPerInterface 2
#define totalEndpoints (maxHidInterfaces * maxEpPerInterface + 1)
#define HID_MAX_HID_CLASS_DESCRIPTORS 5
class HID : public USBDeviceConfig, public UsbConfigXtracter
{
protected:
USB *pUsb; // USB class instance pointer
uint8_t bAddress; // address
protected:
static const uint8_t epInterruptInIndex; // InterruptIN endpoint index
static const uint8_t epInterruptOutIndex; // InterruptOUT endpoint index
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc);
virtual HIDReportParser* GetReportParser(uint8_t id);
public:
HID(USB *pusb) : pUsb(pusb) {};
const USB* GetUsb() { return pUsb; };
virtual bool SetReportParser(uint8_t id, HIDReportParser *prs);
uint8_t SetProtocol( uint8_t iface, uint8_t protocol );
uint8_t GetProtocol( uint8_t iface, uint8_t* dataptr );
uint8_t GetIdle( uint8_t iface, uint8_t reportID, uint8_t* dataptr );
uint8_t SetIdle( uint8_t iface, uint8_t reportID, uint8_t duration );
uint8_t GetReportDescr( uint8_t ep, USBReadParser *parser = NULL);
uint8_t GetHidDescr( uint8_t ep, uint16_t nbytes, uint8_t* dataptr );
uint8_t GetReport( uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr );
uint8_t SetReport( uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr );
};
#endif // __HID_H__

154
hidboot.cpp Normal file
View file

@ -0,0 +1,154 @@
/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#include "hidboot.h"
void MouseReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
{
MOUSEINFO *pmi = (MOUSEINFO*)buf;
if (prevState.mouseInfo.bmLeftButton == 0 && pmi->bmLeftButton == 1)
OnLeftButtonDown(pmi);
if (prevState.mouseInfo.bmLeftButton == 1 && pmi->bmLeftButton == 0)
OnLeftButtonUp(pmi);
if (prevState.mouseInfo.bmRightButton == 0 && pmi->bmRightButton == 1)
OnRightButtonDown(pmi);
if (prevState.mouseInfo.bmRightButton == 1 && pmi->bmRightButton == 0)
OnRightButtonUp(pmi);
if (prevState.mouseInfo.bmMiddleButton == 0 && pmi->bmMiddleButton == 1)
OnMiddleButtonDown(pmi);
if (prevState.mouseInfo.bmMiddleButton == 1 && pmi->bmMiddleButton == 0)
OnMiddleButtonUp(pmi);
if (prevState.mouseInfo.dX != pmi->dX || prevState.mouseInfo.dY != pmi->dY)
OnMouseMove(pmi);
for (uint8_t i=0; i<3; i++)
prevState.bInfo[i] = buf[i];
};
void KeyboardReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
{
// On error - return
if (buf[2] == 1)
return;
KBDINFO *pki = (KBDINFO*)buf;
for (uint8_t i=2; i<8; i++)
{
bool down = false;
bool up = false;
for (uint8_t j=2; j<8; j++)
{
if (buf[i] == prevState.bInfo[j] && buf[i] != 1)
down = true;
if (buf[j] == prevState.bInfo[i] && prevState.bInfo[i] != 1)
up = true;
}
if (!down)
{
HandleLockingKeys(hid, buf[i]);
OnKeyDown(*buf, buf[i]);
}
if (!up)
OnKeyUp(prevState.bInfo[0], prevState.bInfo[i]);
}
for (uint8_t i=0; i<8; i++)
prevState.bInfo[i] = buf[i];
};
uint8_t KeyboardReportParser::HandleLockingKeys(HID *hid, uint8_t key)
{
uint8_t old_keys = kbdLockingKeys.bLeds;
switch (key)
{
case KEY_NUM_LOCK:
kbdLockingKeys.kbdLeds.bmNumLock = ~kbdLockingKeys.kbdLeds.bmNumLock;
break;
case KEY_CAPS_LOCK:
kbdLockingKeys.kbdLeds.bmCapsLock = ~kbdLockingKeys.kbdLeds.bmCapsLock;
break;
case KEY_SCROLL_LOCK:
kbdLockingKeys.kbdLeds.bmScrollLock = ~kbdLockingKeys.kbdLeds.bmScrollLock;
break;
}
if (old_keys != kbdLockingKeys.bLeds && hid)
return (hid->SetReport(0, 0/*hid->GetIface()*/, 2, 0, 1, &kbdLockingKeys.bLeds));
return 0;
}
const uint8_t KeyboardReportParser::numKeys[] PROGMEM = { '!', '@', '#', '$', '%', '^', '&', '*', '(', ')' };
const uint8_t KeyboardReportParser::symKeysUp[] PROGMEM = { '_', '+', '{', '}', '|', '~', ':', '"', '~', '<', '>', '?' };
const uint8_t KeyboardReportParser::symKeysLo[] PROGMEM = { '-', '=', '[', ']', '\\', ' ', ';', '\'', '`', ',', '.', '/' };
const uint8_t KeyboardReportParser::padKeys[] PROGMEM = { '/', '*', '-', '+', 0x13 };
uint8_t KeyboardReportParser::OemToAscii(uint8_t mod, uint8_t key)
{
uint8_t shift = (mod & 0x22);
// [a-z]
if (key > 0x03 && key < 0x1e)
{
// Upper case letters
if ( (kbdLockingKeys.kbdLeds.bmCapsLock == 0 && (mod & 2)) ||
(kbdLockingKeys.kbdLeds.bmCapsLock == 1 && (mod & 2) == 0) )
return (key - 4 + 'A');
// Lower case letters
else
return (key - 4 + 'a');
}
// Numbers
else if (key > 0x1d && key < 0x27)
{
if (shift)
return ((uint8_t)pgm_read_byte(&numKeys[key - 0x1e]));
else
return (key - 0x1e + '1');
}
// Keypad Numbers
else if (key > 0x58 && key < 0x62)
{
if (kbdLockingKeys.kbdLeds.bmNumLock == 1)
return (key - 0x59 + '1');
}
else if (key > 0x2c && key < 0x39)
return ((shift) ? (uint8_t)pgm_read_byte(&symKeysUp[key-0x2d]) : (uint8_t)pgm_read_byte(&symKeysLo[key-0x2d]));
else if (key > 0x53 && key < 0x59)
return (uint8_t)pgm_read_byte(&padKeys[key - 0x54]);
else
{
switch (key)
{
case KEY_SPACE: return(0x20);
case KEY_ENTER: return(0x13);
case KEY_ZERO: return((shift) ? ')' : '0');
case KEY_ZERO2: return((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '0' : 0);
case KEY_PERIOD: return((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '.' : 0);
}
}
return( 0 );
}

493
hidboot.h Normal file
View file

@ -0,0 +1,493 @@
/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(__HIDBOOT_H__)
#define __HIDBOOT_H__
#include <inttypes.h>
#include <avr/pgmspace.h>
#include "avrpins.h"
#include "max3421e.h"
#include "usbhost.h"
#include "usb_ch9.h"
#include "Usb.h"
#include "hid.h"
#include <WProgram.h>
#include "printhex.h"
#include "hexdump.h"
#include "message.h"
#include "confdescparser.h"
#define KEY_SPACE 0x2c
#define KEY_ZERO 0x27
#define KEY_ZERO2 0x62
#define KEY_ENTER 0x28
#define KEY_PERIOD 0x63
struct MOUSEINFO
{
struct
{
uint8_t bmLeftButton : 1;
uint8_t bmRightButton : 1;
uint8_t bmMiddleButton : 1;
uint8_t bmDummy : 1;
};
int8_t dX;
int8_t dY;
};
class MouseReportParser : public HIDReportParser
{
union
{
MOUSEINFO mouseInfo;
uint8_t bInfo[3];
} prevState;
public:
virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
protected:
virtual void OnMouseMove (MOUSEINFO *mi) {};
virtual void OnLeftButtonUp (MOUSEINFO *mi) {};
virtual void OnLeftButtonDown (MOUSEINFO *mi) {};
virtual void OnRightButtonUp (MOUSEINFO *mi) {};
virtual void OnRightButtonDown (MOUSEINFO *mi) {};
virtual void OnMiddleButtonUp (MOUSEINFO *mi) {};
virtual void OnMiddleButtonDown (MOUSEINFO *mi) {};
};
struct MODIFIERKEYS
{
uint8_t bmLeftCtrl : 1;
uint8_t bmLeftShift : 1;
uint8_t bmLeftAlt : 1;
uint8_t bmLeftGUI : 1;
uint8_t bmRightCtrl : 1;
uint8_t bmRightShift : 1;
uint8_t bmRightAlt : 1;
uint8_t bmRightGUI : 1;
};
struct KBDINFO
{
struct
{
uint8_t bmLeftCtrl : 1;
uint8_t bmLeftShift : 1;
uint8_t bmLeftAlt : 1;
uint8_t bmLeftGUI : 1;
uint8_t bmRightCtrl : 1;
uint8_t bmRightShift : 1;
uint8_t bmRightAlt : 1;
uint8_t bmRightGUI : 1;
};
uint8_t bReserved;
uint8_t Keys[6];
};
struct KBDLEDS
{
uint8_t bmNumLock : 1;
uint8_t bmCapsLock : 1;
uint8_t bmScrollLock : 1;
uint8_t bmCompose : 1;
uint8_t bmKana : 1;
uint8_t bmReserved : 3;
};
#define KEY_NUM_LOCK 0x53
#define KEY_CAPS_LOCK 0x39
#define KEY_SCROLL_LOCK 0x47
class KeyboardReportParser : public HIDReportParser
{
static const uint8_t numKeys[];
static const uint8_t symKeysUp[];
static const uint8_t symKeysLo[];
static const uint8_t padKeys[];
protected:
union
{
KBDINFO kbdInfo;
uint8_t bInfo[sizeof(KBDINFO)];
} prevState;
union
{
KBDLEDS kbdLeds;
uint8_t bLeds;
} kbdLockingKeys;
uint8_t OemToAscii(uint8_t mod, uint8_t key);
public:
KeyboardReportParser() { kbdLockingKeys.bLeds = 0; };
virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
protected:
uint8_t HandleLockingKeys(HID* hid, uint8_t key);
virtual void OnKeyDown (uint8_t mod, uint8_t key) {};
virtual void OnKeyUp (uint8_t mod, uint8_t key) {};
};
#define totalEndpoints 2
#define HID_MAX_HID_CLASS_DESCRIPTORS 5
template <const uint8_t BOOT_PROTOCOL>
class HIDBoot : public HID //public USBDeviceConfig, public UsbConfigXtracter
{
EpInfo epInfo[totalEndpoints];
HIDReportParser *pRptParser;
uint8_t bConfNum; // configuration number
uint8_t bIfaceNum; // Interface Number
uint8_t bNumIface; // number of interfaces in the configuration
uint8_t bNumEP; // total number of EP in the configuration
uint32_t qNextPollTime; // next poll time
bool bPollEnable; // poll enable flag
void Initialize();
virtual HIDReportParser* GetReportParser(uint8_t id) { return pRptParser; };
public:
HIDBoot(USB *p);
virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) { pRptParser = prs; };
// USBDeviceConfig implementation
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
virtual uint8_t Release();
virtual uint8_t Poll();
virtual uint8_t GetAddress() { return bAddress; };
// UsbConfigXtracter implementation
virtual void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
};
template <const uint8_t BOOT_PROTOCOL>
HIDBoot<BOOT_PROTOCOL>::HIDBoot(USB *p) :
HID(p),
qNextPollTime(0),
bPollEnable(false),
pRptParser(NULL)
{
Initialize();
if (pUsb)
pUsb->RegisterDeviceClass(this);
}
template <const uint8_t BOOT_PROTOCOL>
void HIDBoot<BOOT_PROTOCOL>::Initialize()
{
for(uint8_t i=0; i<totalEndpoints; i++)
{
epInfo[i].epAddr = 0;
epInfo[i].maxPktSize = (i) ? 0 : 8;
epInfo[i].epAttribs = 0;
if (!i)
epInfo[i].bmNakPower = USB_NAK_MAX_POWER;
}
bNumEP = 1;
bNumIface = 0;
bConfNum = 0;
}
template <const uint8_t BOOT_PROTOCOL>
uint8_t HIDBoot<BOOT_PROTOCOL>::Init(uint8_t parent, uint8_t port, bool lowspeed)
{
const uint8_t constBufSize = sizeof(USB_DEVICE_DESCRIPTOR);
uint8_t buf[constBufSize];
uint8_t rcode;
UsbDevice *p = NULL;
EpInfo *oldep_ptr = NULL;
uint8_t len = 0;
uint16_t cd_len = 0;
uint8_t num_of_conf; // number of configurations
uint8_t num_of_intf; // number of interfaces
AddressPool &addrPool = pUsb->GetAddressPool();
USBTRACE("BM Init\r\n");
if (bAddress)
return USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE;
// Get pointer to pseudo device with address 0 assigned
p = addrPool.GetUsbDevicePtr(0);
if (!p)
return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
if (!p->epinfo)
{
USBTRACE("epinfo\r\n");
return USB_ERROR_EPINFO_IS_NULL;
}
// Save old pointer to EP_RECORD of address 0
oldep_ptr = p->epinfo;
// Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence
p->epinfo = epInfo;
p->lowspeed = lowspeed;
// Get device descriptor
rcode = pUsb->getDevDescr( 0, 0, 8, (uint8_t*)buf );
if (!rcode)
len = (buf[0] > constBufSize) ? constBufSize : buf[0];
if( rcode )
{
// Restore p->epinfo
p->epinfo = oldep_ptr;
goto FailGetDevDescr;
}
// Restore p->epinfo
p->epinfo = oldep_ptr;
// Allocate new address according to device class
bAddress = addrPool.AllocAddress(parent, false, port);
if (!bAddress)
return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL;
// Extract Max Packet Size from the device descriptor
epInfo[0].maxPktSize = (uint8_t)((USB_DEVICE_DESCRIPTOR*)buf)->bMaxPacketSize0;
// Assign new address to the device
rcode = pUsb->setAddr( 0, 0, bAddress );
if (rcode)
{
p->lowspeed = false;
addrPool.FreeAddress(bAddress);
bAddress = 0;
USBTRACE2("setAddr:",rcode);
return rcode;
}
USBTRACE2("Addr:", bAddress);
p->lowspeed = false;
p = addrPool.GetUsbDevicePtr(bAddress);
if (!p)
return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL;
p->lowspeed = lowspeed;
if (len)
rcode = pUsb->getDevDescr( bAddress, 0, len, (uint8_t*)buf );
if(rcode)
goto FailGetDevDescr;
num_of_conf = ((USB_DEVICE_DESCRIPTOR*)buf)->bNumConfigurations;
// Assign epInfo to epinfo pointer
rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo);
if (rcode)
goto FailSetDevTblEntry;
USBTRACE2("NC:", num_of_conf);
for (uint8_t i=0; i<num_of_conf; i++)
{
HexDumper<USBReadParser, uint16_t, uint16_t> HexDump;
ConfigDescParser<
USB_CLASS_HID,
HID_BOOT_INTF_SUBCLASS,
BOOT_PROTOCOL,
CP_MASK_COMPARE_ALL> confDescrParser(this);
rcode = pUsb->getConfDescr(bAddress, 0, i, &HexDump);
rcode = pUsb->getConfDescr(bAddress, 0, i, &confDescrParser);
if (bNumEP > 1)
break;
} // for
if (bNumEP < 2)
return USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED;
USBTRACE2("\r\nbAddr:", bAddress);
USBTRACE2("\r\nbNumEP:", bNumEP);
// Assign epInfo to epinfo pointer
rcode = pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo);
USBTRACE2("\r\nCnf:", bConfNum);
// Set Configuration Value
rcode = pUsb->setConf(bAddress, 0, bConfNum);
if (rcode)
goto FailSetConfDescr;
USBTRACE2("\r\nIf:", bIfaceNum);
rcode = SetProtocol(bIfaceNum, HID_BOOT_PROTOCOL);
if (rcode)
goto FailSetProtocol;
if (BOOT_PROTOCOL == 1)
{
rcode = SetIdle(bIfaceNum, 0, 0);
if (rcode)
goto FailSetIdle;
}
USBTRACE("BM configured\r\n");
bPollEnable = true;
return 0;
FailGetDevDescr:
USBTRACE("getDevDescr:");
goto Fail;
FailSetDevTblEntry:
USBTRACE("setDevTblEn:");
goto Fail;
FailGetConfDescr:
USBTRACE("getConf:");
goto Fail;
FailSetProtocol:
USBTRACE("SetProto:");
goto Fail;
FailSetIdle:
USBTRACE("SetIdle:");
goto Fail;
FailSetConfDescr:
USBTRACE("setConf:");
goto Fail;
Fail:
Serial.println(rcode, HEX);
Release();
return rcode;
}
template <const uint8_t BOOT_PROTOCOL>
void HIDBoot<BOOT_PROTOCOL>::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *pep)
{
// If the first configuration satisfies, the others are not concidered.
if (bNumEP > 1 && conf != bConfNum)
return;
ErrorMessage<uint8_t>(PSTR("\r\nConf.Val"), conf);
ErrorMessage<uint8_t>(PSTR("Iface Num"), iface);
ErrorMessage<uint8_t>(PSTR("Alt.Set"), alt);
bConfNum = conf;
bIfaceNum = iface;
uint8_t index;
if ((pep->bmAttributes & 0x03) == 3 && (pep->bEndpointAddress & 0x80) == 0x80)
{
USBTRACE("I8\r\n");
index = epInterruptInIndex;
// Fill in the endpoint info structure
epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F);
epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize;
epInfo[index].epAttribs = 0;
bNumEP ++;
PrintEndpointDescriptor(pep);
}
}
template <const uint8_t BOOT_PROTOCOL>
uint8_t HIDBoot<BOOT_PROTOCOL>::Release()
{
pUsb->GetAddressPool().FreeAddress(bAddress);
bConfNum = 0;
bIfaceNum = 0;
bNumEP = 1;
bAddress = 0;
qNextPollTime = 0;
bPollEnable = false;
return 0;
}
template <const uint8_t BOOT_PROTOCOL>
uint8_t HIDBoot<BOOT_PROTOCOL>::Poll()
{
uint8_t rcode = 0;
if (!bPollEnable)
return 0;
if (qNextPollTime <= millis())
{
qNextPollTime = millis() + 50;
const uint8_t const_buff_len = 16;
uint8_t buf[const_buff_len];
uint16_t read = (uint16_t)epInfo[epInterruptInIndex].maxPktSize;
uint8_t rcode = pUsb->inTransfer(bAddress, epInfo[epInterruptInIndex].epAddr, &read, buf);
if (rcode)
{
if (rcode != hrNAK)
USBTRACE2("Poll:", rcode);
return rcode;
}
for (uint8_t i=0; i<read; i++)
PrintHex<uint8_t>(buf[i]);
if (read)
Serial.println("");
if (pRptParser)
pRptParser->Parse((HID*)this, 0, (uint8_t)read, buf);
}
return rcode;
}
#endif // __HIDBOOTMOUSE_H__

1768
hidescriptorparser.cpp Normal file

File diff suppressed because it is too large Load diff

193
hidescriptorparser.h Normal file
View file

@ -0,0 +1,193 @@
/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined(__HIDDESCRIPTORPARSER_H__)
#define __HIDDESCRIPTORPARSER_H__
#include <inttypes.h>
#include <avr/pgmspace.h>
#include "avrpins.h"
#include "max3421e.h"
#include "usbhost.h"
#include "usb_ch9.h"
#include "Usb.h"
#include <WProgram.h>
#include "printhex.h"
#include "hexdump.h"
#include "message.h"
#include "confdescparser.h"
//#include "hidusagestr.h"
#include "hid.h"
//#include "..\ptp\simplefifo.h"
class ReportDescParserBase : public USBReadParser
{
public:
typedef void (*UsagePageFunc)(uint16_t usage);
static void PrintGenericDesktopPageUsage(uint16_t usage);
static void PrintSimulationControlsPageUsage(uint16_t usage);
static void PrintVRControlsPageUsage(uint16_t usage);
static void PrintSportsControlsPageUsage(uint16_t usage);
static void PrintGameControlsPageUsage(uint16_t usage);
static void PrintGenericDeviceControlsPageUsage(uint16_t usage);
static void PrintLEDPageUsage(uint16_t usage);
static void PrintButtonPageUsage(uint16_t usage);
static void PrintOrdinalPageUsage(uint16_t usage);
static void PrintTelephonyPageUsage(uint16_t usage);
static void PrintConsumerPageUsage(uint16_t usage);
static void PrintDigitizerPageUsage(uint16_t usage);
static void PrintAlphanumDisplayPageUsage(uint16_t usage);
static void PrintMedicalInstrumentPageUsage(uint16_t usage);
static void PrintValue(uint8_t *p, uint8_t len);
static void PrintByteValue(uint8_t data);
static void PrintItemTitle(uint8_t prefix);
static const char *usagePageTitles0[];
static const char *usagePageTitles1[];
static const char *genDesktopTitles0[];
static const char *genDesktopTitles1[];
static const char *genDesktopTitles2[];
static const char *genDesktopTitles3[];
static const char *genDesktopTitles4[];
static const char *simuTitles0[];
static const char *simuTitles1[];
static const char *simuTitles2[];
static const char *vrTitles0[];
static const char *vrTitles1[];
static const char *sportsCtrlTitles0[];
static const char *sportsCtrlTitles1[];
static const char *sportsCtrlTitles2[];
static const char *gameTitles0[];
static const char *gameTitles1[];
static const char *genDevCtrlTitles[];
static const char *ledTitles[];
static const char *telTitles0[];
static const char *telTitles1[];
static const char *telTitles2[];
static const char *telTitles3[];
static const char *telTitles4[];
static const char *telTitles5[];
static const char *consTitles0[];
static const char *consTitles1[];
static const char *consTitles2[];
static const char *consTitles3[];
static const char *consTitles4[];
static const char *consTitles5[];
static const char *consTitles6[];
static const char *consTitles7[];
static const char *consTitles8[];
static const char *consTitles9[];
static const char *consTitlesA[];
static const char *consTitlesB[];
static const char *consTitlesC[];
static const char *consTitlesD[];
static const char *consTitlesE[];
static const char *digitTitles0[];
static const char *digitTitles1[];
static const char *digitTitles2[];
static const char *aplphanumTitles0[];
static const char *aplphanumTitles1[];
static const char *aplphanumTitles2[];
static const char *medInstrTitles0[];
static const char *medInstrTitles1[];
static const char *medInstrTitles2[];
static const char *medInstrTitles3[];
static const char *medInstrTitles4[];
protected:
static UsagePageFunc usagePageFunctions[];
MultiValueBuffer theBuffer;
MultiByteValueParser valParser;
ByteSkipper theSkipper;
uint8_t varBuffer[sizeof(USB_CONFIGURATION_DESCRIPTOR)];
uint8_t itemParseState; // Item parser state variable
uint8_t itemSize; // Item size
uint8_t itemPrefix; // Item prefix (first byte)
uint8_t rptSize; // Report Size
uint8_t rptCount; // Report Count
uint16_t totalSize; // Report size in bits
virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn);
UsagePageFunc pfUsage;
static void PrintUsagePage(uint16_t page);
void SetUsagePage(uint16_t page);
public:
ReportDescParserBase() :
itemParseState(0),
itemSize(0),
itemPrefix(0),
rptSize(0),
rptCount(0),
pfUsage(NULL)
{
theBuffer.pValue = varBuffer;
valParser.Initialize(&theBuffer);
theSkipper.Initialize(&theBuffer);
};
virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset);
enum
{
enErrorSuccess = 0
, enErrorIncomplete // value or record is partialy read in buffer
, enErrorBufferTooSmall
};
};
class ReportDescParser : public ReportDescParserBase
{
};
class ReportDescParser2 : public ReportDescParserBase
{
uint8_t rptId; // Report ID
uint8_t useMin; // Usage Minimum
uint8_t useMax; // Usage Maximum
uint8_t fieldCount; // Number of field being currently processed
void OnInputItem(uint8_t itm); // Method which is called every time Input item is found
uint8_t *pBuf; // Report buffer pointer
uint8_t bLen; // Report length
protected:
virtual uint8_t ParseItem(uint8_t **pp, uint16_t *pcntdn);
public:
ReportDescParser2(uint16_t len, uint8_t *pbuf) :
ReportDescParserBase(), bLen(len), pBuf(pbuf), rptId(0), useMin(0), useMax(0), fieldCount(0)
{};
};
class UniversalReportParser : public HIDReportParser
{
public:
virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
};
#endif // __HIDDESCRIPTORPARSER_H__

977
hidusagestr.h Normal file
View file

@ -0,0 +1,977 @@
/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").
Contact information
-------------------
Circuits At Home, LTD
Web : http://www.circuitsathome.com
e-mail : support@circuitsathome.com
*/
#if !defined( __HIDUSAGESTR_H__)
#define __HIDUSAGESTR_H__
#include <avr/pgmspace.h>
const char pstrSpace [] PROGMEM = " ";
const char pstrCRLF [] PROGMEM = "\r\n";
const char pstrSingleTab [] PROGMEM = "\t";
const char pstrDoubleTab [] PROGMEM = "\t\t";
const char pstrTripleTab [] PROGMEM = "\t\t\t";
// Usage Page String Titles
const char pstrUsagePageUndefined [] PROGMEM = "Undef";
const char pstrUsagePageGenericDesktopControls [] PROGMEM = "Gen Desktop Ctrls";
const char pstrUsagePageSimulationControls [] PROGMEM = "Simu Ctrls";
const char pstrUsagePageVRControls [] PROGMEM = "VR Ctrls";
const char pstrUsagePageSportControls [] PROGMEM = "Sport Ctrls";
const char pstrUsagePageGameControls [] PROGMEM = "Game Ctrls";
const char pstrUsagePageGenericDeviceControls [] PROGMEM = "Gen Dev Ctrls";
const char pstrUsagePageKeyboardKeypad [] PROGMEM = "Kbrd/Keypad";
const char pstrUsagePageLEDs [] PROGMEM = "LEDs";
const char pstrUsagePageButton [] PROGMEM = "Button";
const char pstrUsagePageOrdinal [] PROGMEM = "Ordinal";
const char pstrUsagePageTelephone [] PROGMEM = "Tel";
const char pstrUsagePageConsumer [] PROGMEM = "Consumer";
const char pstrUsagePageDigitizer [] PROGMEM = "Digitizer";
const char pstrUsagePagePID [] PROGMEM = "PID";
const char pstrUsagePageUnicode [] PROGMEM = "Unicode";
const char pstrUsagePageAlphaNumericDisplay [] PROGMEM = "Alpha Num Disp";
const char pstrUsagePageMedicalInstruments [] PROGMEM = "Medical Instr";
const char pstrUsagePageMonitor [] PROGMEM = "Monitor";
const char pstrUsagePagePower [] PROGMEM = "Power";
const char pstrUsagePageBarCodeScanner [] PROGMEM = "Bar Code Scan";
const char pstrUsagePageScale [] PROGMEM = "Scale";
const char pstrUsagePageMSRDevices [] PROGMEM = "Magn Stripe Read Dev";
const char pstrUsagePagePointOfSale [] PROGMEM = "POS";
const char pstrUsagePageCameraControl [] PROGMEM = "Cam Ctrl";
const char pstrUsagePageArcade [] PROGMEM = "Arcade";
const char pstrUsagePageReserved [] PROGMEM = "Reserved";
const char pstrUsagePageVendorDefined [] PROGMEM = "Vendor Def";
// Generic Desktop Controls Page
const char pstrUsagePointer [] PROGMEM = "Pointer";
const char pstrUsageMouse [] PROGMEM = "Mouse";
const char pstrUsageJoystick [] PROGMEM = "Joystick";
const char pstrUsageGamePad [] PROGMEM = "Game Pad";
const char pstrUsageKeyboard [] PROGMEM = "Kbrd";
const char pstrUsageKeypad [] PROGMEM = "Keypad";
const char pstrUsageMultiAxisController [] PROGMEM = "Multi-axis Ctrl";
const char pstrUsageTabletPCSystemControls [] PROGMEM = "Tablet PC Sys Ctrls";
const char pstrUsageX [] PROGMEM = "X";
const char pstrUsageY [] PROGMEM = "Y";
const char pstrUsageZ [] PROGMEM = "Z";
const char pstrUsageRx [] PROGMEM = "Rx";
const char pstrUsageRy [] PROGMEM = "Ry";
const char pstrUsageRz [] PROGMEM = "Rz";
const char pstrUsageSlider [] PROGMEM = "Slider";
const char pstrUsageDial [] PROGMEM = "Dial";
const char pstrUsageWheel [] PROGMEM = "Wheel";
const char pstrUsageHatSwitch [] PROGMEM = "Hat Switch";
const char pstrUsageCountedBuffer [] PROGMEM = "Counted Buf";
const char pstrUsageByteCount [] PROGMEM = "Byte Count";
const char pstrUsageMotionWakeup [] PROGMEM = "Motion Wakeup";
const char pstrUsageStart [] PROGMEM = "Start";
const char pstrUsageSelect [] PROGMEM = "Sel";
const char pstrUsageVx [] PROGMEM = "Vx";
const char pstrUsageVy [] PROGMEM = "Vy";
const char pstrUsageVz [] PROGMEM = "Vz";
const char pstrUsageVbrx [] PROGMEM = "Vbrx";
const char pstrUsageVbry [] PROGMEM = "Vbry";
const char pstrUsageVbrz [] PROGMEM = "Vbrz";
const char pstrUsageVno [] PROGMEM = "Vno";
const char pstrUsageFeatureNotification [] PROGMEM = "Feature Notif";
const char pstrUsageResolutionMultiplier [] PROGMEM = "Res Mult";
const char pstrUsageSystemControl [] PROGMEM = "Sys Ctrl";
const char pstrUsageSystemPowerDown [] PROGMEM = "Sys Pwr Down";
const char pstrUsageSystemSleep [] PROGMEM = "Sys Sleep";
const char pstrUsageSystemWakeup [] PROGMEM = "Sys Wakeup";
const char pstrUsageSystemContextMenu [] PROGMEM = "Sys Context Menu";
const char pstrUsageSystemMainMenu [] PROGMEM = "Sys Main Menu";
const char pstrUsageSystemAppMenu [] PROGMEM = "Sys App Menu";
const char pstrUsageSystemMenuHelp [] PROGMEM = "Sys Menu Help";
const char pstrUsageSystemMenuExit [] PROGMEM = "Sys Menu Exit";
const char pstrUsageSystemMenuSelect [] PROGMEM = "Sys Menu Select";
const char pstrUsageSystemMenuRight [] PROGMEM = "Sys Menu Right";
const char pstrUsageSystemMenuLeft [] PROGMEM = "Sys Menu Left";
const char pstrUsageSystemMenuUp [] PROGMEM = "Sys Menu Up";
const char pstrUsageSystemMenuDown [] PROGMEM = "Sys Menu Down";
const char pstrUsageSystemColdRestart [] PROGMEM = "Sys Cold Restart";
const char pstrUsageSystemWarmRestart [] PROGMEM = "Sys Warm Restart";
const char pstrUsageDPadUp [] PROGMEM = "D-pad Up";
const char pstrUsageDPadDown [] PROGMEM = "D-pad Down";
const char pstrUsageDPadRight [] PROGMEM = "D-pad Right";
const char pstrUsageDPadLeft [] PROGMEM = "D-pad Left";
const char pstrUsageSystemDock [] PROGMEM = "Sys Dock";
const char pstrUsageSystemUndock [] PROGMEM = "Sys Undock";
const char pstrUsageSystemSetup [] PROGMEM = "Sys Setup";
const char pstrUsageSystemBreak [] PROGMEM = "Sys Break";
const char pstrUsageSystemDebuggerBreak [] PROGMEM = "Sys Dbg Brk";
const char pstrUsageApplicationBreak [] PROGMEM = "App Break";
const char pstrUsageApplicationDebuggerBreak [] PROGMEM = "App Dbg Brk";
const char pstrUsageSystemSpeakerMute [] PROGMEM = "Sys Spk Mute";
const char pstrUsageSystemHibernate [] PROGMEM = "Sys Hiber";
const char pstrUsageSystemDisplayInvert [] PROGMEM = "Sys Disp Inv";
const char pstrUsageSystemDisplayInternal [] PROGMEM = "Sys Disp Int";
const char pstrUsageSystemDisplayExternal [] PROGMEM = "Sys Disp Ext";
const char pstrUsageSystemDisplayBoth [] PROGMEM = "Sys Disp Both";
const char pstrUsageSystemDisplayDual [] PROGMEM = "Sys Disp Dual";
const char pstrUsageSystemDisplayToggleIntExt [] PROGMEM = "Sys Disp Tgl Int/Ext";
const char pstrUsageSystemDisplaySwapPriSec [] PROGMEM = "Sys Disp Swap Pri/Sec";
const char pstrUsageSystemDisplayLCDAutoscale [] PROGMEM = "Sys Disp LCD Autoscale";
// Simulation Controls Page
const char pstrUsageFlightSimulationDevice [] PROGMEM = "Flight Simu Dev";
const char pstrUsageAutomobileSimulationDevice [] PROGMEM = "Auto Simu Dev";
const char pstrUsageTankSimulationDevice [] PROGMEM = "Tank Simu Dev";
const char pstrUsageSpaceshipSimulationDevice [] PROGMEM = "Space Simu Dev";
const char pstrUsageSubmarineSimulationDevice [] PROGMEM = "Subm Simu Dev";
const char pstrUsageSailingSimulationDevice [] PROGMEM = "Sail Simu Dev";
const char pstrUsageMotocicleSimulationDevice [] PROGMEM = "Moto Simu Dev";
const char pstrUsageSportsSimulationDevice [] PROGMEM = "Sport Simu Dev";
const char pstrUsageAirplaneSimulationDevice [] PROGMEM = "Airp Simu Dev";
const char pstrUsageHelicopterSimulationDevice [] PROGMEM = "Heli Simu Dev";
const char pstrUsageMagicCarpetSimulationDevice [] PROGMEM = "Magic Carpet Simu Dev";
const char pstrUsageBicycleSimulationDevice [] PROGMEM = "Bike Simu Dev";
const char pstrUsageFlightControlStick [] PROGMEM = "Flight Ctrl Stick";
const char pstrUsageFlightStick [] PROGMEM = "Flight Stick";
const char pstrUsageCyclicControl [] PROGMEM = "Cyclic Ctrl";
const char pstrUsageCyclicTrim [] PROGMEM = "Cyclic Trim";
const char pstrUsageFlightYoke [] PROGMEM = "Flight Yoke";
const char pstrUsageTrackControl [] PROGMEM = "Track Ctrl";
const char pstrUsageAileron [] PROGMEM = "Aileron";
const char pstrUsageAileronTrim [] PROGMEM = "Aileron Trim";
const char pstrUsageAntiTorqueControl [] PROGMEM = "Anti-Torque Ctrl";
const char pstrUsageAutopilotEnable [] PROGMEM = "Autopilot Enable";
const char pstrUsageChaffRelease [] PROGMEM = "Chaff Release";
const char pstrUsageCollectiveControl [] PROGMEM = "Collective Ctrl";
const char pstrUsageDiveBrake [] PROGMEM = "Dive Brake";
const char pstrUsageElectronicCountermeasures [] PROGMEM = "El Countermeasures";
const char pstrUsageElevator [] PROGMEM = "Elevator";
const char pstrUsageElevatorTrim [] PROGMEM = "Elevator Trim";
const char pstrUsageRudder [] PROGMEM = "Rudder";
const char pstrUsageThrottle [] PROGMEM = "Throttle";
const char pstrUsageFlightCommunications [] PROGMEM = "Flight Comm";
const char pstrUsageFlareRelease [] PROGMEM = "Flare Release";
const char pstrUsageLandingGear [] PROGMEM = "Landing Gear";
const char pstrUsageToeBrake [] PROGMEM = "Toe Brake";
const char pstrUsageTrigger [] PROGMEM = "Trigger";
const char pstrUsageWeaponsArm [] PROGMEM = "Weapons Arm";
const char pstrUsageWeaponsSelect [] PROGMEM = "Weapons Sel";
const char pstrUsageWingFlaps [] PROGMEM = "Wing Flaps";
const char pstrUsageAccelerator [] PROGMEM = "Accel";
const char pstrUsageBrake [] PROGMEM = "Brake";
const char pstrUsageClutch [] PROGMEM = "Clutch";
const char pstrUsageShifter [] PROGMEM = "Shifter";
const char pstrUsageSteering [] PROGMEM = "Steering";
const char pstrUsageTurretDirection [] PROGMEM = "Turret Dir";
const char pstrUsageBarrelElevation [] PROGMEM = "Barrel Ele";
const char pstrUsageDivePlane [] PROGMEM = "Dive Plane";
const char pstrUsageBallast [] PROGMEM = "Ballast";
const char pstrUsageBicycleCrank [] PROGMEM = "Bicycle Crank";
const char pstrUsageHandleBars [] PROGMEM = "Handle Bars";
const char pstrUsageFrontBrake [] PROGMEM = "Front Brake";
const char pstrUsageRearBrake [] PROGMEM = "Rear Brake";
// VR Controls Page
const char pstrUsageBelt [] PROGMEM = "Belt";
const char pstrUsageBodySuit [] PROGMEM = "Body Suit";
const char pstrUsageFlexor [] PROGMEM = "Flexor";
const char pstrUsageGlove [] PROGMEM = "Glove";
const char pstrUsageHeadTracker [] PROGMEM = "Head Track";
const char pstrUsageHeadMountedDisplay [] PROGMEM = "Head Disp";
const char pstrUsageHandTracker [] PROGMEM = "Hand Track";
const char pstrUsageOculometer [] PROGMEM = "Oculometer";
const char pstrUsageVest [] PROGMEM = "Vest";
const char pstrUsageAnimatronicDevice [] PROGMEM = "Animat Dev";
const char pstrUsageStereoEnable [] PROGMEM = "Stereo Enbl";
const char pstrUsageDisplayEnable [] PROGMEM = "Display Enbl";
// Sport Controls Page
const char pstrUsageBaseballBat [] PROGMEM = "Baseball Bat";
const char pstrUsageGolfClub [] PROGMEM = "Golf Club";
const char pstrUsageRowingMachine [] PROGMEM = "Rowing Mach";
const char pstrUsageTreadmill [] PROGMEM = "Treadmill";
const char pstrUsageOar [] PROGMEM = "Oar";
const char pstrUsageSlope [] PROGMEM = "Slope";
const char pstrUsageRate [] PROGMEM = "Rate";
const char pstrUsageStickSpeed [] PROGMEM = "Stick Speed";
const char pstrUsageStickFaceAngle [] PROGMEM = "Stick Face Ang";
const char pstrUsageStickHeelToe [] PROGMEM = "Stick Heel/Toe";
const char pstrUsageStickFollowThough [] PROGMEM = "Stick Flw Thru";
const char pstrUsageStickTempo [] PROGMEM = "Stick Tempo";
const char pstrUsageStickType [] PROGMEM = "Stick Type";
const char pstrUsageStickHeight [] PROGMEM = "Stick Hght";
const char pstrUsagePutter [] PROGMEM = "Putter";
const char pstrUsage1Iron [] PROGMEM = "1 Iron";
const char pstrUsage2Iron [] PROGMEM = "2 Iron";
const char pstrUsage3Iron [] PROGMEM = "3 Iron";
const char pstrUsage4Iron [] PROGMEM = "4 Iron";
const char pstrUsage5Iron [] PROGMEM = "5 Iron";
const char pstrUsage6Iron [] PROGMEM = "6 Iron";
const char pstrUsage7Iron [] PROGMEM = "7 Iron";
const char pstrUsage8Iron [] PROGMEM = "8 Iron";
const char pstrUsage9Iron [] PROGMEM = "9 Iron";
const char pstrUsage10Iron [] PROGMEM = "10 Iron";
const char pstrUsage11Iron [] PROGMEM = "11 Iron";
const char pstrUsageSandWedge [] PROGMEM = "Sand Wedge";
const char pstrUsageLoftWedge [] PROGMEM = "Loft Wedge";
const char pstrUsagePowerWedge [] PROGMEM = "Pwr Wedge";
const char pstrUsage1Wood [] PROGMEM = "1 Wood";
const char pstrUsage3Wood [] PROGMEM = "3 Wood";
const char pstrUsage5Wood [] PROGMEM = "5 Wood";
const char pstrUsage7Wood [] PROGMEM = "7 Wood";
const char pstrUsage9Wood [] PROGMEM = "9 Wood";
// Game Controls Page
const char pstrUsage3DGameController [] PROGMEM = "3D Game Ctrl";
const char pstrUsagePinballDevice [] PROGMEM = "Pinball Dev";
const char pstrUsageGunDevice [] PROGMEM = "Gun Dev";
const char pstrUsagePointOfView [] PROGMEM = "POV";
const char pstrUsageTurnRightLeft [] PROGMEM = "Turn Right Left";
const char pstrUsagePitchForwardBackward [] PROGMEM = "Pitch Fwd/Back";
const char pstrUsageRollRightLeft [] PROGMEM = "Roll Right/Left";
const char pstrUsageMoveRightLeft [] PROGMEM = "Move Right/Left";
const char pstrUsageMoveForwardBackward [] PROGMEM = "Move Fwd/Back";
const char pstrUsageMoveUpDown [] PROGMEM = "Move Up/Down";
const char pstrUsageLeanRightLeft [] PROGMEM = "Lean Right/Left";
const char pstrUsageLeanForwardBackward [] PROGMEM = "Lean Fwd/Back";
const char pstrUsageHeightOfPOV [] PROGMEM = "Height of POV";
const char pstrUsageFlipper [] PROGMEM = "Flipper";
const char pstrUsageSecondaryFlipper [] PROGMEM = "Second Flipper";
const char pstrUsageBump [] PROGMEM = "Bump";
const char pstrUsageNewGame [] PROGMEM = "New Game";
const char pstrUsageShootBall [] PROGMEM = "Shoot Ball";
const char pstrUsagePlayer [] PROGMEM = "Player";
const char pstrUsageGunBolt [] PROGMEM = "Gun Bolt";
const char pstrUsageGunClip [] PROGMEM = "Gun Clip";
const char pstrUsageGunSelector [] PROGMEM = "Gun Sel";
const char pstrUsageGunSingleShot [] PROGMEM = "Gun Sngl Shot";
const char pstrUsageGunBurst [] PROGMEM = "Gun Burst";
const char pstrUsageGunAutomatic [] PROGMEM = "Gun Auto";
const char pstrUsageGunSafety [] PROGMEM = "Gun Safety";
const char pstrUsageGamepadFireJump [] PROGMEM = "Gamepad Fire/Jump";
const char pstrUsageGamepadTrigger [] PROGMEM = "Gamepad Trig";
// Generic Device Controls Page
const char pstrUsageBatteryStrength [] PROGMEM = "Bat Strength";
const char pstrUsageWirelessChannel [] PROGMEM = "Wireless Ch";
const char pstrUsageWirelessID [] PROGMEM = "Wireless ID";
const char pstrUsageDiscoverWirelessControl [] PROGMEM = "Discover Wireless Ctrl";
const char pstrUsageSecurityCodeCharEntered [] PROGMEM = "Sec Code Char Entrd";
const char pstrUsageSecurityCodeCharErased [] PROGMEM = "Sec Code Char Erased";
const char pstrUsageSecurityCodeCleared [] PROGMEM = "Sec Code Cleared";
// LED Page
const char pstrUsageNumLock [] PROGMEM = "Num Lock";
const char pstrUsageCapsLock [] PROGMEM = "Caps Lock";
const char pstrUsageScrollLock [] PROGMEM = "Scroll Lock";
const char pstrUsageCompose [] PROGMEM = "Compose";
const char pstrUsageKana [] PROGMEM = "Kana";
const char pstrUsagePower [] PROGMEM = "Pwr";
const char pstrUsageShift [] PROGMEM = "Shift";
const char pstrUsageDoNotDisturb [] PROGMEM = "DND";
const char pstrUsageMute [] PROGMEM = "Mute";
const char pstrUsageToneEnable [] PROGMEM = "Tone Enbl";
const char pstrUsageHighCutFilter [] PROGMEM = "High Cut Fltr";
const char pstrUsageLowCutFilter [] PROGMEM = "Low Cut Fltr";
const char pstrUsageEqualizerEnable [] PROGMEM = "Eq Enbl";
const char pstrUsageSoundFieldOn [] PROGMEM = "Sound Field On";
const char pstrUsageSurroundOn [] PROGMEM = "Surround On";
const char pstrUsageRepeat [] PROGMEM = "Repeat";
const char pstrUsageStereo [] PROGMEM = "Stereo";
const char pstrUsageSamplingRateDetect [] PROGMEM = "Smpl Rate Detect";
const char pstrUsageSpinning [] PROGMEM = "Spinning";
const char pstrUsageCAV [] PROGMEM = "CAV";
const char pstrUsageCLV [] PROGMEM = "CLV";
const char pstrUsageRecordingFormatDetect [] PROGMEM = "Rec Format Detect";
const char pstrUsageOffHook [] PROGMEM = "Off Hook";
const char pstrUsageRing [] PROGMEM = "Ring";
const char pstrUsageMessageWaiting [] PROGMEM = "Msg Wait";
const char pstrUsageDataMode [] PROGMEM = "Data Mode";
const char pstrUsageBatteryOperation [] PROGMEM = "Bat Op";
const char pstrUsageBatteryOK [] PROGMEM = "Bat OK";
const char pstrUsageBatteryLow [] PROGMEM = "Bat Low";
const char pstrUsageSpeaker [] PROGMEM = "Speaker";
const char pstrUsageHeadSet [] PROGMEM = "Head Set";
const char pstrUsageHold [] PROGMEM = "Hold";
const char pstrUsageMicrophone [] PROGMEM = "Mic";
const char pstrUsageCoverage [] PROGMEM = "Coverage";
const char pstrUsageNightMode [] PROGMEM = "Night Mode";
const char pstrUsageSendCalls [] PROGMEM = "Send Calls";
const char pstrUsageCallPickup [] PROGMEM = "Call Pickup";
const char pstrUsageConference [] PROGMEM = "Conf";
const char pstrUsageStandBy [] PROGMEM = "Stand-by";
const char pstrUsageCameraOn [] PROGMEM = "Cam On";
const char pstrUsageCameraOff [] PROGMEM = "Cam Off";
const char pstrUsageOnLine [] PROGMEM = "On-Line";
const char pstrUsageOffLine [] PROGMEM = "Off-Line";
const char pstrUsageBusy [] PROGMEM = "Busy";
const char pstrUsageReady [] PROGMEM = "Ready";
const char pstrUsagePaperOut [] PROGMEM = "Paper Out";
const char pstrUsagePaperJam [] PROGMEM = "Paper Jam";
const char pstrUsageRemote [] PROGMEM = "Remote";
const char pstrUsageForward [] PROGMEM = "Fwd";
const char pstrUsageReverse [] PROGMEM = "Rev";
const char pstrUsageStop [] PROGMEM = "Stop";
const char pstrUsageRewind [] PROGMEM = "Rewind";
const char pstrUsageFastForward [] PROGMEM = "Fast Fwd";
const char pstrUsagePlay [] PROGMEM = "Play";
const char pstrUsagePause [] PROGMEM = "Pause";
const char pstrUsageRecord [] PROGMEM = "Rec";
const char pstrUsageError [] PROGMEM = "Error";
const char pstrUsageSelectedIndicator [] PROGMEM = "Usage Sel Ind";
const char pstrUsageInUseIndicator [] PROGMEM = "Usage In Use Ind";
const char pstrUsageMultiModeIndicator [] PROGMEM = "Usage Multi Mode Ind";
const char pstrUsageIndicatorOn [] PROGMEM = "Ind On";
const char pstrUsageIndicatorFlash [] PROGMEM = "Ind Flash";
const char pstrUsageIndicatorSlowBlink [] PROGMEM = "Ind Slow Blk";
const char pstrUsageIndicatorFastBlink [] PROGMEM = "Ind Fast Blk";
const char pstrUsageIndicatorOff [] PROGMEM = "Ind Off";
const char pstrUsageFlashOnTime [] PROGMEM = "Flash On Time";
const char pstrUsageSlowBlinkOnTime [] PROGMEM = "Slow Blk On Time";
const char pstrUsageSlowBlinkOffTime [] PROGMEM = "Slow Blk Off Time";
const char pstrUsageFastBlinkOnTime [] PROGMEM = "Fast Blk On Time";
const char pstrUsageFastBlinkOffTime [] PROGMEM = "Fast Blk Off Time";
const char pstrUsageIndicatorColor [] PROGMEM = "Usage Ind Color";
const char pstrUsageIndicatorRed [] PROGMEM = "Ind Red";
const char pstrUsageIndicatorGreen [] PROGMEM = "Ind Green";
const char pstrUsageIndicatorAmber [] PROGMEM = "Ind Amber";
const char pstrUsageGenericIndicator [] PROGMEM = "Gen Ind";
const char pstrUsageSystemSuspend [] PROGMEM = "Sys Suspend";
const char pstrUsageExternalPowerConnected [] PROGMEM = "Ext Pwr Conn";
// Telephony Usage Page
const char pstrUsagePhone [] PROGMEM = "Phone";
const char pstrUsageAnsweringMachine [] PROGMEM = "Answ Mach";
const char pstrUsageMessageControls [] PROGMEM = "Msg Ctrls";
const char pstrUsageHandset [] PROGMEM = "Handset";
const char pstrUsageHeadset [] PROGMEM = "Headset";
const char pstrUsageTelephonyKeyPad [] PROGMEM = "Tel Key Pad";
const char pstrUsageProgrammableButton [] PROGMEM = "Prog Button";
const char pstrUsageHookSwitch [] PROGMEM = "Hook Sw";
const char pstrUsageFlash [] PROGMEM = "Flash";
const char pstrUsageFeature [] PROGMEM = "Feature";
//const char pstrUsageHold [] PROGMEM = "Hold";
const char pstrUsageRedial [] PROGMEM = "Redial";
const char pstrUsageTransfer [] PROGMEM = "Transfer";
const char pstrUsageDrop [] PROGMEM = "Drop";
const char pstrUsagePark [] PROGMEM = "Park";
const char pstrUsageForwardCalls [] PROGMEM = "Fwd Calls";
const char pstrUsageAlternateFunction [] PROGMEM = "Alt Func";
const char pstrUsageLine [] PROGMEM = "Line";
const char pstrUsageSpeakerPhone [] PROGMEM = "Spk Phone";
//const char pstrUsageConference [] PROGMEM = "Conference";
const char pstrUsageRingEnable [] PROGMEM = "Ring Enbl";
const char pstrUsageRingSelect [] PROGMEM = "Ring Sel";
const char pstrUsagePhoneMute [] PROGMEM = "Phone Mute";
const char pstrUsageCallerID [] PROGMEM = "Caller ID";
const char pstrUsageSend [] PROGMEM = "Send";
const char pstrUsageSpeedDial [] PROGMEM = "Speed Dial";
const char pstrUsageStoreNumber [] PROGMEM = "Store Num";
const char pstrUsageRecallNumber [] PROGMEM = "Recall Num";
const char pstrUsagePhoneDirectory [] PROGMEM = "Phone Dir";
const char pstrUsageVoiceMail [] PROGMEM = "Voice Mail";
const char pstrUsageScreenCalls [] PROGMEM = "Screen Calls";
//const char pstrUsageDoNotDisturb [] PROGMEM = "Do Not Disturb";
const char pstrUsageMessage [] PROGMEM = "Msg";
const char pstrUsageAnswerOnOff [] PROGMEM = "Answer On/Off";
const char pstrUsageInsideDialTone [] PROGMEM = "Inside Dial Tone";
const char pstrUsageOutsideDialTone [] PROGMEM = "Outside Dial Tone";
const char pstrUsageInsideRingTone [] PROGMEM = "Inside Ring Tone";
const char pstrUsageOutsideRingTone [] PROGMEM = "Outside Ring Tone";
const char pstrUsagePriorityRingTone [] PROGMEM = "Prior Ring Tone";
const char pstrUsageInsideRingback [] PROGMEM = "Inside Ringback";
const char pstrUsagePriorityRingback [] PROGMEM = "Priority Ringback";
const char pstrUsageLineBusyTone [] PROGMEM = "Ln Busy Tone";
const char pstrUsageReorderTone [] PROGMEM = "Reorder Tone";
const char pstrUsageCallWaitingTone [] PROGMEM = "Call Wait Tone";
const char pstrUsageConfirmationTone1 [] PROGMEM = "Cnfrm Tone1";
const char pstrUsageConfirmationTone2 [] PROGMEM = "Cnfrm Tone2";
const char pstrUsageTonesOff [] PROGMEM = "Tones Off";
const char pstrUsageOutsideRingback [] PROGMEM = "Outside Ringback";
const char pstrUsageRinger [] PROGMEM = "Ringer";
const char pstrUsagePhoneKey0 [] PROGMEM = "0";
const char pstrUsagePhoneKey1 [] PROGMEM = "1";
const char pstrUsagePhoneKey2 [] PROGMEM = "2";
const char pstrUsagePhoneKey3 [] PROGMEM = "3";
const char pstrUsagePhoneKey4 [] PROGMEM = "4";
const char pstrUsagePhoneKey5 [] PROGMEM = "5";
const char pstrUsagePhoneKey6 [] PROGMEM = "6";
const char pstrUsagePhoneKey7 [] PROGMEM = "7";
const char pstrUsagePhoneKey8 [] PROGMEM = "8";
const char pstrUsagePhoneKey9 [] PROGMEM = "9";
const char pstrUsagePhoneKeyStar [] PROGMEM = "*";
const char pstrUsagePhoneKeyPound [] PROGMEM = "#";
const char pstrUsagePhoneKeyA [] PROGMEM = "A";
const char pstrUsagePhoneKeyB [] PROGMEM = "B";
const char pstrUsagePhoneKeyC [] PROGMEM = "C";
const char pstrUsagePhoneKeyD [] PROGMEM = "D";
// Consumer Usage Page
const char pstrUsageConsumerControl [] PROGMEM = "Consumer Ctrl";
const char pstrUsageNumericKeyPad [] PROGMEM = "Num Key Pad";
//const char pstrUsageProgrammableButton [] PROGMEM = "Prog Btn";
//const char pstrUsageMicrophone [] PROGMEM = "Mic";
const char pstrUsageHeadphone [] PROGMEM = "Headphone";
const char pstrUsageGraphicEqualizer [] PROGMEM = "Graph Eq";
const char pstrUsagePlus10 [] PROGMEM = "+10";
const char pstrUsagePlus100 [] PROGMEM = "+100";
const char pstrUsageAMPM [] PROGMEM = "AM/PM";
//const char pstrUsagePower [] PROGMEM = "Pwr";
const char pstrUsageReset [] PROGMEM = "Reset";
const char pstrUsageSleep [] PROGMEM = "Sleep";
const char pstrUsageSleepAfter [] PROGMEM = "Sleep After";
const char pstrUsageSleepMode [] PROGMEM = "Sleep Mode";
const char pstrUsageIllumination [] PROGMEM = "Illumin";
const char pstrUsageFunctionButtons [] PROGMEM = "Func Btns";
const char pstrUsageMenu [] PROGMEM = "Menu";
const char pstrUsageMenuPick [] PROGMEM = "Menu Pick";
const char pstrUsageMenuUp [] PROGMEM = "Menu Up";
const char pstrUsageMenuDown [] PROGMEM = "Menu Down";
const char pstrUsageMenuLeft [] PROGMEM = "Menu Left";
const char pstrUsageMenuRight [] PROGMEM = "Menu Right";
const char pstrUsageMenuEscape [] PROGMEM = "Menu Esc";
const char pstrUsageMenuValueIncrease [] PROGMEM = "Menu Val Inc";
const char pstrUsageMenuValueDecrease [] PROGMEM = "Menu Val Dec";
const char pstrUsageDataOnScreen [] PROGMEM = "Data On Scr";
const char pstrUsageClosedCaption [] PROGMEM = "Closed Cptn";
const char pstrUsageClosedCaptionSelect [] PROGMEM = "Closed Cptn Sel";
const char pstrUsageVCRTV [] PROGMEM = "VCR/TV";
const char pstrUsageBroadcastMode [] PROGMEM = "Brdcast Mode";
const char pstrUsageSnapshot [] PROGMEM = "Snapshot";
const char pstrUsageStill [] PROGMEM = "Still";
const char pstrUsageSelection [] PROGMEM = "Sel";
const char pstrUsageAssignSelection [] PROGMEM = "Assign Sel";
const char pstrUsageModeStep [] PROGMEM = "Mode Step";
const char pstrUsageRecallLast [] PROGMEM = "Recall Last";
const char pstrUsageEnterChannel [] PROGMEM = "Entr Channel";
const char pstrUsageOrderMovie [] PROGMEM = "Ord Movie";
const char pstrUsageChannel [] PROGMEM = "Channel";
const char pstrUsageMediaSelection [] PROGMEM = "Med Sel";
const char pstrUsageMediaSelectComputer [] PROGMEM = "Med Sel Comp";
const char pstrUsageMediaSelectTV [] PROGMEM = "Med Sel TV";
const char pstrUsageMediaSelectWWW [] PROGMEM = "Med Sel WWW";
const char pstrUsageMediaSelectDVD [] PROGMEM = "Med Sel DVD";
const char pstrUsageMediaSelectTelephone [] PROGMEM = "Med Sel Tel";
const char pstrUsageMediaSelectProgramGuide [] PROGMEM = "Med Sel PG";
const char pstrUsageMediaSelectVideoPhone [] PROGMEM = "Med Sel Vid";
const char pstrUsageMediaSelectGames [] PROGMEM = "Med Sel Games";
const char pstrUsageMediaSelectMessages [] PROGMEM = "Med Sel Msg";
const char pstrUsageMediaSelectCD [] PROGMEM = "Med Sel CD";
const char pstrUsageMediaSelectVCR [] PROGMEM = "Med Sel VCR";
const char pstrUsageMediaSelectTuner [] PROGMEM = "Med Sel Tuner";
const char pstrUsageQuit [] PROGMEM = "Quit";
const char pstrUsageHelp [] PROGMEM = "Help";
const char pstrUsageMediaSelectTape [] PROGMEM = "Med Sel Tape";
const char pstrUsageMediaSelectCable [] PROGMEM = "Med Sel Cbl";
const char pstrUsageMediaSelectSatellite [] PROGMEM = "Med Sel Sat";
const char pstrUsageMediaSelectSecurity [] PROGMEM = "Med Sel Secur";
const char pstrUsageMediaSelectHome [] PROGMEM = "Med Sel Home";
const char pstrUsageMediaSelectCall [] PROGMEM = "Med Sel Call";
const char pstrUsageChannelIncrement [] PROGMEM = "Ch Inc";
const char pstrUsageChannelDecrement [] PROGMEM = "Ch Dec";
const char pstrUsageMediaSelectSAP [] PROGMEM = "Med Sel SAP";
const char pstrUsageVCRPlus [] PROGMEM = "VCR+";
const char pstrUsageOnce [] PROGMEM = "Once";
const char pstrUsageDaily [] PROGMEM = "Daily";
const char pstrUsageWeekly [] PROGMEM = "Weekly";
const char pstrUsageMonthly [] PROGMEM = "Monthly";
//const char pstrUsagePlay [] PROGMEM = "Play";
//const char pstrUsagePause [] PROGMEM = "Pause";
//const char pstrUsageRecord [] PROGMEM = "Rec";
//const char pstrUsageFastForward [] PROGMEM = "FF";
//const char pstrUsageRewind [] PROGMEM = "Rewind";
const char pstrUsageScanNextTrack [] PROGMEM = "Next Track";
const char pstrUsageScanPreviousTrack [] PROGMEM = "Prev Track";
//const char pstrUsageStop [] PROGMEM = "Stop";
const char pstrUsageEject [] PROGMEM = "Eject";
const char pstrUsageRandomPlay [] PROGMEM = "Random";
const char pstrUsageSelectDisk [] PROGMEM = "Sel Disk";
const char pstrUsageEnterDisk [] PROGMEM = "Ent Disk";
//const char pstrUsageRepeat [] PROGMEM = "Repeat";
const char pstrUsageTracking [] PROGMEM = "Tracking";
const char pstrUsageTrackNormal [] PROGMEM = "Trk Norm";
const char pstrUsageSlowTracking [] PROGMEM = "Slow Trk";
const char pstrUsageFrameForward [] PROGMEM = "Frm Fwd";
const char pstrUsageFrameBackwards [] PROGMEM = "Frm Back";
const char pstrUsageMark [] PROGMEM = "Mark";
const char pstrUsageClearMark [] PROGMEM = "Clr Mark";
const char pstrUsageRepeatFromMark [] PROGMEM = "Rpt Mark";
const char pstrUsageReturnToMark [] PROGMEM = "Ret to Mark";
const char pstrUsageSearchMarkForward [] PROGMEM = "Search Mark Fwd";
const char pstrUsageSearchMarkBackwards [] PROGMEM = "Search Mark Back";
const char pstrUsageCounterReset [] PROGMEM = "Counter Reset";
const char pstrUsageShowCounter [] PROGMEM = "Show Counter";
const char pstrUsageTrackingIncrement [] PROGMEM = "Track Inc";
const char pstrUsageTrackingDecrement [] PROGMEM = "Track Dec";
const char pstrUsageStopEject [] PROGMEM = "Stop/Eject";
const char pstrUsagePlayPause [] PROGMEM = "Play/Pause";
const char pstrUsagePlaySkip [] PROGMEM = "Play/Skip";
const char pstrUsageVolume [] PROGMEM = "Vol";
const char pstrUsageBalance [] PROGMEM = "Balance";
//const char pstrUsageMute [] PROGMEM = "Mute";
const char pstrUsageBass [] PROGMEM = "Bass";
const char pstrUsageTreble [] PROGMEM = "Treble";
const char pstrUsageBassBoost [] PROGMEM = "Bass Boost";
const char pstrUsageSurroundMode [] PROGMEM = "Surround";
const char pstrUsageLoudness [] PROGMEM = "Loud";
const char pstrUsageMPX [] PROGMEM = "MPX";
const char pstrUsageVolumeIncrement [] PROGMEM = "Vol Inc";
const char pstrUsageVolumeDecrement [] PROGMEM = "Vol Dec";
const char pstrUsageSpeedSelect [] PROGMEM = "Speed";
const char pstrUsagePlaybackSpeed [] PROGMEM = "Play Speed";
const char pstrUsageStandardPlay [] PROGMEM = "Std Play";
const char pstrUsageLongPlay [] PROGMEM = "Long Play";
const char pstrUsageExtendedPlay [] PROGMEM = "Ext Play";
const char pstrUsageSlow [] PROGMEM = "Slow";
const char pstrUsageFanEnable [] PROGMEM = "Fan Enbl";
const char pstrUsageFanSpeed [] PROGMEM = "Fan Speed";
const char pstrUsageLightEnable [] PROGMEM = "Light Enbl";
const char pstrUsageLightIlluminationLevel [] PROGMEM = "Light Illum Lev";
const char pstrUsageClimateControlEnable [] PROGMEM = "Climate Enbl";
const char pstrUsageRoomTemperature [] PROGMEM = "Room Temp";
const char pstrUsageSecurityEnable [] PROGMEM = "Secur Enbl";
const char pstrUsageFireAlarm [] PROGMEM = "Fire Alm";
const char pstrUsagePoliceAlarm [] PROGMEM = "Police Alm";
const char pstrUsageProximity [] PROGMEM = "Prox";
const char pstrUsageMotion [] PROGMEM = "Motion";
const char pstrUsageDuresAlarm [] PROGMEM = "Dures Alm";
const char pstrUsageHoldupAlarm [] PROGMEM = "Holdup Alm";
const char pstrUsageMedicalAlarm [] PROGMEM = "Med Alm";
const char pstrUsageBalanceRight [] PROGMEM = "Balance Right";
const char pstrUsageBalanceLeft [] PROGMEM = "Balance Left";
const char pstrUsageBassIncrement [] PROGMEM = "Bass Inc";
const char pstrUsageBassDecrement [] PROGMEM = "Bass Dec";
const char pstrUsageTrebleIncrement [] PROGMEM = "Treble Inc";
const char pstrUsageTrebleDecrement [] PROGMEM = "Treble Dec";
const char pstrUsageSpeakerSystem [] PROGMEM = "Spk Sys";
const char pstrUsageChannelLeft [] PROGMEM = "Ch Left";
const char pstrUsageChannelRight [] PROGMEM = "Ch Right";
const char pstrUsageChannelCenter [] PROGMEM = "Ch Center";
const char pstrUsageChannelFront [] PROGMEM = "Ch Front";
const char pstrUsageChannelCenterFront [] PROGMEM = "Ch Cntr Front";
const char pstrUsageChannelSide [] PROGMEM = "Ch Side";
const char pstrUsageChannelSurround [] PROGMEM = "Ch Surround";
const char pstrUsageChannelLowFreqEnhancement [] PROGMEM = "Ch Low Freq Enh";
const char pstrUsageChannelTop [] PROGMEM = "Ch Top";
const char pstrUsageChannelUnknown [] PROGMEM = "Ch Unk";
const char pstrUsageSubChannel [] PROGMEM = "Sub-ch";
const char pstrUsageSubChannelIncrement [] PROGMEM = "Sub-ch Inc";
const char pstrUsageSubChannelDecrement [] PROGMEM = "Sub-ch Dec";
const char pstrUsageAlternateAudioIncrement [] PROGMEM = "Alt Aud Inc";
const char pstrUsageAlternateAudioDecrement [] PROGMEM = "Alt Aud Dec";
const char pstrUsageApplicationLaunchButtons [] PROGMEM = "App Launch Btns";
const char pstrUsageALLaunchButtonConfigTool [] PROGMEM = "AL Launch Conf Tl";
const char pstrUsageALProgrammableButton [] PROGMEM = "AL Pgm Btn";
const char pstrUsageALConsumerControlConfig [] PROGMEM = "AL Cons Ctrl Cfg";
const char pstrUsageALWordProcessor [] PROGMEM = "AL Word Proc";
const char pstrUsageALTextEditor [] PROGMEM = "AL Txt Edtr";
const char pstrUsageALSpreadsheet [] PROGMEM = "AL Sprdsheet";
const char pstrUsageALGraphicsEditor [] PROGMEM = "AL Graph Edtr";
const char pstrUsageALPresentationApp [] PROGMEM = "AL Present App";
const char pstrUsageALDatabaseApp [] PROGMEM = "AL DB App";
const char pstrUsageALEmailReader [] PROGMEM = "AL E-mail Rdr";
const char pstrUsageALNewsreader [] PROGMEM = "AL Newsrdr";
const char pstrUsageALVoicemail [] PROGMEM = "AL Voicemail";
const char pstrUsageALContactsAddressBook [] PROGMEM = "AL Addr Book";
const char pstrUsageALCalendarSchedule [] PROGMEM = "AL Clndr/Schdlr";
const char pstrUsageALTaskProjectManager [] PROGMEM = "AL Task/Prj Mgr";
const char pstrUsageALLogJournalTimecard [] PROGMEM = "AL Log/Jrnl/Tmcrd";
const char pstrUsageALCheckbookFinance [] PROGMEM = "AL Chckbook/Fin";
const char pstrUsageALCalculator [] PROGMEM = "AL Calc";
const char pstrUsageALAVCapturePlayback [] PROGMEM = "AL A/V Capt/Play";
const char pstrUsageALLocalMachineBrowser [] PROGMEM = "AL Loc Mach Brow";
const char pstrUsageALLANWANBrow [] PROGMEM = "AL LAN/WAN Brow";
const char pstrUsageALInternetBrowser [] PROGMEM = "AL I-net Brow";
const char pstrUsageALRemoteNetISPConnect [] PROGMEM = "AL Rem Net Con";
const char pstrUsageALNetworkConference [] PROGMEM = "AL Net Conf";
const char pstrUsageALNetworkChat [] PROGMEM = "AL Net Chat";
const char pstrUsageALTelephonyDialer [] PROGMEM = "AL Tel/Dial";
const char pstrUsageALLogon [] PROGMEM = "AL Logon";
const char pstrUsageALLogoff [] PROGMEM = "AL Logoff";
const char pstrUsageALLogonLogoff [] PROGMEM = "AL Logon/Logoff";
const char pstrUsageALTermLockScrSav [] PROGMEM = "AL Term Lock/Scr Sav";
const char pstrUsageALControlPannel [] PROGMEM = "AL Ctrl Pan";
const char pstrUsageALCommandLineProcessorRun [] PROGMEM = "AL Cmd/Run";
const char pstrUsageALProcessTaskManager [] PROGMEM = "AL Task Mgr";
const char pstrUsageALSelectTaskApplication [] PROGMEM = "AL Sel App";
const char pstrUsageALNextTaskApplication [] PROGMEM = "AL Next App";
const char pstrUsageALPreviousTaskApplication [] PROGMEM = "AL Prev App";
const char pstrUsageALPreemptiveHaltTaskApp [] PROGMEM = "AL Prmpt Halt App";
const char pstrUsageALIntegratedHelpCenter [] PROGMEM = "AL Hlp Cntr";
const char pstrUsageALDocuments [] PROGMEM = "AL Docs";
const char pstrUsageALThesaurus [] PROGMEM = "AL Thsrs";
const char pstrUsageALDictionary [] PROGMEM = "AL Dict";
const char pstrUsageALDesktop [] PROGMEM = "AL Desktop";
const char pstrUsageALSpellCheck [] PROGMEM = "AL Spell Chk";
const char pstrUsageALGrammarCheck [] PROGMEM = "AL Gram Chk";
const char pstrUsageALWirelessStatus [] PROGMEM = "AL Wireless Sts";
const char pstrUsageALKeyboardLayout [] PROGMEM = "AL Kbd Layout";
const char pstrUsageALVirusProtection [] PROGMEM = "AL Vir Protect";
const char pstrUsageALEncryption [] PROGMEM = "AL Encrypt";
const char pstrUsageALScreenSaver [] PROGMEM = "AL Scr Sav";
const char pstrUsageALAlarms [] PROGMEM = "AL Alarms";
const char pstrUsageALClock [] PROGMEM = "AL Clock";
const char pstrUsageALFileBrowser [] PROGMEM = "AL File Brow";
const char pstrUsageALPowerStatus [] PROGMEM = "AL Pwr Sts";
const char pstrUsageALImageBrowser [] PROGMEM = "AL Img Brow";
const char pstrUsageALAudioBrowser [] PROGMEM = "AL Aud Brow";
const char pstrUsageALMovieBrowser [] PROGMEM = "AL Mov Brow";
const char pstrUsageALDigitalRightsManager [] PROGMEM = "AL Dig Rights Mgr";
const char pstrUsageALDigitalWallet [] PROGMEM = "AL Dig Wallet";
const char pstrUsageALInstantMessaging [] PROGMEM = "AL Inst Msg";
const char pstrUsageALOEMFeaturesBrowser [] PROGMEM = "AL OEM Tips Brow";
const char pstrUsageALOEMHelp [] PROGMEM = "AL OEM Hlp";
const char pstrUsageALOnlineCommunity [] PROGMEM = "AL Online Com";
const char pstrUsageALEntertainmentContentBrow [] PROGMEM = "AL Ent Cont Brow";
const char pstrUsageALOnlineShoppingBrowser [] PROGMEM = "AL Online Shop Brow";
const char pstrUsageALSmartCardInfoHelp [] PROGMEM = "AL SmartCard Inf";
const char pstrUsageALMarketMonitorFinBrowser [] PROGMEM = "AL Market Brow";
const char pstrUsageALCustomCorpNewsBrowser [] PROGMEM = "AL Cust Corp News Brow";
const char pstrUsageALOnlineActivityBrowser [] PROGMEM = "AL Online Act Brow";
const char pstrUsageALResearchSearchBrowser [] PROGMEM = "AL Search Brow";
const char pstrUsageALAudioPlayer [] PROGMEM = "AL Aud Player";
const char pstrUsageGenericGUIAppControls [] PROGMEM = "Gen GUI App Ctrl";
const char pstrUsageACNew [] PROGMEM = "AC New";
const char pstrUsageACOpen [] PROGMEM = "AC Open";
const char pstrUsageACClose [] PROGMEM = "AC Close";
const char pstrUsageACExit [] PROGMEM = "AC Exit";
const char pstrUsageACMaximize [] PROGMEM = "AC Max";
const char pstrUsageACMinimize [] PROGMEM = "AC Min";
const char pstrUsageACSave [] PROGMEM = "AC Save";
const char pstrUsageACPrint [] PROGMEM = "AC Print";
const char pstrUsageACProperties [] PROGMEM = "AC Prop";
const char pstrUsageACUndo [] PROGMEM = "AC Undo";
const char pstrUsageACCopy [] PROGMEM = "AC Copy";
const char pstrUsageACCut [] PROGMEM = "AC Cut";
const char pstrUsageACPaste [] PROGMEM = "AC Paste";
const char pstrUsageACSelectAll [] PROGMEM = "AC Sel All";
const char pstrUsageACFind [] PROGMEM = "AC Find";
const char pstrUsageACFindAndReplace [] PROGMEM = "AC Find/Replace";
const char pstrUsageACSearch [] PROGMEM = "AC Search";
const char pstrUsageACGoto [] PROGMEM = "AC Goto";
const char pstrUsageACHome [] PROGMEM = "AC Home";
const char pstrUsageACBack [] PROGMEM = "AC Back";
const char pstrUsageACForward [] PROGMEM = "AC Fwd";
const char pstrUsageACStop [] PROGMEM = "AC Stop";
const char pstrUsageACRefresh [] PROGMEM = "AC Refresh";
const char pstrUsageACPreviousLink [] PROGMEM = "AC Prev Link";
const char pstrUsageACNextLink [] PROGMEM = "AC Next Link";
const char pstrUsageACBookmarks [] PROGMEM = "AC Bkmarks";
const char pstrUsageACHistory [] PROGMEM = "AC Hist";
const char pstrUsageACSubscriptions [] PROGMEM = "AC Subscr";
const char pstrUsageACZoomIn [] PROGMEM = "AC Zoom In";
const char pstrUsageACZoomOut [] PROGMEM = "AC Zoom Out";
const char pstrUsageACZoom [] PROGMEM = "AC Zoom";
const char pstrUsageACFullScreenView [] PROGMEM = "AC Full Scr";
const char pstrUsageACNormalView [] PROGMEM = "AC Norm View";
const char pstrUsageACViewToggle [] PROGMEM = "AC View Tgl";
const char pstrUsageACScrollUp [] PROGMEM = "AC Scroll Up";
const char pstrUsageACScrollDown [] PROGMEM = "AC Scroll Down";
const char pstrUsageACScroll [] PROGMEM = "AC Scroll";
const char pstrUsageACPanLeft [] PROGMEM = "AC Pan Left";
const char pstrUsageACPanRight [] PROGMEM = "AC Pan Right";
const char pstrUsageACPan [] PROGMEM = "AC Pan";
const char pstrUsageACNewWindow [] PROGMEM = "AC New Wnd";
const char pstrUsageACTileHoriz [] PROGMEM = "AC Tile Horiz";
const char pstrUsageACTileVert [] PROGMEM = "AC Tile Vert";
const char pstrUsageACFormat [] PROGMEM = "AC Frmt";
const char pstrUsageACEdit [] PROGMEM = "AC Edit";
const char pstrUsageACBold [] PROGMEM = "AC Bold";
const char pstrUsageACItalics [] PROGMEM = "AC Ital";
const char pstrUsageACUnderline [] PROGMEM = "AC Under";
const char pstrUsageACStrikethrough [] PROGMEM = "AC Strike";
const char pstrUsageACSubscript [] PROGMEM = "AC Sub";
const char pstrUsageACSuperscript [] PROGMEM = "AC Super";
const char pstrUsageACAllCaps [] PROGMEM = "AC All Caps";
const char pstrUsageACRotate [] PROGMEM = "AC Rotate";
const char pstrUsageACResize [] PROGMEM = "AC Resize";
const char pstrUsageACFlipHorizontal [] PROGMEM = "AC Flp H";
const char pstrUsageACFlipVertical [] PROGMEM = "AC Flp V";
const char pstrUsageACMirrorHorizontal [] PROGMEM = "AC Mir H";
const char pstrUsageACMirrorVertical [] PROGMEM = "AC Mir V";
const char pstrUsageACFontSelect [] PROGMEM = "AC Fnt Sel";
const char pstrUsageACFontColor [] PROGMEM = "AC Fnt Clr";
const char pstrUsageACFontSize [] PROGMEM = "AC Fnt Size";
const char pstrUsageACJustifyLeft [] PROGMEM = "AC Just Left";
const char pstrUsageACJustifyCenterH [] PROGMEM = "AC Just Cent H";
const char pstrUsageACJustifyRight [] PROGMEM = "AC Just Right";
const char pstrUsageACJustifyBlockH [] PROGMEM = "AC Just Block H";
const char pstrUsageACJustifyTop [] PROGMEM = "AC Just Top";
const char pstrUsageACJustifyCenterV [] PROGMEM = "AC Just Cent V";
const char pstrUsageACJustifyBottom [] PROGMEM = "AC Just Bot";
const char pstrUsageACJustifyBlockV [] PROGMEM = "AC Just Block V";
const char pstrUsageACIndentDecrease [] PROGMEM = "AC Indent Dec";
const char pstrUsageACIndentIncrease [] PROGMEM = "AC Indent Inc";
const char pstrUsageACNumberedList [] PROGMEM = "AC Num List";
const char pstrUsageACRestartNumbering [] PROGMEM = "AC Res Num";
const char pstrUsageACBulletedList [] PROGMEM = "AC Blt List";
const char pstrUsageACPromote [] PROGMEM = "AC Promote";
const char pstrUsageACDemote [] PROGMEM = "AC Demote";
const char pstrUsageACYes [] PROGMEM = "AC Yes";
const char pstrUsageACNo [] PROGMEM = "AC No";
const char pstrUsageACCancel [] PROGMEM = "AC Cancel";
const char pstrUsageACCatalog [] PROGMEM = "AC Ctlg";
const char pstrUsageACBuyChkout [] PROGMEM = "AC Buy";
const char pstrUsageACAddToCart [] PROGMEM = "AC Add2Cart";
const char pstrUsageACExpand [] PROGMEM = "AC Xpnd";
const char pstrUsageACExpandAll [] PROGMEM = "AC Xpand All";
const char pstrUsageACCollapse [] PROGMEM = "AC Collapse";
const char pstrUsageACCollapseAll [] PROGMEM = "AC Collapse All";
const char pstrUsageACPrintPreview [] PROGMEM = "AC Prn Prevw";
const char pstrUsageACPasteSpecial [] PROGMEM = "AC Paste Spec";
const char pstrUsageACInsertMode [] PROGMEM = "AC Ins Mode";
const char pstrUsageACDelete [] PROGMEM = "AC Del";
const char pstrUsageACLock [] PROGMEM = "AC Lock";
const char pstrUsageACUnlock [] PROGMEM = "AC Unlock";
const char pstrUsageACProtect [] PROGMEM = "AC Prot";
const char pstrUsageACUnprotect [] PROGMEM = "AC Unprot";
const char pstrUsageACAttachComment [] PROGMEM = "AC Attach Cmnt";
const char pstrUsageACDeleteComment [] PROGMEM = "AC Del Cmnt";
const char pstrUsageACViewComment [] PROGMEM = "AC View Cmnt";
const char pstrUsageACSelectWord [] PROGMEM = "AC Sel Word";
const char pstrUsageACSelectSentence [] PROGMEM = "AC Sel Sntc";
const char pstrUsageACSelectParagraph [] PROGMEM = "AC Sel Para";
const char pstrUsageACSelectColumn [] PROGMEM = "AC Sel Col";
const char pstrUsageACSelectRow [] PROGMEM = "AC Sel Row";
const char pstrUsageACSelectTable [] PROGMEM = "AC Sel Tbl";
const char pstrUsageACSelectObject [] PROGMEM = "AC Sel Obj";
const char pstrUsageACRedoRepeat [] PROGMEM = "AC Redo";
const char pstrUsageACSort [] PROGMEM = "AC Sort";
const char pstrUsageACSortAscending [] PROGMEM = "AC Sort Asc";
const char pstrUsageACSortDescending [] PROGMEM = "AC Sort Desc";
const char pstrUsageACFilter [] PROGMEM = "AC Filt";
const char pstrUsageACSetClock [] PROGMEM = "AC Set Clk";
const char pstrUsageACViewClock [] PROGMEM = "AC View Clk";
const char pstrUsageACSelectTimeZone [] PROGMEM = "AC Sel Time Z";
const char pstrUsageACEditTimeZone [] PROGMEM = "AC Edt Time Z";
const char pstrUsageACSetAlarm [] PROGMEM = "AC Set Alm";
const char pstrUsageACClearAlarm [] PROGMEM = "AC Clr Alm";
const char pstrUsageACSnoozeAlarm [] PROGMEM = "AC Snz Alm";
const char pstrUsageACResetAlarm [] PROGMEM = "AC Rst Alm";
const char pstrUsageACSyncronize [] PROGMEM = "AC Sync";
const char pstrUsageACSendReceive [] PROGMEM = "AC Snd/Rcv";
const char pstrUsageACSendTo [] PROGMEM = "AC Snd To";
const char pstrUsageACReply [] PROGMEM = "AC Reply";
const char pstrUsageACReplyAll [] PROGMEM = "AC Reply All";
const char pstrUsageACForwardMessage [] PROGMEM = "AC Fwd Msg";
const char pstrUsageACSend [] PROGMEM = "AC Snd";
const char pstrUsageACAttachFile [] PROGMEM = "AC Att File";
const char pstrUsageACUpload [] PROGMEM = "AC Upld";
const char pstrUsageACDownload [] PROGMEM = "AC Dnld";
const char pstrUsageACSetBorders [] PROGMEM = "AC Set Brd";
const char pstrUsageACInsertRow [] PROGMEM = "AC Ins Row";
const char pstrUsageACInsertColumn [] PROGMEM = "AC Ins Col";
const char pstrUsageACInsertFile [] PROGMEM = "AC Ins File";
const char pstrUsageACInsertPicture [] PROGMEM = "AC Ins Pic";
const char pstrUsageACInsertObject [] PROGMEM = "AC Ins Obj";
const char pstrUsageACInsertSymbol [] PROGMEM = "AC Ins Sym";
const char pstrUsageACSaveAndClose [] PROGMEM = "AC Sav&Cls";
const char pstrUsageACRename [] PROGMEM = "AC Rename";
const char pstrUsageACMerge [] PROGMEM = "AC Merge";
const char pstrUsageACSplit [] PROGMEM = "AC Split";
const char pstrUsageACDistributeHorizontaly [] PROGMEM = "AC Dist Hor";
const char pstrUsageACDistributeVerticaly [] PROGMEM = "AC Dist Ver";
// Digitaizers
const char pstrUsageDigitizer [] PROGMEM = "Digitizer";
const char pstrUsagePen [] PROGMEM = "Pen";
const char pstrUsageLightPen [] PROGMEM = "Light Pen";
const char pstrUsageTouchScreen [] PROGMEM = "Touch Scr";
const char pstrUsageTouchPad [] PROGMEM = "Touch Pad";
const char pstrUsageWhiteBoard [] PROGMEM = "White Brd";
const char pstrUsageCoordinateMeasuringMachine [] PROGMEM = "Coord Meas Mach";
const char pstrUsage3DDigitizer [] PROGMEM = "3D Dgtz";
const char pstrUsageStereoPlotter [] PROGMEM = "Stereo Plot";
const char pstrUsageArticulatedArm [] PROGMEM = "Art Arm";
const char pstrUsageArmature [] PROGMEM = "Armature";
const char pstrUsageMultiplePointDigitizer [] PROGMEM = "Multi Point Dgtz";
const char pstrUsageFreeSpaceWand [] PROGMEM = "Free Space Wand";
const char pstrUsageStylus [] PROGMEM = "Stylus";
const char pstrUsagePuck [] PROGMEM = "Puck";
const char pstrUsageFinger [] PROGMEM = "Finger";
const char pstrUsageTipPressure [] PROGMEM = "Tip Press";
const char pstrUsageBarrelPressure [] PROGMEM = "Brl Press";
const char pstrUsageInRange [] PROGMEM = "In Range";
const char pstrUsageTouch [] PROGMEM = "Touch";
const char pstrUsageUntouch [] PROGMEM = "Untouch";
const char pstrUsageTap [] PROGMEM = "Tap";
const char pstrUsageQuality [] PROGMEM = "Qlty";
const char pstrUsageDataValid [] PROGMEM = "Data Valid";
const char pstrUsageTransducerIndex [] PROGMEM = "Transducer Ind";
const char pstrUsageTabletFunctionKeys [] PROGMEM = "Tabl Func Keys";
const char pstrUsageProgramChangeKeys [] PROGMEM = "Pgm Chng Keys";
//const char pstrUsageBatteryStrength [] PROGMEM = "Bat Strength";
const char pstrUsageInvert [] PROGMEM = "Invert";
const char pstrUsageXTilt [] PROGMEM = "X Tilt";
const char pstrUsageYTilt [] PROGMEM = "Y Tilt";
const char pstrUsageAzimuth [] PROGMEM = "Azimuth";
const char pstrUsageAltitude [] PROGMEM = "Altitude";
const char pstrUsageTwist [] PROGMEM = "Twist";
const char pstrUsageTipSwitch [] PROGMEM = "Tip Sw";
const char pstrUsageSecondaryTipSwitch [] PROGMEM = "Scnd Tip Sw";
const char pstrUsageBarrelSwitch [] PROGMEM = "Brl Sw";
const char pstrUsageEraser [] PROGMEM = "Eraser";
const char pstrUsageTabletPick [] PROGMEM = "Tbl Pick";
// Alphanumeric Display Page
const char pstrUsageAlphanumericDisplay [] PROGMEM = "Alphanum Disp";
const char pstrUsageBitmappedDisplay [] PROGMEM = "Bmp Disp";
const char pstrUsageDisplayAttributesReport [] PROGMEM = "Disp Attr Rpt";
const char pstrUsageASCIICharacterSet [] PROGMEM = "ASCII chset";
const char pstrUsageDataReadBack [] PROGMEM = "Data Rd Back";
const char pstrUsageFontReadBack [] PROGMEM = "Fnt Rd Back";
const char pstrUsageDisplayControlReport [] PROGMEM = "Disp Ctrl Rpt";
const char pstrUsageClearDisplay [] PROGMEM = "Clr Disp";
//const char pstrUsageDisplayEnable [] PROGMEM = "Disp Enbl";
const char pstrUsageScreenSaverDelay [] PROGMEM = "Scr Sav Delay";
const char pstrUsageScreenSaverEnable [] PROGMEM = "Scr Sav Enbl";
const char pstrUsageVerticalScroll [] PROGMEM = "V Scroll";
const char pstrUsageHorizontalScroll [] PROGMEM = "H Scroll";
const char pstrUsageCharacterReport [] PROGMEM = "Char Rpt";
const char pstrUsageDisplayData [] PROGMEM = "Disp Data";
const char pstrUsageDisplayStatus [] PROGMEM = "Disp Stat";
const char pstrUsageStatusNotReady [] PROGMEM = "Stat !Ready";
const char pstrUsageStatusReady [] PROGMEM = "Stat Ready";
const char pstrUsageErrorNotALoadableCharacter [] PROGMEM = "Err Not Ld Char";
const char pstrUsageErrorFotDataCanNotBeRead [] PROGMEM = "Fnt Data Rd Err";
const char pstrUsageCursorPositionReport [] PROGMEM = "Cur Pos Rpt";
const char pstrUsageRow [] PROGMEM = "Row";
const char pstrUsageColumn [] PROGMEM = "Col";
const char pstrUsageRows [] PROGMEM = "Rows";
const char pstrUsageColumns [] PROGMEM = "Cols";
const char pstrUsageCursorPixelPosition [] PROGMEM = "Cur Pix Pos";
const char pstrUsageCursorMode [] PROGMEM = "Cur Mode";
const char pstrUsageCursorEnable [] PROGMEM = "Cur Enbl";
const char pstrUsageCursorBlink [] PROGMEM = "Cur Blnk";
const char pstrUsageFontReport [] PROGMEM = "Fnt Rpt";
const char pstrUsageFontData [] PROGMEM = "Fnt Data";
const char pstrUsageCharacterWidth [] PROGMEM = "Char Wdth";
const char pstrUsageCharacterHeight [] PROGMEM = "Char Hght";
const char pstrUsageCharacterSpacingHorizontal [] PROGMEM = "Char Space H";
const char pstrUsageCharacterSpacingVertical [] PROGMEM = "Char Space V";
const char pstrUsageUnicodeCharset [] PROGMEM = "Unicode Char";
const char pstrUsageFont7Segment [] PROGMEM = "Fnt 7-seg";
const char pstrUsage7SegmentDirectMap [] PROGMEM = "7-seg map";
const char pstrUsageFont14Segment [] PROGMEM = "Fnt 14-seg";
const char pstrUsage14SegmentDirectMap [] PROGMEM = "14-seg map";
const char pstrUsageDisplayBrightness [] PROGMEM = "Disp Bright";
const char pstrUsageDisplayContrast [] PROGMEM = "Disp Cntrst";
const char pstrUsageCharacterAttribute [] PROGMEM = "Char Attr";
const char pstrUsageAttributeReadback [] PROGMEM = "Attr Readbk";
const char pstrUsageAttributeData [] PROGMEM = "Attr Data";
const char pstrUsageCharAttributeEnhance [] PROGMEM = "Char Attr Enh";
const char pstrUsageCharAttributeUnderline [] PROGMEM = "Char Attr Undl";
const char pstrUsageCharAttributeBlink [] PROGMEM = "Char Attr Blnk";
const char pstrUsageBitmapSizeX [] PROGMEM = "Bmp Size X";
const char pstrUsageBitmapSizeY [] PROGMEM = "Bmp Size Y";
const char pstrUsageBitDepthFormat [] PROGMEM = "Bit Dpth Fmt";
const char pstrUsageDisplayOrientation [] PROGMEM = "Disp Ornt";
const char pstrUsagePaletteReport [] PROGMEM = "Pal Rpt";
const char pstrUsagePaletteDataSize [] PROGMEM = "Pal Data Size";
const char pstrUsagePaletteDataOffset [] PROGMEM = "Pal Data Off";
const char pstrUsagePaletteData [] PROGMEM = "Pal Data";
const char pstrUsageBlitReport [] PROGMEM = "Blit Rpt";
const char pstrUsageBlitRectangleX1 [] PROGMEM = "Blit Rect X1";
const char pstrUsageBlitRectangleY1 [] PROGMEM = "Blit Rect Y1";
const char pstrUsageBlitRectangleX2 [] PROGMEM = "Blit Rect X2";
const char pstrUsageBlitRectangleY2 [] PROGMEM = "Blit Rect Y2";
const char pstrUsageBlitData [] PROGMEM = "Blit Data";
const char pstrUsageSoftButton [] PROGMEM = "Soft Btn";
const char pstrUsageSoftButtonID [] PROGMEM = "Soft Btn ID";
const char pstrUsageSoftButtonSide [] PROGMEM = "Soft Btn Side";
const char pstrUsageSoftButtonOffset1 [] PROGMEM = "Soft Btn Off1";
const char pstrUsageSoftButtonOffset2 [] PROGMEM = "Soft Btn Off2";
const char pstrUsageSoftButtonReport [] PROGMEM = "Soft Btn Rpt";
// Medical Instrument Page
const char pstrUsageMedicalUltrasound [] PROGMEM = "Med Ultrasnd";
const char pstrUsageVCRAcquisition [] PROGMEM = "VCR/Acq";
const char pstrUsageFreezeThaw [] PROGMEM = "Freeze";
const char pstrUsageClipStore [] PROGMEM = "Clip Store";
const char pstrUsageUpdate [] PROGMEM = "Update";
const char pstrUsageNext [] PROGMEM = "Next";
const char pstrUsageSave [] PROGMEM = "Save";
const char pstrUsagePrint [] PROGMEM = "Print";
const char pstrUsageMicrophoneEnable [] PROGMEM = "Mic Enbl";
const char pstrUsageCine [] PROGMEM = "Cine";
const char pstrUsageTransmitPower [] PROGMEM = "Trans Pwr";
//const char pstrUsageVolume [] PROGMEM = "Vol";
const char pstrUsageFocus [] PROGMEM = "Focus";
const char pstrUsageDepth [] PROGMEM = "Depth";
const char pstrUsageSoftStepPrimary [] PROGMEM = "Soft Stp-Pri";
const char pstrUsageSoftStepSecondary [] PROGMEM = "Soft Stp-Sec";
const char pstrUsageDepthGainCompensation [] PROGMEM = "Dpth Gain Comp";
const char pstrUsageZoomSelect [] PROGMEM = "Zoom Sel";
const char pstrUsageZoomAdjust [] PROGMEM = "Zoom Adj";
const char pstrUsageSpectralDopplerModeSelect [] PROGMEM = "Spec Dop Mode Sel";
const char pstrUsageSpectralDopplerModeAdjust [] PROGMEM = "Spec Dop Mode Adj";
const char pstrUsageColorDopplerModeSelect [] PROGMEM = "Color Dop Mode Sel";
const char pstrUsageColorDopplerModeAdjust [] PROGMEM = "Color Dop Mode Adj";
const char pstrUsageMotionModeSelect [] PROGMEM = "Motion Mode Sel";
const char pstrUsageMotionModeAdjust [] PROGMEM = "Motion Mode Adj";
const char pstrUsage2DModeSelect [] PROGMEM = "2D Mode Sel";
const char pstrUsage2DModeAdjust [] PROGMEM = "2D Mode Adj";
const char pstrUsageSoftControlSelect [] PROGMEM = "Soft Ctrl Sel";
const char pstrUsageSoftControlAdjust [] PROGMEM = "Soft Ctrl Adj";
//extern const char *usagePageTitles0[15];
//const char *usagePageTitles1[];
//const char *genDesktopTitles0[];
//const char *genDesktopTitles1[];
//const char *genDesktopTitles2[];
//const char *genDesktopTitles3[];
//const char *genDesktopTitles4[];
//const char *simuTitles0[];
//const char *simuTitles1[];
//const char *simuTitles2[];
//const char *vrTitles0[];
//const char *vrTitles1[];
//const char *sportsCtrlTitles0[];
//const char *sportsCtrlTitles1[];
//const char *sportsCtrlTitles2[];
//const char *gameTitles0[];
//const char *gameTitles1[];
//const char *genDevCtrlTitles[];
//const char *ledTitles[];
//const char *telTitles0[];
//const char *telTitles1[];
//const char *telTitles2[];
//const char *telTitles3[];
//const char *telTitles4[];
//const char *telTitles5[];
//const char *consTitles0[];
//const char *consTitles1[];
//const char *consTitles2[];
//const char *consTitles3[];
//const char *consTitles4[];
//const char *consTitles5[];
//const char *consTitles6[];
//const char *consTitles7[];
//const char *consTitles8[];
//const char *consTitles9[];
//const char *consTitlesA[];
//const char *consTitlesB[];
//const char *consTitlesC[];
//const char *consTitlesD[];
//const char *consTitlesE[];
//const char *digitTitles0[];
//const char *digitTitles1[];
//const char *digitTitles2[];
//const char *aplphanumTitles0[];
//const char *aplphanumTitles1[];
//const char *aplphanumTitles2[];
//const char *medInstrTitles0[];
//const char *medInstrTitles1[];
//const char *medInstrTitles2[];
//const char *medInstrTitles3[];
//const char *medInstrTitles4[];
#endif //__HIDUSAGESTR_H__

1047
hidusagetitlearrays.cpp Normal file

File diff suppressed because it is too large Load diff