convert xte 2 way

This commit is contained in:
wellenvogel 2021-11-18 17:27:40 +01:00
parent 292fc006ae
commit aa0d22aab3
6 changed files with 95 additions and 20 deletions

Binary file not shown.

View File

@ -58,7 +58,7 @@ uint32_t mtr2nm(uint32_t m)
} }
double mtr2nm(double m) double mtr2nm(double m)
{ {
return m / 1852; return m / 1852.0;
} }
bool convertToJson(const GwSatInfoList &si,JsonVariant &variant){ bool convertToJson(const GwSatInfoList &si,JsonVariant &variant){

View File

@ -16,6 +16,7 @@ class GwBoatItemBase{
GWSC(formatWind); GWSC(formatWind);
GWSC(formatLatitude); GWSC(formatLatitude);
GWSC(formatLongitude); GWSC(formatLongitude);
GWSC(formatXte);
GWSC(formatFixed0); GWSC(formatFixed0);
GWSC(formatDepth); GWSC(formatDepth);
GWSC(kelvinToC); GWSC(kelvinToC);
@ -239,7 +240,7 @@ class GwBoatData{
GWBOATDATA(double,DepthTransducer,4000,formatDepth) GWBOATDATA(double,DepthTransducer,4000,formatDepth)
GWBOATDATA(double,SecondsSinceMidnight,4000,formatFixed0) GWBOATDATA(double,SecondsSinceMidnight,4000,formatFixed0)
GWBOATDATA(double,WaterTemperature,4000,kelvinToC) GWBOATDATA(double,WaterTemperature,4000,kelvinToC)
GWBOATDATA(double,XTE,4000,formatFixed0) GWBOATDATA(double,XTE,4000,formatXte)
GWBOATDATA(double,DTW,4000,mtr2nm) GWBOATDATA(double,DTW,4000,mtr2nm)
GWBOATDATA(double,BTW,4000,formatCourse) GWBOATDATA(double,BTW,4000,formatCourse)
GWBOATDATA(double,WPLatitude,4000,formatLatitude) GWBOATDATA(double,WPLatitude,4000,formatLatitude)

View File

@ -128,6 +128,21 @@ private:
} }
#define UD(item) updateDouble(boatData->item, item, msg.sourceId) #define UD(item) updateDouble(boatData->item, item, msg.sourceId)
#define UI(item) updateUint32(boatData->item, item, msg.sourceId) #define UI(item) updateUint32(boatData->item, item, msg.sourceId)
tN2kXTEMode xteMode(const char modeChar){
switch(modeChar){
case 'D':
return N2kxtem_Differential;
case 'E':
return N2kxtem_Estimated;
case 'M':
return N2kxtem_Manual;
case 'S':
return N2kxtem_Simulator;
default:
break;
}
return N2kxtem_Autonomous;
}
void convertRMB(const SNMEA0183Msg &msg) void convertRMB(const SNMEA0183Msg &msg)
{ {
LOG_DEBUG(GwLog::DEBUG + 1, "convert RMB"); LOG_DEBUG(GwLog::DEBUG + 1, "convert RMB");
@ -141,23 +156,7 @@ private:
tN2kXTEMode mode=N2kxtem_Autonomous; tN2kXTEMode mode=N2kxtem_Autonomous;
if (msg.FieldCount() > 13){ if (msg.FieldCount() > 13){
const char *modeChar=msg.Field(13); const char *modeChar=msg.Field(13);
switch(*modeChar){ mode=xteMode(*modeChar);
case 'D':
mode=N2kxtem_Differential;
break;
case 'E':
mode=N2kxtem_Estimated;
break;
case 'M':
mode=N2kxtem_Manual;
break;
case 'S':
mode=N2kxtem_Simulator;
break;
default:
break;
}
} }
SetN2kXTE(n2kMsg,1,mode,false,rmb.xte); SetN2kXTE(n2kMsg,1,mode,false,rmb.xte);
send(n2kMsg); send(n2kMsg);
@ -725,6 +724,25 @@ private:
SetN2kRateOfTurn(n2kMsg,1,ROT); SetN2kRateOfTurn(n2kMsg,1,ROT);
send(n2kMsg); send(n2kMsg);
} }
void convertXTE(const SNMEA0183Msg &msg){
if (msg.FieldCount() < 6){
LOG_DEBUG(GwLog::DEBUG,"unable to parse XTE %s",msg.line);
return;
}
if (msg.Field(0)[0] != 'A') return;
if (msg.Field(1)[0] != 'A') return;
if (msg.Field(4)[0] != 'N') return; //nm only
if (msg.FieldLen(2) < 1) return;
const char dir=msg.Field(3)[0];
if (dir != 'L' && dir != 'R') return;
double xte=atof(msg.Field(2)) * nmTom;
if (dir == 'R') xte=-xte;
if (! updateDouble(boatData->XTE,xte,msg.sourceId)) return;
tN2kMsg n2kMsg;
tN2kXTEMode mode=xteMode(msg.Field(5)[0]);
SetN2kXTE(n2kMsg,1,mode,false,xte);
send(n2kMsg);
}
//shortcut for lambda converters //shortcut for lambda converters
#define CVL [](const SNMEA0183Msg &msg, NMEA0183DataToN2KFunctions *p) -> void #define CVL [](const SNMEA0183Msg &msg, NMEA0183DataToN2KFunctions *p) -> void
@ -791,7 +809,10 @@ private:
String(F("GLL")), &NMEA0183DataToN2KFunctions::convertGLL); String(F("GLL")), &NMEA0183DataToN2KFunctions::convertGLL);
converters.registerConverter( converters.registerConverter(
127251UL, 127251UL,
String(F("ROT")), &NMEA0183DataToN2KFunctions::convertROT); String(F("ROT")), &NMEA0183DataToN2KFunctions::convertROT);
converters.registerConverter(
129283UL,
String(F("XTE")), &NMEA0183DataToN2KFunctions::convertXTE);
unsigned long *aispgns=new unsigned long[7]{129810UL,129809UL,129040UL,129039UL,129802UL,129794UL,129038UL}; unsigned long *aispgns=new unsigned long[7]{129810UL,129809UL,129040UL,129039UL,129802UL,129794UL,129038UL};
converters.registerConverter(7,&aispgns[0], converters.registerConverter(7,&aispgns[0],
String(F("AIVDM")),&NMEA0183DataToN2KFunctions::convertAIVDX); String(F("AIVDM")),&NMEA0183DataToN2KFunctions::convertAIVDX);

