35#include <wx/checklst.h>
36#include <wx/combobox.h>
39#include <wx/statline.h>
40#include <wx/tokenzr.h>
46#if !wxUSE_XLOCALE && wxCHECK_VERSION(3, 0, 0)
47#define wxAtoi(arg) atoi(arg)
50static std::vector<ConnectionParams*> the_connection_params;
52std::vector<ConnectionParams*>& TheConnectionParams() {
53 return the_connection_params;
56ConnectionParams::ConnectionParams(
const wxString& configStr) {
57 m_optionsPanel =
nullptr;
58 Deserialize(configStr);
61void ConnectionParams::Deserialize(
const wxString& configStr) {
63 wxArrayString prms = wxStringTokenize(configStr,
";");
64 if (prms.Count() < 18) {
69 Type = (ConnectionType)wxAtoi(prms[0]);
70 NetProtocol = (NetworkProtocol)wxAtoi(prms[1]);
71 NetworkAddress = prms[2];
72 NetworkPort = (ConnectionType)wxAtoi(prms[3]);
73 Protocol = (DataProtocol)wxAtoi(prms[4]);
75 Baudrate = wxAtoi(prms[6]);
76 ChecksumCheck = wxAtoi(prms[7]);
77 int iotval = wxAtoi(prms[8]);
78 IOSelect = ((iotval <= 2) ? static_cast<dsPortType>(iotval) : DS_TYPE_INPUT);
79 InputSentenceListType = (ListType)wxAtoi(prms[9]);
80 InputSentenceList = wxStringTokenize(prms[10],
",");
81 OutputSentenceListType = (ListType)wxAtoi(prms[11]);
82 OutputSentenceList = wxStringTokenize(prms[12],
",");
83 Garmin = !!wxAtoi(prms[14]);
84 GarminUpload = !!wxAtoi(prms[15]);
85 FurunoGP3X = !!wxAtoi(prms[16]);
90 if (prms.Count() >= 18) {
91 bEnabled = !!wxAtoi(prms[17]);
93 if (prms.Count() >= 19) {
94 UserComment = prms[18];
96 if (prms.Count() >= 20) {
97 AutoSKDiscover = !!wxAtoi(prms[19]);
99 if (prms.Count() >= 21) {
100 socketCAN_port = prms[20];
102 if (prms.Count() >= 22) {
103 NoDataReconnect = wxAtoi(prms[21]);
105 if (prms.Count() >= 23) {
106 DisableEcho = wxAtoi(prms[22]);
108 if (prms.Count() >= 24) {
109 AuthToken = prms[23];
113wxString ConnectionParams::Serialize()
const {
115 for (
size_t i = 0; i < InputSentenceList.Count(); i++) {
116 if (i > 0) istcs.Append(
",");
117 istcs.Append(InputSentenceList[i]);
120 for (
size_t i = 0; i < OutputSentenceList.Count(); i++) {
121 if (i > 0) ostcs.Append(
",");
122 ostcs.Append(OutputSentenceList[i]);
124 wxString ret = wxString::Format(
125 "%d;%d;%s;%d;%d;%s;%d;%d;%d;%d;%s;%d;%s;%d;%d;%d;%d;%d;%s;%d;%s;%d;%d;%s",
126 Type, NetProtocol, NetworkAddress.c_str(), NetworkPort, Protocol,
127 Port.c_str(), Baudrate, ChecksumCheck, IOSelect, InputSentenceListType,
128 istcs.c_str(), OutputSentenceListType, ostcs.c_str(), 0 ,
129 Garmin, GarminUpload, FurunoGP3X, bEnabled, UserComment.c_str(),
130 AutoSKDiscover, socketCAN_port.c_str(), NoDataReconnect, DisableEcho,
137 std::stringstream ss;
138 ss << Type << NetProtocol << NetworkAddress << NetworkPort << Protocol << Port
139 << Baudrate << ChecksumCheck << IOSelect << InputSentenceListType
140 << OutputSentenceListType << Garmin << GarminUpload << FurunoGP3X
141 << UserComment << AutoSKDiscover << socketCAN_port << NoDataReconnect
142 << DisableEcho << AuthToken;
143 for (
const auto& sentence : OutputSentenceList) ss << sentence;
144 for (
const auto& sentence : InputSentenceList) ss << sentence;
148ConnectionParams::ConnectionParams() {
153 Protocol = PROTO_NMEA0183;
156 ChecksumCheck =
true;
159 IOSelect = DS_TYPE_INPUT;
160 InputSentenceListType = WHITELIST;
161 OutputSentenceListType = WHITELIST;
165 m_optionsPanel = NULL;
166 AutoSKDiscover =
false;
167 NoDataReconnect =
false;
173ConnectionParams::~ConnectionParams() {
177wxString ConnectionParams::GetSourceTypeStr()
const {
192wxString ConnectionParams::GetAddressStr()
const {
194 return wxString::Format(
"%s", Port.c_str());
195 else if (Type == NETWORK)
196 return wxString::Format(
"%s:%d", NetworkAddress.c_str(), NetworkPort);
197 else if (Type == INTERNAL_GPS)
198 return _(
"Internal");
199 else if (Type == INTERNAL_BT)
200 return NetworkAddress;
206static wxString NetworkProtocolToString(NetworkProtocol NetProtocol) {
207 switch (NetProtocol) {
215 return _(
"Signal K");
217 return _(
"Undefined");
221wxString ConnectionParams::GetParametersStr()
const {
224 return wxString::Format(
"%d", Baudrate);
226 return NetworkProtocolToString(NetProtocol);
236wxString ConnectionParams::GetIOTypeValueStr()
const {
237 if (IOSelect == DS_TYPE_INPUT)
239 else if (IOSelect == DS_TYPE_OUTPUT)
245wxString ConnectionParams::FilterTypeToStr(ListType type,
246 FilterDirection dir)
const {
247 if (dir == FILTER_INPUT) {
248 if (type == BLACKLIST)
253 if (type == BLACKLIST)
260wxString ConnectionParams::GetFiltersStr()
const {
262 for (
size_t i = 0; i < InputSentenceList.Count(); i++) {
263 if (i > 0) istcs.Append(
",");
264 istcs.Append(InputSentenceList[i]);
267 for (
size_t i = 0; i < OutputSentenceList.Count(); i++) {
268 if (i > 0) ostcs.Append(
",");
269 ostcs.Append(OutputSentenceList[i]);
272 if (istcs.Len() > 0) {
274 ret.Append(wxString::Format(
275 ": %s %s", FilterTypeToStr(InputSentenceListType, FILTER_INPUT).c_str(),
278 ret.Append(_(
"In: None"));
280 if (ostcs.Len() > 0) {
282 ret.Append(_(
"Out"));
283 ret.Append(wxString::Format(
285 FilterTypeToStr(OutputSentenceListType, FILTER_OUTPUT).c_str(),
288 ret.Append(_(
", Out: None"));
292wxString ConnectionParams::GetDSPort()
const {
294 return wxString::Format(
"Serial:%s", Port.c_str());
295 else if (Type == NETWORK) {
296 wxString proto = NetworkProtocolToString(NetProtocol);
297 return wxString::Format(
"%s:%s:%d", proto.c_str(), NetworkAddress.c_str(),
299 }
else if (Type == INTERNAL_BT) {
305bool ConnectionParams::GetValidPort()
const {
306 if (Type == SERIAL && Port ==
"")
308 else if (Type == NETWORK && (NetworkAddress ==
"" || !NetworkPort))
310 else if (Type == INTERNAL_BT && Port ==
"")
316std::string ConnectionParams::GetStrippedDSPort()
const {
317 if (Type == SERIAL) {
318 wxString t = wxString::Format(
"Serial:%s", Port.c_str());
319 wxString comx = t.AfterFirst(
':').BeforeFirst(
' ');
320 return comx.ToStdString();
321 }
else if (Type == NETWORK) {
322 wxString proto = NetworkProtocolToString(NetProtocol);
323 wxString t = wxString::Format(
"%s:%s:%d", proto.c_str(),
324 NetworkAddress.c_str(), NetworkPort);
325 return t.ToStdString();
327 }
else if (Type == SOCKETCAN) {
329 if (!socketCAN_port.ToStdString().empty())
330 rv +=
"socketCAN-" + socketCAN_port.ToStdString();
332 }
else if (Type == INTERNAL_BT) {
333 return Port.ToStdString();
334 }
else if (Type == INTERNAL_GPS) {
335 return Port.ToStdString();
340std::string ConnectionParams::GetLastDSPort()
const {
341 if (Type == SERIAL) {
342 wxString sp = wxString::Format(
"Serial:%s", Port.c_str());
343 return sp.ToStdString();
345 wxString proto = NetworkProtocolToString(LastNetProtocol);
346 wxString sp = wxString::Format(
"%s:%s:%d", proto.c_str(),
347 LastNetworkAddress.c_str(), LastNetworkPort);
348 return sp.ToStdString();
352bool ConnectionParams::SentencePassesFilter(
const wxString& sentence,
353 FilterDirection direction)
const {
354 wxArrayString filter;
355 bool listype =
false;
357 if (direction == FILTER_INPUT) {
358 filter = InputSentenceList;
359 if (InputSentenceListType == WHITELIST) listype =
true;
361 filter = OutputSentenceList;
362 if (OutputSentenceListType == WHITELIST) listype =
true;
364 if (filter.Count() == 0)
368 for (
size_t i = 0; i < filter.Count(); i++) {
370 switch (fs.Length()) {
372 if (fs == sentence.Mid(1, 2))
return listype;
375 if (fs == sentence.Mid(3, 3))
return listype;
378 if (fs == sentence.Mid(1, 5))
return listype;
385 if (re.Matches(sentence.Mid(0, 8))) {
394NavAddr::Bus ConnectionParams::GetCommProtocol()
const {
395 if (Type == NETWORK) {
396 if (NetProtocol == SIGNALK)
397 return NavAddr::Bus::Signalk;
398 else if (NetProtocol == GPSD)
399 return NavAddr::Bus::N0183;
404 return NavAddr::Bus::N0183;
406 return NavAddr::Bus::N2000;
408 return NavAddr::Bus::Undef;
412NavAddr::Bus ConnectionParams::GetLastCommProtocol() {
413 if (Type == NETWORK) {
414 if (LastNetProtocol == SIGNALK)
415 return NavAddr::Bus::Signalk;
416 else if (LastNetProtocol == GPSD)
417 return NavAddr::Bus::N0183;
420 switch (LastDataProtocol) {
422 return NavAddr::Bus::N0183;
424 return NavAddr::Bus::N2000;
426 return NavAddr::Bus::Undef;
std::string GetKey() const
Return string unique for each instance.
PlugIn Object Definition/API.