diff --git a/libraries/CompleteHID/CompleteHID.cpp b/libraries/CompleteHID/CompleteHID.cpp index b177adebe..b533e6317 100644 --- a/libraries/CompleteHID/CompleteHID.cpp +++ b/libraries/CompleteHID/CompleteHID.cpp @@ -1,7 +1,6 @@ #if 1 //defined(USBCON) #include "CompleteHID.h" -#include "HID.h" #define HID_MOUSE_ABS_ENABLED @@ -197,9 +196,6 @@ const u8 _hidReportDescriptor[] = { #endif }; -size_t getsizeof_hidReportDescriptor() { - return sizeof(_hidReportDescriptor); -} //================================================================================ //================================================================================ @@ -207,6 +203,12 @@ size_t getsizeof_hidReportDescriptor() { Mouse_::Mouse_(void) : _buttons(0) { + static HID_Descriptor cb = { + .length = sizeof(_hidReportDescriptor), + .descriptor = _hidReportDescriptor, + }; + static HIDDescriptorListNode node(&cb); + HID.AppendDescriptor(&node); } void Mouse_::begin(void) @@ -232,7 +234,7 @@ void Mouse_::move(signed char x, signed char y, signed char wheel) m[1] = x; m[2] = y; m[3] = wheel; - HID_SendReport(HID_REPORTID_MOUSE,m,sizeof(m)); + HID.SendReport(HID_REPORTID_MOUSE,m,sizeof(m)); } // X and Y have the range of 0 to 32767. @@ -261,7 +263,7 @@ void Mouse_::moveAbsolute(uint16_t x, uint16_t y) m[2] = MSB(x); m[3] = LSB(y); m[4] = MSB(y); - HID_SendReport(HID_REPORTID_MOUSE_ABS,m,sizeof(m)); + HID.SendReport(HID_REPORTID_MOUSE_ABS,m,sizeof(m)); } void Mouse_::buttons(uint8_t b) @@ -308,7 +310,7 @@ void Keyboard_::end(void) void Keyboard_::sendReport(KeyReport* keys) { - HID_SendReport(HID_REPORTID_KEYBOARD,keys,sizeof(*keys)); + HID.SendReport(HID_REPORTID_KEYBOARD,keys,sizeof(*keys)); } extern @@ -549,12 +551,12 @@ size_t Keyboard_::systemControl(uint8_t k) m[0] = LSB(mask); m[1] = MSB(mask); - HID_SendReport(HID_REPORTID_SYSTEMCONTROL,m,sizeof(m)); + HID.SendReport(HID_REPORTID_SYSTEMCONTROL,m,sizeof(m)); // these are all OSCs, so send a clear to make it possible to send it again later m[0] = 0; m[1] = 0; - HID_SendReport(HID_REPORTID_SYSTEMCONTROL,m,sizeof(m)); + HID.SendReport(HID_REPORTID_SYSTEMCONTROL,m,sizeof(m)); return 1; } else @@ -581,12 +583,12 @@ size_t Keyboard_::consumerControl(uint8_t k) m[0] = LSB(mask); m[1] = MSB(mask); - HID_SendReport(HID_REPORTID_CONSUMERCONTROL,m,sizeof(m)); + HID.SendReport(HID_REPORTID_CONSUMERCONTROL,m,sizeof(m)); // these are all OSCs, so send a clear to make it possible to send it again later m[0] = 0; m[1] = 0; - HID_SendReport(HID_REPORTID_CONSUMERCONTROL,m,sizeof(m)); + HID.SendReport(HID_REPORTID_CONSUMERCONTROL,m,sizeof(m)); return 1; } else diff --git a/libraries/CompleteHID/CompleteHID.h b/libraries/CompleteHID/CompleteHID.h index fc55747ca..467237f86 100644 --- a/libraries/CompleteHID/CompleteHID.h +++ b/libraries/CompleteHID/CompleteHID.h @@ -1,7 +1,7 @@ #ifndef COMPLETEHID_h #define COMPLETEHID_h -#if defined(_USING_HID) +#if 0 //defined(_USING_HID) #error "Can only attach one submodule to HID module" @@ -12,6 +12,8 @@ #include "HID.h" #include "HIDTables.h" +extern HID_ HID; + //================================================================================ //================================================================================ // Mouse @@ -98,17 +100,17 @@ public: Keyboard_(void); void begin(void); void end(void); - virtual size_t write(uint8_t k); - virtual size_t press(uint8_t k); - virtual size_t release(uint8_t k); - virtual size_t writeKeycode(uint8_t k); - virtual size_t pressKeycode(uint8_t k); - virtual size_t releaseKeycode(uint8_t k); - virtual size_t addKeycodeToReport(uint8_t k); - virtual size_t removeKeycodeFromReport(uint8_t k); - virtual void releaseAll(void); - virtual size_t systemControl(uint8_t k); - virtual size_t consumerControl(uint8_t k); + size_t write(uint8_t k); + size_t press(uint8_t k); + size_t release(uint8_t k); + size_t writeKeycode(uint8_t k); + size_t pressKeycode(uint8_t k); + size_t releaseKeycode(uint8_t k); + size_t addKeycodeToReport(uint8_t k); + size_t removeKeycodeFromReport(uint8_t k); + void releaseAll(void); + size_t systemControl(uint8_t k); + size_t consumerControl(uint8_t k); }; extern Keyboard_ Keyboard; diff --git a/libraries/MIDIUSB/MIDIUSB.cpp b/libraries/MIDIUSB/MIDIUSB.cpp index 1c7c52d9d..9a1bfd79d 100644 --- a/libraries/MIDIUSB/MIDIUSB.cpp +++ b/libraries/MIDIUSB/MIDIUSB.cpp @@ -44,7 +44,7 @@ int MIDI_GetInterface(uint8_t* interfaceNum) interfaceNum[0] += 2; // uses 2 return USB_SendControl(0,&_midiInterface,sizeof(_midiInterface)); } -bool MIDI_Setup(Setup& setup, u8 i) +bool MIDI_Setup(USBSetup& setup, u8 i) { //Support requests here if needed. Typically these are optional return false; diff --git a/libraries/MIDIUSB/MIDIUSB.h b/libraries/MIDIUSB/MIDIUSB.h index 7fad15473..0776002dc 100644 --- a/libraries/MIDIUSB/MIDIUSB.h +++ b/libraries/MIDIUSB/MIDIUSB.h @@ -30,12 +30,12 @@ public: int8_t begin(); - virtual uint32_t available(void); - virtual void accept(void); - virtual midiEventPacket_t read(void); - virtual void flush(void); - virtual void sendMIDI(midiEventPacket_t event); - virtual size_t write(const uint8_t *buffer, size_t size); + uint32_t available(void); + void accept(void); + midiEventPacket_t read(void); + void flush(void); + void sendMIDI(midiEventPacket_t event); + size_t write(const uint8_t *buffer, size_t size); operator bool(); }; extern MIDI_ MidiUSB; diff --git a/libraries/MouseAndKeyboard/MouseAndKeyboard.cpp b/libraries/MouseAndKeyboard/MouseAndKeyboard.cpp deleted file mode 100644 index 809ff9d50..000000000 --- a/libraries/MouseAndKeyboard/MouseAndKeyboard.cpp +++ /dev/null @@ -1,416 +0,0 @@ -#if 1 //defined(USBCON) - -#include "MouseAndKeyboard.h" -#include "HID.h" - -const u8 _hidReportDescriptor[] PROGMEM = { - - // Mouse - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 54 - 0x09, 0x02, // USAGE (Mouse) - 0xa1, 0x01, // COLLECTION (Application) - 0x09, 0x01, // USAGE (Pointer) - 0xa1, 0x00, // COLLECTION (Physical) - 0x85, 0x01, // REPORT_ID (1) - 0x05, 0x09, // USAGE_PAGE (Button) - 0x19, 0x01, // USAGE_MINIMUM (Button 1) - 0x29, 0x03, // USAGE_MAXIMUM (Button 3) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0x01, // LOGICAL_MAXIMUM (1) - 0x95, 0x03, // REPORT_COUNT (3) - 0x75, 0x01, // REPORT_SIZE (1) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x95, 0x01, // REPORT_COUNT (1) - 0x75, 0x05, // REPORT_SIZE (5) - 0x81, 0x03, // INPUT (Cnst,Var,Abs) - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) - 0x09, 0x30, // USAGE (X) - 0x09, 0x31, // USAGE (Y) - 0x09, 0x38, // USAGE (Wheel) - 0x15, 0x81, // LOGICAL_MINIMUM (-127) - 0x25, 0x7f, // LOGICAL_MAXIMUM (127) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, 0x03, // REPORT_COUNT (3) - 0x81, 0x06, // INPUT (Data,Var,Rel) - 0xc0, // END_COLLECTION - 0xc0, // END_COLLECTION - - // Keyboard - 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 47 - 0x09, 0x06, // USAGE (Keyboard) - 0xa1, 0x01, // COLLECTION (Application) - 0x85, 0x02, // REPORT_ID (2) - 0x05, 0x07, // USAGE_PAGE (Keyboard) - - 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) - 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0x01, // LOGICAL_MAXIMUM (1) - 0x75, 0x01, // REPORT_SIZE (1) - - 0x95, 0x08, // REPORT_COUNT (8) - 0x81, 0x02, // INPUT (Data,Var,Abs) - 0x95, 0x01, // REPORT_COUNT (1) - 0x75, 0x08, // REPORT_SIZE (8) - 0x81, 0x03, // INPUT (Cnst,Var,Abs) - - 0x95, 0x06, // REPORT_COUNT (6) - 0x75, 0x08, // REPORT_SIZE (8) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0x65, // LOGICAL_MAXIMUM (101) - 0x05, 0x07, // USAGE_PAGE (Keyboard) - - 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) - 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) - 0x81, 0x00, // INPUT (Data,Ary,Abs) - 0xc0, // END_COLLECTION - -#ifdef RAWHID_ENABLED - // RAW HID - 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30 - 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE), - - 0xA1, 0x01, // Collection 0x01 - 0x85, 0x03, // REPORT_ID (3) - 0x75, 0x08, // report size = 8 bits - 0x15, 0x00, // logical minimum = 0 - 0x26, 0xFF, 0x00, // logical maximum = 255 - - 0x95, 64, // report count TX - 0x09, 0x01, // usage - 0x81, 0x02, // Input (array) - - 0x95, 64, // report count RX - 0x09, 0x02, // usage - 0x91, 0x02, // Output (array) - 0xC0 // end collection -#endif -}; - -size_t getsizeof_hidReportDescriptor() { - return sizeof(_hidReportDescriptor); -} - -Mouse_ Mouse; - -//================================================================================ -//================================================================================ -// Mouse - -Mouse_::Mouse_(void) : _buttons(0) -{ -} - -void Mouse_::begin(void) -{ -} - -void Mouse_::end(void) -{ -} - -void Mouse_::click(uint8_t b) -{ - _buttons = b; - move(0,0,0); - _buttons = 0; - move(0,0,0); -} - -void Mouse_::move(signed char x, signed char y, signed char wheel) -{ - u8 m[4]; - m[0] = _buttons; - m[1] = x; - m[2] = y; - m[3] = wheel; - HID_SendReport(1,m,4); -} - -void Mouse_::buttons(uint8_t b) -{ - if (b != _buttons) - { - _buttons = b; - move(0,0,0); - } -} - -void Mouse_::press(uint8_t b) -{ - buttons(_buttons | b); -} - -void Mouse_::release(uint8_t b) -{ - buttons(_buttons & ~b); -} - -bool Mouse_::isPressed(uint8_t b) -{ - if ((b & _buttons) > 0) - return true; - return false; -} - -//================================================================================ -//================================================================================ -// Keyboard - -Keyboard_ Keyboard; - -Keyboard_::Keyboard_(void) -{ -} - -void Keyboard_::begin(void) -{ -} - -void Keyboard_::end(void) -{ -} - -void Keyboard_::sendReport(KeyReport* keys) -{ - HID_SendReport(2,keys,sizeof(KeyReport)); -} - -extern -const uint8_t _asciimap[128] PROGMEM; - -#define SHIFT 0x80 -const uint8_t _asciimap[128] = -{ - 0x00, // NUL - 0x00, // SOH - 0x00, // STX - 0x00, // ETX - 0x00, // EOT - 0x00, // ENQ - 0x00, // ACK - 0x00, // BEL - 0x2a, // BS Backspace - 0x2b, // TAB Tab - 0x28, // LF Enter - 0x00, // VT - 0x00, // FF - 0x00, // CR - 0x00, // SO - 0x00, // SI - 0x00, // DEL - 0x00, // DC1 - 0x00, // DC2 - 0x00, // DC3 - 0x00, // DC4 - 0x00, // NAK - 0x00, // SYN - 0x00, // ETB - 0x00, // CAN - 0x00, // EM - 0x00, // SUB - 0x00, // ESC - 0x00, // FS - 0x00, // GS - 0x00, // RS - 0x00, // US - - 0x2c, // ' ' - 0x1e|SHIFT, // ! - 0x34|SHIFT, // " - 0x20|SHIFT, // # - 0x21|SHIFT, // $ - 0x22|SHIFT, // % - 0x24|SHIFT, // & - 0x34, // ' - 0x26|SHIFT, // ( - 0x27|SHIFT, // ) - 0x25|SHIFT, // * - 0x2e|SHIFT, // + - 0x36, // , - 0x2d, // - - 0x37, // . - 0x38, // / - 0x27, // 0 - 0x1e, // 1 - 0x1f, // 2 - 0x20, // 3 - 0x21, // 4 - 0x22, // 5 - 0x23, // 6 - 0x24, // 7 - 0x25, // 8 - 0x26, // 9 - 0x33|SHIFT, // : - 0x33, // ; - 0x36|SHIFT, // < - 0x2e, // = - 0x37|SHIFT, // > - 0x38|SHIFT, // ? - 0x1f|SHIFT, // @ - 0x04|SHIFT, // A - 0x05|SHIFT, // B - 0x06|SHIFT, // C - 0x07|SHIFT, // D - 0x08|SHIFT, // E - 0x09|SHIFT, // F - 0x0a|SHIFT, // G - 0x0b|SHIFT, // H - 0x0c|SHIFT, // I - 0x0d|SHIFT, // J - 0x0e|SHIFT, // K - 0x0f|SHIFT, // L - 0x10|SHIFT, // M - 0x11|SHIFT, // N - 0x12|SHIFT, // O - 0x13|SHIFT, // P - 0x14|SHIFT, // Q - 0x15|SHIFT, // R - 0x16|SHIFT, // S - 0x17|SHIFT, // T - 0x18|SHIFT, // U - 0x19|SHIFT, // V - 0x1a|SHIFT, // W - 0x1b|SHIFT, // X - 0x1c|SHIFT, // Y - 0x1d|SHIFT, // Z - 0x2f, // [ - 0x31, // bslash - 0x30, // ] - 0x23|SHIFT, // ^ - 0x2d|SHIFT, // _ - 0x35, // ` - 0x04, // a - 0x05, // b - 0x06, // c - 0x07, // d - 0x08, // e - 0x09, // f - 0x0a, // g - 0x0b, // h - 0x0c, // i - 0x0d, // j - 0x0e, // k - 0x0f, // l - 0x10, // m - 0x11, // n - 0x12, // o - 0x13, // p - 0x14, // q - 0x15, // r - 0x16, // s - 0x17, // t - 0x18, // u - 0x19, // v - 0x1a, // w - 0x1b, // x - 0x1c, // y - 0x1d, // z - 0x2f|SHIFT, // - 0x31|SHIFT, // | - 0x30|SHIFT, // } - 0x35|SHIFT, // ~ - 0 // DEL -}; - -uint8_t USBPutChar(uint8_t c); - -// press() adds the specified key (printing, non-printing, or modifier) -// to the persistent key report and sends the report. Because of the way -// USB HID works, the host acts like the key remains pressed until we -// call release(), releaseAll(), or otherwise clear the report and resend. -size_t Keyboard_::press(uint8_t k) -{ - uint8_t i; - if (k >= 136) { // it's a non-printing key (not a modifier) - k = k - 136; - } else if (k >= 128) { // it's a modifier key - _keyReport.modifiers |= (1<<(k-128)); - k = 0; - } else { // it's a printing key - k = pgm_read_byte(_asciimap + k); - if (!k) { - setWriteError(); - return 0; - } - if (k & 0x80) { // it's a capital letter or other character reached with shift - _keyReport.modifiers |= 0x02; // the left shift modifier - k &= 0x7F; - } - } - - // Add k to the key report only if it's not already present - // and if there is an empty slot. - if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && - _keyReport.keys[2] != k && _keyReport.keys[3] != k && - _keyReport.keys[4] != k && _keyReport.keys[5] != k) { - - for (i=0; i<6; i++) { - if (_keyReport.keys[i] == 0x00) { - _keyReport.keys[i] = k; - break; - } - } - if (i == 6) { - setWriteError(); - return 0; - } - } - sendReport(&_keyReport); - return 1; -} - -// release() takes the specified key out of the persistent key report and -// sends the report. This tells the OS the key is no longer pressed and that -// it shouldn't be repeated any more. -size_t Keyboard_::release(uint8_t k) -{ - uint8_t i; - if (k >= 136) { // it's a non-printing key (not a modifier) - k = k - 136; - } else if (k >= 128) { // it's a modifier key - _keyReport.modifiers &= ~(1<<(k-128)); - k = 0; - } else { // it's a printing key - k = pgm_read_byte(_asciimap + k); - if (!k) { - return 0; - } - if (k & 0x80) { // it's a capital letter or other character reached with shift - _keyReport.modifiers &= ~(0x02); // the left shift modifier - k &= 0x7F; - } - } - - // Test the key report to see if k is present. Clear it if it exists. - // Check all positions in case the key is present more than once (which it shouldn't be) - for (i=0; i<6; i++) { - if (0 != k && _keyReport.keys[i] == k) { - _keyReport.keys[i] = 0x00; - } - } - - sendReport(&_keyReport); - return 1; -} - -void Keyboard_::releaseAll(void) -{ - _keyReport.keys[0] = 0; - _keyReport.keys[1] = 0; - _keyReport.keys[2] = 0; - _keyReport.keys[3] = 0; - _keyReport.keys[4] = 0; - _keyReport.keys[5] = 0; - _keyReport.modifiers = 0; - sendReport(&_keyReport); -} - -size_t Keyboard_::write(uint8_t c) -{ - uint8_t p = press(c); // Keydown - release(c); // Keyup - return p; // just return the result of press() since release() almost always returns 1 -} - -#endif \ No newline at end of file diff --git a/libraries/MouseAndKeyboard/MouseAndKeyboard.h b/libraries/MouseAndKeyboard/MouseAndKeyboard.h deleted file mode 100644 index 0c67206a2..000000000 --- a/libraries/MouseAndKeyboard/MouseAndKeyboard.h +++ /dev/null @@ -1,104 +0,0 @@ -#ifndef MOUSEANDKEYBOARD_h - -#if defined(_USING_HID) - -#error "Can only attach one submodule to HID module" - -#else - -#define _USING_HID - -#include "HID.h" -//================================================================================ -//================================================================================ -// Mouse - -#define MOUSE_LEFT 1 -#define MOUSE_RIGHT 2 -#define MOUSE_MIDDLE 4 -#define MOUSE_ALL (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE) - -class Mouse_ -{ -private: - uint8_t _buttons; - void buttons(uint8_t b); -public: - Mouse_(void); - void begin(void); - void end(void); - void click(uint8_t b = MOUSE_LEFT); - void move(signed char x, signed char y, signed char wheel = 0); - void press(uint8_t b = MOUSE_LEFT); // press LEFT by default - void release(uint8_t b = MOUSE_LEFT); // release LEFT by default - bool isPressed(uint8_t b = MOUSE_LEFT); // check LEFT by default -}; -extern Mouse_ Mouse; - -//================================================================================ -//================================================================================ -// Keyboard - -#define KEY_LEFT_CTRL 0x80 -#define KEY_LEFT_SHIFT 0x81 -#define KEY_LEFT_ALT 0x82 -#define KEY_LEFT_GUI 0x83 -#define KEY_RIGHT_CTRL 0x84 -#define KEY_RIGHT_SHIFT 0x85 -#define KEY_RIGHT_ALT 0x86 -#define KEY_RIGHT_GUI 0x87 - -#define KEY_UP_ARROW 0xDA -#define KEY_DOWN_ARROW 0xD9 -#define KEY_LEFT_ARROW 0xD8 -#define KEY_RIGHT_ARROW 0xD7 -#define KEY_BACKSPACE 0xB2 -#define KEY_TAB 0xB3 -#define KEY_RETURN 0xB0 -#define KEY_ESC 0xB1 -#define KEY_INSERT 0xD1 -#define KEY_DELETE 0xD4 -#define KEY_PAGE_UP 0xD3 -#define KEY_PAGE_DOWN 0xD6 -#define KEY_HOME 0xD2 -#define KEY_END 0xD5 -#define KEY_CAPS_LOCK 0xC1 -#define KEY_F1 0xC2 -#define KEY_F2 0xC3 -#define KEY_F3 0xC4 -#define KEY_F4 0xC5 -#define KEY_F5 0xC6 -#define KEY_F6 0xC7 -#define KEY_F7 0xC8 -#define KEY_F8 0xC9 -#define KEY_F9 0xCA -#define KEY_F10 0xCB -#define KEY_F11 0xCC -#define KEY_F12 0xCD - -// Low level key report: up to 6 keys and shift, ctrl etc at once -typedef struct -{ - uint8_t modifiers; - uint8_t reserved; - uint8_t keys[6]; -} KeyReport; - -class Keyboard_ : public Print -{ -private: - KeyReport _keyReport; - void sendReport(KeyReport* keys); -public: - Keyboard_(void); - void begin(void); - void end(void); - virtual size_t write(uint8_t k); - virtual size_t press(uint8_t k); - virtual size_t release(uint8_t k); - virtual void releaseAll(void); -}; -extern Keyboard_ Keyboard; - -#endif -#endif \ No newline at end of file