diff --git a/USBHost_t36.h b/USBHost_t36.h index cf23d17..b0f21d9 100644 --- a/USBHost_t36.h +++ b/USBHost_t36.h @@ -366,9 +366,9 @@ public: uint16_t idVendor() { return (device != nullptr) ? device->idVendor : 0; } uint16_t idProduct() { return (device != nullptr) ? device->idProduct : 0; } - const uint8_t *manufacturer() + const uint8_t *manufacturer() { return ((device == nullptr) || (device->strbuf == nullptr)) ? nullptr : &device->strbuf->buffer[device->strbuf->iStrings[strbuf_t::STR_ID_MAN]]; } - const uint8_t *product() + const uint8_t *product() { return ((device == nullptr) || (device->strbuf == nullptr)) ? nullptr : &device->strbuf->buffer[device->strbuf->iStrings[strbuf_t::STR_ID_PROD]]; } const uint8_t *serialNumber() { return ((device == nullptr) || (device->strbuf == nullptr)) ? nullptr : &device->strbuf->buffer[device->strbuf->iStrings[strbuf_t::STR_ID_SERIAL]]; } @@ -457,9 +457,9 @@ public: operator bool() { return (mydevice != nullptr); } uint16_t idVendor() { return (mydevice != nullptr) ? mydevice->idVendor : 0; } uint16_t idProduct() { return (mydevice != nullptr) ? mydevice->idProduct : 0; } - const uint8_t *manufacturer() + const uint8_t *manufacturer() { return ((mydevice == nullptr) || (mydevice->strbuf == nullptr)) ? nullptr : &mydevice->strbuf->buffer[mydevice->strbuf->iStrings[strbuf_t::STR_ID_MAN]]; } - const uint8_t *product() + const uint8_t *product() { return ((mydevice == nullptr) || (mydevice->strbuf == nullptr)) ? nullptr : &mydevice->strbuf->buffer[mydevice->strbuf->iStrings[strbuf_t::STR_ID_PROD]]; } const uint8_t *serialNumber() { return ((mydevice == nullptr) || (mydevice->strbuf == nullptr)) ? nullptr : &mydevice->strbuf->buffer[mydevice->strbuf->iStrings[strbuf_t::STR_ID_SERIAL]]; } @@ -557,6 +557,7 @@ private: static volatile bool reset_busy; }; +//-------------------------------------------------------------------------- class USBHIDParser : public USBDriver { public: @@ -595,7 +596,7 @@ private: strbuf_t mystring_bufs[1]; }; - +//-------------------------------------------------------------------------- class KeyboardController : public USBDriver /* , public USBHIDInput */ { public: @@ -658,6 +659,89 @@ private: strbuf_t mystring_bufs[1]; }; +//-------------------------------------------------------------------------- + +class KeyboardHIDExtrasController : public USBHIDInput { +public: + KeyboardHIDExtrasController(USBHost &host) { USBHIDParser::driver_ready_for_hid_collection(this); } + void clear() { event_ = false;} + bool available() { return event_; } + void attachPress(void (*f)(uint32_t top, uint16_t code)) { keyPressedFunction = f; } + void attachRelease(void (*f)(uint32_t top, uint16_t code)) { keyReleasedFunction = f; } + enum {MAX_KEYS_DOWN=4}; +// uint32_t buttons() { return buttons_; } +protected: + virtual bool claim_collection(Device_t *dev, uint32_t topusage); + virtual void hid_input_begin(uint32_t topusage, uint32_t type, int lgmin, int lgmax); + virtual void hid_input_data(uint32_t usage, int32_t value); + virtual void hid_input_end(); + virtual void disconnect_collection(Device_t *dev); +private: + void (*keyPressedFunction)(uint32_t top, uint16_t code); + void (*keyReleasedFunction)(uint32_t top, uint16_t code); + uint32_t topusage_ = 0; // What top report am I processing? + uint8_t collections_claimed_ = 0; + volatile bool event_ = false; + volatile bool hid_input_begin_ = false; + volatile bool hid_input_data_ = false; // did we receive any valid data with report? + uint8_t count_keys_down_ = 0; + uint16_t keys_down[MAX_KEYS_DOWN]; +}; + +//-------------------------------------------------------------------------- + +class MouseController : public USBHIDInput { +public: + MouseController(USBHost &host) { USBHIDParser::driver_ready_for_hid_collection(this); } + bool available() { return mouseEvent; } + void mouseDataClear(); + uint8_t getButtons() { return buttons; } + int getMouseX() { return mouseX; } + int getMouseY() { return mouseY; } + int getWheel() { return wheel; } + int getWheelH() { return wheelH; } +protected: + virtual bool claim_collection(Device_t *dev, uint32_t topusage); + virtual void hid_input_begin(uint32_t topusage, uint32_t type, int lgmin, int lgmax); + virtual void hid_input_data(uint32_t usage, int32_t value); + virtual void hid_input_end(); + virtual void disconnect_collection(Device_t *dev); +private: + uint8_t collections_claimed = 0; + volatile bool mouseEvent = false; + volatile bool hid_input_begin_ = false; + uint8_t buttons = 0; + int mouseX = 0; + int mouseY = 0; + int wheel = 0; + int wheelH = 0; +}; + +//-------------------------------------------------------------------------- + +class JoystickController : public USBHIDInput { +public: + JoystickController(USBHost &host) { USBHIDParser::driver_ready_for_hid_collection(this); } + bool available() { return joystickEvent; } + void joystickDataClear(); + uint32_t getButtons() { return buttons; } + int getAxis(uint32_t index) { return (index < (sizeof(axis)/sizeof(axis[0]))) ? axis[index] : 0; } +protected: + virtual bool claim_collection(Device_t *dev, uint32_t topusage); + virtual void hid_input_begin(uint32_t topusage, uint32_t type, int lgmin, int lgmax); + virtual void hid_input_data(uint32_t usage, int32_t value); + virtual void hid_input_end(); + virtual void disconnect_collection(Device_t *dev); +private: + uint8_t collections_claimed = 0; + bool anychange = false; + volatile bool joystickEvent = false; + uint32_t buttons = 0; + int16_t axis[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +}; + +//-------------------------------------------------------------------------- + class MIDIDevice : public USBDriver { public: enum { SYSEX_MAX_LEN = 60 }; @@ -802,6 +886,7 @@ private: strbuf_t mystring_bufs[1]; }; +//-------------------------------------------------------------------------- class USBSerial: public USBDriver, public Stream { public: @@ -860,8 +945,11 @@ private: enum { CDCACM, FTDI, PL2303, CH341 } sertype; }; +//-------------------------------------------------------------------------- class AntPlus: public USBDriver { +// Please post any AntPlus feedback or contributions on this forum thread: +// https://forum.pjrc.com/threads/43110-Ant-libarary-and-USB-driver-for-Teensy-3-5-6 public: AntPlus(USBHost &host) : /* txtimer(this),*/ updatetimer(this) { init(); } void begin(const uint8_t key=0); @@ -1079,82 +1167,4 @@ private: }; -class MouseController : public USBHIDInput { -public: - MouseController(USBHost &host) { USBHIDParser::driver_ready_for_hid_collection(this); } - bool available() { return mouseEvent; } - void mouseDataClear(); - uint8_t getButtons() { return buttons; } - int getMouseX() { return mouseX; } - int getMouseY() { return mouseY; } - int getWheel() { return wheel; } - int getWheelH() { return wheelH; } -protected: - virtual bool claim_collection(Device_t *dev, uint32_t topusage); - virtual void hid_input_begin(uint32_t topusage, uint32_t type, int lgmin, int lgmax); - virtual void hid_input_data(uint32_t usage, int32_t value); - virtual void hid_input_end(); - virtual void disconnect_collection(Device_t *dev); -private: - uint8_t collections_claimed = 0; - volatile bool mouseEvent = false; - volatile bool hid_input_begin_ = false; - uint8_t buttons = 0; - int mouseX = 0; - int mouseY = 0; - int wheel = 0; - int wheelH = 0; -}; - - -class JoystickController : public USBHIDInput { -public: - JoystickController(USBHost &host) { USBHIDParser::driver_ready_for_hid_collection(this); } - bool available() { return joystickEvent; } - void joystickDataClear(); - uint32_t getButtons() { return buttons; } - int getAxis(uint32_t index) { return (index < (sizeof(axis)/sizeof(axis[0]))) ? axis[index] : 0; } -protected: - virtual bool claim_collection(Device_t *dev, uint32_t topusage); - virtual void hid_input_begin(uint32_t topusage, uint32_t type, int lgmin, int lgmax); - virtual void hid_input_data(uint32_t usage, int32_t value); - virtual void hid_input_end(); - virtual void disconnect_collection(Device_t *dev); -private: - uint8_t collections_claimed = 0; - bool anychange = false; - volatile bool joystickEvent = false; - uint32_t buttons = 0; - int16_t axis[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -}; - - -class KeyboardHIDExtrasController : public USBHIDInput { -public: - KeyboardHIDExtrasController(USBHost &host) { USBHIDParser::driver_ready_for_hid_collection(this); } - void clear() { event_ = false;} - bool available() { return event_; } - void attachPress(void (*f)(uint32_t top, uint16_t code)) { keyPressedFunction = f; } - void attachRelease(void (*f)(uint32_t top, uint16_t code)) { keyReleasedFunction = f; } - enum {MAX_KEYS_DOWN=4}; -// uint32_t buttons() { return buttons_; } -protected: - virtual bool claim_collection(Device_t *dev, uint32_t topusage); - virtual void hid_input_begin(uint32_t topusage, uint32_t type, int lgmin, int lgmax); - virtual void hid_input_data(uint32_t usage, int32_t value); - virtual void hid_input_end(); - virtual void disconnect_collection(Device_t *dev); -private: - void (*keyPressedFunction)(uint32_t top, uint16_t code); - void (*keyReleasedFunction)(uint32_t top, uint16_t code); - uint32_t topusage_ = 0; // What top report am I processing? - uint8_t collections_claimed_ = 0; - volatile bool event_ = false; - volatile bool hid_input_begin_ = false; - volatile bool hid_input_data_ = false; // did we receive any valid data with report? - uint8_t count_keys_down_ = 0; - uint16_t keys_down[MAX_KEYS_DOWN]; -}; - - #endif