OpenCPN Partial API docs
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
comm_drv_n2k_net.h
1/***************************************************************************
2 *
3 * Project: OpenCPN
4 * Purpose:
5 * Author: David Register, Alec Leamas
6 *
7 ***************************************************************************
8 * Copyright (C) 2023 by David Register, Alec Leamas *
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
19 * *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
24 **************************************************************************/
25
26#ifndef _COMMDRIVERN2KNET_H
27#define _COMMDRIVERN2KNET_H
28
29#include <wx/wxprec.h>
30
31#ifndef WX_PRECOMP
32#include <wx/wx.h>
33#endif // precompiled header
34
35#include "model/comm_can_util.h"
36#include "model/comm_drv_n2k.h"
38#include "model/conn_params.h"
39
40#include <wx/datetime.h>
41
42#ifdef __WXGTK__
43// newer versions of glib define its own GSocket but we unfortunately use this
44// name in our own (semi-)public header and so can't change it -- rename glib
45// one instead
46// #include <gtk/gtk.h>
47#define GSocket GlibGSocket
48#include <wx/socket.h>
49#undef GSocket
50#else
51#include <wx/socket.h>
52#endif
53
54#ifndef __WXMSW__
55#include <sys/socket.h> // needed for (some) Mac builds
56#include <netinet/in.h>
57#endif
58
59#define RX_BUFFER_SIZE_NET 4096
60
61#define ESCAPE 0x10
62#define STARTOFTEXT 0x02
63#define ENDOFTEXT 0x03
64
65#define MsgTypeN2kData 0x93
66#define MsgTypeN2kRequest 0x94
67
68typedef enum {
69 N2KFormat_Undefined = 0,
70 N2KFormat_YD_RAW,
71 N2KFormat_Actisense_RAW_ASCII,
72 N2KFormat_Actisense_N2K_ASCII,
73 N2KFormat_Actisense_N2K,
74 N2KFormat_Actisense_RAW,
75 N2KFormat_Actisense_NGT,
76 N2KFormat_SeaSmart,
77 N2KFormat_MiniPlex
78} N2K_Format;
79
80typedef enum { TX_FORMAT_YDEN = 0, TX_FORMAT_ACTISENSE } GW_TX_FORMAT;
81
82class CommDriverN2KNetEvent; // Internal
83class MrqContainer;
84class FastMessageMap;
85
86class circular_buffer {
87public:
88 circular_buffer(size_t size);
89 void reset();
90 size_t capacity() const;
91 size_t size() const;
92 bool empty() const;
93 bool full() const;
94 void put(unsigned char item);
95 unsigned char get();
96
97private:
98 std::mutex mutex_;
99 std::unique_ptr<unsigned char[]> buf_;
100 size_t head_ = 0;
101 size_t tail_ = 0;
102 const size_t max_size_;
103 bool full_ = 0;
104};
105
107 public wxEvtHandler,
108 public DriverStatsProvider {
109public:
111 CommDriverN2KNet(const ConnectionParams* params, DriverListener& listener);
112
113 virtual ~CommDriverN2KNet();
114
115 DriverStats GetDriverStats() const override { return m_driver_stats; }
116
117 void SetListener(DriverListener& l) override {};
118
119 void Open();
120 void Close();
121 ConnectionParams GetParams() const { return m_params; }
122
123 bool SetOutputSocketOptions(wxSocketBase* tsock);
124 void OnServerSocketEvent(wxSocketEvent& event); // The listener
125 void OnTimerSocket(wxTimerEvent& event) { OnTimerSocket(); }
126 void OnTimerSocket();
127 void OnSocketEvent(wxSocketEvent& event);
128 void OpenNetworkGPSD();
129 void OpenNetworkTCP(unsigned int addr);
130 void OpenNetworkUDP(unsigned int addr);
131 void OnSocketReadWatchdogTimer(wxTimerEvent& event);
132 void HandleResume();
133
134 bool SendMessage(std::shared_ptr<const NavMsg> msg,
135 std::shared_ptr<const NavAddr> addr) override;
136 wxSocketBase* GetSock() const { return m_sock; }
137
138private:
139 ConnectionParams m_params;
140 DriverListener& m_listener;
141
142 void handle_N2K_MSG(CommDriverN2KNetEvent& event);
143 wxString GetNetPort() const { return m_net_port; }
144 wxIPV4address GetAddr() const { return m_addr; }
145 wxTimer* GetSocketThreadWatchdogTimer() {
146 return &m_socketread_watchdog_timer;
147 }
148 wxTimer* GetSocketTimer() { return &m_socket_timer; }
149 void SetSock(wxSocketBase* sock) { m_sock = sock; }
150 void SetTSock(wxSocketBase* sock) { m_tsock = sock; }
151 wxSocketBase* GetTSock() const { return m_tsock; }
152 void SetSockServer(wxSocketServer* sock) { m_socket_server = sock; }
153 wxSocketServer* GetSockServer() const { return m_socket_server; }
154 void SetMulticast(bool multicast) { m_is_multicast = multicast; }
155 bool GetMulticast() const { return m_is_multicast; }
156
157 NetworkProtocol GetProtocol() { return m_net_protocol; }
158 void SetBrxConnectEvent(bool event) { m_brx_connect_event = event; }
159 bool GetBrxConnectEvent() { return m_brx_connect_event; }
160
161 void SetConnectTime(wxDateTime time) { m_connect_time = time; }
162 wxDateTime GetConnectTime() { return m_connect_time; }
163
164 dsPortType GetPortType() const { return m_io_select; }
165 wxString GetPort() const { return m_portstring; }
166
167 std::vector<unsigned char> PushFastMsgFragment(const CanHeader& header,
168 int position);
169 std::vector<unsigned char> PushCompleteMsg(const CanHeader header,
170 int position,
171 const can_frame frame);
172
173 void HandleCanFrameInput(can_frame frame);
174
175 ConnectionType GetConnectionType() const { return m_connection_type; }
176
177 bool ChecksumOK(const std::string& sentence);
178 void SetOk(bool ok) { m_bok = ok; };
179
180 N2K_Format DetectFormat(std::vector<unsigned char> packet);
181 bool ProcessActisense_ASCII_RAW(std::vector<unsigned char> packet);
182 bool ProcessActisense_ASCII_N2K(std::vector<unsigned char> packet);
183 bool ProcessActisense_N2K(std::vector<unsigned char> packet);
184 bool ProcessActisense_RAW(std::vector<unsigned char> packet);
185 bool ProcessActisense_NGT(std::vector<unsigned char> packet);
186 bool ProcessSeaSmart(std::vector<unsigned char> packet);
187 bool ProcessMiniPlex(std::vector<unsigned char> packet);
188
189 bool SendN2KNetwork(std::shared_ptr<const Nmea2000Msg>& msg,
190 std::shared_ptr<const NavAddr2000> dest_addr);
191
192 std::vector<std::vector<unsigned char>> GetTxVector(
193 const std::shared_ptr<const Nmea2000Msg>& msg,
194 std::shared_ptr<const NavAddr2000> dest_addr);
195 bool SendSentenceNetwork(std::vector<std::vector<unsigned char>> payload);
196 bool HandleMgntMsg(uint64_t pgn, std::vector<unsigned char>& payload);
197 bool PrepareForTX();
198 std::vector<unsigned char> PrepareLogPayload(
199 std::shared_ptr<const Nmea2000Msg>& msg,
200 std::shared_ptr<const NavAddr2000> addr);
201 void OnProdInfoTimer(wxTimerEvent& ev);
202
203 StatsTimer m_stats_timer;
204 DriverStats m_driver_stats;
205
206 wxString m_net_port;
207 NetworkProtocol m_net_protocol;
208 wxIPV4address m_addr;
209 wxSocketBase* m_sock;
210 wxSocketBase* m_tsock;
211 wxSocketServer* m_socket_server;
212 bool m_is_multicast;
213 MrqContainer* m_mrq_container;
214
215 int m_txenter;
216 int m_dog_value;
217 std::string m_sock_buffer;
218 wxString m_portstring;
219 dsPortType m_io_select;
220 wxDateTime m_connect_time;
221 bool m_brx_connect_event;
222 bool m_bchecksumCheck;
223 ConnectionType m_connection_type;
224
225 wxTimer m_socket_timer;
226 wxTimer m_socketread_watchdog_timer;
227
228 bool m_bok;
229 int m_ib;
230 bool m_bInMsg, m_bGotESC, m_bGotSOT;
231
232 circular_buffer* m_circle;
233 unsigned char* rx_buffer;
234 std::string m_sentence;
235
236 FastMessageMap* fast_messages;
237 N2K_Format m_n2k_format;
238 uint8_t m_order;
239 char m_TX_flag;
240 bool m_TX_available;
241 wxTimer m_prodinfo_timer;
242
243 ObsListener resume_listener;
244
245 DECLARE_EVENT_TABLE()
246};
247
248#endif // guard
CAN v2.0 29 bit header as used by NMEA 2000.
void SetListener(DriverListener &l) override
Set the entity which will receive incoming data.
void OnSocketEvent(wxSocketEvent &event)
Interface implemented by transport layer and possible other parties like test code which should handl...
Definition comm_driver.h:48
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:228
Continuously report driver stats to CommDrvRegistry.evt_driver_stats.
Communication statistics infrastructure.
Driver statistics report.