+ version 0.1.03

+ refactored for smaller footprint
+ added support for more datatypes
+ extended example eketch
This commit is contained in:
rob tillaart 2015-03-08 00:04:31 +01:00
parent 093fbf040e
commit 35b6713f81
3 changed files with 146 additions and 59 deletions

View File

@ -1,7 +1,7 @@
// //
// FILE: XMLWriter.cpp // FILE: XMLWriter.cpp
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.1.02 // VERSION: 0.1.03
// DATE: 2013-11-06 // DATE: 2013-11-06
// PURPOSE: Simple XML library // PURPOSE: Simple XML library
// //
@ -9,6 +9,7 @@
// 0.1.00 - 2013-11-06 initial version // 0.1.00 - 2013-11-06 initial version
// 0.1.01 - 2013-11-07 rework interfaces // 0.1.01 - 2013-11-07 rework interfaces
// 0.1.02 - 2013-11-07 +setIndentSize(), corrected history, +escape support // 0.1.02 - 2013-11-07 +setIndentSize(), corrected history, +escape support
// 0.1.03 - 2015-03-07 refactored - footprint + interface
// //
// Released to the public domain // Released to the public domain
// //
@ -36,19 +37,12 @@ void XMLWriter::header()
void XMLWriter::comment(char* text, bool multiLine) void XMLWriter::comment(char* text, bool multiLine)
{ {
_stream->println(); _stream->println();
if (multiLine) if (!multiLine) spaces();
{ _stream->print("<!-- ");
_stream->println("<!-- "); if (multiLine) _stream->println();
_stream->println(text); _stream->print(text);
_stream->println(" -->"); if (multiLine) _stream->println();
} _stream->println(" -->");
else
{
spaces();
_stream->print("<!-- ");
_stream->print(text);
_stream->println(" -->");
}
} }
void XMLWriter::tagOpen(char* tag, bool newline) void XMLWriter::tagOpen(char* tag, bool newline)
@ -58,7 +52,7 @@ void XMLWriter::tagOpen(char* tag, bool newline)
void XMLWriter::tagOpen(char* tag, char* name, bool newline) void XMLWriter::tagOpen(char* tag, char* name, bool newline)
{ {
strncpy(tagNames[_idx++], tag, 10); strncpy(tagStack[_idx++], tag, 10);
tagStart(tag); tagStart(tag);
if (name[0] != 0) tagField("name", name); if (name[0] != 0) tagField("name", name);
tagEnd(newline, NOSLASH); tagEnd(newline, NOSLASH);
@ -70,44 +64,44 @@ void XMLWriter::tagClose(bool indent)
_indent -= _indentStep; _indent -= _indentStep;
if (indent) spaces(); if (indent) spaces();
_stream->print("</"); _stream->print("</");
_stream->print(tagNames[--_idx]); _stream->print(tagStack[--_idx]);
_stream->println(">"); _stream->println(">");
} }
void XMLWriter::tagStart(char *tag) void XMLWriter::tagStart(char *tag)
{ {
spaces(); spaces();
_stream->write('<'); _stream->write("<");
_stream->print(tag); _stream->print(tag);
} }
void XMLWriter::tagField(char *field, char* value) void XMLWriter::tagField(char *field, char* str)
{ {
_stream->write(' '); _stream->write(" ");
_stream->print(field); _stream->print(field);
_stream->print("=\""); _stream->print("=\"");
#ifdef XMLWRITER_ESCAPE_SUPPORT #ifdef XMLWRITER_ESCAPE_SUPPORT
escape(value); escape(str);
#else #else
_stream->print(value); _stream->print(str);
#endif #endif
_stream->print("\""); _stream->print("\"");
} }
void XMLWriter::tagEnd(bool newline, bool addSlash) void XMLWriter::tagEnd(bool newline, bool addSlash)
{ {
if (addSlash) _stream->write('/'); if (addSlash) _stream->write("/");
_stream->print('>'); _stream->print(">");
if (newline) _stream->println(); if (newline) _stream->println();
} }
void XMLWriter::writeNode(char* tag, char* value) void XMLWriter::writeNode(char* tag, char* str)
{ {
tagOpen(tag, "", NONEWLINE); tagOpen(tag, "", NONEWLINE);
#ifdef XMLWRITER_ESCAPE_SUPPORT #ifdef XMLWRITER_ESCAPE_SUPPORT
escape(value); escape(str);
#else #else
_stream->print(value); _stream->print(str);
#endif #endif
tagClose(NOINDENT); tagClose(NOINDENT);
} }
@ -118,44 +112,101 @@ void XMLWriter::setIndentSize(uint8_t size)
} }
#ifdef XMLWRITER_EXTENDED #ifdef XMLWRITER_EXTENDED
void XMLWriter::tagField(char *field, int value) // void XMLWriter::tagField(char *field, uint8_t value, uint8_t base)
// {
// tagField(field, (uint32_t) value, base);
// }
// void XMLWriter::tagField(char *field, uint16_t value, uint8_t base)
// {
// tagField(field, (uint32_t) value, base);
// }
// void XMLWriter::tagField(char *field, uint32_t value, uint8_t base)
// {
// _stream->write(" ");
// _stream->print(field);
// _stream->print("=\"");
// _stream->print(value, base);
// _stream->print("\"");
// }
// void XMLWriter::tagField(char *field, int8_t value, uint8_t base)
// {
// tagField(field, (long) value, base);
// }
// void XMLWriter::tagField(char *field, int16_t value, uint8_t base)
// {
// tagField(field, (long) value, base);
// }
void XMLWriter::tagField(char *field, int32_t value, uint8_t base)
{ {
_stream->write(' '); _stream->write(" ");
_stream->print(field); _stream->print(field);
_stream->print("=\""); _stream->print("=\"");
_stream->print(value); _stream->print(value, base);
_stream->print("\""); _stream->print("\"");
} }
void XMLWriter::tagField(char *field, long value)
void XMLWriter::tagField(char *field, bool value)
{ {
_stream->write(' '); _stream->write(" ");
_stream->print(field); _stream->print(field);
_stream->print("=\""); _stream->print("=\"");
_stream->print(value); _stream->print(value?"true":"false");
_stream->print("\""); _stream->print("\"");
} }
void XMLWriter::tagField(char *field, double value, uint8_t decimals) void XMLWriter::tagField(char *field, double value, uint8_t decimals)
{ {
_stream->write(' '); _stream->write(" ");
_stream->print(field); _stream->print(field);
_stream->print("=\""); _stream->print("=\"");
_stream->print(value); _stream->print(value, decimals);
_stream->print("\""); _stream->print("\"");
} }
void XMLWriter::writeNode(char* tag, int value) void XMLWriter::writeNode(char* tag, uint8_t value, uint8_t base)
{ {
tagOpen(tag, "", NONEWLINE); // one line writeNode(tag, (uint32_t) value, base);
_stream->print(value); }
void XMLWriter::writeNode(char* tag, uint16_t value, uint8_t base)
{
writeNode(tag, (uint32_t) value, base);
}
void XMLWriter::writeNode(char* tag, uint32_t value, uint8_t base)
{
tagOpen(tag, "", NONEWLINE);
_stream->print(value, base);
tagClose(NOINDENT); tagClose(NOINDENT);
} }
void XMLWriter::writeNode(char* tag, long value) void XMLWriter::writeNode(char* tag, int8_t value, uint8_t base)
{
writeNode(tag, (int32_t) value, base);
}
void XMLWriter::writeNode(char* tag, int16_t value, uint8_t base)
{
writeNode(tag, (int32_t) value, base);
}
void XMLWriter::writeNode(char* tag, int32_t value, uint8_t base)
{ {
tagOpen(tag, "", NONEWLINE); tagOpen(tag, "", NONEWLINE);
_stream->print(value); _stream->print(value, base);
tagClose(NOINDENT);
}
void XMLWriter::writeNode(char* tag, bool value)
{
tagOpen(tag, "", NONEWLINE);
_stream->print(value?"true":"false");
tagClose(NOINDENT); tagClose(NOINDENT);
} }
@ -171,7 +222,7 @@ void XMLWriter::writeNode(char* tag, double value, uint8_t decimals)
void XMLWriter::spaces() void XMLWriter::spaces()
{ {
for (uint8_t i=_indent; i>0; i--) _stream->write(' '); for (uint8_t i=_indent; i>0; i--) _stream->write(" ");
} }
#ifdef XMLWRITER_ESCAPE_SUPPORT #ifdef XMLWRITER_ESCAPE_SUPPORT

View File

@ -3,7 +3,7 @@
// //
// FILE: XMLWriter.h // FILE: XMLWriter.h
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.1.02 // VERSION: 0.1.03
// DATE: 2013-11-06 // DATE: 2013-11-06
// PURPOSE: Simple XML writer library // PURPOSE: Simple XML writer library
// //
@ -11,24 +11,24 @@
// //
#include "Arduino.h" #include "Arduino.h"
// TODO pre 1.0 support ? // no pre 1.0 support!
#define XMLWRITER_VERSION "0.1.01" #define XMLWRITER_VERSION "0.1.03"
// for comment() // for comment()
#define MULTILINE true #define MULTILINE true
// for tagOpen(), tagEnd() // for tagOpen(), tagEnd()
#define NEWLINE true #define NEWLINE true
#define NONEWLINE false #define NONEWLINE false
#define NOINDENT false // for tagClose() #define NOINDENT false // for tagClose()
// for tagEnd() // for tagEnd()
#define SLASH true #define SLASH true
#define NOSLASH false #define NOSLASH false
// deepness of XML tree 5..10 // deepness of XML tree 5..10
// needed for stack of tagnames // needed for stack of tagStack
#define XMLWRITER_MAXLEVEL 5 #define XMLWRITER_MAXLEVEL 5
// reduce footprint by not using all // reduce footprint by not using all
@ -71,12 +71,22 @@ public:
void setIndentSize(uint8_t size); void setIndentSize(uint8_t size);
#ifdef XMLWRITER_EXTENDED #ifdef XMLWRITER_EXTENDED
void tagField(char* field, int value); void tagField(char* field, uint8_t value, uint8_t base=DEC);
void tagField(char* field, long value); void tagField(char* field, uint16_t value, uint8_t base=DEC);
void tagField(char* field, double value, uint8_t decimals=2); void tagField(char* field, uint32_t value, uint8_t base=DEC);
void tagField(char* field, int8_t value, uint8_t base=DEC);
void tagField(char* field, int16_t value, uint8_t base=DEC);
void tagField(char* field, int32_t value, uint8_t base=DEC);
void tagField(char *field, bool value);
void tagField(char* field, double value, uint8_t decimals=2);
void writeNode(char* tag, int value); void writeNode(char* tag, uint8_t value, uint8_t base=DEC);
void writeNode(char* tag, long value); void writeNode(char* tag, uint16_t value, uint8_t base=DEC);
void writeNode(char* tag, uint32_t value, uint8_t base=DEC);
void writeNode(char* tag, int8_t value, uint8_t base=DEC);
void writeNode(char* tag, int16_t value, uint8_t base=DEC);
void writeNode(char* tag, int32_t value, uint8_t base=DEC);
void writeNode(char* tag, bool value);
void writeNode(char* tag, double value, uint8_t decimals=2); void writeNode(char* tag, double value, uint8_t decimals=2);
#endif #endif
@ -98,7 +108,7 @@ private:
// stack - used to remember the current tagname to create // stack - used to remember the current tagname to create
// automatic the right close tag. // automatic the right close tag.
uint8_t _idx; uint8_t _idx;
char tagNames[XMLWRITER_MAXLEVEL][11]; char tagStack[XMLWRITER_MAXLEVEL][11];
}; };
#endif #endif

