35#include <wx/jsonreader.h>
36#include <wx/jsonval.h>
37#include <wx/jsonwriter.h>
38#include <wx/tokenzr.h>
41#include "model/comm_drv_factory.h"
42#include "model/comm_drv_n0183_android_bt.h"
46#include "model/comm_n0183_output.h"
47#include "model/config_vars.h"
48#include "model/conn_params.h"
50#include "model/nmea_ctx_factory.h"
51#include "model/nmea_log.h"
52#include "model/route.h"
56#include "model/garmin_wrapper.h"
59void LogBroadcastOutputMessageColor(
const std::shared_ptr<const NavMsg>& msg,
62 ns.direction = NavmsgStatus::Direction::kOutput;
68void BroadcastNMEA0183Message(
const wxString& msg,
NmeaLog* nmea_log,
70 auto& registry = CommDriverRegistry::GetInstance();
71 const std::vector<std::unique_ptr<AbstractCommDriver>>& drivers =
72 registry.GetDrivers();
74 for (
auto& driver : drivers) {
75 if (driver->bus == NavAddr::Bus::N0183) {
79 params = drv_serial->GetParams();
83 params = drv_net->GetParams();
90 params = drv_bluetooth->GetParams();
96 if (params.IOSelect == DS_TYPE_INPUT_OUTPUT ||
97 params.IOSelect == DS_TYPE_OUTPUT) {
98 std::string
id = msg.ToStdString().substr(1, 5);
100 std::make_shared<NavAddr>(
NavAddr0183(params.GetStrippedDSPort()));
102 std::make_shared<Nmea0183Msg>(
id, msg.ToStdString(), source_addr);
104 ns.direction = NavmsgStatus::Direction::kOutput;
105 if (params.SentencePassesFilter(msg, FILTER_OUTPUT)) {
106 bool xmit_ok = driver->SendMessage(msg_out, source_addr);
107 if (!xmit_ok) ns.status = NavmsgStatus::State::kTxError;
109 ns.accepted = NavmsgStatus::Accepted::kFilteredDropped;
111 LogBroadcastOutputMessageColor(msg_out, ns, nmea_log);
116 on_msg_sent.
Notify(msg.ToStdString());
119bool CreateOutputConnection(
const wxString& com_name,
124 auto& registry = CommDriverRegistry::GetInstance();
125 const std::vector<DriverPtr>& drivers = registry.GetDrivers();
129 bool bGarmin =
false;
130 if (com_name.Lower().StartsWith(
"serial")) {
131 comx = com_name.AfterFirst(
':');
133 comx.BeforeFirst(
' ');
134 DriverPtr& old_driver =
FindDriver(drivers, comx.ToStdString());
135 wxLogDebug(
"Looking for old stream %s", com_name);
138 auto drv_serial_n0183 =
140 if (drv_serial_n0183) {
141 params_save = drv_serial_n0183->GetParams();
142 baud = params_save.Baudrate;
143 bGarmin = params_save.Garmin;
144 drv_serial_n0183->Close();
146 registry.Deactivate(old_driver);
148 b_restoreStream =
true;
151 if (baud == 0) baud = 4800;
153 if (com_name.Lower().StartsWith(
"serial")) {
158 cp.Garmin = bGarminIn || bGarmin;
159 cp.IOSelect = DS_TYPE_OUTPUT;
168 if (drv_serial_n0183) {
169 if ((wxNOT_FOUND != com_name.Upper().Find(
"USB")) &&
170 (wxNOT_FOUND != com_name.Upper().Find(
"GARMIN"))) {
173 while (!drv_serial_n0183->IsGarminThreadActive() && (timeout < 50)) {
179 if (!drv_serial_n0183->IsGarminThreadActive()) {
180 MESSAGE_LOG <<
"-->GPS Port:" << com_name
181 <<
" ...Could not be opened for writing";
186 while (!drv_serial_n0183->IsSecThreadActive() && (timeout < 50)) {
191 if (!drv_serial_n0183->IsSecThreadActive()) {
192 MESSAGE_LOG <<
"-->GPS Port:" << com_name
193 <<
" ...Could not be opened for writing";
199 driver =
FindDriver(drivers, com_name.ToStdString()).get();
201 if (com_name.Find(
"Bluetooth") != wxNOT_FOUND) {
202 wxString comm_addr = com_name.AfterFirst(
';');
204 driver =
FindDriver(drivers, comm_addr.ToStdString()).get();
209 }
else if (com_name.Lower().StartsWith(
"udp") ||
210 com_name.Lower().StartsWith(
"tcp")) {
213 NetworkProtocol protocol = UDP;
214 if (com_name.Lower().StartsWith(
"tcp")) protocol = TCP;
215 wxStringTokenizer tkz(com_name,
":");
216 wxString token = tkz.GetNextToken();
217 wxString address = tkz.GetNextToken();
218 token = tkz.GetNextToken();
224 cp.NetProtocol = protocol;
225 cp.NetworkAddress = address;
226 cp.NetworkPort = port;
227 cp.IOSelect = DS_TYPE_INPUT_OUTPUT;
231 FindDriver(drivers, cp.GetStrippedDSPort(), cp.GetLastCommProtocol());
237 if (com_name.Lower().StartsWith(
"tcp")) {
239 std::string msg(_(
"Connecting to "));
241 dlg_ctx.set_message(msg);
247 for (bconnected =
false; !bconnected && (loopCount > 0); loopCount--) {
248 if (drv_net_n0183->GetSock()->IsConnected()) {
257 msg = _(
"Connected to ");
259 dlg_ctx.set_message(msg);
262 auto& me =
FindDriver(drivers, driver->iface, driver->bus);
263 registry.Deactivate(me);
270 return driver !=
nullptr;
273int PrepareOutputChannel(
const wxString& com_name,
N0183DlgCtx dlg_ctx,
277 auto& registry = CommDriverRegistry::GetInstance();
281 const std::vector<DriverPtr>& drivers = registry.GetDrivers();
282 bool is_garmin_serial =
false;
285 if (com_name.Lower().StartsWith(
"serial")) {
287 comx = com_name.AfterFirst(
':');
288 comx = comx.BeforeFirst(
' ');
289 DriverPtr& existing_driver =
FindDriver(drivers, comx.ToStdString());
290 wxLogDebug(
"Looking for old stream %s", com_name);
292 if (existing_driver) {
295 if (drv_serial_n0183) {
296 is_garmin_serial = drv_serial_n0183->GetParams().Garmin;
306 if (is_garmin_serial) {
307 params_save = drv_serial_n0183->GetParams();
308 b_restoreStream =
true;
309 drv_serial_n0183->Close();
311 FindDriver(drivers, drv_serial_n0183->GetParams().GetStrippedDSPort(),
312 drv_serial_n0183->GetParams().GetCommProtocol());
313 registry.Deactivate(me);
317 CreateOutputConnection(com_name, params_save, btempStream,
318 b_restoreStream, dlg_ctx, is_garmin_serial);
319 if (!conn_ok)
return 1;
321#ifdef xUSE_GARMINHOST
323 if (com_name.Upper().Matches(
"*GARMIN*"))
329 drv_n0183_serial->StopGarminUSBIOThread(
true);
331 if (!drv_n0183_serial->IsGarminThreadActive()) {
332 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
334 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
335 << v_init <<
" LastGarminError: " << GetLastGarminError();
337 ret_val = ERR_GARMIN_INITIALIZE;
339 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
340 << Garmin_GPS_GetSaveString();
343 wxLogMessage(
"Sending Waypoint...");
346 RoutePointList rplist;
349 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
352 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
353 << GetLastGarminError();
355 ret_val = ERR_GARMIN_SEND_MESSAGE;
366int SendRouteToGPS_N0183(
Route* pr,
const wxString& com_name,
371 std::unique_ptr<AbstractCommDriver> target_driver;
373 bool b_restoreStream =
false;
374 bool btempStream =
false;
376 auto& registry = CommDriverRegistry::GetInstance();
378 PrepareOutputChannel(com_name, dlg_ctx, params_save, b_restoreStream,
383 return ERR_GPS_DRIVER_NOT_AVAILAIBLE;
388 if (com_name.Upper().Matches(
"*GARMIN*"))
390 auto drv_serial_n0183 =
392 if (drv_serial_n0183) {
393 drv_serial_n0183->Close();
394 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
395 drv_serial_n0183->GetParams().GetStrippedDSPort(),
396 drv_serial_n0183->GetParams().GetCommProtocol());
397 registry.Deactivate(me);
401 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
403 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, error code: "
404 << v_init <<
" LastGarminError: " << GetLastGarminError();
405 ret_val = ERR_GARMIN_INITIALIZE;
407 MESSAGE_LOG <<
"Garmin USB initialized, unit identifies as "
408 << Garmin_GPS_GetSaveString();
411 wxLogMessage(
"Sending Routes...");
412 int ret1 = Garmin_GPS_SendRoute(wxString(
"usb:"), pr, dlg_ctx);
415 MESSAGE_LOG <<
" Error sending routes, last garmin error: "
416 << GetLastGarminError();
417 ret_val = ERR_GARMIN_SEND_MESSAGE;
427 if (g_bGarminHostUpload) {
429 auto drv_serial_n0183 =
431 if (drv_serial_n0183) {
432 drv_serial_n0183->Close();
433 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
434 drv_serial_n0183->GetParams().GetStrippedDSPort(),
435 drv_serial_n0183->GetParams().GetCommProtocol());
436 registry.Deactivate(me);
440 dlg_ctx.set_value(20);
442 wxString short_com = com_name.Mid(7);
449 v_init = Garmin_GPS_Init(short_com);
450 if (v_init >= 0)
break;
455 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: "
456 << short_com <<
" Error Code: " << v_init
457 <<
" LastGarminError: " << GetLastGarminError();
459 ret_val = ERR_GARMIN_INITIALIZE;
462 MESSAGE_LOG <<
"Sendig Route to Garmin GPS on port: " << short_com
463 <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
466 dlg_ctx.set_value(40);
467 lret_val = Garmin_GPS_SendRoute(short_com, pr, dlg_ctx);
469 MESSAGE_LOG <<
"Error Sending Route to Garmin GPS on port: " << short_com
470 <<
" Error Code: " << lret_val
471 <<
" LastGarminError: " << GetLastGarminError();
472 ret_val = ERR_GARMIN_SEND_MESSAGE;
480 dlg_ctx.set_value(100);
489 std::make_shared<NavAddr>(NavAddr::Bus::N0183, drv_n0183->iface);
491 NMEA0183 oNMEA0183(NmeaCtxFactory());
492 oNMEA0183.TalkerID = _T (
"EC" );
495 dlg_ctx.set_range(100);
497 int progress_stall = 500;
504 if (bsend_waypoints) {
511 if (g_GPS_Ident ==
"Generic") {
513 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
515 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
518 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
520 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
522 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
524 oNMEA0183.Wpl.Write(snt);
526 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
529 wxString talker_save = g_TalkerIdText;
530 g_TalkerIdText.Clear();
532 oNMEA0183.TalkerID = _T (
"PFEC," );
535 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
537 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
540 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
542 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
544 wxString name = prp->GetName();
546 name.Truncate(g_maxWPNameLength);
547 oNMEA0183.GPwpl.To = name;
549 oNMEA0183.GPwpl.Write(snt);
551 g_TalkerIdText = talker_save;
554 wxString payload = snt.Sentence;
566 auto msg_out = std::make_shared<Nmea0183Msg>(
567 "ECWPL", snt.Sentence.ToStdString(), address);
569 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
570 if (g_GPS_Ident !=
"FurunoGP3X")
571 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
574 ns.direction = NavmsgStatus::Direction::kOutput;
575 multiplexer.LogOutputMessage(msg_out, ns);
577 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + snt.Sentence;
581 dlg_ctx.set_value((ip * 100) / nProg);
583 wxMilliSleep(progress_stall);
585 node = node->GetNext();
593 unsigned int max_length = 76;
594 unsigned int max_wp = 2;
598 if (g_GPS_Ident ==
"FurunoGP3X") {
604 wxString talker_save = g_TalkerIdText;
605 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText.Clear();
607 oNMEA0183.Rte.Empty();
608 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
611 oNMEA0183.Rte.RouteName = _T (
"1" );
615 if (g_GPS_Ident ==
"FurunoGP3X") {
616 oNMEA0183.Rte.RouteName = _T (
"01" );
617 oNMEA0183.TalkerID = _T (
"GP" );
618 oNMEA0183.Rte.m_complete_char =
'C';
619 oNMEA0183.Rte.m_skip_checksum = 1;
622 oNMEA0183.Rte.total_number_of_messages = 1;
623 oNMEA0183.Rte.message_number = 1;
629 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
631 if (g_GPS_Ident ==
"FurunoGP3X") {
632 name = prp->GetName();
634 name.Truncate(g_maxWPNameLength);
639 oNMEA0183.Rte.AddWaypoint(name);
640 node = node->GetNext();
643 oNMEA0183.Rte.Write(snt);
645 if ((snt.Sentence.Len() > max_length) ||
650 NMEA0183 tNMEA0183(NmeaCtxFactory());
652 tNMEA0183.TalkerID = _T (
"EC" );
654 tNMEA0183.Rte.Empty();
655 tNMEA0183.Rte.TypeOfRoute = CompleteRoute;
657 if (g_GPS_Ident !=
"FurunoGP3X") {
659 tNMEA0183.Rte.RouteName = _T (
"1" );
664 tNMEA0183.Rte.RouteName = _T (
"01" );
667 tNMEA0183.Rte.Write(tsnt);
669 unsigned int tare_length = tsnt.Sentence.Len();
672 wxArrayString sentence_array;
676 bool bnew_sentence =
true;
678 unsigned int wp_count = 0;
683 unsigned int name_len =
684 prp->GetName().Truncate(g_maxWPNameLength).Len();
685 if (g_GPS_Ident ==
"FurunoGP3X")
689 sent_len = tare_length;
690 sent_len += name_len + 1;
691 bnew_sentence =
false;
692 _node = _node->GetNext();
696 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
698 bnew_sentence =
true;
700 if (wp_count == max_wp)
701 sent_len += name_len;
703 sent_len += name_len + 1;
705 _node = _node->GetNext();
712 int final_total = n_total;
714 bnew_sentence =
true;
719 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
720 if (g_GPS_Ident ==
"FurunoGP3X") {
721 name = prp->GetName();
723 name.Truncate(g_maxWPNameLength);
728 unsigned int name_len = name.Len();
731 sent_len = tare_length;
732 sent_len += name_len + 1;
733 bnew_sentence =
false;
735 oNMEA0183.Rte.Empty();
736 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
738 if (g_GPS_Ident !=
"FurunoGP3X") {
740 oNMEA0183.Rte.RouteName =
"1";
744 oNMEA0183.Rte.RouteName =
"01";
747 oNMEA0183.Rte.total_number_of_messages = final_total;
748 oNMEA0183.Rte.message_number = n_run;
749 snt.Sentence.Clear();
752 oNMEA0183.Rte.AddWaypoint(name);
753 _node = _node->GetNext();
755 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
757 bnew_sentence =
true;
759 oNMEA0183.Rte.Write(snt);
761 sentence_array.Add(snt.Sentence);
763 sent_len += name_len + 1;
764 oNMEA0183.Rte.AddWaypoint(name);
766 _node = _node->GetNext();
771 oNMEA0183.Rte.Write(snt);
772 if (snt.Sentence.Len() > tare_length) sentence_array.Add(snt.Sentence);
774 for (
unsigned int ii = 0; ii < sentence_array.GetCount(); ii++) {
775 wxString sentence = sentence_array[ii];
777 auto msg_out = std::make_shared<Nmea0183Msg>(
778 "ECRTE", sentence.ToStdString(), std::make_shared<NavAddr>());
779 drv_n0183->SendMessage(msg_out, address);
782 ns.direction = NavmsgStatus::Direction::kOutput;
783 multiplexer.LogOutputMessage(msg_out, ns);
788 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + sentence;
792 wxMilliSleep(progress_stall);
796 auto msg_out = std::make_shared<Nmea0183Msg>(
797 "ECRTE", snt.Sentence.ToStdString(), address);
798 drv_n0183->SendMessage(msg_out, address);
801 ns.direction = NavmsgStatus::Direction::kOutput;
802 multiplexer.LogOutputMessage(msg_out, ns);
806 wxString(
"-->GPS Port:") + com_name +
" Sentence: " + snt.Sentence;
811 if (g_GPS_Ident ==
"FurunoGP3X") {
812 wxString name = pr->GetName();
813 if (name.IsEmpty()) name =
"RTECOMMENT";
815 rte.Printf(
"$PFEC,GPrtc,01,");
816 rte += name.Left(16);
818 rtep.Printf(
",%c%c", 0x0d, 0x0a);
822 std::make_shared<Nmea0183Msg>(
"GPRTC", rte.ToStdString(), address);
823 drv_n0183->SendMessage(msg_out, address);
825 ns.direction = NavmsgStatus::Direction::kOutput;
826 multiplexer.LogOutputMessage(msg_out, ns);
828 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + rte;
833 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
836 std::make_shared<Nmea0183Msg>(
"GPRTC", term.ToStdString(), address);
837 drv_n0183->SendMessage(msg_outf, address);
840 ns.direction = NavmsgStatus::Direction::kOutput;
841 multiplexer.LogOutputMessage(msg_outf, ns);
843 msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
847 dlg_ctx.set_value(100);
849 wxMilliSleep(progress_stall);
853 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText = talker_save;
858 registry.Deactivate(target_driver);
861 if (b_restoreStream) {
863 MakeCommDriver(¶ms_save);
869int SendWaypointToGPS_N0183(
RoutePoint* prp,
const wxString& com_name,
873 std::unique_ptr<AbstractCommDriver> target_driver;
875 bool b_restoreStream =
false;
876 bool btempStream =
false;
878 auto& registry = CommDriverRegistry::GetInstance();
880 PrepareOutputChannel(com_name, dlg_ctx, params_save, b_restoreStream,
885 if (com_name.Upper().Matches(
"*GARMIN*"))
887 auto drv_serial_n0183 =
889 if (drv_serial_n0183) {
890 drv_serial_n0183->Close();
891 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
892 drv_serial_n0183->GetParams().GetStrippedDSPort(),
893 drv_serial_n0183->GetParams().GetCommProtocol());
895 registry.Deactivate(me);
899 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
901 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
902 << v_init <<
" LastGarminError: " << GetLastGarminError();
904 ret_val = ERR_GARMIN_INITIALIZE;
906 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
907 << Garmin_GPS_GetSaveString();
910 wxLogMessage(
"Sending Waypoint...");
913 RoutePointList rplist;
916 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
919 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
920 << GetLastGarminError();
922 ret_val = ERR_GARMIN_SEND_MESSAGE;
934 if (g_bGarminHostUpload) {
939 serial_n0183->Close();
940 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
941 serial_n0183->GetParams().GetStrippedDSPort(),
942 serial_n0183->GetParams().GetCommProtocol());
943 registry.Deactivate(me);
945 RoutePointList rplist;
947 wxString short_com = com_name.Mid(7);
954 v_init = Garmin_GPS_Init(short_com);
955 if (v_init >= 0)
break;
960 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: " << com_name
961 <<
" Error Code: " << v_init
962 <<
"LastGarminError: " << GetLastGarminError();
964 ret_val = ERR_GARMIN_INITIALIZE;
967 MESSAGE_LOG <<
"Sending waypoint(s) to Garmin GPS on port: " << com_name;
968 MESSAGE_LOG <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
974 ret_val = Garmin_GPS_SendWaypoints(short_com, &rplist);
976 MESSAGE_LOG <<
"Error Sending Waypoint(s) to Garmin GPS on port, "
977 << com_name <<
" error code: " << ret_val
978 <<
", last garmin error: " << GetLastGarminError();
979 ret_val = ERR_GARMIN_SEND_MESSAGE;
991 ret_val = ERR_GPS_DRIVER_NOT_AVAILAIBLE;
995 auto address = std::make_shared<NavAddr>();
997 NMEA0183 oNMEA0183(NmeaCtxFactory());
998 oNMEA0183.TalkerID =
"EC";
999 dlg_ctx.set_range(100);
1001 if (g_GPS_Ident ==
"Generic") {
1002 if (prp->m_lat < 0.)
1003 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat,
"S");
1005 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat,
"N");
1007 if (prp->m_lon < 0.)
1008 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon,
"W");
1010 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon,
"E");
1012 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
1014 oNMEA0183.Wpl.Write(snt);
1015 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
1016 oNMEA0183.TalkerID =
"PFEC,";
1018 if (prp->m_lat < 0.)
1019 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat,
"S");
1021 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat,
"N");
1023 if (prp->m_lon < 0.)
1024 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon,
"W");
1026 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon,
"E");
1028 wxString name = prp->GetName();
1030 name.Truncate(g_maxWPNameLength);
1031 oNMEA0183.GPwpl.To = name;
1033 oNMEA0183.GPwpl.Write(snt);
1036 auto msg_out = std::make_shared<Nmea0183Msg>(
1037 "ECWPL", snt.Sentence.ToStdString(), address);
1038 drv_n0183->SendMessage(msg_out, address);
1041 ns.direction = NavmsgStatus::Direction::kOutput;
1042 multiplexer.LogOutputMessage(msg_out, ns);
1043 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: ";
1047 if (g_GPS_Ident ==
"FurunoGP3X") {
1049 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
1054 auto logmsg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
1056 wxLogMessage(logmsg);
1058 dlg_ctx.set_value(100);
1067 if (btempStream) registry.Deactivate(target_driver);
1069 if (b_restoreStream) {
1070 MakeCommDriver(¶ms_save);
Common interface for all drivers.
NMEA0183 drivers common part.
Generic event handling between MVC Model and Controller based on a shared EventVar variable.
const void Notify()
Notify all listeners, no data supplied.
Representation of message status as determined by the multiplexer.
virtual bool IsVisible() const =0
Return true if log is visible i.
virtual void Add(const Logline &l)=0
Add an formatted string to log output.
Represents a waypoint or mark within the navigation system.
Represents a navigational route in the navigation system.
RoutePointList * pRoutePointList
Ordered list of waypoints (RoutePoints) that make up this route.
wxString m_RouteNameString
User-assigned name for the route.
Communication driver layer.
DriverPtr & FindDriver(const std::vector< DriverPtr > &drivers, const std::string &iface, const NavAddr::Bus _bus)
Search list of drivers for a driver with given interface string.
Driver registration container, a singleton.
Enhanced logging interface on top of wx/log.h.