intermediate: xdr mappings
This commit is contained in:
parent
d927861cdf
commit
ad29c93dd2
|
@ -230,36 +230,112 @@ void GwXDRMappings::begin()
|
||||||
LOG_DEBUG(GwLog::DEBUG, "no type definition for %s", def->toString().c_str());
|
LOG_DEBUG(GwLog::DEBUG, "no type definition for %s", def->toString().c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
long n2kkey=def->n2kKey();
|
long n2kkey = def->n2kKey();
|
||||||
auto it=n2kMap.find(n2kkey);
|
auto it = n2kMap.find(n2kkey);
|
||||||
if (it == n2kMap.end()){
|
GwXDRMapping *mapping = new GwXDRMapping(def, type);
|
||||||
LOG_DEBUG(GwLog::DEBUG,"insert mapping with key %ld",n2kkey);
|
if (it == n2kMap.end())
|
||||||
GwXDRMapping *mapping = new GwXDRMapping(def, type);
|
{
|
||||||
n2kMap[n2kkey]=mapping;
|
LOG_DEBUG(GwLog::DEBUG, "insert mapping with key %ld", n2kkey);
|
||||||
|
GwXDRMapping::MappingList mappings;
|
||||||
|
mappings.push_back(mapping);
|
||||||
|
n2kMap[n2kkey] = mappings;
|
||||||
}
|
}
|
||||||
else{
|
else
|
||||||
LOG_DEBUG(GwLog::DEBUG,"append mapping with key %ld",n2kkey);
|
{
|
||||||
it->second->addMappingDef(def);
|
LOG_DEBUG(GwLog::DEBUG, "append mapping with key %ld", n2kkey);
|
||||||
|
it->second.push_back(mapping);
|
||||||
}
|
}
|
||||||
//for nmea0183 there could be multiple entries
|
//for nmea0183 there could be multiple entries
|
||||||
//as potentially there are different units that we can handle
|
//as potentially there are different units that we can handle
|
||||||
//so after we inserted the definition we do additional type lookups
|
//so after we inserted the definition we do additional type lookups
|
||||||
while (type != NULL){
|
while (type != NULL)
|
||||||
String n183key=GwXDRMappingDef::n183key(def->xdrName,
|
{
|
||||||
type->xdrtype,type->xdrunit);
|
String n183key = GwXDRMappingDef::n183key(def->xdrName,
|
||||||
auto it=n183Map.find(n183key);
|
type->xdrtype, type->xdrunit);
|
||||||
if (it == n183Map.end()){
|
auto it = n183Map.find(n183key);
|
||||||
LOG_DEBUG(GwLog::DEBUG,"insert mapping with n183key %s",n183key.c_str());
|
if (it == n183Map.end())
|
||||||
n183Map[n183key]=new GwXDRMapping(def,type);
|
{
|
||||||
|
LOG_DEBUG(GwLog::DEBUG, "insert mapping with n183key %s", n183key.c_str());
|
||||||
|
GwXDRMapping::MappingList mappings;
|
||||||
|
mappings.push_back(mapping);
|
||||||
|
n183Map[n183key] = mappings;
|
||||||
}
|
}
|
||||||
else{
|
else
|
||||||
LOG_DEBUG(GwLog::DEBUG,"append mapping with n183key %s",n183key.c_str());
|
{
|
||||||
it->second->addMappingDef(def);
|
LOG_DEBUG(GwLog::DEBUG, "append mapping with n183key %s", n183key.c_str());
|
||||||
|
it->second.push_back(mapping);
|
||||||
}
|
}
|
||||||
type=findType(code,&typeIndex);
|
type = findType(code, &typeIndex);
|
||||||
if (! type) break;
|
if (!type)
|
||||||
|
break;
|
||||||
|
mapping=new GwXDRMapping(def,type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* select the best matching mapping
|
||||||
|
* depending on the instance id
|
||||||
|
*/
|
||||||
|
GwXDRFoundMapping GwXDRMappings::selectMapping(GwXDRMapping::MappingList *list,int instance){
|
||||||
|
GwXDRMapping *candidate=NULL;
|
||||||
|
for (auto mit=list->begin();mit != list->end();mit++){
|
||||||
|
GwXDRMappingDef *def=(*mit)->definition;
|
||||||
|
//if there is no instance we take a mapping with instance type ignore
|
||||||
|
//otherwise we prefer a matching instance before we use auto/ignore
|
||||||
|
if (instance < 0){
|
||||||
|
if (def->instanceMode != GwXDRMappingDef::IS_IGNORE) continue;
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"found mapping %s",def->toString().c_str());
|
||||||
|
return GwXDRFoundMapping(*mit);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
switch(def->instanceMode){
|
||||||
|
case GwXDRMappingDef::IS_SINGLE:
|
||||||
|
if (def->instanceId == instance){
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"found mapping %s",def->toString().c_str());
|
||||||
|
return GwXDRFoundMapping(*mit,instance);
|
||||||
|
}
|
||||||
|
case GwXDRMappingDef::IS_AUTO:
|
||||||
|
candidate=*mit;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (candidate != NULL){
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"found mapping %s",candidate->definition->toString().c_str());
|
||||||
|
return GwXDRFoundMapping(candidate,instance);
|
||||||
|
}
|
||||||
|
return GwXDRFoundMapping();
|
||||||
|
}
|
||||||
|
GwXDRFoundMapping GwXDRMappings::getMapping(String xName,String xType,String xUnit){
|
||||||
|
//get an instance suffix from the name and separate it
|
||||||
|
int sepIdx=xName.indexOf('#');
|
||||||
|
int instance=-1;
|
||||||
|
if (sepIdx>=0){
|
||||||
|
String istr=xName.substring(sepIdx+1);
|
||||||
|
xName=xName.substring(0,sepIdx);
|
||||||
|
instance=istr.toInt();
|
||||||
|
}
|
||||||
|
if (xName == "") return GwXDRFoundMapping();
|
||||||
|
String n183Key=GwXDRMappingDef::n183key(xName,xType,xUnit);
|
||||||
|
auto it=n183Map.find(n183Key);
|
||||||
|
if (it == n183Map.end()) {
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"find n183mapping for %s,i=%d - nothing found",n183Key.c_str(),instance);
|
||||||
|
return GwXDRFoundMapping();
|
||||||
|
}
|
||||||
|
return selectMapping(&(it->second),instance);
|
||||||
|
}
|
||||||
|
GwXDRFoundMapping GwXDRMappings::getMapping(GwXDRCategory category,int selector,int field,int instance){
|
||||||
|
long n2kKey=GwXDRMappingDef::n2kKey(category,selector,field);
|
||||||
|
auto it=n2kMap.find(n2kKey);
|
||||||
|
if (it == n2kMap.end()){
|
||||||
|
LOG_DEBUG(GwLog::DEBUG,"find n2kmapping for c=%d,s=%d,f=%d,i=%d - nothing found",
|
||||||
|
(int)category,selector,field,instance);
|
||||||
|
return GwXDRFoundMapping();
|
||||||
|
}
|
||||||
|
return selectMapping(&(it->second),instance);
|
||||||
|
}
|
|
@ -123,23 +123,39 @@ class GwXDRMappingDef{
|
||||||
rt += xdrUnit;
|
rt += xdrUnit;
|
||||||
return rt;
|
return rt;
|
||||||
}
|
}
|
||||||
typedef std::vector<GwXDRMappingDef*> MappingList;
|
|
||||||
private:
|
private:
|
||||||
static bool handleToken(String tok,int index,GwXDRMappingDef *def);
|
static bool handleToken(String tok,int index,GwXDRMappingDef *def);
|
||||||
};
|
};
|
||||||
class GwXDRMapping{
|
class GwXDRMapping{
|
||||||
public:
|
public:
|
||||||
GwXDRMappingDef::MappingList definitions;
|
GwXDRMappingDef *definition;
|
||||||
GwXDRType *type;
|
GwXDRType *type;
|
||||||
GwXDRMapping(GwXDRMappingDef *definition,GwXDRType *type){
|
GwXDRMapping(GwXDRMappingDef *definition,GwXDRType *type){
|
||||||
this->definitions.push_back(definition);
|
this->definition=definition;
|
||||||
this->type=type;
|
this->type=type;
|
||||||
}
|
}
|
||||||
void addMappingDef(GwXDRMappingDef *definition){
|
typedef std::vector<GwXDRMapping*> MappingList;
|
||||||
this->definitions.push_back(definition);
|
typedef std::map<String,MappingList> N138Map;
|
||||||
|
typedef std::map<long,MappingList> N2KMap;
|
||||||
|
};
|
||||||
|
class GwXDRFoundMapping{
|
||||||
|
public:
|
||||||
|
GwXDRMappingDef *definition=NULL;
|
||||||
|
GwXDRType *type=NULL;
|
||||||
|
int instanceId=-1;
|
||||||
|
bool empty=true;
|
||||||
|
GwXDRFoundMapping(GwXDRMappingDef *definition,GwXDRType *type){
|
||||||
|
this->definition=definition;
|
||||||
|
this->type=type;
|
||||||
|
empty=false;
|
||||||
}
|
}
|
||||||
typedef std::map<String,GwXDRMapping*> N138Map;
|
GwXDRFoundMapping(GwXDRMapping* mapping,int instance=-1){
|
||||||
typedef std::map<long,GwXDRMapping*> N2KMap;
|
this->definition=mapping->definition;
|
||||||
|
this->type=mapping->type;
|
||||||
|
this->instanceId=instance;
|
||||||
|
empty=false;
|
||||||
|
}
|
||||||
|
GwXDRFoundMapping(){}
|
||||||
};
|
};
|
||||||
|
|
||||||
class GwXDRMappings{
|
class GwXDRMappings{
|
||||||
|
@ -148,13 +164,14 @@ class GwXDRMappings{
|
||||||
GwConfigHandler *config;
|
GwConfigHandler *config;
|
||||||
GwXDRMapping::N138Map n183Map;
|
GwXDRMapping::N138Map n183Map;
|
||||||
GwXDRMapping::N2KMap n2kMap;
|
GwXDRMapping::N2KMap n2kMap;
|
||||||
|
GwXDRFoundMapping selectMapping(GwXDRMapping::MappingList *list,int instance);
|
||||||
public:
|
public:
|
||||||
GwXDRMappings(GwLog *logger,GwConfigHandler *config);
|
GwXDRMappings(GwLog *logger,GwConfigHandler *config);
|
||||||
void begin();
|
void begin();
|
||||||
//get the mappings
|
//get the mappings
|
||||||
//the returned mapping will exactly contain one mapping def
|
//the returned mapping will exactly contain one mapping def
|
||||||
GwXDRMapping getMapping(String xName,String xType,String xUnit);
|
GwXDRFoundMapping getMapping(String xName,String xType,String xUnit);
|
||||||
GwXDRMapping getMapping(GwXDRCategory category,int selector,int field=0,int instance=0);
|
GwXDRFoundMapping getMapping(GwXDRCategory category,int selector,int field=0,int instance=-1);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue