Arduino Serial + Serial base = less flash usage

Committer:
eveolution
Date:
Mon Aug 25 19:04:02 2014 +0000
Revision:
0:7b9f0f2e2724
Serial base + Arduino Serial code = less flash usage

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eveolution 0:7b9f0f2e2724 1 /*
eveolution 0:7b9f0f2e2724 2 Print.h - Base class that provides print() and println()
eveolution 0:7b9f0f2e2724 3 Copyright (c) 2008 David A. Mellis. All right reserved.
eveolution 0:7b9f0f2e2724 4
eveolution 0:7b9f0f2e2724 5 This library is free software; you can redistribute it and/or
eveolution 0:7b9f0f2e2724 6 modify it under the terms of the GNU Lesser General Public
eveolution 0:7b9f0f2e2724 7 License as published by the Free Software Foundation; either
eveolution 0:7b9f0f2e2724 8 version 2.1 of the License, or (at your option) any later version.
eveolution 0:7b9f0f2e2724 9
eveolution 0:7b9f0f2e2724 10 This library is distributed in the hope that it will be useful,
eveolution 0:7b9f0f2e2724 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
eveolution 0:7b9f0f2e2724 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
eveolution 0:7b9f0f2e2724 13 Lesser General Public License for more details.
eveolution 0:7b9f0f2e2724 14
eveolution 0:7b9f0f2e2724 15 You should have received a copy of the GNU Lesser General Public
eveolution 0:7b9f0f2e2724 16 License along with this library; if not, write to the Free Software
eveolution 0:7b9f0f2e2724 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
eveolution 0:7b9f0f2e2724 18 */
eveolution 0:7b9f0f2e2724 19
eveolution 0:7b9f0f2e2724 20 /* mbed Microcontroller Library
eveolution 0:7b9f0f2e2724 21 * Copyright (c) 2006-2013 ARM Limited
eveolution 0:7b9f0f2e2724 22 *
eveolution 0:7b9f0f2e2724 23 * Licensed under the Apache License, Version 2.0 (the "License");
eveolution 0:7b9f0f2e2724 24 * you may not use this file except in compliance with the License.
eveolution 0:7b9f0f2e2724 25 * You may obtain a copy of the License at
eveolution 0:7b9f0f2e2724 26 *
eveolution 0:7b9f0f2e2724 27 * http://www.apache.org/licenses/LICENSE-2.0
eveolution 0:7b9f0f2e2724 28 *
eveolution 0:7b9f0f2e2724 29 * Unless required by applicable law or agreed to in writing, software
eveolution 0:7b9f0f2e2724 30 * distributed under the License is distributed on an "AS IS" BASIS,
eveolution 0:7b9f0f2e2724 31 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
eveolution 0:7b9f0f2e2724 32 * See the License for the specific language governing permissions and
eveolution 0:7b9f0f2e2724 33 * limitations under the License.
eveolution 0:7b9f0f2e2724 34 */
eveolution 0:7b9f0f2e2724 35 #include "ardSerial.h"
eveolution 0:7b9f0f2e2724 36 #include "wait_api.h"
eveolution 0:7b9f0f2e2724 37
eveolution 0:7b9f0f2e2724 38 #if DEVICE_SERIAL
eveolution 0:7b9f0f2e2724 39
eveolution 0:7b9f0f2e2724 40 //namespace mbed {
eveolution 0:7b9f0f2e2724 41
eveolution 0:7b9f0f2e2724 42 ardSerial::ardSerial(PinName tx, PinName rx) : mbed::SerialBase(tx, rx) {
eveolution 0:7b9f0f2e2724 43 }
eveolution 0:7b9f0f2e2724 44
eveolution 0:7b9f0f2e2724 45 int ardSerial::getc() {
eveolution 0:7b9f0f2e2724 46 return _base_getc();
eveolution 0:7b9f0f2e2724 47 }
eveolution 0:7b9f0f2e2724 48
eveolution 0:7b9f0f2e2724 49 int ardSerial::putc(int c) {
eveolution 0:7b9f0f2e2724 50 return _base_putc(c);
eveolution 0:7b9f0f2e2724 51 }
eveolution 0:7b9f0f2e2724 52
eveolution 0:7b9f0f2e2724 53 int ardSerial::puts(const char *str) {
eveolution 0:7b9f0f2e2724 54 while (*str)
eveolution 0:7b9f0f2e2724 55 putc(*str ++);
eveolution 0:7b9f0f2e2724 56 return 0;
eveolution 0:7b9f0f2e2724 57 }
eveolution 0:7b9f0f2e2724 58
eveolution 0:7b9f0f2e2724 59 int ardSerial::write(uint8_t c) {
eveolution 0:7b9f0f2e2724 60 return _base_putc(c);
eveolution 0:7b9f0f2e2724 61 }
eveolution 0:7b9f0f2e2724 62
eveolution 0:7b9f0f2e2724 63 int ardSerial::write(const uint8_t *buffer, size_t size)
eveolution 0:7b9f0f2e2724 64 {
eveolution 0:7b9f0f2e2724 65 size_t n = 0;
eveolution 0:7b9f0f2e2724 66 while (size--) {
eveolution 0:7b9f0f2e2724 67 n += write(*buffer++);
eveolution 0:7b9f0f2e2724 68 }
eveolution 0:7b9f0f2e2724 69 return n;
eveolution 0:7b9f0f2e2724 70 }
eveolution 0:7b9f0f2e2724 71
eveolution 0:7b9f0f2e2724 72
eveolution 0:7b9f0f2e2724 73 int ardSerial::print(const char str[])
eveolution 0:7b9f0f2e2724 74 {
eveolution 0:7b9f0f2e2724 75 return write(str);
eveolution 0:7b9f0f2e2724 76 }
eveolution 0:7b9f0f2e2724 77
eveolution 0:7b9f0f2e2724 78 int ardSerial::print(char c)
eveolution 0:7b9f0f2e2724 79 {
eveolution 0:7b9f0f2e2724 80 return write(c);
eveolution 0:7b9f0f2e2724 81 }
eveolution 0:7b9f0f2e2724 82
eveolution 0:7b9f0f2e2724 83 int ardSerial::print(unsigned char b, int base)
eveolution 0:7b9f0f2e2724 84 {
eveolution 0:7b9f0f2e2724 85 return print((unsigned long) b, base);
eveolution 0:7b9f0f2e2724 86 }
eveolution 0:7b9f0f2e2724 87
eveolution 0:7b9f0f2e2724 88 int ardSerial::print(int n, int base)
eveolution 0:7b9f0f2e2724 89 {
eveolution 0:7b9f0f2e2724 90 return print((long) n, base);
eveolution 0:7b9f0f2e2724 91 }
eveolution 0:7b9f0f2e2724 92
eveolution 0:7b9f0f2e2724 93 int ardSerial::print(unsigned int n, int base)
eveolution 0:7b9f0f2e2724 94 {
eveolution 0:7b9f0f2e2724 95 return print((unsigned long) n, base);
eveolution 0:7b9f0f2e2724 96 }
eveolution 0:7b9f0f2e2724 97
eveolution 0:7b9f0f2e2724 98 int ardSerial::print(long n, int base)
eveolution 0:7b9f0f2e2724 99 {
eveolution 0:7b9f0f2e2724 100 if (base == 0) {
eveolution 0:7b9f0f2e2724 101 return write(n);
eveolution 0:7b9f0f2e2724 102 } else if (base == 10) {
eveolution 0:7b9f0f2e2724 103 if (n < 0) {
eveolution 0:7b9f0f2e2724 104 int t = print('-');
eveolution 0:7b9f0f2e2724 105 n = -n;
eveolution 0:7b9f0f2e2724 106 return printNumber(n, 10) + t;
eveolution 0:7b9f0f2e2724 107 }
eveolution 0:7b9f0f2e2724 108 return printNumber(n, 10);
eveolution 0:7b9f0f2e2724 109 } else {
eveolution 0:7b9f0f2e2724 110 return printNumber(n, base);
eveolution 0:7b9f0f2e2724 111 }
eveolution 0:7b9f0f2e2724 112 }
eveolution 0:7b9f0f2e2724 113
eveolution 0:7b9f0f2e2724 114 int ardSerial::print(unsigned long n, int base)
eveolution 0:7b9f0f2e2724 115 {
eveolution 0:7b9f0f2e2724 116 if (base == 0) return write(n);
eveolution 0:7b9f0f2e2724 117 else return printNumber(n, base);
eveolution 0:7b9f0f2e2724 118 }
eveolution 0:7b9f0f2e2724 119
eveolution 0:7b9f0f2e2724 120 int ardSerial::print(double n, int digits)
eveolution 0:7b9f0f2e2724 121 {
eveolution 0:7b9f0f2e2724 122 return printFloat(n, digits);
eveolution 0:7b9f0f2e2724 123 }
eveolution 0:7b9f0f2e2724 124
eveolution 0:7b9f0f2e2724 125 // Private Methods /////////////////////////////////////////////////////////////
eveolution 0:7b9f0f2e2724 126
eveolution 0:7b9f0f2e2724 127 int ardSerial::printNumber(unsigned long n, uint8_t base) {
eveolution 0:7b9f0f2e2724 128 char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
eveolution 0:7b9f0f2e2724 129 char *str = &buf[sizeof(buf) - 1];
eveolution 0:7b9f0f2e2724 130
eveolution 0:7b9f0f2e2724 131 *str = '\0';
eveolution 0:7b9f0f2e2724 132
eveolution 0:7b9f0f2e2724 133 // prevent crash if called with base == 1
eveolution 0:7b9f0f2e2724 134 if (base < 2) base = 10;
eveolution 0:7b9f0f2e2724 135
eveolution 0:7b9f0f2e2724 136 do {
eveolution 0:7b9f0f2e2724 137 unsigned long m = n;
eveolution 0:7b9f0f2e2724 138 n /= base;
eveolution 0:7b9f0f2e2724 139 char c = m - base * n;
eveolution 0:7b9f0f2e2724 140 *--str = c < 10 ? c + '0' : c + 'A' - 10;
eveolution 0:7b9f0f2e2724 141 } while(n);
eveolution 0:7b9f0f2e2724 142
eveolution 0:7b9f0f2e2724 143 return write(str);
eveolution 0:7b9f0f2e2724 144 }
eveolution 0:7b9f0f2e2724 145
eveolution 0:7b9f0f2e2724 146 int ardSerial::printFloat(double number, uint8_t digits)
eveolution 0:7b9f0f2e2724 147 {
eveolution 0:7b9f0f2e2724 148 size_t n = 0;
eveolution 0:7b9f0f2e2724 149
eveolution 0:7b9f0f2e2724 150 if (isnan(number)) return print("nan");
eveolution 0:7b9f0f2e2724 151 if (isinf(number)) return print("inf");
eveolution 0:7b9f0f2e2724 152 if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
eveolution 0:7b9f0f2e2724 153 if (number <-4294967040.0) return print ("ovf"); // constant determined empirically
eveolution 0:7b9f0f2e2724 154
eveolution 0:7b9f0f2e2724 155 // Handle negative numbers
eveolution 0:7b9f0f2e2724 156 if (number < 0.0)
eveolution 0:7b9f0f2e2724 157 {
eveolution 0:7b9f0f2e2724 158 n += print('-');
eveolution 0:7b9f0f2e2724 159 number = -number;
eveolution 0:7b9f0f2e2724 160 }
eveolution 0:7b9f0f2e2724 161
eveolution 0:7b9f0f2e2724 162 // Round correctly so that print(1.999, 2) prints as "2.00"
eveolution 0:7b9f0f2e2724 163 double rounding = 0.5;
eveolution 0:7b9f0f2e2724 164 for (uint8_t i=0; i<digits; ++i)
eveolution 0:7b9f0f2e2724 165 rounding /= 10.0;
eveolution 0:7b9f0f2e2724 166
eveolution 0:7b9f0f2e2724 167 number += rounding;
eveolution 0:7b9f0f2e2724 168
eveolution 0:7b9f0f2e2724 169 // Extract the integer part of the number and print it
eveolution 0:7b9f0f2e2724 170 unsigned long int_part = (unsigned long)number;
eveolution 0:7b9f0f2e2724 171 double remainder = number - (double)int_part;
eveolution 0:7b9f0f2e2724 172 n += print(int_part);
eveolution 0:7b9f0f2e2724 173
eveolution 0:7b9f0f2e2724 174 // Print the decimal point, but only if there are digits beyond
eveolution 0:7b9f0f2e2724 175 if (digits > 0) {
eveolution 0:7b9f0f2e2724 176 n += print(".");
eveolution 0:7b9f0f2e2724 177 }
eveolution 0:7b9f0f2e2724 178
eveolution 0:7b9f0f2e2724 179 // Extract digits from the remainder one at a time
eveolution 0:7b9f0f2e2724 180 while (digits-- > 0)
eveolution 0:7b9f0f2e2724 181 {
eveolution 0:7b9f0f2e2724 182 remainder *= 10.0;
eveolution 0:7b9f0f2e2724 183 int toPrint = int(remainder);
eveolution 0:7b9f0f2e2724 184 n += print(toPrint);
eveolution 0:7b9f0f2e2724 185 remainder -= toPrint;
eveolution 0:7b9f0f2e2724 186 }
eveolution 0:7b9f0f2e2724 187
eveolution 0:7b9f0f2e2724 188 return n;
eveolution 0:7b9f0f2e2724 189 }
eveolution 0:7b9f0f2e2724 190
eveolution 0:7b9f0f2e2724 191 //} // namespace mbed
eveolution 0:7b9f0f2e2724 192 #endif
eveolution 0:7b9f0f2e2724 193