View File

@ -20,7 +20,7 @@ void setup()
Serial.begin(115200); Serial.begin(115200);
XML.header(); XML.header();
XML.comment("XMLWriterTest.ino\nThis is a demo of a simple XML lib for Arduino", MULTILINE); // MULTILINE == true. XML.comment("XMLWriterTest.ino\nThis is a demo of a simple XML lib for Arduino", true);
XML.tagOpen("Arduino", "42"); XML.tagOpen("Arduino", "42");
@ -32,6 +32,7 @@ void setup()
Weather(); Weather();
Weather2(); Weather2();
DataTypes();
XML.tagClose(); XML.tagClose();
} }
@ -85,8 +86,33 @@ void DigitalPorts()
XML.tagClose(); XML.tagClose();
} }
void DataTypes()
{
XML.comment("Testing dataTypes I");
XML.tagOpen("Datatypes");
XML.writeNode("Bool", 1 == 1);
XML.writeNode("Bool", 1 == 0);
XML.writeNode("BIN", 42, BIN);
XML.writeNode("DEC", 42, DEC);
XML.writeNode("HEX", 42, HEX);
XML.writeNode("OCT", 42, OCT);
XML.tagClose();
XML.comment("Testing dataTypes II");
for (int i=0; i<3; i++)
{
XML.tagStart("dataTypes");
XML.tagField("Bool", 1 == 1);
XML.tagField("Bool", 1 == 0);
int x = analogRead(A0);
XML.tagField("BIN", x, BIN);
XML.tagField("DEC", x, DEC);
XML.tagField("HEX", x, HEX);
XML.tagField("OCT", x, OCT);
XML.tagEnd();
}
}
void loop() void loop()
{ {
} }