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"; }
Interface implemented by classes which listens.
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.
General observable implementation with several specializations.
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