25#ifndef _DRIVER_NAVMSG_H
26#define _DRIVER_NAVMSG_H
37#include <netinet/in.h>
42using NavmsgClock = std::chrono::system_clock;
43using NavmsgTimePoint = std::chrono::time_point<NavmsgClock>;
48 N2kPGN(uint64_t _pgn) { pgn = _pgn; }
50 friend bool operator<(
const N2kPGN& lhs,
const N2kPGN& rhs) {
51 return lhs.pgn < rhs.pgn;
54 std::string to_string()
const {
72 N2kName(uint64_t name) { value.Name = name; }
75 return lhs.value.Name < rhs.value.Name;
78 std::string to_string()
const {
84 static uint64_t Parse(
const std::string& s) {
104 uint32_t UnicNumberAndManCode;
106 unsigned char DeviceInstance;
107 unsigned char DeviceFunction;
108 unsigned char DeviceClass;
109 unsigned char IndustryGroupAndSystemInstance;
115 void SetUniqueNumber(uint32_t _UniqueNumber) {
116 value.UnicNumberAndManCode =
117 (value.UnicNumberAndManCode & 0xffe00000) | (_UniqueNumber & 0x1fffff);
119 void SetManufacturerCode(uint16_t _ManufacturerCode) {
120 value.UnicNumberAndManCode =
121 (value.UnicNumberAndManCode & 0x1fffff) |
122 (((
unsigned long)(_ManufacturerCode & 0x7ff)) << 21);
124 void SetDeviceInstance(
unsigned char _DeviceInstance) {
125 value.DeviceInstance = _DeviceInstance;
127 void SetDeviceFunction(
unsigned char _DeviceFunction) {
128 value.DeviceFunction = _DeviceFunction;
130 void SetDeviceClass(
unsigned char _DeviceClass) {
131 value.DeviceClass = ((_DeviceClass & 0x7f) << 1);
133 void SetIndustryGroup(
unsigned char _IndustryGroup) {
134 value.IndustryGroupAndSystemInstance =
135 (value.IndustryGroupAndSystemInstance & 0x0f) | (_IndustryGroup << 4) |
138 void SetSystemInstance(
unsigned char _SystemInstance) {
139 value.IndustryGroupAndSystemInstance =
140 (value.IndustryGroupAndSystemInstance & 0xf0) |
141 (_SystemInstance & 0x0f);
144 uint64_t GetName()
const {
return value.Name; }
161 NavAddr(Bus b,
const std::string& i) : bus(b),
iface(i) {};
166 virtual std::string to_string()
const {
167 return NavAddr::BusToString(bus) +
" " +
iface;
169 static std::string BusToString(Bus b);
170 static Bus StringToBus(
const std::string& s);
184 std::string to_string()
const {
return iface; }
193 :
NavAddr(NavAddr::Bus::N2000,
iface), name(0), address(_address) {};
198 std::string to_string()
const {
return name.to_string(); }
201 unsigned char address;
206 const std::string id;
208 :
NavAddr(NavAddr::Bus::Plugin,
"Internal"), id(_id) {}
215 std::string to_string()
const {
return NavAddr::to_string(); }
221 :
NavAddr(NavAddr::Bus::TestBus,
"Test"), name(output_path) {};
223 const std::string name;
229 enum class State { kOk, kCannotParse, kBadChecksum, kFiltered };
238 virtual std::string
key()
const = 0;
252 const NavAddr::Bus bus;
262 const NavmsgTimePoint created_at;
265 NavMsg(
const NavAddr::Bus& _bus, std::shared_ptr<const NavAddr> src,
267 : bus(_bus), state(_state),
source(src), created_at(NavmsgClock::now()) {
270 NavMsg(
const NavAddr::Bus& _bus, std::shared_ptr<const NavAddr> src)
271 :
NavMsg(_bus, src, State::kOk) {};
280 :
NavMsg(NavAddr::Bus::N2000, std::make_shared<NavAddr>()), PGN(_pgn) {}
282 Nmea2000Msg(
const uint64_t _pgn, std::shared_ptr<const NavAddr2000> src)
283 :
NavMsg(NavAddr::Bus::N2000, src), PGN(_pgn) {}
285 Nmea2000Msg(
const uint64_t _pgn,
const std::vector<unsigned char>& _payload,
286 std::shared_ptr<const NavAddr2000> src)
287 :
NavMsg(NavAddr::Bus::N2000, src), PGN(_pgn), payload(_payload) {}
289 Nmea2000Msg(
const uint64_t _pgn,
const std::vector<unsigned char>& _payload,
290 std::shared_ptr<const NavAddr2000> src,
int _priority)
291 :
NavMsg(NavAddr::Bus::N2000, src),
294 priority(_priority) {}
298 std::string
key()
const override {
299 return std::string(
"n2000-") + PGN.to_string();
305 std::string
to_vdr()
const override;
308 std::vector<unsigned char> payload;
315 Nmea0183Msg(
const std::string&
id,
const std::string& _payload,
316 std::shared_ptr<const NavAddr> src, State _state)
317 :
NavMsg(NavAddr::Bus::N0183, src, _state),
322 Nmea0183Msg(
const std::string&
id,
const std::string& _payload,
323 std::shared_ptr<const NavAddr> src)
327 :
NavMsg(NavAddr::Bus::Undef, std::make_shared<const NavAddr>()) {}
330 :
Nmea0183Msg(
id.size() <= 3 ? std::string(
"??") +
id : id,
"",
331 std::make_shared<const NavAddr>()) {}
341 std::string
key()
const override {
347 std::string
to_vdr()
const override;
352 static const char*
const prefix =
"n0183-";
353 return std::string(prefix) +
type;
365 :
NavMsg(NavAddr::Bus::Undef, std::make_shared<const NavAddr>()) {}
367 PluginMsg(
const std::string& _name,
const std::string& _dest_host,
368 const std::string& msg)
369 :
NavMsg(NavAddr::Bus::Plugin, std::make_shared<const NavAddr>(
370 NavAddr::Bus::Plugin,
"Internal")),
375 PluginMsg(
const std::string& _name,
const std::string& msg)
380 std::string
key()
const {
return std::string(
"plug.json-") + name; };
384 const std::string name;
385 const std::string message;
393 :
NavMsg(NavAddr::Bus::Undef, std::make_shared<const NavAddr>()) {}
395 SignalkMsg(std::string _context_self, std::string _context,
396 std::string _raw_message, std::string _iface)
397 :
NavMsg(NavAddr::Bus::Signalk,
398 std::make_shared<const NavAddr>(NavAddr::Bus::Signalk, _iface)),
399 context_self(_context_self),
401 raw_message(_raw_message) {};
405 std::string
key()
const {
return std::string(
"signalK"); };
411 std::string context_self;
413 std::string raw_message;
420 :
NavMsg(NavAddr::Bus::Undef, std::make_shared<const NavAddr>()) {}
424 std::string
key()
const {
return "navmsg-undef"; }
Where messages are sent to or received from.
const std::string iface
Physical device for 0183, else a unique string.
Actual data sent between application and transport layer.
std::string GetKey() const
Alias for key().
virtual std::string to_vdr() const
Return message in unquoted format used by VDR plugin, see https://opencpn-manuals....
virtual std::string key() const =0
Return unique key used by observable to notify/listen.
std::shared_ptr< const NavAddr > source
Source address is set by drivers when receiving, unused and should be empty when sending.
virtual std::string to_string() const
Return printable string for logging etc without trailing nl.
static NavAddr::Bus GetBusByKey(const std::string &key)
Return bus corresponding to given key.
A regular Nmea0183 message.
const std::string type
For example 'GGA'.
std::string key() const override
Return unique key used by observable to notify/listen.
const std::string talker
For example 'GP'.
const std::string payload
Complete NMEA0183 sentence, also prefix.
std::string to_vdr() const override
Return message in unquoted format used by VDR plugin, see https://opencpn-manuals....
static std::string MessageKey(const char *type)
Return key which should be used to listen to given message type.
std::string to_string() const override
Return printable string for logging etc without trailing nl.
See: https://github.com/OpenCPN/OpenCPN/issues/2729#issuecomment-1179506343.
std::string key() const override
Return unique key used by observable to notify/listen.
std::string to_string() const override
Print "bus key id payload".
std::string to_vdr() const override
Return message in unquoted format used by VDR plugin, see https://opencpn-manuals....
An invalid message, error return value.
std::string key() const
Return unique key used by observable to notify/listen.
A plugin to plugin json message over the REST interface.
std::string to_string() const
Return printable string for logging etc without trailing nl.
std::string key() const
Return unique key used by observable to notify/listen.
const std::string dest_host
hostname, ip address or 'localhost'
Plugin ABI encapsulation.
A parsed SignalK message over ipv4.
std::string key() const
Return unique key used by observable to notify/listen.
std::string to_string() const
Return printable string for logging etc without trailing nl.
Interface implemented by classes which listens.
General observable pattern implementation built on top of wxWidgets event handling.
N2k uses CAN which defines the basic properties of messages.
uint32_t GetNumber() const
21 bits
uint16_t GetManufacturer() const
9 bits
uint8_t GetDevClass() const
7 bits
uint8_t GetDevFunc() const
8 bits
uint8_t GetIndustryGroup() const
4 bits
uint8_t GetDevInstanceHigh() const
5 bits
uint8_t GetDevInstanceLow() const
3 bits
uint8_t GetSysInstance() const
4 bits