+ version 0.1.01

+ complete rewritten to be more logical (still work in progress)
+ made some private methods public
+ made some methods conditional to keep footprint small
+ updated demo program to show various methods
This commit is contained in:
Rob Tillaart 2013-11-07 20:02:40 +01:00
parent b6b7d7ec47
commit 65f592b29d
3 changed files with 176 additions and 79 deletions

View File

@ -1,20 +1,29 @@
//
// FILE: XMLWriter.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// VERSION: 0.1.01
// DATE: 2013-11-06
// PURPOSE: Simple XML library
//
// HISTORY:
// 0.1.00 - 2011-01-21 initial version//
// 0.1.00 - 2011-11-06 initial version
// 0.1.01 - 2011-11-07 rework interfaces
//
// Released to the public domain
//
#include <XMLWriter.h>
#define XMLWRITER_INDENT_STEP 2
XMLWriter::XMLWriter(Print* stream)
{
_stream = stream;
reset();
}
void XMLWriter::reset()
{
_indent = 0;
_idx = 0;
}
@ -24,49 +33,70 @@ void XMLWriter::header()
_stream->println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
void XMLWriter::comment(char* text, bool oneLiner)
void XMLWriter::comment(char* text, bool multiLine)
{
_stream->println();
if (oneLiner)
if (multiLine)
{
_stream->println("<!-- ");
_stream->println(text);
_stream->println(" -->");
}
else
{
spaces();
_stream->print("<!-- ");
_stream->print(text);
_stream->println(" -->");
}
else
{
_stream->println("<!-- ");
_stream->println(text);
_stream->println(" -->");
}
}
void XMLWriter::tagOpen(char* tag, bool oneLiner)
void XMLWriter::tagOpen(char* tag, bool newline)
{
tagOpen(tag, "", oneLiner);
tagOpen(tag, "", newline);
}
void XMLWriter::tagOpen(char* tag, char* name, bool oneLiner)
void XMLWriter::tagOpen(char* tag, char* name, bool newline)
{
strncpy(tagnames[_idx++], tag, 10);
spaces();
tagStart(tag);
if (name[0] != 0) tagField("name", name);
tagEnd();
if (oneLiner) _stream->println();
_indent += 2;
tagEnd(newline, false);
_indent += XMLWRITER_INDENT_STEP;
}
void XMLWriter::tagClose(bool indent)
{
_indent -= 2;
_indent -= XMLWRITER_INDENT_STEP;
if (indent) spaces();
_stream->print("</");
_stream->print(tagnames[--_idx]);
_stream->println(">");
}
void XMLWriter::tagStart(char *tag)
{
spaces();
_stream->write('<');
_stream->print(tag);
}
void XMLWriter::tagField(char *field, char* value)
{
_stream->write(' ');
_stream->print(field);
_stream->print("=\"");
_stream->print(value);
_stream->print("\"");
}
void XMLWriter::tagEnd(bool newline, bool addSlash)
{
if (addSlash) _stream->write('/');
_stream->print('>');
if (newline) _stream->println();
}
void XMLWriter::writeNode(char* tag, char* value)
{
tagOpen(tag, "", false);
@ -74,15 +104,8 @@ void XMLWriter::writeNode(char* tag, char* value)
tagClose(false);
}
////////////////////////////////////////////////////////////////////
void XMLWriter::tagStart(char *tag)
{
_stream->write('<');
_stream->print(tag);
}
inline void XMLWriter::tagField(char *field, char* value)
#ifdef XMLWRITER_EXTENDED
void XMLWriter::tagField(char *field, int value)
{
_stream->write(' ');
_stream->print(field);
@ -91,11 +114,48 @@ inline void XMLWriter::tagField(char *field, char* value)
_stream->print("\"");
}
inline void XMLWriter::tagEnd()
void XMLWriter::tagField(char *field, long value)
{
_stream->write('>');
_stream->write(' ');
_stream->print(field);
_stream->print("=\"");
_stream->print(value);
_stream->print("\"");
}
void XMLWriter::tagField(char *field, double value, uint8_t decimals)
{
_stream->write(' ');
_stream->print(field);
_stream->print("=\"");
_stream->print(value);
_stream->print("\"");
}
void XMLWriter::writeNode(char* tag, int value)
{
tagOpen(tag, "", false); // one line
_stream->print(value);
tagClose(false);
}
void XMLWriter::writeNode(char* tag, long value)
{
tagOpen(tag, "", false);
_stream->print(value);
tagClose(false);
}
void XMLWriter::writeNode(char* tag, double value, uint8_t decimals)
{
tagOpen(tag, "", false);
_stream->print(value, decimals);
tagClose(false);
}
#endif
////////////////////////////////////////////////////////////////////
void XMLWriter::spaces()
{
for (uint8_t i=0; i< _indent; i++) _stream->write(' ');

View File

@ -3,19 +3,21 @@
//
// FILE: XMLWriter.h
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// VERSION: 0.1.01
// DATE: 2013-11-06
// PURPOSE: Simple XML writer library
//
// Released to the public domain
//
#define XMLWRITER_VERSION "0.1.00"
#define XMLWRITER_VERSION "0.1.01"
// deepness of XML tree 5..10
// needed for stack of tagnames
#define XMLWRITER_MAXLEVEL 5
#define XMLWRITER_EXTENDED
#include "Arduino.h"
class XMLWriter
@ -23,18 +25,31 @@ class XMLWriter
public:
XMLWriter(Print* stream);
void reset();
void header();
void comment(char* text, bool oneLiner=true);
void tagOpen(char* tag, bool oneLiner=true);
void tagOpen(char* tag, char* name, bool oneLiner=true);
void comment(char* text, bool multiLine=false);
void tagOpen(char* tag, bool newline=true);
void tagOpen(char* tag, char* name, bool newline=true);
void tagClose(bool indent=true);
void tagStart(char* tag);
void tagField(char* field, char* value);
void tagEnd(bool newline=true, bool addSlash=true);
void writeNode(char* tag, char* value);
private:
void tagStart(char *tag);
void tagField(char *field, char* value);
void tagEnd();
#ifdef XMLWRITER_EXTENDED
void tagField(char* field, int value);
void tagField(char* field, long value);
void tagField(char* field, double value, uint8_t decimals=2);
void writeNode(char* tag, int value);
void writeNode(char* tag, long value);
void writeNode(char* tag, double value, uint8_t decimals=2);
#endif
private:
void spaces();
Print* _stream;

View File

@ -1,7 +1,7 @@
//
// FILE: XMLWriterTest.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// VERSION: 0.1.01
// PURPOSE: make a simple XML generating lib
// DATE: 2013-11-06
// URL:
@ -20,44 +20,41 @@ void setup()
Serial.begin(115200);
XML.header();
XML.comment("XMLWriterTest.ino\n This is a demo of a simple XML lib for Arduino");
XML.comment("XMLWriterTest.ino\nThis is a demo of a simple XML lib for Arduino", true);
XML.tagOpen("Arduino", "42");
XML.tagOpen("Ports");
doAnalogPorts("before");
doDigitalPorts();
doAnalogPorts("after");
AnalogPorts("before");
DigitalPorts();
AnalogPorts("after");
XML.tagClose();
doWeather();
Weather();
Weather2();
XML.tagClose();
}
void doAnalogPorts(char* name)
void Weather2()
{
XML.comment("The analog ports are multiplexed", true);
XML.tagOpen("Analog", name);
XML.writeNode("Analog0", itoa(analogRead(A0), buffer, 10));
XML.writeNode("Analog1", itoa(analogRead(A1), buffer, 10));
XML.writeNode("Analog2", itoa(analogRead(A2), buffer, 10));
XML.tagClose();
XML.comment("The weather in South Africa");
for (int i=0; i<10; i++)
{
XML.tagStart("Weather");
XML.tagField("Date", "20131106");
XML.tagField("Time", "1:42");
XML.tagField("Temp", "23.4");
XML.tagField("Humi", "50%");
XML.tagField("Rain", "10mm");
XML.tagField("Sun", "40");
XML.tagEnd();
}
}
void doDigitalPorts()
void Weather()
{
XML.comment("The digital ports are not multiplexed", true);
XML.tagOpen("Digital");
XML.writeNode("D1", itoa(digitalRead(1), buffer, 10));
XML.writeNode("D13", itoa(digitalRead(13), buffer, 10));
XML.writeNode("D10", itoa(digitalRead(10), buffer, 10));
XML.tagClose();
}
void doWeather()
{
XML.comment("The weather in Nebraska", true);
XML.comment("The weather in Nebraska");
XML.tagOpen("Weather");
XML.writeNode("Date", "20131106");
XML.writeNode("Time", "11:42");
@ -68,6 +65,31 @@ void doWeather()
XML.tagClose();
}
void AnalogPorts(char* name)
{
XML.comment("The analog ports are multiplexed");
XML.tagOpen("Analog", name);
XML.writeNode("Analog0", itoa(analogRead(A0), buffer, 10));
XML.writeNode("Analog1", analogRead(A1));
XML.writeNode("Analog2", (5.0*analogRead(A2))/1023); // default nr decimals = 2
XML.writeNode("Analog2", (5.0*analogRead(A2))/1023, 3);
XML.tagClose();
}
void DigitalPorts()
{
XML.comment("The digital ports are not multiplexed");
XML.tagOpen("Digital");
XML.writeNode("D1", itoa(digitalRead(1), buffer, 10));
XML.writeNode("D13", digitalRead(13));
XML.tagClose();
}
void loop()
{
}