View File

@ -1030,6 +1030,50 @@ private:
SendMessage(nmeamsg); SendMessage(nmeamsg);
} }
} }
void HandleXTE(const tN2kMsg &msg){
unsigned char SID=0;
tN2kXTEMode XTEMode;
bool NavigationTerminated=false;
double XTE=N2kDoubleNA;
if (! ParseN2kXTE(msg,SID,XTEMode,NavigationTerminated,XTE)){
LOG_DEBUG(GwLog::DEBUG,"unable to parse PGN %d",msg.PGN);
return;
}
if (NavigationTerminated) return;
if (! updateDouble(boatData->XTE,XTE)) return;
tNMEA0183Msg nmeamsg;
if (!nmeamsg.Init("XTE",talkerId)) return;
const char *mode="A";
switch(XTEMode){
case N2kxtem_Differential:
mode="D";
break;
case N2kxtem_Estimated:
mode="E";
break;
case N2kxtem_Simulator:
mode="S";
break;
case N2kxtem_Manual:
mode="M";
break;
default:
break;
}
if (!nmeamsg.AddStrField("A")) return;
if (!nmeamsg.AddStrField("A")) return;
double val=mtr2nm(XTE);
const char *dir="L";
if (val < 0) {
dir="R";
val=-val;
}
if (! nmeamsg.AddDoubleField(val,1.0,"%.4f")) return;
if (! nmeamsg.AddStrField(dir)) return;
if (! nmeamsg.AddStrField("N")) return;
if (! nmeamsg.AddStrField(mode)) return;
SendMessage(nmeamsg);
}
void registerConverters() void registerConverters()
@ -1055,6 +1099,7 @@ private:
converters.registerConverter(129539UL, &N2kToNMEA0183Functions::HandleDop); converters.registerConverter(129539UL, &N2kToNMEA0183Functions::HandleDop);
converters.registerConverter(129540UL, &N2kToNMEA0183Functions::HandleSats); converters.registerConverter(129540UL, &N2kToNMEA0183Functions::HandleSats);
converters.registerConverter(127251UL, &N2kToNMEA0183Functions::HandleROT); converters.registerConverter(127251UL, &N2kToNMEA0183Functions::HandleROT);
converters.registerConverter(129283UL, &N2kToNMEA0183Functions::HandleXTE);
#define HANDLE_AIS #define HANDLE_AIS
#ifdef HANDLE_AIS #ifdef HANDLE_AIS
converters.registerConverter(129038UL, &N2kToNMEA0183Functions::HandleAISClassAPosReport); // AIS Class A Position Report, Message Type 1 converters.registerConverter(129038UL, &N2kToNMEA0183Functions::HandleAISClassAPosReport); // AIS Class A Position Report, Message Type 1

View File

@ -548,6 +548,14 @@ let valueFormatters = {
return x.toFixed(2); return x.toFixed(2);
}, },
u:'°/s' u:'°/s'
},
formatXte:{
f: function(v){
let x=parseFloat(v);
if (isNaN(x)) return '---';
return x.toFixed(0);
},
u:'m'
} }
} }
function createDashboardItem(name, def, parent) { function createDashboardItem(name, def, parent) {