UIPEthernet library for Arduino IDE, Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32,Nordic nRF51,Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API. Compiled and tested on Nucleo-F302R8. Master repository is: https://github.com/UIPEthernet/UIPEthernet/

Committer:
cassyarduino
Date:
Wed Dec 28 13:02:52 2016 +0000
Revision:
7:ef1f092165eb
Child:
35:f9f3a91fe4d4
Try add using print class

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cassyarduino 7:ef1f092165eb 1 /*
cassyarduino 7:ef1f092165eb 2 Print.cpp - Base class that provides print() and println()
cassyarduino 7:ef1f092165eb 3 Copyright (c) 2008 David A. Mellis. All right reserved.
cassyarduino 7:ef1f092165eb 4
cassyarduino 7:ef1f092165eb 5 This library is free software; you can redistribute it and/or
cassyarduino 7:ef1f092165eb 6 modify it under the terms of the GNU Lesser General Public
cassyarduino 7:ef1f092165eb 7 License as published by the Free Software Foundation; either
cassyarduino 7:ef1f092165eb 8 version 2.1 of the License, or (at your option) any later version.
cassyarduino 7:ef1f092165eb 9
cassyarduino 7:ef1f092165eb 10 This library is distributed in the hope that it will be useful,
cassyarduino 7:ef1f092165eb 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
cassyarduino 7:ef1f092165eb 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
cassyarduino 7:ef1f092165eb 13 Lesser General Public License for more details.
cassyarduino 7:ef1f092165eb 14
cassyarduino 7:ef1f092165eb 15 You should have received a copy of the GNU Lesser General Public
cassyarduino 7:ef1f092165eb 16 License along with this library; if not, write to the Free Software
cassyarduino 7:ef1f092165eb 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
cassyarduino 7:ef1f092165eb 18
cassyarduino 7:ef1f092165eb 19 Modified 23 November 2006 by David A. Mellis
cassyarduino 7:ef1f092165eb 20 Modified 03 August 2015 by Chuck Todd
cassyarduino 7:ef1f092165eb 21 */
cassyarduino 7:ef1f092165eb 22
cassyarduino 7:ef1f092165eb 23 #include <stdlib.h>
cassyarduino 7:ef1f092165eb 24 #include <stdio.h>
cassyarduino 7:ef1f092165eb 25 #include <string.h>
cassyarduino 7:ef1f092165eb 26 #include <math.h>
cassyarduino 7:ef1f092165eb 27 //#include "Arduino.h"
cassyarduino 7:ef1f092165eb 28
cassyarduino 7:ef1f092165eb 29 #include "Print.h"
cassyarduino 7:ef1f092165eb 30
cassyarduino 7:ef1f092165eb 31 // Public Methods //////////////////////////////////////////////////////////////
cassyarduino 7:ef1f092165eb 32
cassyarduino 7:ef1f092165eb 33 /* default implementation: may be overridden */
cassyarduino 7:ef1f092165eb 34 size_t Print::write(const uint8_t *buffer, size_t size)
cassyarduino 7:ef1f092165eb 35 {
cassyarduino 7:ef1f092165eb 36 size_t n = 0;
cassyarduino 7:ef1f092165eb 37 while (size--) {
cassyarduino 7:ef1f092165eb 38 if (write(*buffer++)) n++;
cassyarduino 7:ef1f092165eb 39 else break;
cassyarduino 7:ef1f092165eb 40 }
cassyarduino 7:ef1f092165eb 41 return n;
cassyarduino 7:ef1f092165eb 42 }
cassyarduino 7:ef1f092165eb 43
cassyarduino 7:ef1f092165eb 44 size_t Print::print(const __FlashStringHelper *ifsh)
cassyarduino 7:ef1f092165eb 45 {
cassyarduino 7:ef1f092165eb 46 size_t n = print(ifsh);
cassyarduino 7:ef1f092165eb 47 n += println();
cassyarduino 7:ef1f092165eb 48 return n;
cassyarduino 7:ef1f092165eb 49 }
cassyarduino 7:ef1f092165eb 50
cassyarduino 7:ef1f092165eb 51 size_t Print::print(const String &s)
cassyarduino 7:ef1f092165eb 52 {
cassyarduino 7:ef1f092165eb 53 return write(s.c_str(), s.length());
cassyarduino 7:ef1f092165eb 54 }
cassyarduino 7:ef1f092165eb 55
cassyarduino 7:ef1f092165eb 56 size_t Print::print(const char str[])
cassyarduino 7:ef1f092165eb 57 {
cassyarduino 7:ef1f092165eb 58 return write(str);
cassyarduino 7:ef1f092165eb 59 }
cassyarduino 7:ef1f092165eb 60
cassyarduino 7:ef1f092165eb 61 size_t Print::print(char c)
cassyarduino 7:ef1f092165eb 62 {
cassyarduino 7:ef1f092165eb 63 return write(c);
cassyarduino 7:ef1f092165eb 64 }
cassyarduino 7:ef1f092165eb 65
cassyarduino 7:ef1f092165eb 66 size_t Print::print(unsigned char b, int base)
cassyarduino 7:ef1f092165eb 67 {
cassyarduino 7:ef1f092165eb 68 return print((unsigned long) b, base);
cassyarduino 7:ef1f092165eb 69 }
cassyarduino 7:ef1f092165eb 70
cassyarduino 7:ef1f092165eb 71 size_t Print::print(int n, int base)
cassyarduino 7:ef1f092165eb 72 {
cassyarduino 7:ef1f092165eb 73 return print((long) n, base);
cassyarduino 7:ef1f092165eb 74 }
cassyarduino 7:ef1f092165eb 75
cassyarduino 7:ef1f092165eb 76 size_t Print::print(unsigned int n, int base)
cassyarduino 7:ef1f092165eb 77 {
cassyarduino 7:ef1f092165eb 78 return print((unsigned long) n, base);
cassyarduino 7:ef1f092165eb 79 }
cassyarduino 7:ef1f092165eb 80
cassyarduino 7:ef1f092165eb 81 size_t Print::print(long n, int base)
cassyarduino 7:ef1f092165eb 82 {
cassyarduino 7:ef1f092165eb 83 if (base == 0) {
cassyarduino 7:ef1f092165eb 84 return write(n);
cassyarduino 7:ef1f092165eb 85 } else if (base == 10) {
cassyarduino 7:ef1f092165eb 86 if (n < 0) {
cassyarduino 7:ef1f092165eb 87 int t = print('-');
cassyarduino 7:ef1f092165eb 88 n = -n;
cassyarduino 7:ef1f092165eb 89 return printNumber(n, 10) + t;
cassyarduino 7:ef1f092165eb 90 }
cassyarduino 7:ef1f092165eb 91 return printNumber(n, 10);
cassyarduino 7:ef1f092165eb 92 } else {
cassyarduino 7:ef1f092165eb 93 return printNumber(n, base);
cassyarduino 7:ef1f092165eb 94 }
cassyarduino 7:ef1f092165eb 95 }
cassyarduino 7:ef1f092165eb 96
cassyarduino 7:ef1f092165eb 97 size_t Print::print(unsigned long n, int base)
cassyarduino 7:ef1f092165eb 98 {
cassyarduino 7:ef1f092165eb 99 if (base == 0) return write(n);
cassyarduino 7:ef1f092165eb 100 else return printNumber(n, base);
cassyarduino 7:ef1f092165eb 101 }
cassyarduino 7:ef1f092165eb 102
cassyarduino 7:ef1f092165eb 103 size_t Print::print(double n, int digits)
cassyarduino 7:ef1f092165eb 104 {
cassyarduino 7:ef1f092165eb 105 return printFloat(n, digits);
cassyarduino 7:ef1f092165eb 106 }
cassyarduino 7:ef1f092165eb 107
cassyarduino 7:ef1f092165eb 108 size_t Print::println(const __FlashStringHelper *ifsh)
cassyarduino 7:ef1f092165eb 109 {
cassyarduino 7:ef1f092165eb 110 size_t n = print(ifsh);
cassyarduino 7:ef1f092165eb 111 n += println();
cassyarduino 7:ef1f092165eb 112 return n;
cassyarduino 7:ef1f092165eb 113 }
cassyarduino 7:ef1f092165eb 114
cassyarduino 7:ef1f092165eb 115 size_t Print::print(const Printable& x)
cassyarduino 7:ef1f092165eb 116 {
cassyarduino 7:ef1f092165eb 117 return x.printTo(*this);
cassyarduino 7:ef1f092165eb 118 }
cassyarduino 7:ef1f092165eb 119
cassyarduino 7:ef1f092165eb 120 size_t Print::println(void)
cassyarduino 7:ef1f092165eb 121 {
cassyarduino 7:ef1f092165eb 122 return write("\r\n");
cassyarduino 7:ef1f092165eb 123 }
cassyarduino 7:ef1f092165eb 124
cassyarduino 7:ef1f092165eb 125 size_t Print::println(const String &s)
cassyarduino 7:ef1f092165eb 126 {
cassyarduino 7:ef1f092165eb 127 size_t n = print(s);
cassyarduino 7:ef1f092165eb 128 n += println();
cassyarduino 7:ef1f092165eb 129 return n;
cassyarduino 7:ef1f092165eb 130 }
cassyarduino 7:ef1f092165eb 131
cassyarduino 7:ef1f092165eb 132 size_t Print::println(const char c[])
cassyarduino 7:ef1f092165eb 133 {
cassyarduino 7:ef1f092165eb 134 size_t n = print(c);
cassyarduino 7:ef1f092165eb 135 n += println();
cassyarduino 7:ef1f092165eb 136 return n;
cassyarduino 7:ef1f092165eb 137 }
cassyarduino 7:ef1f092165eb 138
cassyarduino 7:ef1f092165eb 139 size_t Print::println(char c)
cassyarduino 7:ef1f092165eb 140 {
cassyarduino 7:ef1f092165eb 141 size_t n = print(c);
cassyarduino 7:ef1f092165eb 142 n += println();
cassyarduino 7:ef1f092165eb 143 return n;
cassyarduino 7:ef1f092165eb 144 }
cassyarduino 7:ef1f092165eb 145
cassyarduino 7:ef1f092165eb 146 size_t Print::println(unsigned char b, int base)
cassyarduino 7:ef1f092165eb 147 {
cassyarduino 7:ef1f092165eb 148 size_t n = print(b, base);
cassyarduino 7:ef1f092165eb 149 n += println();
cassyarduino 7:ef1f092165eb 150 return n;
cassyarduino 7:ef1f092165eb 151 }
cassyarduino 7:ef1f092165eb 152
cassyarduino 7:ef1f092165eb 153 size_t Print::println(int num, int base)
cassyarduino 7:ef1f092165eb 154 {
cassyarduino 7:ef1f092165eb 155 size_t n = print(num, base);
cassyarduino 7:ef1f092165eb 156 n += println();
cassyarduino 7:ef1f092165eb 157 return n;
cassyarduino 7:ef1f092165eb 158 }
cassyarduino 7:ef1f092165eb 159
cassyarduino 7:ef1f092165eb 160 size_t Print::println(unsigned int num, int base)
cassyarduino 7:ef1f092165eb 161 {
cassyarduino 7:ef1f092165eb 162 size_t n = print(num, base);
cassyarduino 7:ef1f092165eb 163 n += println();
cassyarduino 7:ef1f092165eb 164 return n;
cassyarduino 7:ef1f092165eb 165 }
cassyarduino 7:ef1f092165eb 166
cassyarduino 7:ef1f092165eb 167 size_t Print::println(long num, int base)
cassyarduino 7:ef1f092165eb 168 {
cassyarduino 7:ef1f092165eb 169 size_t n = print(num, base);
cassyarduino 7:ef1f092165eb 170 n += println();
cassyarduino 7:ef1f092165eb 171 return n;
cassyarduino 7:ef1f092165eb 172 }
cassyarduino 7:ef1f092165eb 173
cassyarduino 7:ef1f092165eb 174 size_t Print::println(unsigned long num, int base)
cassyarduino 7:ef1f092165eb 175 {
cassyarduino 7:ef1f092165eb 176 size_t n = print(num, base);
cassyarduino 7:ef1f092165eb 177 n += println();
cassyarduino 7:ef1f092165eb 178 return n;
cassyarduino 7:ef1f092165eb 179 }
cassyarduino 7:ef1f092165eb 180
cassyarduino 7:ef1f092165eb 181 size_t Print::println(double num, int digits)
cassyarduino 7:ef1f092165eb 182 {
cassyarduino 7:ef1f092165eb 183 size_t n = print(num, digits);
cassyarduino 7:ef1f092165eb 184 n += println();
cassyarduino 7:ef1f092165eb 185 return n;
cassyarduino 7:ef1f092165eb 186 }
cassyarduino 7:ef1f092165eb 187
cassyarduino 7:ef1f092165eb 188 size_t Print::println(const Printable& x)
cassyarduino 7:ef1f092165eb 189 {
cassyarduino 7:ef1f092165eb 190 size_t n = print(x);
cassyarduino 7:ef1f092165eb 191 n += println();
cassyarduino 7:ef1f092165eb 192 return n;
cassyarduino 7:ef1f092165eb 193 }
cassyarduino 7:ef1f092165eb 194
cassyarduino 7:ef1f092165eb 195 // Private Methods /////////////////////////////////////////////////////////////
cassyarduino 7:ef1f092165eb 196
cassyarduino 7:ef1f092165eb 197 size_t Print::printNumber(unsigned long n, uint8_t base)
cassyarduino 7:ef1f092165eb 198 {
cassyarduino 7:ef1f092165eb 199 char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
cassyarduino 7:ef1f092165eb 200 char *str = &buf[sizeof(buf) - 1];
cassyarduino 7:ef1f092165eb 201
cassyarduino 7:ef1f092165eb 202 *str = '\0';
cassyarduino 7:ef1f092165eb 203
cassyarduino 7:ef1f092165eb 204 // prevent crash if called with base == 1
cassyarduino 7:ef1f092165eb 205 if (base < 2) base = 10;
cassyarduino 7:ef1f092165eb 206
cassyarduino 7:ef1f092165eb 207 do {
cassyarduino 7:ef1f092165eb 208 char c = n % base;
cassyarduino 7:ef1f092165eb 209 n /= base;
cassyarduino 7:ef1f092165eb 210
cassyarduino 7:ef1f092165eb 211 *--str = c < 10 ? c + '0' : c + 'A' - 10;
cassyarduino 7:ef1f092165eb 212 } while(n);
cassyarduino 7:ef1f092165eb 213
cassyarduino 7:ef1f092165eb 214 return write(str);
cassyarduino 7:ef1f092165eb 215 }
cassyarduino 7:ef1f092165eb 216
cassyarduino 7:ef1f092165eb 217 size_t Print::printFloat(double number, uint8_t digits)
cassyarduino 7:ef1f092165eb 218 {
cassyarduino 7:ef1f092165eb 219 size_t n = 0;
cassyarduino 7:ef1f092165eb 220
cassyarduino 7:ef1f092165eb 221 if (isnan(number)) return print("nan");
cassyarduino 7:ef1f092165eb 222 if (isinf(number)) return print("inf");
cassyarduino 7:ef1f092165eb 223 if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
cassyarduino 7:ef1f092165eb 224 if (number <-4294967040.0) return print ("ovf"); // constant determined empirically
cassyarduino 7:ef1f092165eb 225
cassyarduino 7:ef1f092165eb 226 // Handle negative numbers
cassyarduino 7:ef1f092165eb 227 if (number < 0.0)
cassyarduino 7:ef1f092165eb 228 {
cassyarduino 7:ef1f092165eb 229 n += print('-');
cassyarduino 7:ef1f092165eb 230 number = -number;
cassyarduino 7:ef1f092165eb 231 }
cassyarduino 7:ef1f092165eb 232
cassyarduino 7:ef1f092165eb 233 // Round correctly so that print(1.999, 2) prints as "2.00"
cassyarduino 7:ef1f092165eb 234 double rounding = 0.5;
cassyarduino 7:ef1f092165eb 235 for (uint8_t i=0; i<digits; ++i)
cassyarduino 7:ef1f092165eb 236 rounding /= 10.0;
cassyarduino 7:ef1f092165eb 237
cassyarduino 7:ef1f092165eb 238 number += rounding;
cassyarduino 7:ef1f092165eb 239
cassyarduino 7:ef1f092165eb 240 // Extract the integer part of the number and print it
cassyarduino 7:ef1f092165eb 241 unsigned long int_part = (unsigned long)number;
cassyarduino 7:ef1f092165eb 242 double remainder = number - (double)int_part;
cassyarduino 7:ef1f092165eb 243 n += print(int_part);
cassyarduino 7:ef1f092165eb 244
cassyarduino 7:ef1f092165eb 245 // Print the decimal point, but only if there are digits beyond
cassyarduino 7:ef1f092165eb 246 if (digits > 0) {
cassyarduino 7:ef1f092165eb 247 n += print(".");
cassyarduino 7:ef1f092165eb 248 }
cassyarduino 7:ef1f092165eb 249
cassyarduino 7:ef1f092165eb 250 // Extract digits from the remainder one at a time
cassyarduino 7:ef1f092165eb 251 while (digits-- > 0)
cassyarduino 7:ef1f092165eb 252 {
cassyarduino 7:ef1f092165eb 253 remainder *= 10.0;
cassyarduino 7:ef1f092165eb 254 int toPrint = int(remainder);
cassyarduino 7:ef1f092165eb 255 n += print(toPrint);
cassyarduino 7:ef1f092165eb 256 remainder -= toPrint;
cassyarduino 7:ef1f092165eb 257 }
cassyarduino 7:ef1f092165eb 258
cassyarduino 7:ef1f092165eb 259 return n;
cassyarduino 7:ef1f092165eb 260 }