diff options
Diffstat (limited to 'libraries/HID/HID.cpp')
-rw-r--r-- | libraries/HID/HID.cpp | 113 |
1 files changed, 54 insertions, 59 deletions
diff --git a/libraries/HID/HID.cpp b/libraries/HID/HID.cpp index 3a439f0..574af6b 100644 --- a/libraries/HID/HID.cpp +++ b/libraries/HID/HID.cpp @@ -1,20 +1,20 @@ -/* Copyright (c) 2015, Arduino LLC -** -** Original code (pre-library): Copyright (c) 2011, Peter Barrett -** -** Permission to use, copy, modify, and/or distribute this software for -** any purpose with or without fee is hereby granted, provided that the -** above copyright notice and this permission notice appear in all copies. -** -** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR -** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -** SOFTWARE. -*/ +/* + Copyright (c) 2015, Arduino LLC + Original code (pre-library): Copyright (c) 2011, Peter Barrett + + Permission to use, copy, modify, and/or distribute this software for + any purpose with or without fee is hereby granted, provided that the + above copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR + BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES + OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + SOFTWARE. + */ #include "PluggableUSB.h" #include "HID.h" @@ -25,11 +25,10 @@ HID_ HID; int HID_::getInterface(uint8_t* interfaceNum) { - interfaceNum[0] += 1; // uses 1 - hidInterface = - { + *interfaceNum += 1; // uses 1 + hidInterface = { D_INTERFACE(interface(), 1, 3, 0, 0), - D_HIDREPORT(sizeof_hidReportDescriptor), + D_HIDREPORT(descriptorSize), D_ENDPOINT(USB_ENDPOINT_IN(endpoint()), USB_ENDPOINT_TYPE_INTERRUPT, USB_EP_SIZE, 0x01) }; return USB_SendControl(0, &hidInterface, sizeof(hidInterface)); @@ -38,14 +37,13 @@ int HID_::getInterface(uint8_t* interfaceNum) int HID_::getDescriptor(int8_t type) { if (HID_REPORT_DESCRIPTOR_TYPE == type) { - HIDDescriptorListNode* current = rootNode; int total = 0; - while (current != NULL) { - int res = USB_SendControl(TRANSFER_PGM, current->data, current->length); + HIDDescriptorListNode* node; + for (node = rootNode; node; node = node->next) { + int res = USB_SendControl(TRANSFER_PGM, node->data, node->length); if (res == -1) return -1; total += res; - current = current->next; } return total; } @@ -60,61 +58,58 @@ void HID_::AppendDescriptor(HIDDescriptorListNode *node) rootNode = node; } else { HIDDescriptorListNode *current = rootNode; - while(current->next != NULL) { + while (current->next) { current = current->next; } current->next = node; } - sizeof_hidReportDescriptor += (uint16_t)node->length; + descriptorSize += node->length; } void HID_::SendReport(uint8_t id, const void* data, int len) { USB_Send(endpoint(), &id, 1); - USB_Send(endpoint() | TRANSFER_RELEASE,data,len); + USB_Send(endpoint() | TRANSFER_RELEASE, data, len); } bool HID_::setup(USBSetup& setup, uint8_t interfaceNum) { if (interface() != interfaceNum) { return false; - } else { - uint8_t r = setup.bRequest; - uint8_t requestType = setup.bmRequestType; - if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType) - { - if (HID_GET_REPORT == r) - { - //HID_GetReport(); - return true; - } - if (HID_GET_PROTOCOL == r) - { - //Send8(protocol); // TODO - return true; - } + } + + uint8_t request = setup.bRequest; + uint8_t requestType = setup.bmRequestType; + + if (requestType == REQUEST_DEVICETOHOST_CLASS_INTERFACE) + { + if (request == HID_GET_REPORT) { + // TODO: HID_GetReport(); + return true; } - - if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType) - { - if (HID_SET_PROTOCOL == r) - { - protocol = setup.wValueL; - return true; - } - - if (HID_SET_IDLE == r) - { - idle = setup.wValueL; - return true; - } + if (request == HID_GET_PROTOCOL) { + // TODO: Send8(protocol); + return true; + } + } + + if (requestType == REQUEST_HOSTTODEVICE_CLASS_INTERFACE) + { + if (request == HID_SET_PROTOCOL) { + protocol = setup.wValueL; + return true; + } + if (request == HID_SET_IDLE) { + idle = setup.wValueL; + return true; } - return false; } + + return false; } HID_::HID_(void) : PUSBListNode(1, 1, epType), - rootNode(NULL), sizeof_hidReportDescriptor(0), + rootNode(NULL), descriptorSize(0), protocol(1), idle(1) { epType[0] = EP_TYPE_INTERRUPT_IN; |