Dylan Saada / Mbed 2 deprecated telemetre2

Dependencies:   mbed

Committer:
dylancachan
Date:
Wed Apr 15 06:23:18 2015 +0000
Revision:
0:6ce9c65992e5
telemetre

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dylancachan 0:6ce9c65992e5 1 /* mbed USBHost Library
dylancachan 0:6ce9c65992e5 2 * Copyright (c) 2006-2013 ARM Limited
dylancachan 0:6ce9c65992e5 3 *
dylancachan 0:6ce9c65992e5 4 * Licensed under the Apache License, Version 2.0 (the "License");
dylancachan 0:6ce9c65992e5 5 * you may not use this file except in compliance with the License.
dylancachan 0:6ce9c65992e5 6 * You may obtain a copy of the License at
dylancachan 0:6ce9c65992e5 7 *
dylancachan 0:6ce9c65992e5 8 * http://www.apache.org/licenses/LICENSE-2.0
dylancachan 0:6ce9c65992e5 9 *
dylancachan 0:6ce9c65992e5 10 * Unless required by applicable law or agreed to in writing, software
dylancachan 0:6ce9c65992e5 11 * distributed under the License is distributed on an "AS IS" BASIS,
dylancachan 0:6ce9c65992e5 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dylancachan 0:6ce9c65992e5 13 * See the License for the specific language governing permissions and
dylancachan 0:6ce9c65992e5 14 * limitations under the License.
dylancachan 0:6ce9c65992e5 15 */
dylancachan 0:6ce9c65992e5 16
dylancachan 0:6ce9c65992e5 17 #include "USBHostMouse.h"
dylancachan 0:6ce9c65992e5 18
dylancachan 0:6ce9c65992e5 19 #if USBHOST_MOUSE
dylancachan 0:6ce9c65992e5 20
dylancachan 0:6ce9c65992e5 21 USBHostMouse::USBHostMouse() {
dylancachan 0:6ce9c65992e5 22 host = USBHost::getHostInst();
dylancachan 0:6ce9c65992e5 23 init();
dylancachan 0:6ce9c65992e5 24 }
dylancachan 0:6ce9c65992e5 25
dylancachan 0:6ce9c65992e5 26 void USBHostMouse::init() {
dylancachan 0:6ce9c65992e5 27 dev = NULL;
dylancachan 0:6ce9c65992e5 28 int_in = NULL;
dylancachan 0:6ce9c65992e5 29 onUpdate = NULL;
dylancachan 0:6ce9c65992e5 30 onButtonUpdate = NULL;
dylancachan 0:6ce9c65992e5 31 onXUpdate = NULL;
dylancachan 0:6ce9c65992e5 32 onYUpdate = NULL;
dylancachan 0:6ce9c65992e5 33 onZUpdate = NULL;
dylancachan 0:6ce9c65992e5 34 report_id = 0;
dylancachan 0:6ce9c65992e5 35 dev_connected = false;
dylancachan 0:6ce9c65992e5 36 mouse_device_found = false;
dylancachan 0:6ce9c65992e5 37 mouse_intf = -1;
dylancachan 0:6ce9c65992e5 38
dylancachan 0:6ce9c65992e5 39 buttons = 0;
dylancachan 0:6ce9c65992e5 40 x = 0;
dylancachan 0:6ce9c65992e5 41 y = 0;
dylancachan 0:6ce9c65992e5 42 z = 0;
dylancachan 0:6ce9c65992e5 43 }
dylancachan 0:6ce9c65992e5 44
dylancachan 0:6ce9c65992e5 45 bool USBHostMouse::connected() {
dylancachan 0:6ce9c65992e5 46 return dev_connected;
dylancachan 0:6ce9c65992e5 47 }
dylancachan 0:6ce9c65992e5 48
dylancachan 0:6ce9c65992e5 49 bool USBHostMouse::connect() {
dylancachan 0:6ce9c65992e5 50 int len_listen;
dylancachan 0:6ce9c65992e5 51
dylancachan 0:6ce9c65992e5 52 if (dev_connected) {
dylancachan 0:6ce9c65992e5 53 return true;
dylancachan 0:6ce9c65992e5 54 }
dylancachan 0:6ce9c65992e5 55
dylancachan 0:6ce9c65992e5 56 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++) {
dylancachan 0:6ce9c65992e5 57 if ((dev = host->getDevice(i)) != NULL) {
dylancachan 0:6ce9c65992e5 58
dylancachan 0:6ce9c65992e5 59 if(host->enumerate(dev, this))
dylancachan 0:6ce9c65992e5 60 break;
dylancachan 0:6ce9c65992e5 61
dylancachan 0:6ce9c65992e5 62 if (mouse_device_found) {
dylancachan 0:6ce9c65992e5 63
dylancachan 0:6ce9c65992e5 64 int_in = dev->getEndpoint(mouse_intf, INTERRUPT_ENDPOINT, IN);
dylancachan 0:6ce9c65992e5 65 if (!int_in)
dylancachan 0:6ce9c65992e5 66 break;
dylancachan 0:6ce9c65992e5 67
dylancachan 0:6ce9c65992e5 68 USB_INFO("New Mouse device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, mouse_intf);
dylancachan 0:6ce9c65992e5 69 dev->setName("Mouse", mouse_intf);
dylancachan 0:6ce9c65992e5 70 host->registerDriver(dev, mouse_intf, this, &USBHostMouse::init);
dylancachan 0:6ce9c65992e5 71
dylancachan 0:6ce9c65992e5 72 int_in->attach(this, &USBHostMouse::rxHandler);
dylancachan 0:6ce9c65992e5 73 len_listen = int_in->getSize();
dylancachan 0:6ce9c65992e5 74 if (len_listen > sizeof(report)) {
dylancachan 0:6ce9c65992e5 75 len_listen = sizeof(report);
dylancachan 0:6ce9c65992e5 76 }
dylancachan 0:6ce9c65992e5 77 host->interruptRead(dev, int_in, report, len_listen, false);
dylancachan 0:6ce9c65992e5 78
dylancachan 0:6ce9c65992e5 79 dev_connected = true;
dylancachan 0:6ce9c65992e5 80 return true;
dylancachan 0:6ce9c65992e5 81 }
dylancachan 0:6ce9c65992e5 82 }
dylancachan 0:6ce9c65992e5 83 }
dylancachan 0:6ce9c65992e5 84 init();
dylancachan 0:6ce9c65992e5 85 return false;
dylancachan 0:6ce9c65992e5 86 }
dylancachan 0:6ce9c65992e5 87
dylancachan 0:6ce9c65992e5 88 void USBHostMouse::rxHandler() {
dylancachan 0:6ce9c65992e5 89 int len_listen = int_in->getSize();
dylancachan 0:6ce9c65992e5 90
dylancachan 0:6ce9c65992e5 91 if (onUpdate) {
dylancachan 0:6ce9c65992e5 92 (*onUpdate)(report[0] & 0x07, report[1], report[2], report[3]);
dylancachan 0:6ce9c65992e5 93 }
dylancachan 0:6ce9c65992e5 94
dylancachan 0:6ce9c65992e5 95 if (onButtonUpdate && (buttons != (report[0] & 0x07))) {
dylancachan 0:6ce9c65992e5 96 (*onButtonUpdate)(report[0] & 0x07);
dylancachan 0:6ce9c65992e5 97 }
dylancachan 0:6ce9c65992e5 98
dylancachan 0:6ce9c65992e5 99 if (onXUpdate && (x != report[1])) {
dylancachan 0:6ce9c65992e5 100 (*onXUpdate)(report[1]);
dylancachan 0:6ce9c65992e5 101 }
dylancachan 0:6ce9c65992e5 102
dylancachan 0:6ce9c65992e5 103 if (onYUpdate && (y != report[2])) {
dylancachan 0:6ce9c65992e5 104 (*onYUpdate)(report[2]);
dylancachan 0:6ce9c65992e5 105 }
dylancachan 0:6ce9c65992e5 106
dylancachan 0:6ce9c65992e5 107 if (onZUpdate && (z != report[3])) {
dylancachan 0:6ce9c65992e5 108 (*onZUpdate)(report[3]);
dylancachan 0:6ce9c65992e5 109 }
dylancachan 0:6ce9c65992e5 110
dylancachan 0:6ce9c65992e5 111 // update mouse state
dylancachan 0:6ce9c65992e5 112 buttons = report[0] & 0x07;
dylancachan 0:6ce9c65992e5 113 x = report[1];
dylancachan 0:6ce9c65992e5 114 y = report[2];
dylancachan 0:6ce9c65992e5 115 z = report[3];
dylancachan 0:6ce9c65992e5 116
dylancachan 0:6ce9c65992e5 117 if (len_listen > sizeof(report)) {
dylancachan 0:6ce9c65992e5 118 len_listen = sizeof(report);
dylancachan 0:6ce9c65992e5 119 }
dylancachan 0:6ce9c65992e5 120
dylancachan 0:6ce9c65992e5 121 if (dev)
dylancachan 0:6ce9c65992e5 122 host->interruptRead(dev, int_in, report, len_listen, false);
dylancachan 0:6ce9c65992e5 123 }
dylancachan 0:6ce9c65992e5 124
dylancachan 0:6ce9c65992e5 125 /*virtual*/ void USBHostMouse::setVidPid(uint16_t vid, uint16_t pid)
dylancachan 0:6ce9c65992e5 126 {
dylancachan 0:6ce9c65992e5 127 // we don't check VID/PID for mouse driver
dylancachan 0:6ce9c65992e5 128 }
dylancachan 0:6ce9c65992e5 129
dylancachan 0:6ce9c65992e5 130 /*virtual*/ bool USBHostMouse::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
dylancachan 0:6ce9c65992e5 131 {
dylancachan 0:6ce9c65992e5 132 if ((mouse_intf == -1) &&
dylancachan 0:6ce9c65992e5 133 (intf_class == HID_CLASS) &&
dylancachan 0:6ce9c65992e5 134 (intf_subclass == 0x01) &&
dylancachan 0:6ce9c65992e5 135 (intf_protocol == 0x02)) {
dylancachan 0:6ce9c65992e5 136 mouse_intf = intf_nb;
dylancachan 0:6ce9c65992e5 137 return true;
dylancachan 0:6ce9c65992e5 138 }
dylancachan 0:6ce9c65992e5 139 return false;
dylancachan 0:6ce9c65992e5 140 }
dylancachan 0:6ce9c65992e5 141
dylancachan 0:6ce9c65992e5 142 /*virtual*/ bool USBHostMouse::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
dylancachan 0:6ce9c65992e5 143 {
dylancachan 0:6ce9c65992e5 144 if (intf_nb == mouse_intf) {
dylancachan 0:6ce9c65992e5 145 if (type == INTERRUPT_ENDPOINT && dir == IN) {
dylancachan 0:6ce9c65992e5 146 mouse_device_found = true;
dylancachan 0:6ce9c65992e5 147 return true;
dylancachan 0:6ce9c65992e5 148 }
dylancachan 0:6ce9c65992e5 149 }
dylancachan 0:6ce9c65992e5 150 return false;
dylancachan 0:6ce9c65992e5 151 }
dylancachan 0:6ce9c65992e5 152
dylancachan 0:6ce9c65992e5 153 #endif