OpenCPN Partial API docs
Loading...
Searching...
No Matches
comm_drv_n2k_net.h
Go to the documentation of this file.
1/***************************************************************************
2 * Copyright (C) 2023 by David Register *
3 * Copyright (C) 2023 Alec Leamas *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, see <https://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
25#ifndef _COMMDRIVERN2KNET_H
26#define _COMMDRIVERN2KNET_H
27
28#ifndef __WXMSW__
29#include <sys/socket.h> // needed for (some) Mac builds
30#include <netinet/in.h>
31#endif
32
33#include <wx/wxprec.h>
34#ifndef WX_PRECOMP
35#include <wx/wx.h>
36#endif
37
38#include <wx/datetime.h>
39
40#include "model/comm_buffers.h"
41#include "model/comm_can_util.h"
42#include "model/comm_drv_n2k.h"
45#include "model/conn_params.h"
46
47#ifdef __WXGTK__
48// newer versions of glib define its own GSocket but we unfortunately use this
49// name in our own (semi-)public header and so can't change it -- rename glib
50// one instead
51#define GSocket GlibGSocket
52#include <wx/socket.h>
53#undef GSocket
54#else
55#include <wx/socket.h>
56#endif
57
58#define RX_BUFFER_SIZE_NET 4096
59
60#define ESCAPE 0x10
61#define STARTOFTEXT 0x02
62#define ENDOFTEXT 0x03
63
64#define MsgTypeN2kData 0x93
65#define MsgTypeN2kRequest 0x94
66
67typedef enum {
68 N2KFormat_Undefined = 0,
69 N2KFormat_YD_RAW,
70 N2KFormat_Actisense_RAW_ASCII,
71 N2KFormat_Actisense_N2K_ASCII,
72 N2KFormat_Actisense_N2K,
73 N2KFormat_Actisense_RAW,
74 N2KFormat_Actisense_NGT,
75 N2KFormat_SeaSmart,
76 N2KFormat_MiniPlex
77} N2K_Format;
78
79typedef enum { TX_FORMAT_YDEN = 0, TX_FORMAT_ACTISENSE } GW_TX_FORMAT;
80
81class MrqContainer; // forward in .cpp file
82class CommDriverN2KNetEvent; // Internal
83
85 public wxEvtHandler,
86 public DriverStatsProvider {
87public:
89 CommDriverN2KNet(const ConnectionParams* params, DriverListener& listener);
90
91 virtual ~CommDriverN2KNet();
92
93 DriverStats GetDriverStats() const override { return m_driver_stats; }
94
95 void SetListener(DriverListener& l) override {};
96
97 void Open();
98 void Close();
99 ConnectionParams GetParams() const { return m_params; }
100
101 bool SetOutputSocketOptions(wxSocketBase* tsock);
102 void OnServerSocketEvent(wxSocketEvent& event); // The listener
103 void OnTimerSocket(wxTimerEvent& event) { OnTimerSocket(); }
104 void OnTimerSocket();
105 void OnSocketEvent(wxSocketEvent& event);
106 void OpenNetworkGPSD();
107 void OpenNetworkTCP(unsigned int addr);
108 void OpenNetworkUDP(unsigned int addr);
109 void OnSocketReadWatchdogTimer(wxTimerEvent& event);
110 void HandleResume();
111
112 bool SendMessage(std::shared_ptr<const NavMsg> msg,
113 std::shared_ptr<const NavAddr> addr) override;
114 wxSocketBase* GetSock() const { return m_sock; }
115
116private:
117 ConnectionParams m_params;
118 DriverListener& m_listener;
119
120 void handle_N2K_MSG(CommDriverN2KNetEvent& event);
121 wxString GetNetPort() const { return m_net_port; }
122 wxIPV4address GetAddr() const { return m_addr; }
123 wxTimer* GetSocketThreadWatchdogTimer() {
124 return &m_socketread_watchdog_timer;
125 }
126 wxTimer* GetSocketTimer() { return &m_socket_timer; }
127 void SetSock(wxSocketBase* sock) { m_sock = sock; }
128 void SetTSock(wxSocketBase* sock) { m_tsock = sock; }
129 wxSocketBase* GetTSock() const { return m_tsock; }
130 void SetSockServer(wxSocketServer* sock) { m_socket_server = sock; }
131 wxSocketServer* GetSockServer() const { return m_socket_server; }
132 void SetMulticast(bool multicast) { m_is_multicast = multicast; }
133 bool GetMulticast() const { return m_is_multicast; }
134
135 NetworkProtocol GetProtocol() { return m_net_protocol; }
136 void SetBrxConnectEvent(bool event) { m_brx_connect_event = event; }
137 bool GetBrxConnectEvent() { return m_brx_connect_event; }
138
139 void SetConnectTime(wxDateTime time) { m_connect_time = time; }
140 wxDateTime GetConnectTime() { return m_connect_time; }
141
142 dsPortType GetPortType() const { return m_io_select; }
143 wxString GetPort() const { return m_portstring; }
144
145 std::vector<unsigned char> PushFastMsgFragment(const CanHeader& header,
146 int position);
147 std::vector<unsigned char> PushCompleteMsg(const CanHeader header,
148 int position,
149 const can_frame frame);
150
151 void HandleCanFrameInput(can_frame frame);
152
153 ConnectionType GetConnectionType() const { return m_connection_type; }
154
155 bool ChecksumOK(const std::string& sentence);
156 void SetOk(bool ok) { m_bok = ok; };
157
158 N2K_Format DetectFormat(const std::vector<unsigned char>& packet);
159 bool ProcessActisense_ASCII_RAW(std::vector<unsigned char> packet);
160 bool ProcessActisense_ASCII_N2K(std::vector<unsigned char> packet);
161 bool ProcessActisense_N2K(std::vector<unsigned char> packet);
162 bool ProcessActisense_RAW(std::vector<unsigned char> packet);
163 bool ProcessActisense_NGT(std::vector<unsigned char> packet);
164 bool ProcessSeaSmart(std::vector<unsigned char> packet);
165 bool ProcessMiniPlex(std::vector<unsigned char> packet);
166
167 bool SendN2KNetwork(std::shared_ptr<const Nmea2000Msg>& msg,
168 std::shared_ptr<const NavAddr2000> dest_addr);
169
170 std::vector<std::vector<unsigned char>> GetTxVector(
171 const std::shared_ptr<const Nmea2000Msg>& msg,
172 std::shared_ptr<const NavAddr2000> dest_addr);
173 bool SendSentenceNetwork(std::vector<std::vector<unsigned char>> payload);
174 bool HandleMgntMsg(uint64_t pgn, std::vector<unsigned char>& payload);
175 bool PrepareForTX();
176 std::vector<unsigned char> PrepareLogPayload(
177 std::shared_ptr<const Nmea2000Msg>& msg,
178 std::shared_ptr<const NavAddr2000> addr);
179 void OnProdInfoTimer(wxTimerEvent& ev);
180
181 StatsTimer m_stats_timer;
182 DriverStats m_driver_stats;
183
184 wxString m_net_port;
185 NetworkProtocol m_net_protocol;
186 wxIPV4address m_addr;
187 wxSocketBase* m_sock;
188 wxSocketBase* m_tsock;
189 wxSocketServer* m_socket_server;
190 bool m_is_multicast;
191 MrqContainer* m_mrq_container;
192
193 int m_txenter;
194 int m_dog_value;
195 std::string m_sock_buffer;
196 wxString m_portstring;
197 dsPortType m_io_select;
198 wxDateTime m_connect_time;
199 bool m_brx_connect_event;
200 bool m_bchecksumCheck;
201 ConnectionType m_connection_type;
202
203 wxTimer m_socket_timer;
204 wxTimer m_socketread_watchdog_timer;
205
206 bool m_bok;
207 int m_ib;
208 bool m_bInMsg, m_bGotESC, m_bGotSOT;
209
211 unsigned char* rx_buffer;
212 std::string m_sentence;
213
214 FastMessageMap* fast_messages;
215 N2K_Format m_n2k_format;
216 uint8_t m_order;
217 char m_TX_flag;
218 bool m_TX_available;
219 wxTimer m_prodinfo_timer;
220
221 ObsListener resume_listener;
222
223 DECLARE_EVENT_TABLE()
224};
225
226#endif // guard
CAN v2.0 29 bit header as used by NMEA 2000.
Fixed size, synchronized FIFO buffer.
void SetListener(DriverListener &l) override
Set the entity which will receive incoming data.
DriverStats GetDriverStats() const override
Get the Driver Statistics.
void OnSocketEvent(wxSocketEvent &event)
Interface for handling incoming messages.
Definition comm_driver.h:50
Driver interface providing driver statistics.
Track fast message fragments eventually forming complete messages.
Define an action to be performed when a KeyProvider is notified.
Definition observable.h:257
Continuously report driver stats to CommDrvRegistry.evt_driver_stats.
Various input/output buffers.
Low-level socketcan utility functions.
Nmea2000 driver.
Nmea2000 IP network driver.
Communication statistics infrastructure.
Connection parameters.
Driver statistics report.