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
64typedef enum {
65 N2KFormat_Undefined = 0,
66 N2KFormat_YD_RAW,
67 N2KFormat_Actisense_RAW_ASCII,
68 N2KFormat_Actisense_N2K_ASCII,
69 N2KFormat_Actisense_N2K,
70 N2KFormat_Actisense_RAW,
71 N2KFormat_Actisense_NGT,
72 N2KFormat_SeaSmart,
73 N2KFormat_MiniPlex
74} N2K_Format;
75
76typedef enum { TX_FORMAT_YDEN = 0, TX_FORMAT_ACTISENSE } GW_TX_FORMAT;
77
78class MrqContainer; // forward in .cpp file
79class CommDriverN2KNetEvent; // Internal
80
82 public wxEvtHandler,
83 public DriverStatsProvider {
84public:
86 CommDriverN2KNet(const ConnectionParams* params, DriverListener& listener);
87
88 ~CommDriverN2KNet() override;
89
90 DriverStats GetDriverStats() const override { return m_driver_stats; }
91
92 void SetListener(DriverListener& l) override {};
93
94 void Open();
95 void Close();
96 ConnectionParams GetParams() const { return m_params; }
97
98 bool SetOutputSocketOptions(wxSocketBase* tsock);
99 void OnServerSocketEvent(wxSocketEvent& event); // The listener
100 void OnTimerSocket(wxTimerEvent& event) { OnTimerSocket(); }
101 void OnTimerSocket();
102 void OnSocketEvent(wxSocketEvent& event);
103 void OpenNetworkGPSD();
104 void OpenNetworkTCP(unsigned int addr);
105 void OpenNetworkUDP(unsigned int addr);
106 void OnSocketReadWatchdogTimer(wxTimerEvent& event);
107 void HandleResume();
108 bool SendMessage(std::shared_ptr<const NavMsg> msg,
109 std::shared_ptr<const NavAddr> addr) override;
110 wxSocketBase* GetSock() const { return m_sock; }
111
112private:
113 ConnectionParams m_params;
114 DriverListener& m_listener;
115
116 void handle_N2K_MSG(CommDriverN2KNetEvent& event);
117 wxString GetNetPort() const { return m_net_port; }
118 wxIPV4address GetAddr() const { return m_addr; }
119 wxTimer* GetSocketThreadWatchdogTimer() {
120 return &m_socketread_watchdog_timer;
121 }
122 wxTimer* GetSocketTimer() { return &m_socket_timer; }
123 void SetSock(wxSocketBase* sock) { m_sock = sock; }
124 void SetTSock(wxSocketBase* sock) { m_tsock = sock; }
125 wxSocketBase* GetTSock() const { return m_tsock; }
126 void SetSockServer(wxSocketServer* sock) { m_socket_server = sock; }
127 wxSocketServer* GetSockServer() const { return m_socket_server; }
128 void SetMulticast(bool multicast) { m_is_multicast = multicast; }
129 bool GetMulticast() const { return m_is_multicast; }
130
131 NetworkProtocol GetProtocol() { return m_net_protocol; }
132 void SetBrxConnectEvent(bool event) { m_brx_connect_event = event; }
133 bool GetBrxConnectEvent() const { return m_brx_connect_event; }
134
135 void SetConnectTime(wxDateTime time) { m_connect_time = time; }
136 wxDateTime GetConnectTime() { return m_connect_time; }
137
138 dsPortType GetPortType() const { return m_io_select; }
139 wxString GetPort() const { return m_portstring; }
140
141 std::vector<unsigned char> PushFastMsgFragment(const CanHeader& header,
142 int position);
143 std::vector<unsigned char> PushCompleteMsg(const CanHeader& header,
144 int position,
145 const can_frame& frame);
146
147 void HandleCanFrameInput(const can_frame& frame);
148
149 ConnectionType GetConnectionType() const { return m_connection_type; }
150
151 bool ChecksumOK(const std::string& sentence);
152 void SetOk(bool ok) { m_bok = ok; };
153
154 N2K_Format DetectFormat(const std::vector<unsigned char>& packet);
155 bool ProcessActisense_ASCII_RAW(const std::vector<unsigned char>& packet);
156 bool ProcessActisense_ASCII_N2K(const std::vector<unsigned char>& packet);
157 bool ProcessActisense_N2K(const std::vector<unsigned char>& packet);
158 bool ProcessActisense_RAW(const std::vector<unsigned char>& packet);
159 bool ProcessActisense_NGT(const std::vector<unsigned char>& packet);
160 bool ProcessSeaSmart(const std::vector<unsigned char>& packet);
161 bool ProcessMiniPlex(const std::vector<unsigned char>& packet);
162
163 bool SendN2KNetwork(const std::shared_ptr<const Nmea2000Msg>& msg,
164 const std::shared_ptr<const NavAddr2000>& dest_addr);
165
166 std::vector<std::vector<unsigned char>> GetTxVector(
167 const std::shared_ptr<const Nmea2000Msg>& msg,
168 const std::shared_ptr<const NavAddr2000>& dest_addr);
169 bool SendSentenceNetwork(
170 const std::vector<std::vector<unsigned char>>& payload);
171 bool HandleMgntMsg(uint64_t pgn, const std::vector<unsigned char>& payload);
172 bool PrepareForTX();
173 std::vector<unsigned char> PrepareLogPayload(
174 const std::shared_ptr<const Nmea2000Msg>& msg,
175 const std::shared_ptr<const NavAddr2000>& addr);
176 void OnProdInfoTimer(wxTimerEvent& ev);
177
178 StatsTimer m_stats_timer;
179 DriverStats m_driver_stats;
180
181 wxString m_net_port;
182 NetworkProtocol m_net_protocol;
183 wxIPV4address m_addr;
184 wxSocketBase* m_sock;
185 wxSocketBase* m_tsock;
186 wxSocketServer* m_socket_server;
187 bool m_is_multicast;
188 MrqContainer* m_mrq_container;
189
190 int m_txenter;
191 int m_dog_value;
192 std::string m_sock_buffer;
193 wxString m_portstring;
194 dsPortType m_io_select;
195 wxDateTime m_connect_time;
196 bool m_brx_connect_event;
197 bool m_bchecksumCheck;
198 ConnectionType m_connection_type;
199
200 wxTimer m_socket_timer;
201 wxTimer m_socketread_watchdog_timer;
202
203 bool m_bok;
204 bool m_bInMsg, m_bGotESC, m_bGotSOT;
205
207 unsigned char* rx_buffer;
208 std::string m_sentence;
209
210 FastMessageMap* fast_messages;
211 N2K_Format m_n2k_format;
212 uint8_t m_order;
213 char m_TX_flag;
214 bool m_TX_available;
215 wxTimer m_prodinfo_timer;
216 int m_detect_count; // should we invoke DetectFormat?
217
218 obs::Listener resume_listener;
219
220 DECLARE_EVENT_TABLE()
221};
222
223#endif
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.
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.