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:
Tue Jan 23 15:08:43 2018 +0100
Revision:
39:deeb00b81cc9
Parent:
35:f9f3a91fe4d4
Release: 2.0.4

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 35:f9f3a91fe4d4 22 #if !defined(ARDUINO_ARCH_AVR) && !defined(ARDUINO_ARCH_SAM)
cassyarduino 7:ef1f092165eb 23
cassyarduino 7:ef1f092165eb 24 #include <stdlib.h>
cassyarduino 7:ef1f092165eb 25 #include <stdio.h>
cassyarduino 7:ef1f092165eb 26 #include <string.h>
cassyarduino 7:ef1f092165eb 27 #include <math.h>
cassyarduino 35:f9f3a91fe4d4 28 #if defined(ARDUINO)
cassyarduino 35:f9f3a91fe4d4 29 #include "Arduino.h"
cassyarduino 35:f9f3a91fe4d4 30 #include "Print.h"
cassyarduino 35:f9f3a91fe4d4 31 #endif
cassyarduino 7:ef1f092165eb 32
cassyarduino 35:f9f3a91fe4d4 33 #if defined(__MBED__)
cassyarduino 35:f9f3a91fe4d4 34 #include "mbed/Print.h"
cassyarduino 35:f9f3a91fe4d4 35 #endif
cassyarduino 7:ef1f092165eb 36
cassyarduino 7:ef1f092165eb 37 // Public Methods //////////////////////////////////////////////////////////////
cassyarduino 7:ef1f092165eb 38
cassyarduino 7:ef1f092165eb 39 /* default implementation: may be overridden */
cassyarduino 7:ef1f092165eb 40 size_t Print::write(const uint8_t *buffer, size_t size)
cassyarduino 7:ef1f092165eb 41 {
cassyarduino 7:ef1f092165eb 42 size_t n = 0;
cassyarduino 7:ef1f092165eb 43 while (size--) {
cassyarduino 7:ef1f092165eb 44 if (write(*buffer++)) n++;
cassyarduino 7:ef1f092165eb 45 else break;
cassyarduino 7:ef1f092165eb 46 }
cassyarduino 7:ef1f092165eb 47 return n;
cassyarduino 7:ef1f092165eb 48 }
cassyarduino 7:ef1f092165eb 49
cassyarduino 7:ef1f092165eb 50 size_t Print::print(const __FlashStringHelper *ifsh)
cassyarduino 7:ef1f092165eb 51 {
cassyarduino 7:ef1f092165eb 52 size_t n = print(ifsh);
cassyarduino 7:ef1f092165eb 53 n += println();
cassyarduino 7:ef1f092165eb 54 return n;
cassyarduino 7:ef1f092165eb 55 }
cassyarduino 7:ef1f092165eb 56
cassyarduino 7:ef1f092165eb 57 size_t Print::print(const String &s)
cassyarduino 7:ef1f092165eb 58 {
cassyarduino 7:ef1f092165eb 59 return write(s.c_str(), s.length());
cassyarduino 7:ef1f092165eb 60 }
cassyarduino 7:ef1f092165eb 61
cassyarduino 7:ef1f092165eb 62 size_t Print::print(const char str[])
cassyarduino 7:ef1f092165eb 63 {
cassyarduino 7:ef1f092165eb 64 return write(str);
cassyarduino 7:ef1f092165eb 65 }
cassyarduino 7:ef1f092165eb 66
cassyarduino 7:ef1f092165eb 67 size_t Print::print(char c)
cassyarduino 7:ef1f092165eb 68 {
cassyarduino 7:ef1f092165eb 69 return write(c);
cassyarduino 7:ef1f092165eb 70 }
cassyarduino 7:ef1f092165eb 71
cassyarduino 7:ef1f092165eb 72 size_t Print::print(unsigned char b, int base)
cassyarduino 7:ef1f092165eb 73 {
cassyarduino 7:ef1f092165eb 74 return print((unsigned long) b, base);
cassyarduino 7:ef1f092165eb 75 }
cassyarduino 7:ef1f092165eb 76
cassyarduino 7:ef1f092165eb 77 size_t Print::print(int n, int base)
cassyarduino 7:ef1f092165eb 78 {
cassyarduino 7:ef1f092165eb 79 return print((long) n, base);
cassyarduino 7:ef1f092165eb 80 }
cassyarduino 7:ef1f092165eb 81
cassyarduino 7:ef1f092165eb 82 size_t Print::print(unsigned int n, int base)
cassyarduino 7:ef1f092165eb 83 {
cassyarduino 7:ef1f092165eb 84 return print((unsigned long) n, base);
cassyarduino 7:ef1f092165eb 85 }
cassyarduino 7:ef1f092165eb 86
cassyarduino 7:ef1f092165eb 87 size_t Print::print(long n, int base)
cassyarduino 7:ef1f092165eb 88 {
cassyarduino 7:ef1f092165eb 89 if (base == 0) {
cassyarduino 7:ef1f092165eb 90 return write(n);
cassyarduino 7:ef1f092165eb 91 } else if (base == 10) {
cassyarduino 7:ef1f092165eb 92 if (n < 0) {
cassyarduino 7:ef1f092165eb 93 int t = print('-');
cassyarduino 7:ef1f092165eb 94 n = -n;
cassyarduino 7:ef1f092165eb 95 return printNumber(n, 10) + t;
cassyarduino 7:ef1f092165eb 96 }
cassyarduino 7:ef1f092165eb 97 return printNumber(n, 10);
cassyarduino 7:ef1f092165eb 98 } else {
cassyarduino 7:ef1f092165eb 99 return printNumber(n, base);
cassyarduino 7:ef1f092165eb 100 }
cassyarduino 7:ef1f092165eb 101 }
cassyarduino 7:ef1f092165eb 102
cassyarduino 7:ef1f092165eb 103 size_t Print::print(unsigned long n, int base)
cassyarduino 7:ef1f092165eb 104 {
cassyarduino 7:ef1f092165eb 105 if (base == 0) return write(n);
cassyarduino 7:ef1f092165eb 106 else return printNumber(n, base);
cassyarduino 7:ef1f092165eb 107 }
cassyarduino 7:ef1f092165eb 108
cassyarduino 7:ef1f092165eb 109 size_t Print::print(double n, int digits)
cassyarduino 7:ef1f092165eb 110 {
cassyarduino 7:ef1f092165eb 111 return printFloat(n, digits);
cassyarduino 7:ef1f092165eb 112 }
cassyarduino 7:ef1f092165eb 113
cassyarduino 7:ef1f092165eb 114 size_t Print::println(const __FlashStringHelper *ifsh)
cassyarduino 7:ef1f092165eb 115 {
cassyarduino 7:ef1f092165eb 116 size_t n = print(ifsh);
cassyarduino 7:ef1f092165eb 117 n += println();
cassyarduino 7:ef1f092165eb 118 return n;
cassyarduino 7:ef1f092165eb 119 }
cassyarduino 7:ef1f092165eb 120
cassyarduino 7:ef1f092165eb 121 size_t Print::print(const Printable& x)
cassyarduino 7:ef1f092165eb 122 {
cassyarduino 7:ef1f092165eb 123 return x.printTo(*this);
cassyarduino 7:ef1f092165eb 124 }
cassyarduino 7:ef1f092165eb 125
cassyarduino 7:ef1f092165eb 126 size_t Print::println(void)
cassyarduino 7:ef1f092165eb 127 {
cassyarduino 7:ef1f092165eb 128 return write("\r\n");
cassyarduino 7:ef1f092165eb 129 }
cassyarduino 7:ef1f092165eb 130
cassyarduino 7:ef1f092165eb 131 size_t Print::println(const String &s)
cassyarduino 7:ef1f092165eb 132 {
cassyarduino 7:ef1f092165eb 133 size_t n = print(s);
cassyarduino 7:ef1f092165eb 134 n += println();
cassyarduino 7:ef1f092165eb 135 return n;
cassyarduino 7:ef1f092165eb 136 }
cassyarduino 7:ef1f092165eb 137
cassyarduino 7:ef1f092165eb 138 size_t Print::println(const char c[])
cassyarduino 7:ef1f092165eb 139 {
cassyarduino 7:ef1f092165eb 140 size_t n = print(c);
cassyarduino 7:ef1f092165eb 141 n += println();
cassyarduino 7:ef1f092165eb 142 return n;
cassyarduino 7:ef1f092165eb 143 }
cassyarduino 7:ef1f092165eb 144
cassyarduino 7:ef1f092165eb 145 size_t Print::println(char c)
cassyarduino 7:ef1f092165eb 146 {
cassyarduino 7:ef1f092165eb 147 size_t n = print(c);
cassyarduino 7:ef1f092165eb 148 n += println();
cassyarduino 7:ef1f092165eb 149 return n;
cassyarduino 7:ef1f092165eb 150 }
cassyarduino 7:ef1f092165eb 151
cassyarduino 7:ef1f092165eb 152 size_t Print::println(unsigned char b, int base)
cassyarduino 7:ef1f092165eb 153 {
cassyarduino 7:ef1f092165eb 154 size_t n = print(b, base);
cassyarduino 7:ef1f092165eb 155 n += println();
cassyarduino 7:ef1f092165eb 156 return n;
cassyarduino 7:ef1f092165eb 157 }
cassyarduino 7:ef1f092165eb 158
cassyarduino 7:ef1f092165eb 159 size_t Print::println(int num, int base)
cassyarduino 7:ef1f092165eb 160 {
cassyarduino 7:ef1f092165eb 161 size_t n = print(num, base);
cassyarduino 7:ef1f092165eb 162 n += println();
cassyarduino 7:ef1f092165eb 163 return n;
cassyarduino 7:ef1f092165eb 164 }
cassyarduino 7:ef1f092165eb 165
cassyarduino 7:ef1f092165eb 166 size_t Print::println(unsigned int num, int base)
cassyarduino 7:ef1f092165eb 167 {
cassyarduino 7:ef1f092165eb 168 size_t n = print(num, base);
cassyarduino 7:ef1f092165eb 169 n += println();
cassyarduino 7:ef1f092165eb 170 return n;
cassyarduino 7:ef1f092165eb 171 }
cassyarduino 7:ef1f092165eb 172
cassyarduino 7:ef1f092165eb 173 size_t Print::println(long num, int base)
cassyarduino 7:ef1f092165eb 174 {
cassyarduino 7:ef1f092165eb 175 size_t n = print(num, base);
cassyarduino 7:ef1f092165eb 176 n += println();
cassyarduino 7:ef1f092165eb 177 return n;
cassyarduino 7:ef1f092165eb 178 }
cassyarduino 7:ef1f092165eb 179
cassyarduino 7:ef1f092165eb 180 size_t Print::println(unsigned long num, int base)
cassyarduino 7:ef1f092165eb 181 {
cassyarduino 7:ef1f092165eb 182 size_t n = print(num, base);
cassyarduino 7:ef1f092165eb 183 n += println();
cassyarduino 7:ef1f092165eb 184 return n;
cassyarduino 7:ef1f092165eb 185 }
cassyarduino 7:ef1f092165eb 186
cassyarduino 7:ef1f092165eb 187 size_t Print::println(double num, int digits)
cassyarduino 7:ef1f092165eb 188 {
cassyarduino 7:ef1f092165eb 189 size_t n = print(num, digits);
cassyarduino 7:ef1f092165eb 190 n += println();
cassyarduino 7:ef1f092165eb 191 return n;
cassyarduino 7:ef1f092165eb 192 }
cassyarduino 7:ef1f092165eb 193
cassyarduino 7:ef1f092165eb 194 size_t Print::println(const Printable& x)
cassyarduino 7:ef1f092165eb 195 {
cassyarduino 7:ef1f092165eb 196 size_t n = print(x);
cassyarduino 7:ef1f092165eb 197 n += println();
cassyarduino 7:ef1f092165eb 198 return n;
cassyarduino 7:ef1f092165eb 199 }
cassyarduino 7:ef1f092165eb 200
cassyarduino 7:ef1f092165eb 201 // Private Methods /////////////////////////////////////////////////////////////
cassyarduino 7:ef1f092165eb 202
cassyarduino 7:ef1f092165eb 203 size_t Print::printNumber(unsigned long n, uint8_t base)
cassyarduino 7:ef1f092165eb 204 {
cassyarduino 7:ef1f092165eb 205 char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
cassyarduino 7:ef1f092165eb 206 char *str = &buf[sizeof(buf) - 1];
cassyarduino 7:ef1f092165eb 207
cassyarduino 7:ef1f092165eb 208 *str = '\0';
cassyarduino 7:ef1f092165eb 209
cassyarduino 7:ef1f092165eb 210 // prevent crash if called with base == 1
cassyarduino 7:ef1f092165eb 211 if (base < 2) base = 10;
cassyarduino 7:ef1f092165eb 212
cassyarduino 7:ef1f092165eb 213 do {
cassyarduino 7:ef1f092165eb 214 char c = n % base;
cassyarduino 7:ef1f092165eb 215 n /= base;
cassyarduino 7:ef1f092165eb 216
cassyarduino 7:ef1f092165eb 217 *--str = c < 10 ? c + '0' : c + 'A' - 10;
cassyarduino 7:ef1f092165eb 218 } while(n);
cassyarduino 7:ef1f092165eb 219
cassyarduino 7:ef1f092165eb 220 return write(str);
cassyarduino 7:ef1f092165eb 221 }
cassyarduino 7:ef1f092165eb 222
cassyarduino 7:ef1f092165eb 223 size_t Print::printFloat(double number, uint8_t digits)
cassyarduino 7:ef1f092165eb 224 {
cassyarduino 7:ef1f092165eb 225 size_t n = 0;
cassyarduino 7:ef1f092165eb 226
cassyarduino 7:ef1f092165eb 227 if (isnan(number)) return print("nan");
cassyarduino 7:ef1f092165eb 228 if (isinf(number)) return print("inf");
cassyarduino 7:ef1f092165eb 229 if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
cassyarduino 7:ef1f092165eb 230 if (number <-4294967040.0) return print ("ovf"); // constant determined empirically
cassyarduino 7:ef1f092165eb 231
cassyarduino 7:ef1f092165eb 232 // Handle negative numbers
cassyarduino 7:ef1f092165eb 233 if (number < 0.0)
cassyarduino 7:ef1f092165eb 234 {
cassyarduino 7:ef1f092165eb 235 n += print('-');
cassyarduino 7:ef1f092165eb 236 number = -number;
cassyarduino 7:ef1f092165eb 237 }
cassyarduino 7:ef1f092165eb 238
cassyarduino 7:ef1f092165eb 239 // Round correctly so that print(1.999, 2) prints as "2.00"
cassyarduino 7:ef1f092165eb 240 double rounding = 0.5;
cassyarduino 7:ef1f092165eb 241 for (uint8_t i=0; i<digits; ++i)
cassyarduino 7:ef1f092165eb 242 rounding /= 10.0;
cassyarduino 7:ef1f092165eb 243
cassyarduino 7:ef1f092165eb 244 number += rounding;
cassyarduino 7:ef1f092165eb 245
cassyarduino 7:ef1f092165eb 246 // Extract the integer part of the number and print it
cassyarduino 7:ef1f092165eb 247 unsigned long int_part = (unsigned long)number;
cassyarduino 7:ef1f092165eb 248 double remainder = number - (double)int_part;
cassyarduino 7:ef1f092165eb 249 n += print(int_part);
cassyarduino 7:ef1f092165eb 250
cassyarduino 7:ef1f092165eb 251 // Print the decimal point, but only if there are digits beyond
cassyarduino 7:ef1f092165eb 252 if (digits > 0) {
cassyarduino 7:ef1f092165eb 253 n += print(".");
cassyarduino 7:ef1f092165eb 254 }
cassyarduino 7:ef1f092165eb 255
cassyarduino 7:ef1f092165eb 256 // Extract digits from the remainder one at a time
cassyarduino 7:ef1f092165eb 257 while (digits-- > 0)
cassyarduino 7:ef1f092165eb 258 {
cassyarduino 7:ef1f092165eb 259 remainder *= 10.0;
cassyarduino 7:ef1f092165eb 260 int toPrint = int(remainder);
cassyarduino 7:ef1f092165eb 261 n += print(toPrint);
cassyarduino 7:ef1f092165eb 262 remainder -= toPrint;
cassyarduino 7:ef1f092165eb 263 }
cassyarduino 7:ef1f092165eb 264
cassyarduino 7:ef1f092165eb 265 return n;
cassyarduino 7:ef1f092165eb 266 }
cassyarduino 35:f9f3a91fe4d4 267 #endif