From 8610d94382cae6cbb48579ef42a32aafabe9d63c Mon Sep 17 00:00:00 2001 From: wellenvogel Date: Mon, 22 Nov 2021 12:16:19 +0100 Subject: [PATCH] xdrExample and xdrUnmapped requests --- lib/xdrmappings/GwXDRMappings.cpp | 45 ++++++++++++++++++++++++++++-- lib/xdrmappings/GwXDRMappings.h | 2 ++ src/main.cpp | 46 +++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) diff --git a/lib/xdrmappings/GwXDRMappings.cpp b/lib/xdrmappings/GwXDRMappings.cpp index 1207693..7af8533 100644 --- a/lib/xdrmappings/GwXDRMappings.cpp +++ b/lib/xdrmappings/GwXDRMappings.cpp @@ -201,6 +201,23 @@ String GwXDRMappingDef::getTransducerName(int instance) return name; } +String GwXDRFoundMapping::buildXdrEntry(double value) +{ + char buffer[40]; + String name = getTransducerName(); + if (type->tonmea) + { + value = (*(type->tonmea))(value); + } + snprintf(buffer, 39, "%s,%.3f,%s,%s", + type->xdrtype.c_str(), + value, + type->xdrunit.c_str(), + name.c_str()); + buffer[39] = 0; + return String(buffer); +} + GwXDRMappings::GwXDRMappings(GwLog *logger, GwConfigHandler *config) { this->logger = logger; @@ -393,9 +410,33 @@ const char * GwXDRMappings::getUnMapped(){ *unknowAsString=0; char *ptr=unknowAsString; for (auto it=unknown.begin();it!=unknown.end();it++){ - snprintf(ptr,ESIZE-1,"%lu,",*it); + snprintf(ptr,ESIZE-1,"%lu\n",*it); *(ptr+ESIZE-1)=0; while (*ptr != 0) ptr++; } return unknowAsString; -} \ No newline at end of file +} + +String GwXDRMappings::getXdrEntry(String mapping, double value,int instance){ + String rt; + GwXDRMappingDef *def=GwXDRMappingDef::fromString(mapping); + if (! def) return rt; + int typeIndex=0; + GwXDRType::TypeCode code = findTypeMapping(def->category, def->field); + if (code == GwXDRType::UNKNOWN) + { + return rt; + } + GwXDRType *type = findType(code, &typeIndex); + bool first=true; + while (type){ + GwXDRFoundMapping found(def,type); + found.instanceId=instance; + if (first) first=false; + else rt+=","; + rt+=found.buildXdrEntry(value); + type = findType(code, &typeIndex); + } + delete def; + return rt; +} diff --git a/lib/xdrmappings/GwXDRMappings.h b/lib/xdrmappings/GwXDRMappings.h index 0cb04b6..e257953 100644 --- a/lib/xdrmappings/GwXDRMappings.h +++ b/lib/xdrmappings/GwXDRMappings.h @@ -162,6 +162,7 @@ class GwXDRFoundMapping{ String getTransducerName(){ return definition->getTransducerName(instanceId); } + String buildXdrEntry(double value); }; //the class GwXDRMappings is not intended to be deleted @@ -185,6 +186,7 @@ class GwXDRMappings{ //the returned mapping will exactly contain one mapping def GwXDRFoundMapping getMapping(String xName,String xType,String xUnit); GwXDRFoundMapping getMapping(GwXDRCategory category,int selector,int field=0,int instance=-1); + String getXdrEntry(String mapping, double value,int instance=0); const char * getUnMapped(); }; diff --git a/src/main.cpp b/src/main.cpp index e514809..a2fa2e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -421,6 +421,44 @@ protected: } }; +class XdrExampleRequest : public GwRequestMessage +{ +public: + String mapping; + double value; + XdrExampleRequest(String mapping, double value) : GwRequestMessage(F("text/plain"),F("xdrExample")){ + this->mapping=mapping; + this->value=value; + }; + +protected: + virtual void processRequest() + { + String val=xdrMappings.getXdrEntry(mapping,value); + if (val == "") { + result=val; + return; + } + tNMEA0183Msg msg; + msg.Init("XDR",config.getString(config.talkerId,String("GP")).c_str()); + msg.AddStrField(val.c_str()); + char buf[MAX_NMEA0183_MSG_BUF_LEN]; + msg.GetMessage(buf,MAX_NMEA0183_MSG_BUF_LEN); + result=buf; + } +}; +class XdrUnMappedRequest : public GwRequestMessage +{ +public: + XdrUnMappedRequest() : GwRequestMessage(F("text/plain"),F("boatData")){}; + +protected: + virtual void processRequest() + { + result = xdrMappings.getUnMapped(); + } +}; + void setup() { uint8_t chipid[6]; @@ -524,6 +562,14 @@ void setup() { { return new ResetConfigRequest(); }); webserver.registerMainHandler("/api/boatData", [](AsyncWebServerRequest *request)->GwRequestMessage * { return new BoatDataRequest(); }); + webserver.registerMainHandler("/api/xdrExample", [](AsyncWebServerRequest *request)->GwRequestMessage * + { + String mapping=request->arg("mapping"); + double value=atof(request->arg("value").c_str()); + return new XdrExampleRequest(mapping,value); + }); + webserver.registerMainHandler("/api/xdrUnmapped", [](AsyncWebServerRequest *request)->GwRequestMessage * + { return new XdrUnMappedRequest(); }); webserver.begin(); xdrMappings.begin();