EnOcean USB400 Serial Library

Dependents:   USB400Serial_Hello MFT_IoT_demo_USB400 USB400J_app_board_demo

Committer:
nanashino
Date:
Wed Dec 03 06:18:10 2014 +0000
Revision:
0:0dd5d1e4cf71
initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nanashino 0:0dd5d1e4cf71 1 /* mbed USBHost Library
nanashino 0:0dd5d1e4cf71 2 * Copyright (c) 2006-2013 ARM Limited
nanashino 0:0dd5d1e4cf71 3 *
nanashino 0:0dd5d1e4cf71 4 * Licensed under the Apache License, Version 2.0 (the "License");
nanashino 0:0dd5d1e4cf71 5 * you may not use this file except in compliance with the License.
nanashino 0:0dd5d1e4cf71 6 * You may obtain a copy of the License at
nanashino 0:0dd5d1e4cf71 7 *
nanashino 0:0dd5d1e4cf71 8 * http://www.apache.org/licenses/LICENSE-2.0
nanashino 0:0dd5d1e4cf71 9 *
nanashino 0:0dd5d1e4cf71 10 * Unless required by applicable law or agreed to in writing, software
nanashino 0:0dd5d1e4cf71 11 * distributed under the License is distributed on an "AS IS" BASIS,
nanashino 0:0dd5d1e4cf71 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
nanashino 0:0dd5d1e4cf71 13 * See the License for the specific language governing permissions and
nanashino 0:0dd5d1e4cf71 14 * limitations under the License.
nanashino 0:0dd5d1e4cf71 15 */
nanashino 0:0dd5d1e4cf71 16
nanashino 0:0dd5d1e4cf71 17 /* USB400Serial Library
nanashino 0:0dd5d1e4cf71 18 * Modified mujirushi.org
nanashino 0:0dd5d1e4cf71 19 */
nanashino 0:0dd5d1e4cf71 20
nanashino 0:0dd5d1e4cf71 21 #ifndef USB400SERIAL_H
nanashino 0:0dd5d1e4cf71 22 #define USB400SERIAL_H
nanashino 0:0dd5d1e4cf71 23
nanashino 0:0dd5d1e4cf71 24 #include "USBHostConf.h"
nanashino 0:0dd5d1e4cf71 25
nanashino 0:0dd5d1e4cf71 26 #if USBHOST_SERIAL
nanashino 0:0dd5d1e4cf71 27
nanashino 0:0dd5d1e4cf71 28 #include "USBHost.h"
nanashino 0:0dd5d1e4cf71 29 #include "Stream.h"
nanashino 0:0dd5d1e4cf71 30 #include "MtxCircBuffer.h"
nanashino 0:0dd5d1e4cf71 31
nanashino 0:0dd5d1e4cf71 32 /**
nanashino 0:0dd5d1e4cf71 33 * A class to communicate a USB virtual serial port
nanashino 0:0dd5d1e4cf71 34 */
nanashino 0:0dd5d1e4cf71 35 class USB400SerialPort : public Stream
nanashino 0:0dd5d1e4cf71 36 {
nanashino 0:0dd5d1e4cf71 37 public:
nanashino 0:0dd5d1e4cf71 38 /**
nanashino 0:0dd5d1e4cf71 39 * Constructor
nanashino 0:0dd5d1e4cf71 40 */
nanashino 0:0dd5d1e4cf71 41 USB400SerialPort();
nanashino 0:0dd5d1e4cf71 42
nanashino 0:0dd5d1e4cf71 43 enum IrqType {
nanashino 0:0dd5d1e4cf71 44 RxIrq,
nanashino 0:0dd5d1e4cf71 45 TxIrq
nanashino 0:0dd5d1e4cf71 46 };
nanashino 0:0dd5d1e4cf71 47
nanashino 0:0dd5d1e4cf71 48 enum Parity {
nanashino 0:0dd5d1e4cf71 49 None = 0,
nanashino 0:0dd5d1e4cf71 50 Odd,
nanashino 0:0dd5d1e4cf71 51 Even,
nanashino 0:0dd5d1e4cf71 52 Mark,
nanashino 0:0dd5d1e4cf71 53 Space
nanashino 0:0dd5d1e4cf71 54 };
nanashino 0:0dd5d1e4cf71 55
nanashino 0:0dd5d1e4cf71 56 void connect(USBHost* _host, USBDeviceConnected * _dev,
nanashino 0:0dd5d1e4cf71 57 uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out);
nanashino 0:0dd5d1e4cf71 58
nanashino 0:0dd5d1e4cf71 59 /**
nanashino 0:0dd5d1e4cf71 60 * Check the number of bytes available.
nanashino 0:0dd5d1e4cf71 61 *
nanashino 0:0dd5d1e4cf71 62 * @returns the number of bytes available
nanashino 0:0dd5d1e4cf71 63 */
nanashino 0:0dd5d1e4cf71 64 uint8_t available();
nanashino 0:0dd5d1e4cf71 65
nanashino 0:0dd5d1e4cf71 66 /**
nanashino 0:0dd5d1e4cf71 67 * Attach a member function to call when a packet is received.
nanashino 0:0dd5d1e4cf71 68 *
nanashino 0:0dd5d1e4cf71 69 * @param tptr pointer to the object to call the member function on
nanashino 0:0dd5d1e4cf71 70 * @param mptr pointer to the member function to be called
nanashino 0:0dd5d1e4cf71 71 * @param irq irq type
nanashino 0:0dd5d1e4cf71 72 */
nanashino 0:0dd5d1e4cf71 73 template<typename T>
nanashino 0:0dd5d1e4cf71 74 inline void attach(T* tptr, void (T::*mptr)(void), IrqType irq = RxIrq) {
nanashino 0:0dd5d1e4cf71 75 if ((mptr != NULL) && (tptr != NULL)) {
nanashino 0:0dd5d1e4cf71 76 if (irq == RxIrq) {
nanashino 0:0dd5d1e4cf71 77 rx.attach(tptr, mptr);
nanashino 0:0dd5d1e4cf71 78 } else {
nanashino 0:0dd5d1e4cf71 79 tx.attach(tptr, mptr);
nanashino 0:0dd5d1e4cf71 80 }
nanashino 0:0dd5d1e4cf71 81 }
nanashino 0:0dd5d1e4cf71 82 }
nanashino 0:0dd5d1e4cf71 83
nanashino 0:0dd5d1e4cf71 84 /**
nanashino 0:0dd5d1e4cf71 85 * Attach a callback called when a packet is received
nanashino 0:0dd5d1e4cf71 86 *
nanashino 0:0dd5d1e4cf71 87 * @param ptr function pointer
nanashino 0:0dd5d1e4cf71 88 */
nanashino 0:0dd5d1e4cf71 89 inline void attach(void (*fn)(void), IrqType irq = RxIrq) {
nanashino 0:0dd5d1e4cf71 90 if (fn != NULL) {
nanashino 0:0dd5d1e4cf71 91 if (irq == RxIrq) {
nanashino 0:0dd5d1e4cf71 92 rx.attach(fn);
nanashino 0:0dd5d1e4cf71 93 } else {
nanashino 0:0dd5d1e4cf71 94 tx.attach(fn);
nanashino 0:0dd5d1e4cf71 95 }
nanashino 0:0dd5d1e4cf71 96 }
nanashino 0:0dd5d1e4cf71 97 }
nanashino 0:0dd5d1e4cf71 98
nanashino 0:0dd5d1e4cf71 99 /** Set the baud rate of the serial port
nanashino 0:0dd5d1e4cf71 100 *
nanashino 0:0dd5d1e4cf71 101 * @param baudrate The baudrate of the serial port (default = 9600).
nanashino 0:0dd5d1e4cf71 102 */
nanashino 0:0dd5d1e4cf71 103 void baud(int baudrate = 9600);
nanashino 0:0dd5d1e4cf71 104
nanashino 0:0dd5d1e4cf71 105 /** Set the transmission format used by the Serial port
nanashino 0:0dd5d1e4cf71 106 *
nanashino 0:0dd5d1e4cf71 107 * @param bits The number of bits in a word (default = 8)
nanashino 0:0dd5d1e4cf71 108 * @param parity The parity used (USB400SerialPort::None, USB400SerialPort::Odd, USB400SerialPort::Even, USB400SerialPort::Mark, USB400SerialPort::Space; default = USB400SerialPort::None)
nanashino 0:0dd5d1e4cf71 109 * @param stop The number of stop bits (1 or 2; default = 1)
nanashino 0:0dd5d1e4cf71 110 */
nanashino 0:0dd5d1e4cf71 111 void format(int bits = 8, Parity parity = USB400SerialPort::None, int stop_bits = 1);
nanashino 0:0dd5d1e4cf71 112 virtual int writeBuf(const char* b, int s);
nanashino 0:0dd5d1e4cf71 113 virtual int readBuf(char* b, int s);
nanashino 0:0dd5d1e4cf71 114
nanashino 0:0dd5d1e4cf71 115 protected:
nanashino 0:0dd5d1e4cf71 116 virtual int _getc();
nanashino 0:0dd5d1e4cf71 117 virtual int _putc(int c);
nanashino 0:0dd5d1e4cf71 118
nanashino 0:0dd5d1e4cf71 119 private:
nanashino 0:0dd5d1e4cf71 120 USBHost * host;
nanashino 0:0dd5d1e4cf71 121 USBDeviceConnected * dev;
nanashino 0:0dd5d1e4cf71 122
nanashino 0:0dd5d1e4cf71 123 USBEndpoint * bulk_in;
nanashino 0:0dd5d1e4cf71 124 USBEndpoint * bulk_out;
nanashino 0:0dd5d1e4cf71 125 uint32_t size_bulk_in;
nanashino 0:0dd5d1e4cf71 126 uint32_t size_bulk_out;
nanashino 0:0dd5d1e4cf71 127
nanashino 0:0dd5d1e4cf71 128 void init();
nanashino 0:0dd5d1e4cf71 129
nanashino 0:0dd5d1e4cf71 130 MtxCircBuffer<uint8_t, 128> circ_buf;
nanashino 0:0dd5d1e4cf71 131
nanashino 0:0dd5d1e4cf71 132 uint8_t buf[64];
nanashino 0:0dd5d1e4cf71 133
nanashino 0:0dd5d1e4cf71 134 typedef struct {
nanashino 0:0dd5d1e4cf71 135 uint32_t baudrate;
nanashino 0:0dd5d1e4cf71 136 uint8_t stop_bits;
nanashino 0:0dd5d1e4cf71 137 uint8_t parity;
nanashino 0:0dd5d1e4cf71 138 uint8_t data_bits;
nanashino 0:0dd5d1e4cf71 139 } PACKED LINE_CODING;
nanashino 0:0dd5d1e4cf71 140
nanashino 0:0dd5d1e4cf71 141 LINE_CODING line_coding;
nanashino 0:0dd5d1e4cf71 142
nanashino 0:0dd5d1e4cf71 143 void rxHandler();
nanashino 0:0dd5d1e4cf71 144 void txHandler();
nanashino 0:0dd5d1e4cf71 145 FunctionPointer rx;
nanashino 0:0dd5d1e4cf71 146 FunctionPointer tx;
nanashino 0:0dd5d1e4cf71 147
nanashino 0:0dd5d1e4cf71 148 uint8_t serial_intf;
nanashino 0:0dd5d1e4cf71 149 };
nanashino 0:0dd5d1e4cf71 150
nanashino 0:0dd5d1e4cf71 151 #if (USBHOST_SERIAL <= 1)
nanashino 0:0dd5d1e4cf71 152
nanashino 0:0dd5d1e4cf71 153 class USB400Serial : public IUSBEnumerator, public USB400SerialPort
nanashino 0:0dd5d1e4cf71 154 {
nanashino 0:0dd5d1e4cf71 155 public:
nanashino 0:0dd5d1e4cf71 156 USB400Serial();
nanashino 0:0dd5d1e4cf71 157
nanashino 0:0dd5d1e4cf71 158 /**
nanashino 0:0dd5d1e4cf71 159 * Try to connect a serial device
nanashino 0:0dd5d1e4cf71 160 *
nanashino 0:0dd5d1e4cf71 161 * @return true if connection was successful
nanashino 0:0dd5d1e4cf71 162 */
nanashino 0:0dd5d1e4cf71 163 bool connect();
nanashino 0:0dd5d1e4cf71 164
nanashino 0:0dd5d1e4cf71 165 void disconnect();
nanashino 0:0dd5d1e4cf71 166
nanashino 0:0dd5d1e4cf71 167 /**
nanashino 0:0dd5d1e4cf71 168 * Check if a any serial port is connected
nanashino 0:0dd5d1e4cf71 169 *
nanashino 0:0dd5d1e4cf71 170 * @returns true if a serial device is connected
nanashino 0:0dd5d1e4cf71 171 */
nanashino 0:0dd5d1e4cf71 172 bool connected();
nanashino 0:0dd5d1e4cf71 173
nanashino 0:0dd5d1e4cf71 174 protected:
nanashino 0:0dd5d1e4cf71 175 USBHost* host;
nanashino 0:0dd5d1e4cf71 176 USBDeviceConnected* dev;
nanashino 0:0dd5d1e4cf71 177 uint8_t port_intf;
nanashino 0:0dd5d1e4cf71 178 int ports_found;
nanashino 0:0dd5d1e4cf71 179
nanashino 0:0dd5d1e4cf71 180 //From IUSBEnumerator
nanashino 0:0dd5d1e4cf71 181 virtual void setVidPid(uint16_t vid, uint16_t pid);
nanashino 0:0dd5d1e4cf71 182 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
nanashino 0:0dd5d1e4cf71 183 virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
nanashino 0:0dd5d1e4cf71 184
nanashino 0:0dd5d1e4cf71 185 private:
nanashino 0:0dd5d1e4cf71 186 bool dev_connected;
nanashino 0:0dd5d1e4cf71 187 };
nanashino 0:0dd5d1e4cf71 188
nanashino 0:0dd5d1e4cf71 189 #else // (USBHOST_SERIAL > 1)
nanashino 0:0dd5d1e4cf71 190
nanashino 0:0dd5d1e4cf71 191 #endif // (USBHOST_SERIAL <= 1)
nanashino 0:0dd5d1e4cf71 192
nanashino 0:0dd5d1e4cf71 193 #endif
nanashino 0:0dd5d1e4cf71 194
nanashino 0:0dd5d1e4cf71 195 #endif