From 87a04fc06424a66db100437c6f7b925f8da26994 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Sat, 4 Jun 2011 09:19:17 -0400 Subject: [PATCH 1/2] Added Printable interface class to allow printing of classes such as IPAddress --- hardware/arduino/cores/arduino/Print.cpp | 11 +++++++ hardware/arduino/cores/arduino/Print.h | 3 ++ hardware/arduino/cores/arduino/Printable.h | 37 ++++++++++++++++++++++ libraries/Ethernet/IPAddress.cpp | 10 ++++++ libraries/Ethernet/IPAddress.h | 6 +++- 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 hardware/arduino/cores/arduino/Printable.h diff --git a/hardware/arduino/cores/arduino/Print.cpp b/hardware/arduino/cores/arduino/Print.cpp index 0a580b7b0..06ac52a5e 100755 --- a/hardware/arduino/cores/arduino/Print.cpp +++ b/hardware/arduino/cores/arduino/Print.cpp @@ -117,6 +117,11 @@ void Print::println(const __FlashStringHelper *ifsh) println(); } +void Print::print(const Printable& x) +{ + x.printTo(*this); +} + void Print::println(void) { print('\r'); @@ -177,6 +182,12 @@ void Print::println(double n, int digits) println(); } +void Print::println(const Printable& x) +{ + print(x); + println(); +} + // Private Methods ///////////////////////////////////////////////////////////// void Print::printNumber(unsigned long n, uint8_t base) { diff --git a/hardware/arduino/cores/arduino/Print.h b/hardware/arduino/cores/arduino/Print.h index a4477535b..bf10b1477 100755 --- a/hardware/arduino/cores/arduino/Print.h +++ b/hardware/arduino/cores/arduino/Print.h @@ -24,6 +24,7 @@ #include // for size_t #include "WString.h" +#include "Printable.h" #define DEC 10 #define HEX 16 @@ -50,6 +51,7 @@ class Print void print(long, int = DEC); void print(unsigned long, int = DEC); void print(double, int = 2); + void print(const Printable&); void println(const __FlashStringHelper *); void println(const String &s); @@ -61,6 +63,7 @@ class Print void println(long, int = DEC); void println(unsigned long, int = DEC); void println(double, int = 2); + void println(const Printable&); void println(void); }; diff --git a/hardware/arduino/cores/arduino/Printable.h b/hardware/arduino/cores/arduino/Printable.h new file mode 100644 index 000000000..d332aad1c --- /dev/null +++ b/hardware/arduino/cores/arduino/Printable.h @@ -0,0 +1,37 @@ +/* + Printable.h - Interface class that allows printing of complex types + Copyright (c) 2011 Adrian McEwen. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef Printable_h +#define Printable_h + +class Print; + +/** The Printable class provides a way for new classes to allow themselves to be printed. + By deriving from Printable and implementing the printTo method, it will then be possible + for users to print out instances of this class by passing them into the usual + Print::print and Print::println methods. +*/ +class Printable +{ + public: + virtual void printTo(Print& p) const = 0; +}; + +#endif + diff --git a/libraries/Ethernet/IPAddress.cpp b/libraries/Ethernet/IPAddress.cpp index 610ff4c53..77928b5cb 100644 --- a/libraries/Ethernet/IPAddress.cpp +++ b/libraries/Ethernet/IPAddress.cpp @@ -42,3 +42,13 @@ bool IPAddress::operator==(const uint8_t* addr) return memcmp(addr, _address, sizeof(_address)) == 0; } +void IPAddress::printTo(Print& p) const +{ + for (int i =0; i < 3; i++) + { + p.print(_address[i], DEC); + p.print('.'); + } + p.print(_address[3], DEC); +} + diff --git a/libraries/Ethernet/IPAddress.h b/libraries/Ethernet/IPAddress.h index 487e420bd..7dd520351 100644 --- a/libraries/Ethernet/IPAddress.h +++ b/libraries/Ethernet/IPAddress.h @@ -26,9 +26,11 @@ #ifndef IPAddress_h #define IPAddress_h +#include + // A class to make it easier to handle and pass around IP addresses -class IPAddress { +class IPAddress : public Printable { private: uint8_t _address[4]; // IPv4 address // Access the raw byte array containing the address. Because this returns a pointer @@ -58,6 +60,8 @@ public: IPAddress& operator=(const uint8_t *address); IPAddress& operator=(uint32_t address); + virtual void printTo(Print& p) const; + friend class EthernetClass; friend class UDP; friend class Client; From 4c73aaf1869fc2a1373b13c1e7e81b88c17ccd05 Mon Sep 17 00:00:00 2001 From: tigoe Date: Thu, 9 Jun 2011 04:08:38 -0700 Subject: [PATCH 2/2] Edited build/shared/examples/4.Communication/SerialEvent/SerialEvent.ino via GitHub --- .../shared/examples/4.Communication/SerialEvent/SerialEvent.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/shared/examples/4.Communication/SerialEvent/SerialEvent.ino b/build/shared/examples/4.Communication/SerialEvent/SerialEvent.ino index 2f3f917e5..458c43dad 100644 --- a/build/shared/examples/4.Communication/SerialEvent/SerialEvent.ino +++ b/build/shared/examples/4.Communication/SerialEvent/SerialEvent.ino @@ -39,7 +39,7 @@ void loop() { /* SerialEvent occurs whenever a new byte comes in the - hardware serial RX. Don't do complex things here, as thge + hardware serial RX. Don't do complex things here, as the processor halts the regular program to run this routine: */ void serialEvent() {