/************************************************************ 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; }