mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2025-12-13 05:53:06 +01:00
use new api boatDataString for the UI
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "GwBoatData.h"
|
||||
#include <ArduinoJson/Json/TextFormatter.hpp>
|
||||
#define GWTYPE_DOUBLE 1
|
||||
#define GWTYPE_UINT32 2
|
||||
#define GWTYPE_UINT16 3
|
||||
@@ -30,8 +31,55 @@ GwBoatItemBase::GwBoatItemBase(String name, String format, unsigned long invalid
|
||||
this->name = name;
|
||||
this->format = format;
|
||||
this->type = 0;
|
||||
this->lastUpdateSource=-1;
|
||||
}
|
||||
#define STRING_SIZE 40
|
||||
GwBoatItemBase::StringWriter::StringWriter(){
|
||||
buffer=new uint8_t[STRING_SIZE];
|
||||
wp=buffer;
|
||||
bufferSize=STRING_SIZE;
|
||||
buffer [0]=0;
|
||||
};
|
||||
const char *GwBoatItemBase::StringWriter::c_str() const{
|
||||
return (const char *)buffer;
|
||||
}
|
||||
int GwBoatItemBase::StringWriter::getSize() const{
|
||||
return wp-buffer;
|
||||
}
|
||||
void GwBoatItemBase::StringWriter::reset(){
|
||||
wp=buffer;
|
||||
*wp=0;
|
||||
}
|
||||
void GwBoatItemBase::StringWriter::ensure(size_t size){
|
||||
size_t fill=wp-buffer;
|
||||
size_t newSize=bufferSize;
|
||||
while ((fill+size) >= (newSize-1) ){
|
||||
newSize+=STRING_SIZE;
|
||||
}
|
||||
if (newSize != bufferSize){
|
||||
uint8_t *newBuffer=new uint8_t[newSize];
|
||||
memcpy(newBuffer,buffer,fill);
|
||||
newBuffer[fill]=0;
|
||||
delete buffer;
|
||||
buffer=newBuffer;
|
||||
wp=newBuffer+fill;
|
||||
bufferSize=newSize;
|
||||
}
|
||||
}
|
||||
size_t GwBoatItemBase::StringWriter::write(uint8_t c){
|
||||
ensure(1);
|
||||
*wp=c;
|
||||
wp++;
|
||||
*wp=0;
|
||||
return 1;
|
||||
}
|
||||
size_t GwBoatItemBase::StringWriter::write(const uint8_t* s, size_t n){
|
||||
ensure(n);
|
||||
memcpy(wp,s,n);
|
||||
wp+=n;
|
||||
*wp=0;
|
||||
return n;
|
||||
}
|
||||
|
||||
template<class T> GwBoatItem<T>::GwBoatItem(String name,String formatInfo,unsigned long invalidTime,GwBoatItemMap *map):
|
||||
GwBoatItemBase(name,formatInfo,invalidTime){
|
||||
T dummy;
|
||||
@@ -39,7 +87,6 @@ template<class T> GwBoatItem<T>::GwBoatItem(String name,String formatInfo,unsign
|
||||
if (map){
|
||||
(*map)[name]=this;
|
||||
}
|
||||
lastUpdateSource=-1;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
@@ -88,6 +135,59 @@ void GwBoatItem<T>::toJsonDoc(JsonDocument *doc, unsigned long minTime)
|
||||
o[F("valid")] = isValid(minTime);
|
||||
o[F("format")] = format;
|
||||
}
|
||||
|
||||
|
||||
class WriterWrapper{
|
||||
GwBoatItemBase::StringWriter *writer=NULL;
|
||||
public:
|
||||
WriterWrapper(GwBoatItemBase::StringWriter *w){
|
||||
writer=w;
|
||||
}
|
||||
size_t write(uint8_t c){
|
||||
if (! writer) return 0;
|
||||
return writer->write(c);
|
||||
}
|
||||
size_t write(const uint8_t* s, size_t n){
|
||||
if (! writer) return 0;
|
||||
return writer->write(s,n);
|
||||
}
|
||||
};
|
||||
typedef ARDUINOJSON_NAMESPACE::TextFormatter<WriterWrapper> GwTextWriter;
|
||||
|
||||
static void writeToString(GwTextWriter *writer,const double &value){
|
||||
writer->writeFloat(value);
|
||||
}
|
||||
static void writeToString(GwTextWriter *writer,const uint16_t &value){
|
||||
writer->writeInteger(value);
|
||||
}
|
||||
static void writeToString(GwTextWriter *writer,const uint32_t &value){
|
||||
writer->writeInteger(value);
|
||||
}
|
||||
static void writeToString(GwTextWriter *writer,const int16_t &value){
|
||||
writer->writeInteger(value);
|
||||
}
|
||||
static void writeToString(GwTextWriter *writer,GwSatInfoList &value){
|
||||
writer->writeInteger(value.getNumSats());
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void GwBoatItem<T>::fillString(){
|
||||
writer.reset();
|
||||
WriterWrapper wrapper(&writer);
|
||||
GwTextWriter stringWriter(wrapper);
|
||||
stringWriter.writeRaw(name.c_str());
|
||||
stringWriter.writeChar(',');
|
||||
stringWriter.writeInteger(isValid()?1:0);
|
||||
stringWriter.writeChar(',');
|
||||
stringWriter.writeInteger(lastSet);
|
||||
stringWriter.writeChar(',');
|
||||
stringWriter.writeInteger(lastUpdateSource);
|
||||
stringWriter.writeChar(',');
|
||||
stringWriter.writeRaw(format.c_str());
|
||||
stringWriter.writeChar(',');
|
||||
writeToString(&stringWriter,data);
|
||||
}
|
||||
|
||||
template class GwBoatItem<double>;
|
||||
template class GwBoatItem<uint32_t>;
|
||||
template class GwBoatItem<uint16_t>;
|
||||
@@ -214,7 +314,14 @@ String GwBoatData::toJson() const {
|
||||
serializeJson(json,buf);
|
||||
return buf;
|
||||
}
|
||||
|
||||
String GwBoatData::toString(){
|
||||
String rt;
|
||||
for (auto it=values.begin() ; it != values.end();it++){
|
||||
rt+=it->second->getDataString();
|
||||
rt+="\n";
|
||||
}
|
||||
return rt;
|
||||
}
|
||||
double formatCourse(double cv)
|
||||
{
|
||||
double rt = cv * 180.0 / M_PI;
|
||||
|
||||
@@ -10,6 +10,19 @@
|
||||
|
||||
class GwBoatItemBase{
|
||||
public:
|
||||
class StringWriter{
|
||||
uint8_t *buffer =NULL;
|
||||
uint8_t *wp=NULL;
|
||||
size_t bufferSize=0;
|
||||
void ensure(size_t size);
|
||||
public:
|
||||
StringWriter();
|
||||
size_t write(uint8_t c);
|
||||
size_t write(const uint8_t* s, size_t n);
|
||||
const char * c_str() const;
|
||||
int getSize() const;
|
||||
void reset();
|
||||
};
|
||||
static const unsigned long INVALID_TIME=60000;
|
||||
//the formatter names that must be known in js
|
||||
GWSC(formatCourse);
|
||||
@@ -31,10 +44,12 @@ class GwBoatItemBase{
|
||||
unsigned long invalidTime=INVALID_TIME;
|
||||
String name;
|
||||
String format;
|
||||
StringWriter writer;
|
||||
void uls(unsigned long ts=0){
|
||||
if (ts) lastSet=ts;
|
||||
else lastSet=millis();
|
||||
}
|
||||
int lastUpdateSource;
|
||||
public:
|
||||
int getCurrentType(){return type;}
|
||||
unsigned long getLastSet() const {return lastSet;}
|
||||
@@ -44,9 +59,14 @@ class GwBoatItemBase{
|
||||
void invalidate(){
|
||||
lastSet=0;
|
||||
}
|
||||
const char *getDataString(){
|
||||
fillString();
|
||||
return writer.c_str();
|
||||
}
|
||||
virtual void fillString()=0;
|
||||
virtual void toJsonDoc(JsonDocument *doc, unsigned long minTime)=0;
|
||||
virtual size_t getJsonSize(){return JSON_OBJECT_SIZE(10);}
|
||||
virtual int getLastSource()=0;
|
||||
virtual int getLastSource(){return lastUpdateSource;}
|
||||
virtual void refresh(unsigned long ts=0){uls(ts);}
|
||||
String getName(){return name;}
|
||||
};
|
||||
@@ -54,7 +74,6 @@ class GwBoatData;
|
||||
template<class T> class GwBoatItem : public GwBoatItemBase{
|
||||
protected:
|
||||
T data;
|
||||
int lastUpdateSource;
|
||||
public:
|
||||
GwBoatItem(String name,String formatInfo,unsigned long invalidTime=INVALID_TIME,GwBoatItemMap *map=NULL);
|
||||
virtual ~GwBoatItem(){}
|
||||
@@ -67,6 +86,7 @@ template<class T> class GwBoatItem : public GwBoatItemBase{
|
||||
if (! isValid(millis())) return defaultv;
|
||||
return data;
|
||||
}
|
||||
virtual void fillString();
|
||||
virtual void toJsonDoc(JsonDocument *doc, unsigned long minTime);
|
||||
virtual int getLastSource(){return lastUpdateSource;}
|
||||
};
|
||||
@@ -178,6 +198,7 @@ class GwBoatData{
|
||||
template<class T> bool update(T value,int source,GwBoatItemNameProvider *provider);
|
||||
template<class T> T getDataWithDefault(T defaultv, GwBoatItemNameProvider *provider);
|
||||
String toJson() const;
|
||||
String toString();
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user