mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2025-12-14 06:23:07 +01:00
allow to show unmapped XDR transducer values
This commit is contained in:
@@ -58,6 +58,7 @@ GwXDRType *types[] = {
|
||||
new GwXDRType(GwXDRType::DISPLACEMENTD, "A", "D",DegToRad,RadToDeg,"rd"),
|
||||
new GwXDRType(GwXDRType::RPM,"T","R")
|
||||
};
|
||||
static GwXDRType genericType(GwXDRType::GENERIC, "G", "");
|
||||
template<typename T, int size>
|
||||
int GetArrLength(T(&)[size]){return size;}
|
||||
static GwXDRType *findType(GwXDRType::TypeCode type, int *start = NULL)
|
||||
@@ -82,6 +83,19 @@ static GwXDRType *findType(GwXDRType::TypeCode type, int *start = NULL)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static GwXDRType *findType(const String &typeString, const String &unitString)
|
||||
{
|
||||
int len=GetArrLength(types);
|
||||
for (int i=0; i< len; i++)
|
||||
{
|
||||
if (types[i]->xdrtype == typeString && types[i]->xdrunit == unitString)
|
||||
{
|
||||
return types[i];
|
||||
}
|
||||
}
|
||||
return &genericType;
|
||||
}
|
||||
|
||||
#include "GwXdrTypeMappings.h"
|
||||
|
||||
static GwXDRType::TypeCode findTypeMapping(GwXDRCategory category, int field)
|
||||
@@ -199,7 +213,7 @@ GwXDRMappingDef *GwXDRMappingDef::fromString(String s)
|
||||
}
|
||||
return rt;
|
||||
}
|
||||
String GwXDRMappingDef::getTransducerName(int instance)
|
||||
String GwXDRMappingDef::getTransducerName(int instance) const
|
||||
{
|
||||
String name = xdrName;
|
||||
if (instanceMode == GwXDRMappingDef::IS_AUTO)
|
||||
@@ -257,7 +271,7 @@ bool GwXDRMappings::addMapping(GwXDRMappingDef *def)
|
||||
LOG_DEBUG(GwLog::ERROR, "no type mapping for %s", def->toString().c_str());
|
||||
return false;
|
||||
}
|
||||
GwXDRType *type = findType(code, &typeIndex);
|
||||
GwXDRType *type = ::findType(code, &typeIndex);
|
||||
if (!type)
|
||||
{
|
||||
LOG_DEBUG(GwLog::ERROR, "no type definition for %s", def->toString().c_str());
|
||||
@@ -298,7 +312,7 @@ bool GwXDRMappings::addMapping(GwXDRMappingDef *def)
|
||||
LOG_DEBUG(GwLog::LOG, "append mapping with n183key %s", n183key.c_str());
|
||||
it->second.push_back(mapping);
|
||||
}
|
||||
type = findType(code, &typeIndex);
|
||||
type = ::findType(code, &typeIndex);
|
||||
if (!type)
|
||||
break;
|
||||
mapping = new GwXDRMapping(def, type);
|
||||
@@ -471,7 +485,7 @@ String GwXDRMappings::getXdrEntry(String mapping, double value,int instance){
|
||||
{
|
||||
return rt;
|
||||
}
|
||||
GwXDRType *type = findType(code, &typeIndex);
|
||||
GwXDRType *type = ::findType(code, &typeIndex);
|
||||
bool first=true;
|
||||
unsigned long invalidTime=config->getInt(GwConfigDefinitions::timoSensor);
|
||||
while (type){
|
||||
@@ -480,8 +494,12 @@ String GwXDRMappings::getXdrEntry(String mapping, double value,int instance){
|
||||
if (first) first=false;
|
||||
else rt+=",";
|
||||
rt+=found.buildXdrEntry(value).entry;
|
||||
type = findType(code, &typeIndex);
|
||||
type = ::findType(code, &typeIndex);
|
||||
}
|
||||
delete def;
|
||||
return rt;
|
||||
}
|
||||
|
||||
const GwXDRType * GwXDRMappings::findType(const String &typeString, const String &unitString) const{
|
||||
return ::findType(typeString,unitString);
|
||||
}
|
||||
@@ -140,7 +140,7 @@ class GwXDRMappingDef{
|
||||
rt += xdrUnit;
|
||||
return rt;
|
||||
}
|
||||
String getTransducerName(int instance);
|
||||
String getTransducerName(int instance) const;
|
||||
private:
|
||||
static bool handleToken(String tok,int index,GwXDRMappingDef *def);
|
||||
};
|
||||
@@ -163,12 +163,12 @@ class GwXDRFoundMapping : public GwBoatItemNameProvider{
|
||||
String entry;
|
||||
String transducer;
|
||||
};
|
||||
GwXDRMappingDef *definition=NULL;
|
||||
GwXDRType *type=NULL;
|
||||
const GwXDRMappingDef *definition=NULL;
|
||||
const GwXDRType *type=NULL;
|
||||
int instanceId=-1;
|
||||
bool empty=true;
|
||||
unsigned long timeout=0;
|
||||
GwXDRFoundMapping(GwXDRMappingDef *definition,GwXDRType *type, unsigned long timeout){
|
||||
GwXDRFoundMapping(const GwXDRMappingDef *definition,const GwXDRType *type, unsigned long timeout){
|
||||
this->definition=definition;
|
||||
this->type=type;
|
||||
this->timeout=timeout;
|
||||
@@ -182,7 +182,7 @@ class GwXDRFoundMapping : public GwBoatItemNameProvider{
|
||||
empty=false;
|
||||
}
|
||||
GwXDRFoundMapping(){}
|
||||
String getTransducerName(){
|
||||
virtual String getTransducerName(){
|
||||
return definition->getTransducerName(instanceId);
|
||||
}
|
||||
double valueFromXdr(double value){
|
||||
@@ -203,6 +203,24 @@ class GwXDRFoundMapping : public GwBoatItemNameProvider{
|
||||
}
|
||||
};
|
||||
|
||||
class GwXdrUnknownMapping : public GwXDRFoundMapping{
|
||||
String name;
|
||||
String unit;
|
||||
public:
|
||||
GwXdrUnknownMapping(const String &xdrName, const String &xdrUnit,const GwXDRType *type,unsigned long timeout):
|
||||
name(xdrName),unit(xdrUnit), GwXDRFoundMapping(nullptr,type,timeout){
|
||||
|
||||
}
|
||||
virtual String getTransducerName(){
|
||||
return name;
|
||||
}
|
||||
virtual String getBoatItemFormat(){
|
||||
String rt=GwXDRFoundMapping::getBoatItemFormat();
|
||||
if (type->xdrunit.isEmpty()) rt+=unit;
|
||||
return rt;
|
||||
}
|
||||
};
|
||||
|
||||
//the class GwXDRMappings is not intended to be deleted
|
||||
//the deletion will leave memory leaks!
|
||||
class GwConfigHandler;
|
||||
@@ -229,6 +247,7 @@ class GwXDRMappings{
|
||||
GwXDRFoundMapping getMapping(GwXDRCategory category,int selector,int field=0,int instance=-1);
|
||||
String getXdrEntry(String mapping, double value,int instance=0);
|
||||
const char * getUnMapped();
|
||||
const GwXDRType * findType(const String &typeString, const String &unitString) const;
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user