Nathan Yonkee / Mbed 2 deprecated Nucleo_sinewave_output_copy

Dependencies:   mbed

Committer:
Nathan Yonkee
Date:
Fri Mar 02 07:12:37 2018 -0700
Revision:
9:d58e77ebd769
add mbed-os library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nathan Yonkee 9:d58e77ebd769 1 /* mbed Microcontroller Library
Nathan Yonkee 9:d58e77ebd769 2 * Copyright (c) 2006-2017 ARM Limited
Nathan Yonkee 9:d58e77ebd769 3 *
Nathan Yonkee 9:d58e77ebd769 4 * Licensed under the Apache License, Version 2.0 (the "License");
Nathan Yonkee 9:d58e77ebd769 5 * you may not use this file except in compliance with the License.
Nathan Yonkee 9:d58e77ebd769 6 * You may obtain a copy of the License at
Nathan Yonkee 9:d58e77ebd769 7 *
Nathan Yonkee 9:d58e77ebd769 8 * http://www.apache.org/licenses/LICENSE-2.0
Nathan Yonkee 9:d58e77ebd769 9 *
Nathan Yonkee 9:d58e77ebd769 10 * Unless required by applicable law or agreed to in writing, software
Nathan Yonkee 9:d58e77ebd769 11 * distributed under the License is distributed on an "AS IS" BASIS,
Nathan Yonkee 9:d58e77ebd769 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Nathan Yonkee 9:d58e77ebd769 13 * See the License for the specific language governing permissions and
Nathan Yonkee 9:d58e77ebd769 14 * limitations under the License.
Nathan Yonkee 9:d58e77ebd769 15 */
Nathan Yonkee 9:d58e77ebd769 16
Nathan Yonkee 9:d58e77ebd769 17 #if (DEVICE_SERIAL && DEVICE_INTERRUPTIN)
Nathan Yonkee 9:d58e77ebd769 18
Nathan Yonkee 9:d58e77ebd769 19 #include <errno.h>
Nathan Yonkee 9:d58e77ebd769 20 #include "UARTSerial.h"
Nathan Yonkee 9:d58e77ebd769 21 #include "platform/mbed_poll.h"
Nathan Yonkee 9:d58e77ebd769 22
Nathan Yonkee 9:d58e77ebd769 23 #if MBED_CONF_RTOS_PRESENT
Nathan Yonkee 9:d58e77ebd769 24 #include "rtos/Thread.h"
Nathan Yonkee 9:d58e77ebd769 25 #else
Nathan Yonkee 9:d58e77ebd769 26 #include "platform/mbed_wait_api.h"
Nathan Yonkee 9:d58e77ebd769 27 #endif
Nathan Yonkee 9:d58e77ebd769 28
Nathan Yonkee 9:d58e77ebd769 29 namespace mbed {
Nathan Yonkee 9:d58e77ebd769 30
Nathan Yonkee 9:d58e77ebd769 31 UARTSerial::UARTSerial(PinName tx, PinName rx, int baud) :
Nathan Yonkee 9:d58e77ebd769 32 SerialBase(tx, rx, baud),
Nathan Yonkee 9:d58e77ebd769 33 _blocking(true),
Nathan Yonkee 9:d58e77ebd769 34 _tx_irq_enabled(false),
Nathan Yonkee 9:d58e77ebd769 35 _rx_irq_enabled(true),
Nathan Yonkee 9:d58e77ebd769 36 _dcd_irq(NULL)
Nathan Yonkee 9:d58e77ebd769 37 {
Nathan Yonkee 9:d58e77ebd769 38 /* Attatch IRQ routines to the serial device. */
Nathan Yonkee 9:d58e77ebd769 39 SerialBase::attach(callback(this, &UARTSerial::rx_irq), RxIrq);
Nathan Yonkee 9:d58e77ebd769 40 }
Nathan Yonkee 9:d58e77ebd769 41
Nathan Yonkee 9:d58e77ebd769 42 UARTSerial::~UARTSerial()
Nathan Yonkee 9:d58e77ebd769 43 {
Nathan Yonkee 9:d58e77ebd769 44 delete _dcd_irq;
Nathan Yonkee 9:d58e77ebd769 45 }
Nathan Yonkee 9:d58e77ebd769 46
Nathan Yonkee 9:d58e77ebd769 47 void UARTSerial::dcd_irq()
Nathan Yonkee 9:d58e77ebd769 48 {
Nathan Yonkee 9:d58e77ebd769 49 wake();
Nathan Yonkee 9:d58e77ebd769 50 }
Nathan Yonkee 9:d58e77ebd769 51
Nathan Yonkee 9:d58e77ebd769 52 void UARTSerial::set_baud(int baud)
Nathan Yonkee 9:d58e77ebd769 53 {
Nathan Yonkee 9:d58e77ebd769 54 SerialBase::baud(baud);
Nathan Yonkee 9:d58e77ebd769 55 }
Nathan Yonkee 9:d58e77ebd769 56
Nathan Yonkee 9:d58e77ebd769 57 void UARTSerial::set_data_carrier_detect(PinName dcd_pin, bool active_high)
Nathan Yonkee 9:d58e77ebd769 58 {
Nathan Yonkee 9:d58e77ebd769 59 delete _dcd_irq;
Nathan Yonkee 9:d58e77ebd769 60 _dcd_irq = NULL;
Nathan Yonkee 9:d58e77ebd769 61
Nathan Yonkee 9:d58e77ebd769 62 if (dcd_pin != NC) {
Nathan Yonkee 9:d58e77ebd769 63 _dcd_irq = new InterruptIn(dcd_pin);
Nathan Yonkee 9:d58e77ebd769 64 if (active_high) {
Nathan Yonkee 9:d58e77ebd769 65 _dcd_irq->fall(callback(this, &UARTSerial::dcd_irq));
Nathan Yonkee 9:d58e77ebd769 66 } else {
Nathan Yonkee 9:d58e77ebd769 67 _dcd_irq->rise(callback(this, &UARTSerial::dcd_irq));
Nathan Yonkee 9:d58e77ebd769 68 }
Nathan Yonkee 9:d58e77ebd769 69 }
Nathan Yonkee 9:d58e77ebd769 70 }
Nathan Yonkee 9:d58e77ebd769 71
Nathan Yonkee 9:d58e77ebd769 72 void UARTSerial::set_format(int bits, Parity parity, int stop_bits)
Nathan Yonkee 9:d58e77ebd769 73 {
Nathan Yonkee 9:d58e77ebd769 74 api_lock();
Nathan Yonkee 9:d58e77ebd769 75 SerialBase::format(bits, parity, stop_bits);
Nathan Yonkee 9:d58e77ebd769 76 api_unlock();
Nathan Yonkee 9:d58e77ebd769 77 }
Nathan Yonkee 9:d58e77ebd769 78
Nathan Yonkee 9:d58e77ebd769 79 #if DEVICE_SERIAL_FC
Nathan Yonkee 9:d58e77ebd769 80 void UARTSerial::set_flow_control(Flow type, PinName flow1, PinName flow2)
Nathan Yonkee 9:d58e77ebd769 81 {
Nathan Yonkee 9:d58e77ebd769 82 api_lock();
Nathan Yonkee 9:d58e77ebd769 83 SerialBase::set_flow_control(type, flow1, flow2);
Nathan Yonkee 9:d58e77ebd769 84 api_unlock();
Nathan Yonkee 9:d58e77ebd769 85 }
Nathan Yonkee 9:d58e77ebd769 86 #endif
Nathan Yonkee 9:d58e77ebd769 87
Nathan Yonkee 9:d58e77ebd769 88 int UARTSerial::close()
Nathan Yonkee 9:d58e77ebd769 89 {
Nathan Yonkee 9:d58e77ebd769 90 /* Does not let us pass a file descriptor. So how to close ?
Nathan Yonkee 9:d58e77ebd769 91 * Also, does it make sense to close a device type file descriptor*/
Nathan Yonkee 9:d58e77ebd769 92 return 0;
Nathan Yonkee 9:d58e77ebd769 93 }
Nathan Yonkee 9:d58e77ebd769 94
Nathan Yonkee 9:d58e77ebd769 95 int UARTSerial::isatty()
Nathan Yonkee 9:d58e77ebd769 96 {
Nathan Yonkee 9:d58e77ebd769 97 return 1;
Nathan Yonkee 9:d58e77ebd769 98
Nathan Yonkee 9:d58e77ebd769 99 }
Nathan Yonkee 9:d58e77ebd769 100
Nathan Yonkee 9:d58e77ebd769 101 off_t UARTSerial::seek(off_t offset, int whence)
Nathan Yonkee 9:d58e77ebd769 102 {
Nathan Yonkee 9:d58e77ebd769 103 /*XXX lseek can be done theoratically, but is it sane to mark positions on a dynamically growing/shrinking
Nathan Yonkee 9:d58e77ebd769 104 * buffer system (from an interrupt context) */
Nathan Yonkee 9:d58e77ebd769 105 return -ESPIPE;
Nathan Yonkee 9:d58e77ebd769 106 }
Nathan Yonkee 9:d58e77ebd769 107
Nathan Yonkee 9:d58e77ebd769 108 int UARTSerial::sync()
Nathan Yonkee 9:d58e77ebd769 109 {
Nathan Yonkee 9:d58e77ebd769 110 api_lock();
Nathan Yonkee 9:d58e77ebd769 111
Nathan Yonkee 9:d58e77ebd769 112 while (!_txbuf.empty()) {
Nathan Yonkee 9:d58e77ebd769 113 api_unlock();
Nathan Yonkee 9:d58e77ebd769 114 // Doing better than wait would require TxIRQ to also do wake() when becoming empty. Worth it?
Nathan Yonkee 9:d58e77ebd769 115 wait_ms(1);
Nathan Yonkee 9:d58e77ebd769 116 api_lock();
Nathan Yonkee 9:d58e77ebd769 117 }
Nathan Yonkee 9:d58e77ebd769 118
Nathan Yonkee 9:d58e77ebd769 119 api_unlock();
Nathan Yonkee 9:d58e77ebd769 120
Nathan Yonkee 9:d58e77ebd769 121 return 0;
Nathan Yonkee 9:d58e77ebd769 122 }
Nathan Yonkee 9:d58e77ebd769 123
Nathan Yonkee 9:d58e77ebd769 124 void UARTSerial::sigio(Callback<void()> func) {
Nathan Yonkee 9:d58e77ebd769 125 core_util_critical_section_enter();
Nathan Yonkee 9:d58e77ebd769 126 _sigio_cb = func;
Nathan Yonkee 9:d58e77ebd769 127 if (_sigio_cb) {
Nathan Yonkee 9:d58e77ebd769 128 short current_events = poll(0x7FFF);
Nathan Yonkee 9:d58e77ebd769 129 if (current_events) {
Nathan Yonkee 9:d58e77ebd769 130 _sigio_cb();
Nathan Yonkee 9:d58e77ebd769 131 }
Nathan Yonkee 9:d58e77ebd769 132 }
Nathan Yonkee 9:d58e77ebd769 133 core_util_critical_section_exit();
Nathan Yonkee 9:d58e77ebd769 134 }
Nathan Yonkee 9:d58e77ebd769 135
Nathan Yonkee 9:d58e77ebd769 136 ssize_t UARTSerial::write(const void* buffer, size_t length)
Nathan Yonkee 9:d58e77ebd769 137 {
Nathan Yonkee 9:d58e77ebd769 138 size_t data_written = 0;
Nathan Yonkee 9:d58e77ebd769 139 const char *buf_ptr = static_cast<const char *>(buffer);
Nathan Yonkee 9:d58e77ebd769 140
Nathan Yonkee 9:d58e77ebd769 141 if (length == 0) {
Nathan Yonkee 9:d58e77ebd769 142 return 0;
Nathan Yonkee 9:d58e77ebd769 143 }
Nathan Yonkee 9:d58e77ebd769 144
Nathan Yonkee 9:d58e77ebd769 145 api_lock();
Nathan Yonkee 9:d58e77ebd769 146
Nathan Yonkee 9:d58e77ebd769 147 // Unlike read, we should write the whole thing if blocking. POSIX only
Nathan Yonkee 9:d58e77ebd769 148 // allows partial as a side-effect of signal handling; it normally tries to
Nathan Yonkee 9:d58e77ebd769 149 // write everything if blocking. Without signals we can always write all.
Nathan Yonkee 9:d58e77ebd769 150 while (data_written < length) {
Nathan Yonkee 9:d58e77ebd769 151
Nathan Yonkee 9:d58e77ebd769 152 if (_txbuf.full()) {
Nathan Yonkee 9:d58e77ebd769 153 if (!_blocking) {
Nathan Yonkee 9:d58e77ebd769 154 break;
Nathan Yonkee 9:d58e77ebd769 155 }
Nathan Yonkee 9:d58e77ebd769 156 do {
Nathan Yonkee 9:d58e77ebd769 157 api_unlock();
Nathan Yonkee 9:d58e77ebd769 158 wait_ms(1); // XXX todo - proper wait, WFE for non-rtos ?
Nathan Yonkee 9:d58e77ebd769 159 api_lock();
Nathan Yonkee 9:d58e77ebd769 160 } while (_txbuf.full());
Nathan Yonkee 9:d58e77ebd769 161 }
Nathan Yonkee 9:d58e77ebd769 162
Nathan Yonkee 9:d58e77ebd769 163 while (data_written < length && !_txbuf.full()) {
Nathan Yonkee 9:d58e77ebd769 164 _txbuf.push(*buf_ptr++);
Nathan Yonkee 9:d58e77ebd769 165 data_written++;
Nathan Yonkee 9:d58e77ebd769 166 }
Nathan Yonkee 9:d58e77ebd769 167
Nathan Yonkee 9:d58e77ebd769 168 core_util_critical_section_enter();
Nathan Yonkee 9:d58e77ebd769 169 if (!_tx_irq_enabled) {
Nathan Yonkee 9:d58e77ebd769 170 UARTSerial::tx_irq(); // only write to hardware in one place
Nathan Yonkee 9:d58e77ebd769 171 if (!_txbuf.empty()) {
Nathan Yonkee 9:d58e77ebd769 172 SerialBase::attach(callback(this, &UARTSerial::tx_irq), TxIrq);
Nathan Yonkee 9:d58e77ebd769 173 _tx_irq_enabled = true;
Nathan Yonkee 9:d58e77ebd769 174 }
Nathan Yonkee 9:d58e77ebd769 175 }
Nathan Yonkee 9:d58e77ebd769 176 core_util_critical_section_exit();
Nathan Yonkee 9:d58e77ebd769 177 }
Nathan Yonkee 9:d58e77ebd769 178
Nathan Yonkee 9:d58e77ebd769 179 api_unlock();
Nathan Yonkee 9:d58e77ebd769 180
Nathan Yonkee 9:d58e77ebd769 181 return data_written != 0 ? (ssize_t) data_written : (ssize_t) -EAGAIN;
Nathan Yonkee 9:d58e77ebd769 182 }
Nathan Yonkee 9:d58e77ebd769 183
Nathan Yonkee 9:d58e77ebd769 184 ssize_t UARTSerial::read(void* buffer, size_t length)
Nathan Yonkee 9:d58e77ebd769 185 {
Nathan Yonkee 9:d58e77ebd769 186 size_t data_read = 0;
Nathan Yonkee 9:d58e77ebd769 187
Nathan Yonkee 9:d58e77ebd769 188 char *ptr = static_cast<char *>(buffer);
Nathan Yonkee 9:d58e77ebd769 189
Nathan Yonkee 9:d58e77ebd769 190 if (length == 0) {
Nathan Yonkee 9:d58e77ebd769 191 return 0;
Nathan Yonkee 9:d58e77ebd769 192 }
Nathan Yonkee 9:d58e77ebd769 193
Nathan Yonkee 9:d58e77ebd769 194 api_lock();
Nathan Yonkee 9:d58e77ebd769 195
Nathan Yonkee 9:d58e77ebd769 196 while (_rxbuf.empty()) {
Nathan Yonkee 9:d58e77ebd769 197 if (!_blocking) {
Nathan Yonkee 9:d58e77ebd769 198 api_unlock();
Nathan Yonkee 9:d58e77ebd769 199 return -EAGAIN;
Nathan Yonkee 9:d58e77ebd769 200 }
Nathan Yonkee 9:d58e77ebd769 201 api_unlock();
Nathan Yonkee 9:d58e77ebd769 202 wait_ms(1); // XXX todo - proper wait, WFE for non-rtos ?
Nathan Yonkee 9:d58e77ebd769 203 api_lock();
Nathan Yonkee 9:d58e77ebd769 204 }
Nathan Yonkee 9:d58e77ebd769 205
Nathan Yonkee 9:d58e77ebd769 206 while (data_read < length && !_rxbuf.empty()) {
Nathan Yonkee 9:d58e77ebd769 207 _rxbuf.pop(*ptr++);
Nathan Yonkee 9:d58e77ebd769 208 data_read++;
Nathan Yonkee 9:d58e77ebd769 209 }
Nathan Yonkee 9:d58e77ebd769 210
Nathan Yonkee 9:d58e77ebd769 211 core_util_critical_section_enter();
Nathan Yonkee 9:d58e77ebd769 212 if (!_rx_irq_enabled) {
Nathan Yonkee 9:d58e77ebd769 213 UARTSerial::rx_irq(); // only read from hardware in one place
Nathan Yonkee 9:d58e77ebd769 214 if (!_rxbuf.full()) {
Nathan Yonkee 9:d58e77ebd769 215 SerialBase::attach(callback(this, &UARTSerial::rx_irq), RxIrq);
Nathan Yonkee 9:d58e77ebd769 216 _rx_irq_enabled = true;
Nathan Yonkee 9:d58e77ebd769 217 }
Nathan Yonkee 9:d58e77ebd769 218 }
Nathan Yonkee 9:d58e77ebd769 219 core_util_critical_section_exit();
Nathan Yonkee 9:d58e77ebd769 220
Nathan Yonkee 9:d58e77ebd769 221 api_unlock();
Nathan Yonkee 9:d58e77ebd769 222
Nathan Yonkee 9:d58e77ebd769 223 return data_read;
Nathan Yonkee 9:d58e77ebd769 224 }
Nathan Yonkee 9:d58e77ebd769 225
Nathan Yonkee 9:d58e77ebd769 226 bool UARTSerial::hup() const
Nathan Yonkee 9:d58e77ebd769 227 {
Nathan Yonkee 9:d58e77ebd769 228 return _dcd_irq && _dcd_irq->read() != 0;
Nathan Yonkee 9:d58e77ebd769 229 }
Nathan Yonkee 9:d58e77ebd769 230
Nathan Yonkee 9:d58e77ebd769 231 void UARTSerial::wake()
Nathan Yonkee 9:d58e77ebd769 232 {
Nathan Yonkee 9:d58e77ebd769 233 if (_sigio_cb) {
Nathan Yonkee 9:d58e77ebd769 234 _sigio_cb();
Nathan Yonkee 9:d58e77ebd769 235 }
Nathan Yonkee 9:d58e77ebd769 236 }
Nathan Yonkee 9:d58e77ebd769 237
Nathan Yonkee 9:d58e77ebd769 238 short UARTSerial::poll(short events) const {
Nathan Yonkee 9:d58e77ebd769 239
Nathan Yonkee 9:d58e77ebd769 240 short revents = 0;
Nathan Yonkee 9:d58e77ebd769 241 /* Check the Circular Buffer if space available for writing out */
Nathan Yonkee 9:d58e77ebd769 242
Nathan Yonkee 9:d58e77ebd769 243
Nathan Yonkee 9:d58e77ebd769 244 if (!_rxbuf.empty()) {
Nathan Yonkee 9:d58e77ebd769 245 revents |= POLLIN;
Nathan Yonkee 9:d58e77ebd769 246 }
Nathan Yonkee 9:d58e77ebd769 247
Nathan Yonkee 9:d58e77ebd769 248 /* POLLHUP and POLLOUT are mutually exclusive */
Nathan Yonkee 9:d58e77ebd769 249 if (hup()) {
Nathan Yonkee 9:d58e77ebd769 250 revents |= POLLHUP;
Nathan Yonkee 9:d58e77ebd769 251 } else if (!_txbuf.full()) {
Nathan Yonkee 9:d58e77ebd769 252 revents |= POLLOUT;
Nathan Yonkee 9:d58e77ebd769 253 }
Nathan Yonkee 9:d58e77ebd769 254
Nathan Yonkee 9:d58e77ebd769 255 /*TODO Handle other event types */
Nathan Yonkee 9:d58e77ebd769 256
Nathan Yonkee 9:d58e77ebd769 257 return revents;
Nathan Yonkee 9:d58e77ebd769 258 }
Nathan Yonkee 9:d58e77ebd769 259
Nathan Yonkee 9:d58e77ebd769 260 void UARTSerial::lock()
Nathan Yonkee 9:d58e77ebd769 261 {
Nathan Yonkee 9:d58e77ebd769 262 // This is the override for SerialBase.
Nathan Yonkee 9:d58e77ebd769 263 // No lock required as we only use SerialBase from interrupt or from
Nathan Yonkee 9:d58e77ebd769 264 // inside our own critical section.
Nathan Yonkee 9:d58e77ebd769 265 }
Nathan Yonkee 9:d58e77ebd769 266
Nathan Yonkee 9:d58e77ebd769 267 void UARTSerial::unlock()
Nathan Yonkee 9:d58e77ebd769 268 {
Nathan Yonkee 9:d58e77ebd769 269 // This is the override for SerialBase.
Nathan Yonkee 9:d58e77ebd769 270 }
Nathan Yonkee 9:d58e77ebd769 271
Nathan Yonkee 9:d58e77ebd769 272 void UARTSerial::api_lock(void)
Nathan Yonkee 9:d58e77ebd769 273 {
Nathan Yonkee 9:d58e77ebd769 274 _mutex.lock();
Nathan Yonkee 9:d58e77ebd769 275 }
Nathan Yonkee 9:d58e77ebd769 276
Nathan Yonkee 9:d58e77ebd769 277 void UARTSerial::api_unlock(void)
Nathan Yonkee 9:d58e77ebd769 278 {
Nathan Yonkee 9:d58e77ebd769 279 _mutex.unlock();
Nathan Yonkee 9:d58e77ebd769 280 }
Nathan Yonkee 9:d58e77ebd769 281
Nathan Yonkee 9:d58e77ebd769 282 void UARTSerial::rx_irq(void)
Nathan Yonkee 9:d58e77ebd769 283 {
Nathan Yonkee 9:d58e77ebd769 284 bool was_empty = _rxbuf.empty();
Nathan Yonkee 9:d58e77ebd769 285
Nathan Yonkee 9:d58e77ebd769 286 /* Fill in the receive buffer if the peripheral is readable
Nathan Yonkee 9:d58e77ebd769 287 * and receive buffer is not full. */
Nathan Yonkee 9:d58e77ebd769 288 while (!_rxbuf.full() && SerialBase::readable()) {
Nathan Yonkee 9:d58e77ebd769 289 char data = SerialBase::_base_getc();
Nathan Yonkee 9:d58e77ebd769 290 _rxbuf.push(data);
Nathan Yonkee 9:d58e77ebd769 291 }
Nathan Yonkee 9:d58e77ebd769 292
Nathan Yonkee 9:d58e77ebd769 293 if (_rx_irq_enabled && _rxbuf.full()) {
Nathan Yonkee 9:d58e77ebd769 294 SerialBase::attach(NULL, RxIrq);
Nathan Yonkee 9:d58e77ebd769 295 _rx_irq_enabled = false;
Nathan Yonkee 9:d58e77ebd769 296 }
Nathan Yonkee 9:d58e77ebd769 297
Nathan Yonkee 9:d58e77ebd769 298 /* Report the File handler that data is ready to be read from the buffer. */
Nathan Yonkee 9:d58e77ebd769 299 if (was_empty && !_rxbuf.empty()) {
Nathan Yonkee 9:d58e77ebd769 300 wake();
Nathan Yonkee 9:d58e77ebd769 301 }
Nathan Yonkee 9:d58e77ebd769 302 }
Nathan Yonkee 9:d58e77ebd769 303
Nathan Yonkee 9:d58e77ebd769 304 // Also called from write to start transfer
Nathan Yonkee 9:d58e77ebd769 305 void UARTSerial::tx_irq(void)
Nathan Yonkee 9:d58e77ebd769 306 {
Nathan Yonkee 9:d58e77ebd769 307 bool was_full = _txbuf.full();
Nathan Yonkee 9:d58e77ebd769 308
Nathan Yonkee 9:d58e77ebd769 309 /* Write to the peripheral if there is something to write
Nathan Yonkee 9:d58e77ebd769 310 * and if the peripheral is available to write. */
Nathan Yonkee 9:d58e77ebd769 311 while (!_txbuf.empty() && SerialBase::writeable()) {
Nathan Yonkee 9:d58e77ebd769 312 char data;
Nathan Yonkee 9:d58e77ebd769 313 _txbuf.pop(data);
Nathan Yonkee 9:d58e77ebd769 314 SerialBase::_base_putc(data);
Nathan Yonkee 9:d58e77ebd769 315 }
Nathan Yonkee 9:d58e77ebd769 316
Nathan Yonkee 9:d58e77ebd769 317 if (_tx_irq_enabled && _txbuf.empty()) {
Nathan Yonkee 9:d58e77ebd769 318 SerialBase::attach(NULL, TxIrq);
Nathan Yonkee 9:d58e77ebd769 319 _tx_irq_enabled = false;
Nathan Yonkee 9:d58e77ebd769 320 }
Nathan Yonkee 9:d58e77ebd769 321
Nathan Yonkee 9:d58e77ebd769 322 /* Report the File handler that data can be written to peripheral. */
Nathan Yonkee 9:d58e77ebd769 323 if (was_full && !_txbuf.full() && !hup()) {
Nathan Yonkee 9:d58e77ebd769 324 wake();
Nathan Yonkee 9:d58e77ebd769 325 }
Nathan Yonkee 9:d58e77ebd769 326 }
Nathan Yonkee 9:d58e77ebd769 327
Nathan Yonkee 9:d58e77ebd769 328 void UARTSerial::wait_ms(uint32_t millisec)
Nathan Yonkee 9:d58e77ebd769 329 {
Nathan Yonkee 9:d58e77ebd769 330 /* wait_ms implementation for RTOS spins until exact microseconds - we
Nathan Yonkee 9:d58e77ebd769 331 * want to just sleep until next tick.
Nathan Yonkee 9:d58e77ebd769 332 */
Nathan Yonkee 9:d58e77ebd769 333 #if MBED_CONF_RTOS_PRESENT
Nathan Yonkee 9:d58e77ebd769 334 rtos::Thread::wait(millisec);
Nathan Yonkee 9:d58e77ebd769 335 #else
Nathan Yonkee 9:d58e77ebd769 336 ::wait_ms(millisec);
Nathan Yonkee 9:d58e77ebd769 337 #endif
Nathan Yonkee 9:d58e77ebd769 338 }
Nathan Yonkee 9:d58e77ebd769 339 } //namespace mbed
Nathan Yonkee 9:d58e77ebd769 340
Nathan Yonkee 9:d58e77ebd769 341 #endif //(DEVICE_SERIAL && DEVICE_INTERRUPTIN)