OpenCPN Partial API docs
Loading...
Searching...
No Matches
ais_decoder.h
Go to the documentation of this file.
1/**************************************************************************
2 * Copyright (C) 2010 by David S. Register *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, see <https://www.gnu.org/licenses/>. *
16 **************************************************************************/
17
24#ifndef AIS_DECODER_H_
25#define AIS_DECODER_H_
26
27#include <map>
28#include <unordered_map>
29#include <memory>
30#include <vector>
31
32#include <wx/datetime.h>
33#include <wx/event.h>
34#include <wx/string.h>
35
36#include "rapidjson/fwd.h"
37
38#include "observable/evtvar.h"
39
40#include "model/ais_bitstring.h"
41#include "model/ais_defs.h"
43#include "model/comm_navmsg.h"
44#include "model/ocpn_types.h"
45#include "model/select.h"
46#include "model/track.h"
47
48using N0183MsgPtr = std::shared_ptr<const Nmea0183Msg>;
49using N2000MsgPtr = std::shared_ptr<const Nmea2000Msg>;
50using SignalKMsgPtr = std::shared_ptr<const SignalkMsg>;
51using NavMsgPtr = std::shared_ptr<const NavMsg>;
52
53class AisDecoder; // forward
54class ArrayOfMmsiProperties; // forward
55
56// AISTargetAlertDialog in gui layer
57extern wxEvtHandler *g_pais_alert_dialog_active;
58
59extern Select *pSelectAIS;
60extern wxString AISTargetNameFileName;
61extern AisDecoder *g_pAIS;
62extern ArrayOfMmsiProperties g_MMSI_Props_Array;
64extern unsigned g_OwnShipmmsi;
66enum AISAudioSoundType {
67 AISAUDIO_NONE,
68 AISAUDIO_CPA,
69 AISAUDIO_SART,
70 AISAUDIO_DSC
71};
72
73wxString GetShipNameFromFile(int);
74
77public:
78 MmsiProperties() = default;
79
80 explicit MmsiProperties(int mmsi) {
81 Init();
82 MMSI = mmsi;
83 }
84 explicit MmsiProperties(wxString &spec);
85
87
88 wxString Serialize();
89
90 void Init();
91 int MMSI;
92 int TrackType;
93 bool m_bignore;
94 bool m_bMOB;
95 bool m_bVDM;
96 bool m_bFollower;
97 bool m_bPersistentTrack;
98 wxString m_ShipName;
99};
100
101WX_DEFINE_ARRAY_PTR(MmsiProperties *, ArrayOfMmsiProperties);
102
104 std::function<bool()> confirm_stop_track;
105 std::function<int()> get_target_mmsi;
107 : confirm_stop_track([]() { return true; }),
108 get_target_mmsi([]() { return 0; }) {}
109};
110
111class AisDecoder : public wxEvtHandler {
112public:
113 explicit AisDecoder(const AisDecoderCallbacks &callbacks);
114
115 ~AisDecoder() override;
116
117 AisError DecodeN0183(const wxString &str);
118 std::unordered_map<int, std::shared_ptr<AisTargetData>> &GetTargetList() {
119 return AISTargetList;
120 }
121 std::unordered_map<int, std::shared_ptr<AisTargetData>> &
122 GetAreaNoticeSourcesList() {
123 return AIS_AreaNotice_Sources;
124 }
125 std::shared_ptr<AisTargetData> Get_Target_Data_From_MMSI(unsigned mmsi);
126 int GetNumTargets() const { return m_n_targets; }
127 bool IsAISSuppressed() const { return m_bSuppressed; }
128 bool IsAISAlertGeneral() const { return m_bGeneralAlert; }
129 void UpdateMMSItoNameFile(const wxString &mmsi, const wxString &name);
130 wxString GetMMSItoNameEntry(const wxString &mmsi);
131 AisError DecodeSingleVDO(const wxString &str, GenericPosDatEx *pos,
132 wxString *acc);
133 void DeletePersistentTrack(const Track *track);
134 std::map<int, Track *> m_persistent_tracks;
135 bool AIS_AlertPlaying() const { return m_bAIS_AlertPlaying; };
136
141 obs::EventVar info_update;
142
144 obs::EventVar touch_state;
145
147 obs::EventVar new_ais_wp;
148
150 obs::EventVar new_track;
151
153 obs::EventVar delete_track;
154
156 obs::EventVar plugin_msg_evt;
157
158private:
159 void OnTimerAIS(wxTimerEvent &event);
160 void OnTimerDSC(wxTimerEvent &event);
161
162 bool NMEACheckSumOK(const wxString &str);
163 void UpdateAllCPA();
164 void UpdateOneCPA(AisTargetData *ptarget);
165 void UpdateAllAlarms();
166 void UpdateAllTracks();
167 void UpdateOneTrack(AisTargetData *ptarget);
168 std::shared_ptr<AisTargetData> ProcessDSx(const wxString &str,
169 bool b_take_dsc = false);
170
171 void getAISTarget(long mmsi, std::shared_ptr<AisTargetData> &pTargetData,
172 std::shared_ptr<AisTargetData> &pStaleTarget,
173 bool &bnewtarget, int &last_report_ticks, wxDateTime &now);
174 void handleUpdate(const std::shared_ptr<AisTargetData> &pTargetData,
175 bool bnewtarget, const rapidjson::Value &update);
176 void updateItem(const std::shared_ptr<AisTargetData> &pTargetData,
177 bool bnewtarget, const rapidjson::Value &item,
178 wxString &sfixtime) const;
179 void CommitAISTarget(const std::shared_ptr<AisTargetData> &pTargetData,
180 const wxString &str, bool message_valid,
181 bool new_target);
182 void InitCommListeners();
183 bool HandleN0183_AIS(const N0183MsgPtr &n0183_msg);
184 void HandleSignalK(const SignalKMsgPtr &sK_msg);
185
186 bool HandleN2K_129038(const N2000MsgPtr &n2k_msg);
187 bool HandleN2K_129039(const N2000MsgPtr &n2k_msg);
188 bool HandleN2K_129041(const N2000MsgPtr &n2k_msg);
189 bool HandleN2K_129794(const N2000MsgPtr &n2k_msg);
190 bool HandleN2K_129809(const N2000MsgPtr &n2k_msg);
191 bool HandleN2K_129810(const N2000MsgPtr &n2k_msg);
192 bool HandleN2K_129793(const N2000MsgPtr &n2k_msg);
193
194 wxString m_signalk_selfid;
195 std::unordered_map<int, std::shared_ptr<AisTargetData>> AISTargetList;
196 std::unordered_map<int, std::shared_ptr<AisTargetData>>
197 AIS_AreaNotice_Sources;
198 AIS_Target_Name_Hash *AISTargetNamesC;
199 AIS_Target_Name_Hash *AISTargetNamesNC;
200
201 ObservableListener listener_N0183_VDM;
202 ObservableListener listener_N0183_FRPOS;
203 ObservableListener listener_N0183_CDDSC;
204 ObservableListener listener_N0183_CDDSE;
205 ObservableListener listener_N0183_TLL;
206 ObservableListener listener_N0183_TTM;
207 ObservableListener listener_N0183_OSD;
208 ObservableListener listener_N0183_WPL;
209 ObservableListener listener_SignalK;
210
211 ObservableListener listener_N2K_129038;
212 ObservableListener listener_N2K_129039;
213 ObservableListener listener_N2K_129041;
214 ObservableListener listener_N2K_129794;
215 ObservableListener listener_N2K_129809;
216 ObservableListener listener_N2K_129810;
217 ObservableListener listener_N2K_129793;
218
219 bool m_busy;
220 wxTimer TimerAIS;
221 wxFrame *m_parent_frame;
222 AisDecoderCallbacks m_callbacks;
223
224 int nsentences;
225 int isentence;
226 wxString sentence_accumulator;
227 bool m_OK;
228
229 std::shared_ptr<AisTargetData> m_pLatestTargetData;
230
231 bool m_bAIS_Audio_Alert_On;
232 wxTimer m_AIS_Audio_Alert_Timer;
233 int m_n_targets;
234 bool m_bSuppressed;
235 bool m_bGeneralAlert;
236 std::shared_ptr<AisTargetData> m_ptentative_dsctarget;
237 wxTimer m_dsc_timer;
238 wxString m_dsc_last_string;
239 std::vector<int> m_MMSI_MismatchVec;
240
241 bool m_bAIS_AlertPlaying;
242 DECLARE_EVENT_TABLE()
243};
244
245#endif // AIS_DECODER_H_
AIS use bitstring.
Select * pSelectAIS
Global instance.
wxString AISTargetNameFileName
Global instance.
ArrayOfMmsiProperties g_MMSI_Props_Array
Global instance.
unsigned g_OwnShipmmsi
Global instance.
AisDecoder * g_pAIS
Global instance.
General AIS definitions.
AIS target definitions.
obs::EventVar info_update
Notified when AIS user dialogs should update.
obs::EventVar new_ais_wp
Notified when new AIS wp is created.
obs::EventVar plugin_msg_evt
A JSON message should be sent.
obs::EventVar touch_state
Notified when gFrame->TouchAISActive() should be invoked.
obs::EventVar new_track
Notified on new track creation.
obs::EventVar delete_track
Notified when about to delete track.
Process incoming AIS messages.
Definition ais_decoder.h:76
Represents a track, which is a series of connected track points.
Definition track.h:117
Raw, undecoded messages definitions.
Navigation data types.
Selected route, segment, waypoint, etc.
A generic position and navigation data structure.
Definition ocpn_types.h:68
Recorded track abstraction.