113 lines
1.9 KiB
C++
113 lines
1.9 KiB
C++
/************************************************************
|
|
|
|
TemplatePrinter Class
|
|
|
|
A basic templating engine for a stream of text.
|
|
This wraps the Arduino Print interface and writes to any
|
|
Print interface.
|
|
|
|
Written by Christopher Andrews (https://github.com/Chris--A)
|
|
|
|
************************************************************/
|
|
|
|
#include "TemplatePrinter.h"
|
|
|
|
void TemplatePrinter::resetParam(bool flush)
|
|
{
|
|
if (flush && _inParam)
|
|
{
|
|
_stream.write(_delimiter);
|
|
|
|
if (_paramPos)
|
|
_stream.print(_paramBuffer);
|
|
}
|
|
|
|
memset(_paramBuffer, 0, sizeof(_paramBuffer));
|
|
_paramPos = 0;
|
|
_inParam = false;
|
|
}
|
|
|
|
void TemplatePrinter::flush()
|
|
{
|
|
resetParam(true);
|
|
_stream.flush();
|
|
}
|
|
|
|
size_t TemplatePrinter::write(uint8_t data)
|
|
{
|
|
|
|
if (data == _delimiter)
|
|
{
|
|
|
|
// End of parameter, send to callback
|
|
if (_inParam)
|
|
{
|
|
|
|
// On false, return the parameter place holder as is: not a parameter
|
|
// Bug fix: ignore parameters that are zero length.
|
|
if (!_paramPos || !_cb(_stream, _paramBuffer))
|
|
{
|
|
resetParam(true);
|
|
_stream.write(data);
|
|
}
|
|
else
|
|
{
|
|
resetParam(false);
|
|
}
|
|
|
|
// Start collecting parameter
|
|
}
|
|
else
|
|
{
|
|
_inParam = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
// Are we collecting
|
|
if (_inParam)
|
|
{
|
|
|
|
// Is param still valid
|
|
if (isalnum(data) || data == '_')
|
|
{
|
|
|
|
// Total param len must be 63, 1 for null.
|
|
if (_paramPos < sizeof(_paramBuffer) - 1)
|
|
{
|
|
_paramBuffer[_paramPos++] = data;
|
|
|
|
// Not a valid param
|
|
}
|
|
else
|
|
{
|
|
resetParam(true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
resetParam(true);
|
|
_stream.write(data);
|
|
}
|
|
|
|
// Just output
|
|
}
|
|
else
|
|
{
|
|
_stream.write(data);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
size_t TemplatePrinter::copyFrom(Stream& stream)
|
|
{
|
|
size_t count = 0;
|
|
|
|
while (stream.available())
|
|
count += this->write(stream.read());
|
|
|
|
return count;
|
|
}
|