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 #ifndef USBHOSTSERIAL_H
dylancachan 0:6ce9c65992e5 18 #define USBHOSTSERIAL_H
dylancachan 0:6ce9c65992e5 19
dylancachan 0:6ce9c65992e5 20 #include "USBHostConf.h"
dylancachan 0:6ce9c65992e5 21
dylancachan 0:6ce9c65992e5 22 #if USBHOST_SERIAL
dylancachan 0:6ce9c65992e5 23
dylancachan 0:6ce9c65992e5 24 #include "USBHost.h"
dylancachan 0:6ce9c65992e5 25 #include "Stream.h"
dylancachan 0:6ce9c65992e5 26 #include "MtxCircBuffer.h"
dylancachan 0:6ce9c65992e5 27
dylancachan 0:6ce9c65992e5 28 /**
dylancachan 0:6ce9c65992e5 29 * A class to communicate a USB virtual serial port
dylancachan 0:6ce9c65992e5 30 */
dylancachan 0:6ce9c65992e5 31 class USBHostSerialPort : public Stream {
dylancachan 0:6ce9c65992e5 32 public:
dylancachan 0:6ce9c65992e5 33 /**
dylancachan 0:6ce9c65992e5 34 * Constructor
dylancachan 0:6ce9c65992e5 35 */
dylancachan 0:6ce9c65992e5 36 USBHostSerialPort();
dylancachan 0:6ce9c65992e5 37
dylancachan 0:6ce9c65992e5 38 enum IrqType {
dylancachan 0:6ce9c65992e5 39 RxIrq,
dylancachan 0:6ce9c65992e5 40 TxIrq
dylancachan 0:6ce9c65992e5 41 };
dylancachan 0:6ce9c65992e5 42
dylancachan 0:6ce9c65992e5 43 enum Parity {
dylancachan 0:6ce9c65992e5 44 None = 0,
dylancachan 0:6ce9c65992e5 45 Odd,
dylancachan 0:6ce9c65992e5 46 Even,
dylancachan 0:6ce9c65992e5 47 Mark,
dylancachan 0:6ce9c65992e5 48 Space
dylancachan 0:6ce9c65992e5 49 };
dylancachan 0:6ce9c65992e5 50
dylancachan 0:6ce9c65992e5 51 void connect(USBHost* _host, USBDeviceConnected * _dev,
dylancachan 0:6ce9c65992e5 52 uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out);
dylancachan 0:6ce9c65992e5 53
dylancachan 0:6ce9c65992e5 54 /**
dylancachan 0:6ce9c65992e5 55 * Check the number of bytes available.
dylancachan 0:6ce9c65992e5 56 *
dylancachan 0:6ce9c65992e5 57 * @returns the number of bytes available
dylancachan 0:6ce9c65992e5 58 */
dylancachan 0:6ce9c65992e5 59 uint8_t available();
dylancachan 0:6ce9c65992e5 60
dylancachan 0:6ce9c65992e5 61 /**
dylancachan 0:6ce9c65992e5 62 * Attach a member function to call when a packet is received.
dylancachan 0:6ce9c65992e5 63 *
dylancachan 0:6ce9c65992e5 64 * @param tptr pointer to the object to call the member function on
dylancachan 0:6ce9c65992e5 65 * @param mptr pointer to the member function to be called
dylancachan 0:6ce9c65992e5 66 * @param irq irq type
dylancachan 0:6ce9c65992e5 67 */
dylancachan 0:6ce9c65992e5 68 template<typename T>
dylancachan 0:6ce9c65992e5 69 inline void attach(T* tptr, void (T::*mptr)(void), IrqType irq = RxIrq) {
dylancachan 0:6ce9c65992e5 70 if ((mptr != NULL) && (tptr != NULL)) {
dylancachan 0:6ce9c65992e5 71 if (irq == RxIrq) {
dylancachan 0:6ce9c65992e5 72 rx.attach(tptr, mptr);
dylancachan 0:6ce9c65992e5 73 } else {
dylancachan 0:6ce9c65992e5 74 tx.attach(tptr, mptr);
dylancachan 0:6ce9c65992e5 75 }
dylancachan 0:6ce9c65992e5 76 }
dylancachan 0:6ce9c65992e5 77 }
dylancachan 0:6ce9c65992e5 78
dylancachan 0:6ce9c65992e5 79 /**
dylancachan 0:6ce9c65992e5 80 * Attach a callback called when a packet is received
dylancachan 0:6ce9c65992e5 81 *
dylancachan 0:6ce9c65992e5 82 * @param ptr function pointer
dylancachan 0:6ce9c65992e5 83 */
dylancachan 0:6ce9c65992e5 84 inline void attach(void (*fn)(void), IrqType irq = RxIrq) {
dylancachan 0:6ce9c65992e5 85 if (fn != NULL) {
dylancachan 0:6ce9c65992e5 86 if (irq == RxIrq) {
dylancachan 0:6ce9c65992e5 87 rx.attach(fn);
dylancachan 0:6ce9c65992e5 88 } else {
dylancachan 0:6ce9c65992e5 89 tx.attach(fn);
dylancachan 0:6ce9c65992e5 90 }
dylancachan 0:6ce9c65992e5 91 }
dylancachan 0:6ce9c65992e5 92 }
dylancachan 0:6ce9c65992e5 93
dylancachan 0:6ce9c65992e5 94 /** Set the baud rate of the serial port
dylancachan 0:6ce9c65992e5 95 *
dylancachan 0:6ce9c65992e5 96 * @param baudrate The baudrate of the serial port (default = 9600).
dylancachan 0:6ce9c65992e5 97 */
dylancachan 0:6ce9c65992e5 98 void baud(int baudrate = 750000);
dylancachan 0:6ce9c65992e5 99
dylancachan 0:6ce9c65992e5 100 /** Set the transmission format used by the Serial port
dylancachan 0:6ce9c65992e5 101 *
dylancachan 0:6ce9c65992e5 102 * @param bits The number of bits in a word (default = 8)
dylancachan 0:6ce9c65992e5 103 * @param parity The parity used (USBHostSerialPort::None, USBHostSerialPort::Odd, USBHostSerialPort::Even, USBHostSerialPort::Mark, USBHostSerialPort::Space; default = USBHostSerialPort::None)
dylancachan 0:6ce9c65992e5 104 * @param stop The number of stop bits (1 or 2; default = 1)
dylancachan 0:6ce9c65992e5 105 */
dylancachan 0:6ce9c65992e5 106 void format(int bits = 8, Parity parity = USBHostSerialPort::None, int stop_bits = 1);
dylancachan 0:6ce9c65992e5 107 virtual int writeBuf(const char* b, int s);
dylancachan 0:6ce9c65992e5 108 virtual int readBuf(char* b, int s);
dylancachan 0:6ce9c65992e5 109
dylancachan 0:6ce9c65992e5 110 protected:
dylancachan 0:6ce9c65992e5 111 virtual int _getc();
dylancachan 0:6ce9c65992e5 112 virtual int _putc(int c);
dylancachan 0:6ce9c65992e5 113
dylancachan 0:6ce9c65992e5 114 private:
dylancachan 0:6ce9c65992e5 115 USBHost * host;
dylancachan 0:6ce9c65992e5 116 USBDeviceConnected * dev;
dylancachan 0:6ce9c65992e5 117
dylancachan 0:6ce9c65992e5 118 USBEndpoint * bulk_in;
dylancachan 0:6ce9c65992e5 119 USBEndpoint * bulk_out;
dylancachan 0:6ce9c65992e5 120 uint32_t size_bulk_in;
dylancachan 0:6ce9c65992e5 121 uint32_t size_bulk_out;
dylancachan 0:6ce9c65992e5 122
dylancachan 0:6ce9c65992e5 123 void init();
dylancachan 0:6ce9c65992e5 124
dylancachan 0:6ce9c65992e5 125 MtxCircBuffer<uint8_t, 2048> circ_buf;
dylancachan 0:6ce9c65992e5 126
dylancachan 0:6ce9c65992e5 127 uint8_t buf[2048];
dylancachan 0:6ce9c65992e5 128
dylancachan 0:6ce9c65992e5 129 typedef struct {
dylancachan 0:6ce9c65992e5 130 uint32_t baudrate;
dylancachan 0:6ce9c65992e5 131 uint8_t stop_bits;
dylancachan 0:6ce9c65992e5 132 uint8_t parity;
dylancachan 0:6ce9c65992e5 133 uint8_t data_bits;
dylancachan 0:6ce9c65992e5 134 } PACKED LINE_CODING;
dylancachan 0:6ce9c65992e5 135
dylancachan 0:6ce9c65992e5 136 LINE_CODING line_coding;
dylancachan 0:6ce9c65992e5 137
dylancachan 0:6ce9c65992e5 138 void rxHandler();
dylancachan 0:6ce9c65992e5 139 void txHandler();
dylancachan 0:6ce9c65992e5 140 FunctionPointer rx;
dylancachan 0:6ce9c65992e5 141 FunctionPointer tx;
dylancachan 0:6ce9c65992e5 142
dylancachan 0:6ce9c65992e5 143 uint8_t serial_intf;
dylancachan 0:6ce9c65992e5 144 };
dylancachan 0:6ce9c65992e5 145
dylancachan 0:6ce9c65992e5 146 #if (USBHOST_SERIAL <= 1)
dylancachan 0:6ce9c65992e5 147
dylancachan 0:6ce9c65992e5 148 class USBHostSerial : public IUSBEnumerator, public USBHostSerialPort
dylancachan 0:6ce9c65992e5 149 {
dylancachan 0:6ce9c65992e5 150 public:
dylancachan 0:6ce9c65992e5 151 USBHostSerial();
dylancachan 0:6ce9c65992e5 152
dylancachan 0:6ce9c65992e5 153 /**
dylancachan 0:6ce9c65992e5 154 * Try to connect a serial device
dylancachan 0:6ce9c65992e5 155 *
dylancachan 0:6ce9c65992e5 156 * @return true if connection was successful
dylancachan 0:6ce9c65992e5 157 */
dylancachan 0:6ce9c65992e5 158 bool connect();
dylancachan 0:6ce9c65992e5 159
dylancachan 0:6ce9c65992e5 160 void disconnect();
dylancachan 0:6ce9c65992e5 161
dylancachan 0:6ce9c65992e5 162 /**
dylancachan 0:6ce9c65992e5 163 * Check if a any serial port is connected
dylancachan 0:6ce9c65992e5 164 *
dylancachan 0:6ce9c65992e5 165 * @returns true if a serial device is connected
dylancachan 0:6ce9c65992e5 166 */
dylancachan 0:6ce9c65992e5 167 bool connected();
dylancachan 0:6ce9c65992e5 168
dylancachan 0:6ce9c65992e5 169 protected:
dylancachan 0:6ce9c65992e5 170 USBHost* host;
dylancachan 0:6ce9c65992e5 171 USBDeviceConnected* dev;
dylancachan 0:6ce9c65992e5 172 uint8_t port_intf;
dylancachan 0:6ce9c65992e5 173 int ports_found;
dylancachan 0:6ce9c65992e5 174
dylancachan 0:6ce9c65992e5 175 //From IUSBEnumerator
dylancachan 0:6ce9c65992e5 176 virtual void setVidPid(uint16_t vid, uint16_t pid);
dylancachan 0:6ce9c65992e5 177 virtual bool 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 178 virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
dylancachan 0:6ce9c65992e5 179
dylancachan 0:6ce9c65992e5 180 private:
dylancachan 0:6ce9c65992e5 181 bool dev_connected;
dylancachan 0:6ce9c65992e5 182 };
dylancachan 0:6ce9c65992e5 183
dylancachan 0:6ce9c65992e5 184 #else // (USBHOST_SERIAL > 1)
dylancachan 0:6ce9c65992e5 185
dylancachan 0:6ce9c65992e5 186 class USBHostMultiSerial : public IUSBEnumerator {
dylancachan 0:6ce9c65992e5 187 public:
dylancachan 0:6ce9c65992e5 188 USBHostMultiSerial();
dylancachan 0:6ce9c65992e5 189 virtual ~USBHostMultiSerial();
dylancachan 0:6ce9c65992e5 190
dylancachan 0:6ce9c65992e5 191 USBHostSerialPort* getPort(int port)
dylancachan 0:6ce9c65992e5 192 {
dylancachan 0:6ce9c65992e5 193 return port < USBHOST_SERIAL ? ports[port] : NULL;
dylancachan 0:6ce9c65992e5 194 }
dylancachan 0:6ce9c65992e5 195
dylancachan 0:6ce9c65992e5 196 /**
dylancachan 0:6ce9c65992e5 197 * Try to connect a serial device
dylancachan 0:6ce9c65992e5 198 *
dylancachan 0:6ce9c65992e5 199 * @return true if connection was successful
dylancachan 0:6ce9c65992e5 200 */
dylancachan 0:6ce9c65992e5 201 bool connect();
dylancachan 0:6ce9c65992e5 202
dylancachan 0:6ce9c65992e5 203 void disconnect();
dylancachan 0:6ce9c65992e5 204
dylancachan 0:6ce9c65992e5 205 /**
dylancachan 0:6ce9c65992e5 206 * Check if a any serial port is connected
dylancachan 0:6ce9c65992e5 207 *
dylancachan 0:6ce9c65992e5 208 * @returns true if a serial device is connected
dylancachan 0:6ce9c65992e5 209 */
dylancachan 0:6ce9c65992e5 210 bool connected();
dylancachan 0:6ce9c65992e5 211
dylancachan 0:6ce9c65992e5 212 protected:
dylancachan 0:6ce9c65992e5 213 USBHost* host;
dylancachan 0:6ce9c65992e5 214 USBDeviceConnected* dev;
dylancachan 0:6ce9c65992e5 215 USBHostSerialPort* ports[USBHOST_SERIAL];
dylancachan 0:6ce9c65992e5 216 uint8_t port_intf[USBHOST_SERIAL];
dylancachan 0:6ce9c65992e5 217 int ports_found;
dylancachan 0:6ce9c65992e5 218
dylancachan 0:6ce9c65992e5 219 //From IUSBEnumerator
dylancachan 0:6ce9c65992e5 220 virtual void setVidPid(uint16_t vid, uint16_t pid);
dylancachan 0:6ce9c65992e5 221 virtual bool 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 222 virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
dylancachan 0:6ce9c65992e5 223
dylancachan 0:6ce9c65992e5 224 private:
dylancachan 0:6ce9c65992e5 225 bool dev_connected;
dylancachan 0:6ce9c65992e5 226 };
dylancachan 0:6ce9c65992e5 227 #endif // (USBHOST_SERIAL <= 1)
dylancachan 0:6ce9c65992e5 228
dylancachan 0:6ce9c65992e5 229 #endif
dylancachan 0:6ce9c65992e5 230
dylancachan 0:6ce9c65992e5 231 #endif