correct engine rapid xdr back mapping

This commit is contained in:
wellenvogel 2021-12-04 12:44:15 +01:00
parent 84483024ac
commit 64a95f9316
1 changed files with 20 additions and 9 deletions

View File

@ -112,6 +112,7 @@ private:
sender(msg); sender(msg);
return true; return true;
} }
LOG_DEBUG(GwLog::DEBUG+1,"skipped n2k message %d",msg.PGN);
return false; return false;
} }
bool send(tN2kMsg &msg, String key=""){ bool send(tN2kMsg &msg, String key=""){
@ -158,6 +159,7 @@ private:
this->value=value; this->value=value;
} }
int field(){return mapping.definition->field;} int field(){return mapping.definition->field;}
int selector(){return mapping.definition->selector;}
}; };
typedef std::vector<XdrMappingAndValue> XdrMappingList; typedef std::vector<XdrMappingAndValue> XdrMappingList;
/** /**
@ -174,7 +176,7 @@ private:
double getOtherFieldValue(GwXDRFoundMapping &found, int field){ double getOtherFieldValue(GwXDRFoundMapping &found, int field){
GwXDRFoundMapping other=getOtherFieldMapping(found,field); GwXDRFoundMapping other=getOtherFieldMapping(found,field);
if (other.empty) return N2kDoubleNA; if (other.empty) return N2kDoubleNA;
LOG_DEBUG(GwLog::DEBUG,"found other field mapping %s",other.definition->toString().c_str()); LOG_DEBUG(GwLog::DEBUG+1,"found other field mapping %s",other.definition->toString().c_str());
return boatData->getDataWithDefault(N2kDoubleNA,&other); return boatData->getDataWithDefault(N2kDoubleNA,&other);
} }
/** /**
@ -193,6 +195,11 @@ private:
*(list+i)=getOtherFieldValue(current.mapping,i); *(list+i)=getOtherFieldValue(current.mapping,i);
if (! N2kIsNA(*(list+i))) rt=true; if (! N2kIsNA(*(list+i))) rt=true;
} }
LOG_DEBUG(GwLog::DEBUG+1,"fillFieldList current=%s, start=%d, num=%d, val=%f, return=%s",
current.mapping.definition->toString().c_str(),
start,numFields,
current.value,
rt?"true":"false");
return rt; return rt;
} }
String buildN2KKey(const tN2kMsg &msg,GwXDRFoundMapping &found){ String buildN2KKey(const tN2kMsg &msg,GwXDRFoundMapping &found){
@ -203,6 +210,10 @@ private:
rt+=String(found.instanceId); rt+=String(found.instanceId);
return rt; return rt;
} }
int8_t fromDouble(double v){
if (N2kIsNA(v)) return N2kInt8NA;
return v;
}
void convertXDR(const SNMEA0183Msg &msg){ void convertXDR(const SNMEA0183Msg &msg){
XdrMappingList foundMappings; XdrMappingList foundMappings;
for (int offset=0;offset <= (msg.FieldCount()-4);offset+=4){ for (int offset=0;offset <= (msg.FieldCount()-4);offset+=4){
@ -216,7 +227,7 @@ private:
if (found.empty) continue; if (found.empty) continue;
value=found.valueFromXdr(value); value=found.valueFromXdr(value);
if (!boatData->update(value,msg.sourceId,&found)) continue; if (!boatData->update(value,msg.sourceId,&found)) continue;
LOG_DEBUG(GwLog::DEBUG,"found mapped XDR %s:%s, value %f", LOG_DEBUG(GwLog::DEBUG+1,"found mapped XDR %s:%s, value %f",
transducerName.c_str(), transducerName.c_str(),
found.definition->toString().c_str(), found.definition->toString().c_str(),
value); value);
@ -241,7 +252,7 @@ private:
if (fillFieldList(current, fields, 2)) if (fillFieldList(current, fields, 2))
{ {
SetN2kPGN127505(n2kMsg, current.mapping.instanceId, SetN2kPGN127505(n2kMsg, current.mapping.instanceId,
(tN2kFluidType)(current.mapping.definition->selector), (tN2kFluidType)(current.selector()),
fields[0], fields[0],
fields[1]); fields[1]);
send(n2kMsg, buildN2KKey(n2kMsg, current.mapping)); send(n2kMsg, buildN2KKey(n2kMsg, current.mapping));
@ -258,7 +269,7 @@ private:
case XDRTEMP: case XDRTEMP:
if (fillFieldList(current,fields,2)){ if (fillFieldList(current,fields,2)){
SetN2kPGN130312(n2kMsg,1,current.mapping.instanceId, SetN2kPGN130312(n2kMsg,1,current.mapping.instanceId,
(tN2kTempSource)(current.mapping.definition->selector), (tN2kTempSource)(current.selector()),
fields[0],fields[1]); fields[0],fields[1]);
send(n2kMsg,buildN2KKey(n2kMsg,current.mapping)); send(n2kMsg,buildN2KKey(n2kMsg,current.mapping));
} }
@ -266,7 +277,7 @@ private:
case XDRHUMIDITY: case XDRHUMIDITY:
if (fillFieldList(current,fields,2)){ if (fillFieldList(current,fields,2)){
SetN2kPGN130313(n2kMsg,1,current.mapping.instanceId, SetN2kPGN130313(n2kMsg,1,current.mapping.instanceId,
(tN2kHumiditySource)(current.mapping.definition->selector), (tN2kHumiditySource)(current.selector()),
fields[0], fields[0],
fields[1] fields[1]
); );
@ -276,7 +287,7 @@ private:
case XDRPRESSURE: case XDRPRESSURE:
if (fillFieldList(current,fields,1)){ if (fillFieldList(current,fields,1)){
SetN2kPGN130314(n2kMsg,1,current.mapping.instanceId, SetN2kPGN130314(n2kMsg,1,current.mapping.instanceId,
(tN2kPressureSource)(current.mapping.definition->selector), (tN2kPressureSource)(current.selector()),
fields[0]); fields[0]);
send(n2kMsg,buildN2KKey(n2kMsg,current.mapping)); send(n2kMsg,buildN2KKey(n2kMsg,current.mapping));
} }
@ -288,15 +299,15 @@ private:
{ {
SetN2kPGN127489(n2kMsg, current.mapping.instanceId, SetN2kPGN127489(n2kMsg, current.mapping.instanceId,
fields[0], fields[1], fields[2], fields[3], fields[4], fields[0], fields[1], fields[2], fields[3], fields[4],
fields[5], fields[6], fields[7], (int8_t)fields[8], (int8_t)fields[9], fields[5], fields[6], fields[7], fromDouble(fields[8]), fromDouble(fields[9]),
tN2kEngineDiscreteStatus1(), tN2kEngineDiscreteStatus2()); tN2kEngineDiscreteStatus1(), tN2kEngineDiscreteStatus2());
send(n2kMsg, buildN2KKey(n2kMsg, current.mapping)); send(n2kMsg, buildN2KKey(n2kMsg, current.mapping));
} }
} }
else{ else{
if (fillFieldList(current, fields, 10,13)){ if (fillFieldList(current, fields, 13,10)){
SetN2kPGN127488(n2kMsg,current.mapping.instanceId, SetN2kPGN127488(n2kMsg,current.mapping.instanceId,
fields[10],fields[11],fields[12]); fields[10],fields[11],fromDouble(fields[12]));
send(n2kMsg, buildN2KKey(n2kMsg, current.mapping)); send(n2kMsg, buildN2KKey(n2kMsg, current.mapping));
} }
} }