test test test

Dependencies:   mbed

Committer:
mohamedmoawya
Date:
Mon May 25 19:06:11 2020 +0000
Revision:
0:e4c5e6ec922e
snake game tteest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mohamedmoawya 0:e4c5e6ec922e 1 /* mbed Microcontroller Library
mohamedmoawya 0:e4c5e6ec922e 2 * Copyright (c) 2006-2013 ARM Limited
mohamedmoawya 0:e4c5e6ec922e 3 *
mohamedmoawya 0:e4c5e6ec922e 4 * Licensed under the Apache License, Version 2.0 (the "License");
mohamedmoawya 0:e4c5e6ec922e 5 * you may not use this file except in compliance with the License.
mohamedmoawya 0:e4c5e6ec922e 6 * You may obtain a copy of the License at
mohamedmoawya 0:e4c5e6ec922e 7 *
mohamedmoawya 0:e4c5e6ec922e 8 * http://www.apache.org/licenses/LICENSE-2.0
mohamedmoawya 0:e4c5e6ec922e 9 *
mohamedmoawya 0:e4c5e6ec922e 10 * Unless required by applicable law or agreed to in writing, software
mohamedmoawya 0:e4c5e6ec922e 11 * distributed under the License is distributed on an "AS IS" BASIS,
mohamedmoawya 0:e4c5e6ec922e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mohamedmoawya 0:e4c5e6ec922e 13 * See the License for the specific language governing permissions and
mohamedmoawya 0:e4c5e6ec922e 14 * limitations under the License.
mohamedmoawya 0:e4c5e6ec922e 15 */
mohamedmoawya 0:e4c5e6ec922e 16 #ifndef MBED_SERIALBASE_H
mohamedmoawya 0:e4c5e6ec922e 17 #define MBED_SERIALBASE_H
mohamedmoawya 0:e4c5e6ec922e 18
mohamedmoawya 0:e4c5e6ec922e 19 #include "platform/platform.h"
mohamedmoawya 0:e4c5e6ec922e 20
mohamedmoawya 0:e4c5e6ec922e 21 #if defined (DEVICE_SERIAL) || defined(DOXYGEN_ONLY)
mohamedmoawya 0:e4c5e6ec922e 22
mohamedmoawya 0:e4c5e6ec922e 23 #include "platform/Callback.h"
mohamedmoawya 0:e4c5e6ec922e 24 #include "hal/serial_api.h"
mohamedmoawya 0:e4c5e6ec922e 25 #include "platform/mbed_toolchain.h"
mohamedmoawya 0:e4c5e6ec922e 26 #include "platform/NonCopyable.h"
mohamedmoawya 0:e4c5e6ec922e 27
mohamedmoawya 0:e4c5e6ec922e 28 #if DEVICE_SERIAL_ASYNCH
mohamedmoawya 0:e4c5e6ec922e 29 #include "platform/CThunk.h"
mohamedmoawya 0:e4c5e6ec922e 30 #include "hal/dma_api.h"
mohamedmoawya 0:e4c5e6ec922e 31 #endif
mohamedmoawya 0:e4c5e6ec922e 32
mohamedmoawya 0:e4c5e6ec922e 33 namespace mbed {
mohamedmoawya 0:e4c5e6ec922e 34 /** \addtogroup drivers */
mohamedmoawya 0:e4c5e6ec922e 35
mohamedmoawya 0:e4c5e6ec922e 36 /** A base class for serial port implementations
mohamedmoawya 0:e4c5e6ec922e 37 * Can't be instantiated directly (use Serial or RawSerial)
mohamedmoawya 0:e4c5e6ec922e 38 *
mohamedmoawya 0:e4c5e6ec922e 39 * @note Synchronization level: Set by subclass
mohamedmoawya 0:e4c5e6ec922e 40 * @ingroup drivers
mohamedmoawya 0:e4c5e6ec922e 41 */
mohamedmoawya 0:e4c5e6ec922e 42 class SerialBase : private NonCopyable<SerialBase> {
mohamedmoawya 0:e4c5e6ec922e 43
mohamedmoawya 0:e4c5e6ec922e 44 public:
mohamedmoawya 0:e4c5e6ec922e 45 /** Set the baud rate of the serial port
mohamedmoawya 0:e4c5e6ec922e 46 *
mohamedmoawya 0:e4c5e6ec922e 47 * @param baudrate The baudrate of the serial port (default = 9600).
mohamedmoawya 0:e4c5e6ec922e 48 */
mohamedmoawya 0:e4c5e6ec922e 49 void baud(int baudrate);
mohamedmoawya 0:e4c5e6ec922e 50
mohamedmoawya 0:e4c5e6ec922e 51 enum Parity {
mohamedmoawya 0:e4c5e6ec922e 52 None = 0,
mohamedmoawya 0:e4c5e6ec922e 53 Odd,
mohamedmoawya 0:e4c5e6ec922e 54 Even,
mohamedmoawya 0:e4c5e6ec922e 55 Forced1,
mohamedmoawya 0:e4c5e6ec922e 56 Forced0
mohamedmoawya 0:e4c5e6ec922e 57 };
mohamedmoawya 0:e4c5e6ec922e 58
mohamedmoawya 0:e4c5e6ec922e 59 enum IrqType {
mohamedmoawya 0:e4c5e6ec922e 60 RxIrq = 0,
mohamedmoawya 0:e4c5e6ec922e 61 TxIrq,
mohamedmoawya 0:e4c5e6ec922e 62
mohamedmoawya 0:e4c5e6ec922e 63 IrqCnt
mohamedmoawya 0:e4c5e6ec922e 64 };
mohamedmoawya 0:e4c5e6ec922e 65
mohamedmoawya 0:e4c5e6ec922e 66 enum Flow {
mohamedmoawya 0:e4c5e6ec922e 67 Disabled = 0,
mohamedmoawya 0:e4c5e6ec922e 68 RTS,
mohamedmoawya 0:e4c5e6ec922e 69 CTS,
mohamedmoawya 0:e4c5e6ec922e 70 RTSCTS
mohamedmoawya 0:e4c5e6ec922e 71 };
mohamedmoawya 0:e4c5e6ec922e 72
mohamedmoawya 0:e4c5e6ec922e 73 /** Set the transmission format used by the serial port
mohamedmoawya 0:e4c5e6ec922e 74 *
mohamedmoawya 0:e4c5e6ec922e 75 * @param bits The number of bits in a word (5-8; default = 8)
mohamedmoawya 0:e4c5e6ec922e 76 * @param parity The parity used (SerialBase::None, SerialBase::Odd, SerialBase::Even, SerialBase::Forced1, SerialBase::Forced0; default = SerialBase::None)
mohamedmoawya 0:e4c5e6ec922e 77 * @param stop_bits The number of stop bits (1 or 2; default = 1)
mohamedmoawya 0:e4c5e6ec922e 78 */
mohamedmoawya 0:e4c5e6ec922e 79 void format(int bits = 8, Parity parity = SerialBase::None, int stop_bits = 1);
mohamedmoawya 0:e4c5e6ec922e 80
mohamedmoawya 0:e4c5e6ec922e 81 /** Determine if there is a character available to read
mohamedmoawya 0:e4c5e6ec922e 82 *
mohamedmoawya 0:e4c5e6ec922e 83 * @returns
mohamedmoawya 0:e4c5e6ec922e 84 * 1 if there is a character available to read,
mohamedmoawya 0:e4c5e6ec922e 85 * 0 otherwise
mohamedmoawya 0:e4c5e6ec922e 86 */
mohamedmoawya 0:e4c5e6ec922e 87 int readable();
mohamedmoawya 0:e4c5e6ec922e 88
mohamedmoawya 0:e4c5e6ec922e 89 /** Determine if there is space available to write a character
mohamedmoawya 0:e4c5e6ec922e 90 *
mohamedmoawya 0:e4c5e6ec922e 91 * @returns
mohamedmoawya 0:e4c5e6ec922e 92 * 1 if there is space to write a character,
mohamedmoawya 0:e4c5e6ec922e 93 * 0 otherwise
mohamedmoawya 0:e4c5e6ec922e 94 */
mohamedmoawya 0:e4c5e6ec922e 95 int writeable();
mohamedmoawya 0:e4c5e6ec922e 96
mohamedmoawya 0:e4c5e6ec922e 97 /** Attach a function to call whenever a serial interrupt is generated
mohamedmoawya 0:e4c5e6ec922e 98 *
mohamedmoawya 0:e4c5e6ec922e 99 * @param func A pointer to a void function, or 0 to set as none
mohamedmoawya 0:e4c5e6ec922e 100 * @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty)
mohamedmoawya 0:e4c5e6ec922e 101 */
mohamedmoawya 0:e4c5e6ec922e 102 void attach(Callback<void()> func, IrqType type = RxIrq);
mohamedmoawya 0:e4c5e6ec922e 103
mohamedmoawya 0:e4c5e6ec922e 104 /** Attach a member function to call whenever a serial interrupt is generated
mohamedmoawya 0:e4c5e6ec922e 105 *
mohamedmoawya 0:e4c5e6ec922e 106 * @param obj pointer to the object to call the member function on
mohamedmoawya 0:e4c5e6ec922e 107 * @param method pointer to the member function to be called
mohamedmoawya 0:e4c5e6ec922e 108 * @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty)
mohamedmoawya 0:e4c5e6ec922e 109 * @deprecated
mohamedmoawya 0:e4c5e6ec922e 110 * The attach function does not support cv-qualifiers. Replaced by
mohamedmoawya 0:e4c5e6ec922e 111 * attach(callback(obj, method), type).
mohamedmoawya 0:e4c5e6ec922e 112 */
mohamedmoawya 0:e4c5e6ec922e 113 template<typename T>
mohamedmoawya 0:e4c5e6ec922e 114 MBED_DEPRECATED_SINCE("mbed-os-5.1",
mohamedmoawya 0:e4c5e6ec922e 115 "The attach function does not support cv-qualifiers. Replaced by "
mohamedmoawya 0:e4c5e6ec922e 116 "attach(callback(obj, method), type).")
mohamedmoawya 0:e4c5e6ec922e 117 void attach(T *obj, void (T::*method)(), IrqType type = RxIrq)
mohamedmoawya 0:e4c5e6ec922e 118 {
mohamedmoawya 0:e4c5e6ec922e 119 attach(callback(obj, method), type);
mohamedmoawya 0:e4c5e6ec922e 120 }
mohamedmoawya 0:e4c5e6ec922e 121
mohamedmoawya 0:e4c5e6ec922e 122 /** Attach a member function to call whenever a serial interrupt is generated
mohamedmoawya 0:e4c5e6ec922e 123 *
mohamedmoawya 0:e4c5e6ec922e 124 * @param obj pointer to the object to call the member function on
mohamedmoawya 0:e4c5e6ec922e 125 * @param method pointer to the member function to be called
mohamedmoawya 0:e4c5e6ec922e 126 * @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty)
mohamedmoawya 0:e4c5e6ec922e 127 * @deprecated
mohamedmoawya 0:e4c5e6ec922e 128 * The attach function does not support cv-qualifiers. Replaced by
mohamedmoawya 0:e4c5e6ec922e 129 * attach(callback(obj, method), type).
mohamedmoawya 0:e4c5e6ec922e 130 */
mohamedmoawya 0:e4c5e6ec922e 131 template<typename T>
mohamedmoawya 0:e4c5e6ec922e 132 MBED_DEPRECATED_SINCE("mbed-os-5.1",
mohamedmoawya 0:e4c5e6ec922e 133 "The attach function does not support cv-qualifiers. Replaced by "
mohamedmoawya 0:e4c5e6ec922e 134 "attach(callback(obj, method), type).")
mohamedmoawya 0:e4c5e6ec922e 135 void attach(T *obj, void (*method)(T *), IrqType type = RxIrq)
mohamedmoawya 0:e4c5e6ec922e 136 {
mohamedmoawya 0:e4c5e6ec922e 137 attach(callback(obj, method), type);
mohamedmoawya 0:e4c5e6ec922e 138 }
mohamedmoawya 0:e4c5e6ec922e 139
mohamedmoawya 0:e4c5e6ec922e 140 /** Generate a break condition on the serial line
mohamedmoawya 0:e4c5e6ec922e 141 */
mohamedmoawya 0:e4c5e6ec922e 142 void send_break();
mohamedmoawya 0:e4c5e6ec922e 143
mohamedmoawya 0:e4c5e6ec922e 144 protected:
mohamedmoawya 0:e4c5e6ec922e 145
mohamedmoawya 0:e4c5e6ec922e 146 /** Acquire exclusive access to this serial port
mohamedmoawya 0:e4c5e6ec922e 147 */
mohamedmoawya 0:e4c5e6ec922e 148 virtual void lock(void);
mohamedmoawya 0:e4c5e6ec922e 149
mohamedmoawya 0:e4c5e6ec922e 150 /** Release exclusive access to this serial port
mohamedmoawya 0:e4c5e6ec922e 151 */
mohamedmoawya 0:e4c5e6ec922e 152 virtual void unlock(void);
mohamedmoawya 0:e4c5e6ec922e 153
mohamedmoawya 0:e4c5e6ec922e 154 public:
mohamedmoawya 0:e4c5e6ec922e 155
mohamedmoawya 0:e4c5e6ec922e 156 #if DEVICE_SERIAL_FC
mohamedmoawya 0:e4c5e6ec922e 157 /** Set the flow control type on the serial port
mohamedmoawya 0:e4c5e6ec922e 158 *
mohamedmoawya 0:e4c5e6ec922e 159 * @param type the flow control type (Disabled, RTS, CTS, RTSCTS)
mohamedmoawya 0:e4c5e6ec922e 160 * @param flow1 the first flow control pin (RTS for RTS or RTSCTS, CTS for CTS)
mohamedmoawya 0:e4c5e6ec922e 161 * @param flow2 the second flow control pin (CTS for RTSCTS)
mohamedmoawya 0:e4c5e6ec922e 162 */
mohamedmoawya 0:e4c5e6ec922e 163 void set_flow_control(Flow type, PinName flow1 = NC, PinName flow2 = NC);
mohamedmoawya 0:e4c5e6ec922e 164 #endif
mohamedmoawya 0:e4c5e6ec922e 165
mohamedmoawya 0:e4c5e6ec922e 166 static void _irq_handler(uint32_t id, SerialIrq irq_type);
mohamedmoawya 0:e4c5e6ec922e 167
mohamedmoawya 0:e4c5e6ec922e 168 #if DEVICE_SERIAL_ASYNCH
mohamedmoawya 0:e4c5e6ec922e 169
mohamedmoawya 0:e4c5e6ec922e 170 /** Begin asynchronous write using 8bit buffer. The completion invokes registered TX event callback
mohamedmoawya 0:e4c5e6ec922e 171 *
mohamedmoawya 0:e4c5e6ec922e 172 * This function locks the deep sleep until any event has occurred
mohamedmoawya 0:e4c5e6ec922e 173 *
mohamedmoawya 0:e4c5e6ec922e 174 * @param buffer The buffer where received data will be stored
mohamedmoawya 0:e4c5e6ec922e 175 * @param length The buffer length in bytes
mohamedmoawya 0:e4c5e6ec922e 176 * @param callback The event callback function
mohamedmoawya 0:e4c5e6ec922e 177 * @param event The logical OR of TX events
mohamedmoawya 0:e4c5e6ec922e 178 */
mohamedmoawya 0:e4c5e6ec922e 179 int write(const uint8_t *buffer, int length, const event_callback_t &callback, int event = SERIAL_EVENT_TX_COMPLETE);
mohamedmoawya 0:e4c5e6ec922e 180
mohamedmoawya 0:e4c5e6ec922e 181 /** Begin asynchronous write using 16bit buffer. The completion invokes registered TX event callback
mohamedmoawya 0:e4c5e6ec922e 182 *
mohamedmoawya 0:e4c5e6ec922e 183 * This function locks the deep sleep until any event has occurred
mohamedmoawya 0:e4c5e6ec922e 184 *
mohamedmoawya 0:e4c5e6ec922e 185 * @param buffer The buffer where received data will be stored
mohamedmoawya 0:e4c5e6ec922e 186 * @param length The buffer length in bytes
mohamedmoawya 0:e4c5e6ec922e 187 * @param callback The event callback function
mohamedmoawya 0:e4c5e6ec922e 188 * @param event The logical OR of TX events
mohamedmoawya 0:e4c5e6ec922e 189 */
mohamedmoawya 0:e4c5e6ec922e 190 int write(const uint16_t *buffer, int length, const event_callback_t &callback, int event = SERIAL_EVENT_TX_COMPLETE);
mohamedmoawya 0:e4c5e6ec922e 191
mohamedmoawya 0:e4c5e6ec922e 192 /** Abort the on-going write transfer
mohamedmoawya 0:e4c5e6ec922e 193 */
mohamedmoawya 0:e4c5e6ec922e 194 void abort_write();
mohamedmoawya 0:e4c5e6ec922e 195
mohamedmoawya 0:e4c5e6ec922e 196 /** Begin asynchronous reading using 8bit buffer. The completion invokes registered RX event callback.
mohamedmoawya 0:e4c5e6ec922e 197 *
mohamedmoawya 0:e4c5e6ec922e 198 * This function locks the deep sleep until any event has occurred
mohamedmoawya 0:e4c5e6ec922e 199 *
mohamedmoawya 0:e4c5e6ec922e 200 * @param buffer The buffer where received data will be stored
mohamedmoawya 0:e4c5e6ec922e 201 * @param length The buffer length in bytes
mohamedmoawya 0:e4c5e6ec922e 202 * @param callback The event callback function
mohamedmoawya 0:e4c5e6ec922e 203 * @param event The logical OR of RX events
mohamedmoawya 0:e4c5e6ec922e 204 * @param char_match The matching character
mohamedmoawya 0:e4c5e6ec922e 205 */
mohamedmoawya 0:e4c5e6ec922e 206 int read(uint8_t *buffer, int length, const event_callback_t &callback, int event = SERIAL_EVENT_RX_COMPLETE, unsigned char char_match = SERIAL_RESERVED_CHAR_MATCH);
mohamedmoawya 0:e4c5e6ec922e 207
mohamedmoawya 0:e4c5e6ec922e 208 /** Begin asynchronous reading using 16bit buffer. The completion invokes registered RX event callback.
mohamedmoawya 0:e4c5e6ec922e 209 *
mohamedmoawya 0:e4c5e6ec922e 210 * This function locks the deep sleep until any event has occurred
mohamedmoawya 0:e4c5e6ec922e 211 *
mohamedmoawya 0:e4c5e6ec922e 212 * @param buffer The buffer where received data will be stored
mohamedmoawya 0:e4c5e6ec922e 213 * @param length The buffer length in bytes
mohamedmoawya 0:e4c5e6ec922e 214 * @param callback The event callback function
mohamedmoawya 0:e4c5e6ec922e 215 * @param event The logical OR of RX events
mohamedmoawya 0:e4c5e6ec922e 216 * @param char_match The matching character
mohamedmoawya 0:e4c5e6ec922e 217 */
mohamedmoawya 0:e4c5e6ec922e 218 int read(uint16_t *buffer, int length, const event_callback_t &callback, int event = SERIAL_EVENT_RX_COMPLETE, unsigned char char_match = SERIAL_RESERVED_CHAR_MATCH);
mohamedmoawya 0:e4c5e6ec922e 219
mohamedmoawya 0:e4c5e6ec922e 220 /** Abort the on-going read transfer
mohamedmoawya 0:e4c5e6ec922e 221 */
mohamedmoawya 0:e4c5e6ec922e 222 void abort_read();
mohamedmoawya 0:e4c5e6ec922e 223
mohamedmoawya 0:e4c5e6ec922e 224 /** Configure DMA usage suggestion for non-blocking TX transfers
mohamedmoawya 0:e4c5e6ec922e 225 *
mohamedmoawya 0:e4c5e6ec922e 226 * @param usage The usage DMA hint for peripheral
mohamedmoawya 0:e4c5e6ec922e 227 * @return Zero if the usage was set, -1 if a transaction is on-going
mohamedmoawya 0:e4c5e6ec922e 228 */
mohamedmoawya 0:e4c5e6ec922e 229 int set_dma_usage_tx(DMAUsage usage);
mohamedmoawya 0:e4c5e6ec922e 230
mohamedmoawya 0:e4c5e6ec922e 231 /** Configure DMA usage suggestion for non-blocking RX transfers
mohamedmoawya 0:e4c5e6ec922e 232 *
mohamedmoawya 0:e4c5e6ec922e 233 * @param usage The usage DMA hint for peripheral
mohamedmoawya 0:e4c5e6ec922e 234 * @return Zero if the usage was set, -1 if a transaction is on-going
mohamedmoawya 0:e4c5e6ec922e 235 */
mohamedmoawya 0:e4c5e6ec922e 236 int set_dma_usage_rx(DMAUsage usage);
mohamedmoawya 0:e4c5e6ec922e 237
mohamedmoawya 0:e4c5e6ec922e 238 protected:
mohamedmoawya 0:e4c5e6ec922e 239 void start_read(void *buffer, int buffer_size, char buffer_width, const event_callback_t &callback, int event, unsigned char char_match);
mohamedmoawya 0:e4c5e6ec922e 240 void start_write(const void *buffer, int buffer_size, char buffer_width, const event_callback_t &callback, int event);
mohamedmoawya 0:e4c5e6ec922e 241 void interrupt_handler_asynch(void);
mohamedmoawya 0:e4c5e6ec922e 242 #endif
mohamedmoawya 0:e4c5e6ec922e 243
mohamedmoawya 0:e4c5e6ec922e 244 protected:
mohamedmoawya 0:e4c5e6ec922e 245 SerialBase(PinName tx, PinName rx, int baud);
mohamedmoawya 0:e4c5e6ec922e 246 virtual ~SerialBase();
mohamedmoawya 0:e4c5e6ec922e 247
mohamedmoawya 0:e4c5e6ec922e 248 int _base_getc();
mohamedmoawya 0:e4c5e6ec922e 249 int _base_putc(int c);
mohamedmoawya 0:e4c5e6ec922e 250
mohamedmoawya 0:e4c5e6ec922e 251 #if DEVICE_SERIAL_ASYNCH
mohamedmoawya 0:e4c5e6ec922e 252 CThunk<SerialBase> _thunk_irq;
mohamedmoawya 0:e4c5e6ec922e 253 DMAUsage _tx_usage;
mohamedmoawya 0:e4c5e6ec922e 254 DMAUsage _rx_usage;
mohamedmoawya 0:e4c5e6ec922e 255 event_callback_t _tx_callback;
mohamedmoawya 0:e4c5e6ec922e 256 event_callback_t _rx_callback;
mohamedmoawya 0:e4c5e6ec922e 257 #endif
mohamedmoawya 0:e4c5e6ec922e 258
mohamedmoawya 0:e4c5e6ec922e 259 serial_t _serial;
mohamedmoawya 0:e4c5e6ec922e 260 Callback<void()> _irq[IrqCnt];
mohamedmoawya 0:e4c5e6ec922e 261 int _baud;
mohamedmoawya 0:e4c5e6ec922e 262
mohamedmoawya 0:e4c5e6ec922e 263 };
mohamedmoawya 0:e4c5e6ec922e 264
mohamedmoawya 0:e4c5e6ec922e 265 } // namespace mbed
mohamedmoawya 0:e4c5e6ec922e 266
mohamedmoawya 0:e4c5e6ec922e 267 #endif
mohamedmoawya 0:e4c5e6ec922e 268
mohamedmoawya 0:e4c5e6ec922e 269 #endif