mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2025-12-14 06:23:07 +01:00
xdrmappings: map 130314
This commit is contained in:
@@ -64,8 +64,52 @@ class N2kToNMEA0183Functions : public N2kDataToNMEA0183
|
||||
{
|
||||
|
||||
private:
|
||||
GwXDRMappings *xdrMappings;
|
||||
ConverterList<N2kToNMEA0183Functions,tN2kMsg> converters;
|
||||
static const unsigned long RMCPeriod = 500;
|
||||
tNMEA0183Msg xdrMessage;
|
||||
bool xdrOpened=false;
|
||||
|
||||
String buildXdrEntry(GwXDRFoundMapping &mapping,double value){
|
||||
char buffer[40];
|
||||
String name=mapping.definition->xdrName;
|
||||
if (mapping.definition->instanceMode == GwXDRMappingDef::IS_AUTO ||
|
||||
mapping.definition->instanceMode == GwXDRMappingDef::IS_SINGLE
|
||||
){
|
||||
name+="#";
|
||||
name+=String(mapping.instanceId);
|
||||
}
|
||||
if (mapping.type->tonmea){
|
||||
value=(* (mapping.type->tonmea))(value);
|
||||
}
|
||||
snprintf(buffer,39,"%s,%.3f,%s,%s",
|
||||
mapping.type->xdrtype.c_str(),
|
||||
value,
|
||||
mapping.type->xdrunit.c_str(),
|
||||
name);
|
||||
buffer[39]=0;
|
||||
return String(buffer);
|
||||
}
|
||||
bool addToXdr(String entry){
|
||||
if (! xdrOpened){
|
||||
xdrMessage.Init("XDR",talkerId);
|
||||
xdrOpened=true;
|
||||
}
|
||||
int len=entry.length();
|
||||
if (! xdrMessage.AddStrField(entry.c_str())){
|
||||
SendMessage(xdrMessage);
|
||||
xdrMessage.Init("XDR",talkerId);
|
||||
xdrMessage.AddStrField(entry.c_str());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool finalizeXdr(){
|
||||
if (! xdrOpened) return false;
|
||||
SendMessage(xdrMessage);
|
||||
xdrOpened=false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void setMax(GwBoatItem<double> *maxItem, GwBoatItem<double> *item)
|
||||
{
|
||||
unsigned long now = millis();
|
||||
@@ -1152,6 +1196,23 @@ private:
|
||||
SendMessage(nmeaMsg);
|
||||
}
|
||||
|
||||
void Handle130314(const tN2kMsg &msg){
|
||||
unsigned char SID=-1;
|
||||
unsigned char PressureInstance=0;
|
||||
tN2kPressureSource PressureSource;
|
||||
double ActualPressure;
|
||||
if (! ParseN2kPGN130314(msg,SID, PressureInstance,
|
||||
PressureSource, ActualPressure)){
|
||||
LOG_DEBUG(GwLog::DEBUG,"unable to parse PGN %d",msg.PGN);
|
||||
return;
|
||||
}
|
||||
GwXDRFoundMapping mapping=xdrMappings->getMapping(XDRPRESSURE,(int)PressureSource,0,PressureInstance);
|
||||
if (mapping.empty) return;
|
||||
LOG_DEBUG(GwLog::DEBUG,"found pressure mapping %s",mapping.definition->toString().c_str());
|
||||
addToXdr(buildXdrEntry(mapping,ActualPressure));
|
||||
finalizeXdr();
|
||||
}
|
||||
|
||||
|
||||
void registerConverters()
|
||||
{
|
||||
@@ -1178,6 +1239,7 @@ private:
|
||||
converters.registerConverter(127251UL, &N2kToNMEA0183Functions::HandleROT);
|
||||
converters.registerConverter(129283UL, &N2kToNMEA0183Functions::HandleXTE);
|
||||
converters.registerConverter(129284UL, &N2kToNMEA0183Functions::HandleNavigation);
|
||||
converters.registerConverter(130314UL, &N2kToNMEA0183Functions::Handle130314);
|
||||
#define HANDLE_AIS
|
||||
#ifdef HANDLE_AIS
|
||||
converters.registerConverter(129038UL, &N2kToNMEA0183Functions::HandleAISClassAPosReport); // AIS Class A Position Report, Message Type 1
|
||||
@@ -1191,7 +1253,7 @@ private:
|
||||
public:
|
||||
N2kToNMEA0183Functions(GwLog *logger, GwBoatData *boatData,
|
||||
tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback, int sourceId,
|
||||
String talkerId)
|
||||
String talkerId, GwXDRMappings *xdrMappings)
|
||||
: N2kDataToNMEA0183(logger, boatData, NMEA2000, callback,sourceId,talkerId)
|
||||
{
|
||||
LastPosSend = 0;
|
||||
@@ -1200,6 +1262,7 @@ private:
|
||||
|
||||
this->logger = logger;
|
||||
this->boatData = boatData;
|
||||
this->xdrMappings=xdrMappings;
|
||||
registerConverters();
|
||||
}
|
||||
virtual void loop()
|
||||
@@ -1215,8 +1278,8 @@ private:
|
||||
|
||||
|
||||
N2kDataToNMEA0183* N2kDataToNMEA0183::create(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000,
|
||||
tSendNMEA0183MessageCallback callback, int sourceId,String talkerId){
|
||||
tSendNMEA0183MessageCallback callback, int sourceId,String talkerId, GwXDRMappings *xdrMappings){
|
||||
LOG_DEBUG(GwLog::LOG,"creating N2kToNMEA0183");
|
||||
return new N2kToNMEA0183Functions(logger,boatData,NMEA2000,callback, sourceId,talkerId);
|
||||
return new N2kToNMEA0183Functions(logger,boatData,NMEA2000,callback, sourceId,talkerId,xdrMappings);
|
||||
}
|
||||
//*****************************************************************************
|
||||
|
||||
@@ -28,6 +28,7 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
#include <GwLog.h>
|
||||
#include <GwBoatData.h>
|
||||
#include <GwXDRMappings.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
class N2kDataToNMEA0183 : public tNMEA2000::tMsgHandler
|
||||
@@ -42,10 +43,12 @@ protected:
|
||||
char talkerId[3];
|
||||
tSendNMEA0183MessageCallback SendNMEA0183MessageCallback;
|
||||
void SendMessage(const tNMEA0183Msg &NMEA0183Msg);
|
||||
N2kDataToNMEA0183(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback, int sourceId,String talkerId);
|
||||
N2kDataToNMEA0183(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000,
|
||||
tSendNMEA0183MessageCallback callback, int sourceId,String talkerId);
|
||||
|
||||
public:
|
||||
static N2kDataToNMEA0183* create(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback, int sourceId,String talkerId);
|
||||
static N2kDataToNMEA0183* create(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback,
|
||||
int sourceId,String talkerId, GwXDRMappings *xdrMappings);
|
||||
virtual void HandleMsg(const tN2kMsg &N2kMsg) = 0;
|
||||
virtual void loop();
|
||||
virtual ~N2kDataToNMEA0183(){}
|
||||
|
||||
Reference in New Issue
Block a user