mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
+ 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:
parent
b6b7d7ec47
commit
65f592b29d
@ -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(' ');
|
||||
|
@ -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
|
||||
// deepness of XML tree 5..10
|
||||
// needed for stack of tagnames
|
||||
#define XMLWRITER_MAXLEVEL 5
|
||||
|
||||
#define XMLWRITER_EXTENDED
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
class XMLWriter
|
||||
@ -23,23 +25,36 @@ 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 tagClose(bool indent=true);
|
||||
void writeNode(char* tag, char* value);
|
||||
|
||||
private:
|
||||
void tagStart(char *tag);
|
||||
void tagField(char *field, char* value);
|
||||
void tagEnd();
|
||||
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);
|
||||
|
||||
#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;
|
||||
uint8_t _indent;
|
||||
|
||||
|
||||
uint8_t _idx;
|
||||
char tagnames[XMLWRITER_MAXLEVEL][11];
|
||||
};
|
||||
|
@ -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:
|
||||
@ -17,57 +17,79 @@ char buffer[24];
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.begin(115200);
|
||||
|
||||
XML.header();
|
||||
XML.comment("XMLWriterTest.ino\n This is a demo of a simple XML lib for Arduino");
|
||||
XML.header();
|
||||
XML.comment("XMLWriterTest.ino\nThis is a demo of a simple XML lib for Arduino", true);
|
||||
|
||||
XML.tagOpen("Arduino", "42");
|
||||
XML.tagOpen("Arduino", "42");
|
||||
|
||||
XML.tagOpen("Ports");
|
||||
doAnalogPorts("before");
|
||||
doDigitalPorts();
|
||||
doAnalogPorts("after");
|
||||
XML.tagClose();
|
||||
XML.tagOpen("Ports");
|
||||
AnalogPorts("before");
|
||||
DigitalPorts();
|
||||
AnalogPorts("after");
|
||||
XML.tagClose();
|
||||
|
||||
doWeather();
|
||||
Weather();
|
||||
Weather2();
|
||||
|
||||
XML.tagClose();
|
||||
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();
|
||||
XML.comment("The weather in Nebraska");
|
||||
XML.tagOpen("Weather");
|
||||
XML.writeNode("Date", "20131106");
|
||||
XML.writeNode("Time", "11:42");
|
||||
XML.writeNode("Temp", "23.4");
|
||||
XML.writeNode("Humi", "50%");
|
||||
XML.writeNode("Rain", "10mm");
|
||||
XML.writeNode("Sun", "40");
|
||||
XML.tagClose();
|
||||
}
|
||||
|
||||
void doWeather()
|
||||
void AnalogPorts(char* name)
|
||||
{
|
||||
XML.comment("The weather in Nebraska", true);
|
||||
XML.tagOpen("Weather");
|
||||
XML.writeNode("Date", "20131106");
|
||||
XML.writeNode("Time", "11:42");
|
||||
XML.writeNode("Temp", "23.4");
|
||||
XML.writeNode("Humi", "50%");
|
||||
XML.writeNode("Rain", "10mm");
|
||||
XML.writeNode("Sun", "40");
|
||||
XML.tagClose();
|
||||
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()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user