inport from local

Dependents:   Hobbyking_Cheetah_0511

Committer:
NYX
Date:
Mon Mar 16 06:35:48 2020 +0000
Revision:
0:85b3fd62ea1a
reinport to mbed;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NYX 0:85b3fd62ea1a 1 /* mbed Microcontroller Library
NYX 0:85b3fd62ea1a 2 * Copyright (c) 2006-2013 ARM Limited
NYX 0:85b3fd62ea1a 3 *
NYX 0:85b3fd62ea1a 4 * Licensed under the Apache License, Version 2.0 (the "License");
NYX 0:85b3fd62ea1a 5 * you may not use this file except in compliance with the License.
NYX 0:85b3fd62ea1a 6 * You may obtain a copy of the License at
NYX 0:85b3fd62ea1a 7 *
NYX 0:85b3fd62ea1a 8 * http://www.apache.org/licenses/LICENSE-2.0
NYX 0:85b3fd62ea1a 9 *
NYX 0:85b3fd62ea1a 10 * Unless required by applicable law or agreed to in writing, software
NYX 0:85b3fd62ea1a 11 * distributed under the License is distributed on an "AS IS" BASIS,
NYX 0:85b3fd62ea1a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
NYX 0:85b3fd62ea1a 13 * See the License for the specific language governing permissions and
NYX 0:85b3fd62ea1a 14 * limitations under the License.
NYX 0:85b3fd62ea1a 15 */
NYX 0:85b3fd62ea1a 16 #include "drivers/RawSerial.h"
NYX 0:85b3fd62ea1a 17 #include "platform/mbed_wait_api.h"
NYX 0:85b3fd62ea1a 18 #include <stdio.h>
NYX 0:85b3fd62ea1a 19 #include <cstdarg>
NYX 0:85b3fd62ea1a 20
NYX 0:85b3fd62ea1a 21
NYX 0:85b3fd62ea1a 22 #if DEVICE_SERIAL
NYX 0:85b3fd62ea1a 23
NYX 0:85b3fd62ea1a 24 #define STRING_STACK_LIMIT 120
NYX 0:85b3fd62ea1a 25
NYX 0:85b3fd62ea1a 26 namespace mbed {
NYX 0:85b3fd62ea1a 27
NYX 0:85b3fd62ea1a 28 RawSerial::RawSerial(PinName tx, PinName rx, int baud) : SerialBase(tx, rx, baud) {
NYX 0:85b3fd62ea1a 29 // No lock needed in the constructor
NYX 0:85b3fd62ea1a 30 }
NYX 0:85b3fd62ea1a 31
NYX 0:85b3fd62ea1a 32 int RawSerial::getc() {
NYX 0:85b3fd62ea1a 33 lock();
NYX 0:85b3fd62ea1a 34 int ret = _base_getc();
NYX 0:85b3fd62ea1a 35 unlock();
NYX 0:85b3fd62ea1a 36 return ret;
NYX 0:85b3fd62ea1a 37 }
NYX 0:85b3fd62ea1a 38
NYX 0:85b3fd62ea1a 39 int RawSerial::putc(int c) {
NYX 0:85b3fd62ea1a 40 lock();
NYX 0:85b3fd62ea1a 41 int ret = _base_putc(c);
NYX 0:85b3fd62ea1a 42 unlock();
NYX 0:85b3fd62ea1a 43 return ret;
NYX 0:85b3fd62ea1a 44 }
NYX 0:85b3fd62ea1a 45
NYX 0:85b3fd62ea1a 46 int RawSerial::puts(const char *str) {
NYX 0:85b3fd62ea1a 47 lock();
NYX 0:85b3fd62ea1a 48 while (*str)
NYX 0:85b3fd62ea1a 49 putc(*str ++);
NYX 0:85b3fd62ea1a 50 unlock();
NYX 0:85b3fd62ea1a 51 return 0;
NYX 0:85b3fd62ea1a 52 }
NYX 0:85b3fd62ea1a 53
NYX 0:85b3fd62ea1a 54 // Experimental support for printf in RawSerial. No Stream inheritance
NYX 0:85b3fd62ea1a 55 // means we can't call printf() directly, so we use sprintf() instead.
NYX 0:85b3fd62ea1a 56 // We only call malloc() for the sprintf() buffer if the buffer
NYX 0:85b3fd62ea1a 57 // length is above a certain threshold, otherwise we use just the stack.
NYX 0:85b3fd62ea1a 58 int RawSerial::printf(const char *format, ...) {
NYX 0:85b3fd62ea1a 59 lock();
NYX 0:85b3fd62ea1a 60 std::va_list arg;
NYX 0:85b3fd62ea1a 61 va_start(arg, format);
NYX 0:85b3fd62ea1a 62 // ARMCC microlib does not properly handle a size of 0.
NYX 0:85b3fd62ea1a 63 // As a workaround supply a dummy buffer with a size of 1.
NYX 0:85b3fd62ea1a 64 char dummy_buf[1];
NYX 0:85b3fd62ea1a 65 int len = vsnprintf(dummy_buf, sizeof(dummy_buf), format, arg);
NYX 0:85b3fd62ea1a 66 if (len < STRING_STACK_LIMIT) {
NYX 0:85b3fd62ea1a 67 char temp[STRING_STACK_LIMIT];
NYX 0:85b3fd62ea1a 68 vsprintf(temp, format, arg);
NYX 0:85b3fd62ea1a 69 puts(temp);
NYX 0:85b3fd62ea1a 70 } else {
NYX 0:85b3fd62ea1a 71 char *temp = new char[len + 1];
NYX 0:85b3fd62ea1a 72 vsprintf(temp, format, arg);
NYX 0:85b3fd62ea1a 73 puts(temp);
NYX 0:85b3fd62ea1a 74 delete[] temp;
NYX 0:85b3fd62ea1a 75 }
NYX 0:85b3fd62ea1a 76 va_end(arg);
NYX 0:85b3fd62ea1a 77 unlock();
NYX 0:85b3fd62ea1a 78 return len;
NYX 0:85b3fd62ea1a 79 }
NYX 0:85b3fd62ea1a 80
NYX 0:85b3fd62ea1a 81 /** Acquire exclusive access to this serial port
NYX 0:85b3fd62ea1a 82 */
NYX 0:85b3fd62ea1a 83 void RawSerial::lock() {
NYX 0:85b3fd62ea1a 84 // No lock used - external synchronization required
NYX 0:85b3fd62ea1a 85 }
NYX 0:85b3fd62ea1a 86
NYX 0:85b3fd62ea1a 87 /** Release exclusive access to this serial port
NYX 0:85b3fd62ea1a 88 */
NYX 0:85b3fd62ea1a 89 void RawSerial::unlock() {
NYX 0:85b3fd62ea1a 90 // No lock used - external synchronization required
NYX 0:85b3fd62ea1a 91 }
NYX 0:85b3fd62ea1a 92
NYX 0:85b3fd62ea1a 93 } // namespace mbed
NYX 0:85b3fd62ea1a 94
NYX 0:85b3fd62ea1a 95 #endif