35#include <wx/jsonreader.h>
36#include <wx/jsonval.h>
37#include <wx/jsonwriter.h>
38#include <wx/tokenzr.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"
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) {
80 if (params.IOSelect == DS_TYPE_INPUT_OUTPUT ||
81 params.IOSelect == DS_TYPE_OUTPUT) {
82 std::string
id = msg.ToStdString().substr(1, 5);
84 std::make_shared<NavAddr>(
NavAddr0183(params.GetStrippedDSPort()));
86 std::make_shared<Nmea0183Msg>(
id, msg.ToStdString(), source_addr);
88 ns.direction = NavmsgStatus::Direction::kOutput;
89 if (params.SentencePassesFilter(msg, FILTER_OUTPUT)) {
90 bool xmit_ok = driver->SendMessage(msg_out, source_addr);
91 if (!xmit_ok) ns.status = NavmsgStatus::State::kTxError;
93 ns.accepted = NavmsgStatus::Accepted::kFilteredDropped;
95 LogBroadcastOutputMessageColor(msg_out, ns, nmea_log);
100 on_msg_sent.
Notify(msg.ToStdString());
103bool CreateOutputConnection(
const wxString& com_name,
108 auto& registry = CommDriverRegistry::GetInstance();
109 const std::vector<DriverPtr>& drivers = registry.GetDrivers();
113 bool bGarmin =
false;
114 if (com_name.Lower().StartsWith(
"serial")) {
115 comx = com_name.AfterFirst(
':');
117 comx.BeforeFirst(
' ');
118 DriverPtr& old_driver =
FindDriver(drivers, comx.ToStdString());
119 wxLogDebug(
"Looking for old stream %s", com_name);
122 auto drv_serial_n0183 =
124 if (drv_serial_n0183) {
125 params_save = drv_serial_n0183->GetParams();
126 baud = params_save.Baudrate;
127 bGarmin = params_save.Garmin;
128 drv_serial_n0183->Close();
130 registry.Deactivate(old_driver);
132 b_restoreStream =
true;
135 if (baud == 0) baud = 4800;
137 if (com_name.Lower().StartsWith(
"serial")) {
142 cp.Garmin = bGarminIn || bGarmin;
143 cp.IOSelect = DS_TYPE_OUTPUT;
152 if (drv_serial_n0183) {
153 if ((wxNOT_FOUND != com_name.Upper().Find(
"USB")) &&
154 (wxNOT_FOUND != com_name.Upper().Find(
"GARMIN"))) {
157 while (!drv_serial_n0183->IsGarminThreadActive() && (timeout < 50)) {
163 if (!drv_serial_n0183->IsGarminThreadActive()) {
164 MESSAGE_LOG <<
"-->GPS Port:" << com_name
165 <<
" ...Could not be opened for writing";
170 while (!drv_serial_n0183->IsSecThreadActive() && (timeout < 50)) {
175 if (!drv_serial_n0183->IsSecThreadActive()) {
176 MESSAGE_LOG <<
"-->GPS Port:" << com_name
177 <<
" ...Could not be opened for writing";
182 FindDriver(drivers, comx.ToStdString(), NavAddr::Bus::N0183).get();
187 if (com_name.Find(
"Bluetooth") != wxNOT_FOUND) {
188 wxString comm_addr = com_name.AfterFirst(
';');
190 driver =
FindDriver(drivers, comm_addr.ToStdString()).get();
195 }
else if (com_name.Lower().StartsWith(
"udp") ||
196 com_name.Lower().StartsWith(
"tcp")) {
199 FindDriver(drivers, com_name.ToStdString(), NavAddr::Bus::N0183).get();
202 NetworkProtocol protocol = UDP;
203 if (com_name.Lower().StartsWith(
"tcp")) protocol = TCP;
204 wxStringTokenizer tkz(com_name,
":");
205 wxString token = tkz.GetNextToken();
206 wxString address = tkz.GetNextToken();
207 token = tkz.GetNextToken();
213 cp.NetProtocol = protocol;
214 cp.NetworkAddress = address;
215 cp.NetworkPort = port;
216 cp.IOSelect = DS_TYPE_OUTPUT;
220 FindDriver(drivers, cp.GetStrippedDSPort(), cp.GetLastCommProtocol());
226 if (com_name.Lower().StartsWith(
"tcp")) {
228 std::string msg(_(
"Connecting to "));
230 dlg_ctx.set_message(msg);
236 for (bconnected =
false; !bconnected && (loopCount > 0); loopCount--) {
237 if (drv_net_n0183->GetSock()->IsConnected()) {
246 msg = _(
"Connected to ");
248 dlg_ctx.set_message(msg);
251 auto& me =
FindDriver(drivers, driver->iface, driver->bus);
252 registry.Deactivate(me);
259 return driver !=
nullptr;
262int PrepareOutputChannel(
const wxString& com_name,
N0183DlgCtx dlg_ctx,
266 auto& registry = CommDriverRegistry::GetInstance();
270 const std::vector<DriverPtr>& drivers = registry.GetDrivers();
271 bool is_garmin_serial =
false;
274 if (com_name.Lower().StartsWith(
"serial")) {
276 comx = com_name.AfterFirst(
':');
277 comx = comx.BeforeFirst(
' ');
278 DriverPtr& existing_driver =
FindDriver(drivers, comx.ToStdString());
279 wxLogDebug(
"Looking for old stream %s", com_name);
281 if (existing_driver) {
284 if (drv_serial_n0183) {
285 is_garmin_serial = drv_serial_n0183->GetParams().Garmin;
295 if (is_garmin_serial) {
296 params_save = drv_serial_n0183->GetParams();
297 b_restoreStream =
true;
298 drv_serial_n0183->Close();
300 FindDriver(drivers, drv_serial_n0183->GetParams().GetStrippedDSPort(),
301 drv_serial_n0183->GetParams().GetCommProtocol());
302 registry.Deactivate(me);
306 CreateOutputConnection(com_name, params_save, btempStream,
307 b_restoreStream, dlg_ctx, is_garmin_serial);
308 if (!conn_ok)
return 1;
310#ifdef xUSE_GARMINHOST
312 if (com_name.Upper().Matches(
"*GARMIN*"))
318 drv_n0183_serial->StopGarminUSBIOThread(
true);
320 if (!drv_n0183_serial->IsGarminThreadActive()) {
321 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
323 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
324 << v_init <<
" LastGarminError: " << GetLastGarminError();
326 ret_val = ERR_GARMIN_INITIALIZE;
328 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
329 << Garmin_GPS_GetSaveString();
332 wxLogMessage(
"Sending Waypoint...");
335 RoutePointList rplist;
338 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
341 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
342 << GetLastGarminError();
344 ret_val = ERR_GARMIN_SEND_MESSAGE;
355int SendRouteToGPS_N0183(
Route* pr,
const wxString& com_name,
361 bool b_restoreStream =
false;
362 bool btempStream =
false;
364 auto& registry = CommDriverRegistry::GetInstance();
366 PrepareOutputChannel(com_name, dlg_ctx, params_save, b_restoreStream,
369 std::string target_iface =
370 com_name.AfterFirst(
':').ToStdString();
371 if (com_name.Lower().StartsWith(
"udp") || com_name.Lower().StartsWith(
"tcp"))
372 target_iface = com_name.ToStdString();
374 auto& target_driver =
375 FindDriver(registry.GetDrivers(), target_iface, NavAddr::Bus::N0183);
379 return ERR_GPS_DRIVER_NOT_AVAILAIBLE;
384 if (com_name.Upper().Matches(
"*GARMIN*"))
386 auto drv_serial_n0183 =
388 if (drv_serial_n0183) {
389 drv_serial_n0183->Close();
390 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
391 drv_serial_n0183->GetParams().GetStrippedDSPort(),
392 drv_serial_n0183->GetParams().GetCommProtocol());
393 registry.Deactivate(me);
397 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
399 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, error code: "
400 << v_init <<
" LastGarminError: " << GetLastGarminError();
401 ret_val = ERR_GARMIN_INITIALIZE;
403 MESSAGE_LOG <<
"Garmin USB initialized, unit identifies as "
404 << Garmin_GPS_GetSaveString();
407 wxLogMessage(
"Sending Routes...");
408 int ret1 = Garmin_GPS_SendRoute(wxString(
"usb:"), pr, dlg_ctx);
411 MESSAGE_LOG <<
" Error sending routes, last garmin error: "
412 << GetLastGarminError();
413 ret_val = ERR_GARMIN_SEND_MESSAGE;
423 if (g_bGarminHostUpload) {
425 auto drv_serial_n0183 =
427 if (drv_serial_n0183) {
428 drv_serial_n0183->Close();
429 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
430 drv_serial_n0183->GetParams().GetStrippedDSPort(),
431 drv_serial_n0183->GetParams().GetCommProtocol());
432 registry.Deactivate(me);
436 dlg_ctx.set_value(20);
438 wxString short_com = com_name.Mid(7);
445 v_init = Garmin_GPS_Init(short_com);
446 if (v_init >= 0)
break;
451 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: "
452 << short_com <<
" Error Code: " << v_init
453 <<
" LastGarminError: " << GetLastGarminError();
455 ret_val = ERR_GARMIN_INITIALIZE;
458 MESSAGE_LOG <<
"Sendig Route to Garmin GPS on port: " << short_com
459 <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
462 dlg_ctx.set_value(40);
463 lret_val = Garmin_GPS_SendRoute(short_com, pr, dlg_ctx);
465 MESSAGE_LOG <<
"Error Sending Route to Garmin GPS on port: " << short_com
466 <<
" Error Code: " << lret_val
467 <<
" LastGarminError: " << GetLastGarminError();
468 ret_val = ERR_GARMIN_SEND_MESSAGE;
476 dlg_ctx.set_value(100);
485 std::make_shared<NavAddr>(NavAddr::Bus::N0183, drv_n0183->iface);
487 NMEA0183 oNMEA0183(NmeaCtxFactory());
488 oNMEA0183.TalkerID = _T (
"EC" );
491 dlg_ctx.set_range(100);
493 int progress_stall = 500;
500 if (bsend_waypoints) {
507 if (g_GPS_Ident ==
"Generic") {
509 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
511 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
514 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
516 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
518 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
520 oNMEA0183.Wpl.Write(snt);
522 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
525 wxString talker_save = g_TalkerIdText;
526 g_TalkerIdText.Clear();
528 oNMEA0183.TalkerID = _T (
"PFEC," );
531 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
533 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
536 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
538 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
540 wxString name = prp->GetName();
542 name.Truncate(g_maxWPNameLength);
543 oNMEA0183.GPwpl.To = name;
545 oNMEA0183.GPwpl.Write(snt);
547 g_TalkerIdText = talker_save;
550 wxString payload = snt.Sentence;
562 auto msg_out = std::make_shared<Nmea0183Msg>(
563 "ECWPL", snt.Sentence.ToStdString(), address);
565 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
566 if (g_GPS_Ident !=
"FurunoGP3X")
567 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
570 ns.direction = NavmsgStatus::Direction::kOutput;
571 multiplexer.LogOutputMessage(msg_out, ns);
573 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + snt.Sentence;
577 dlg_ctx.set_value((ip * 100) / nProg);
579 wxMilliSleep(progress_stall);
581 node = node->GetNext();
589 unsigned int max_length = 76;
590 unsigned int max_wp = 2;
594 if (g_GPS_Ident ==
"FurunoGP3X") {
600 wxString talker_save = g_TalkerIdText;
601 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText.Clear();
603 oNMEA0183.Rte.Empty();
604 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
607 oNMEA0183.Rte.RouteName = _T (
"1" );
611 if (g_GPS_Ident ==
"FurunoGP3X") {
612 oNMEA0183.Rte.RouteName = _T (
"01" );
613 oNMEA0183.TalkerID = _T (
"GP" );
614 oNMEA0183.Rte.m_complete_char =
'C';
615 oNMEA0183.Rte.m_skip_checksum = 1;
618 oNMEA0183.Rte.total_number_of_messages = 1;
619 oNMEA0183.Rte.message_number = 1;
625 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
627 if (g_GPS_Ident ==
"FurunoGP3X") {
628 name = prp->GetName();
630 name.Truncate(g_maxWPNameLength);
635 oNMEA0183.Rte.AddWaypoint(name);
636 node = node->GetNext();
639 oNMEA0183.Rte.Write(snt);
641 if ((snt.Sentence.Len() > max_length) ||
646 NMEA0183 tNMEA0183(NmeaCtxFactory());
648 tNMEA0183.TalkerID = _T (
"EC" );
650 tNMEA0183.Rte.Empty();
651 tNMEA0183.Rte.TypeOfRoute = CompleteRoute;
653 if (g_GPS_Ident !=
"FurunoGP3X") {
655 tNMEA0183.Rte.RouteName = _T (
"1" );
660 tNMEA0183.Rte.RouteName = _T (
"01" );
663 tNMEA0183.Rte.Write(tsnt);
665 unsigned int tare_length = tsnt.Sentence.Len();
668 wxArrayString sentence_array;
672 bool bnew_sentence =
true;
674 unsigned int wp_count = 0;
679 unsigned int name_len =
680 prp->GetName().Truncate(g_maxWPNameLength).Len();
681 if (g_GPS_Ident ==
"FurunoGP3X")
685 sent_len = tare_length;
686 sent_len += name_len + 1;
687 bnew_sentence =
false;
688 _node = _node->GetNext();
692 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
694 bnew_sentence =
true;
696 if (wp_count == max_wp)
697 sent_len += name_len;
699 sent_len += name_len + 1;
701 _node = _node->GetNext();
708 int final_total = n_total;
710 bnew_sentence =
true;
715 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
716 if (g_GPS_Ident ==
"FurunoGP3X") {
717 name = prp->GetName();
719 name.Truncate(g_maxWPNameLength);
724 unsigned int name_len = name.Len();
727 sent_len = tare_length;
728 sent_len += name_len + 1;
729 bnew_sentence =
false;
731 oNMEA0183.Rte.Empty();
732 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
734 if (g_GPS_Ident !=
"FurunoGP3X") {
736 oNMEA0183.Rte.RouteName =
"1";
740 oNMEA0183.Rte.RouteName =
"01";
743 oNMEA0183.Rte.total_number_of_messages = final_total;
744 oNMEA0183.Rte.message_number = n_run;
745 snt.Sentence.Clear();
748 oNMEA0183.Rte.AddWaypoint(name);
749 _node = _node->GetNext();
751 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
753 bnew_sentence =
true;
755 oNMEA0183.Rte.Write(snt);
757 sentence_array.Add(snt.Sentence);
759 sent_len += name_len + 1;
760 oNMEA0183.Rte.AddWaypoint(name);
762 _node = _node->GetNext();
767 oNMEA0183.Rte.Write(snt);
768 if (snt.Sentence.Len() > tare_length) sentence_array.Add(snt.Sentence);
770 for (
unsigned int ii = 0; ii < sentence_array.GetCount(); ii++) {
771 wxString sentence = sentence_array[ii];
773 auto msg_out = std::make_shared<Nmea0183Msg>(
774 "ECRTE", sentence.ToStdString(), std::make_shared<NavAddr>());
775 drv_n0183->SendMessage(msg_out, address);
778 ns.direction = NavmsgStatus::Direction::kOutput;
779 multiplexer.LogOutputMessage(msg_out, ns);
784 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + sentence;
788 wxMilliSleep(progress_stall);
792 auto msg_out = std::make_shared<Nmea0183Msg>(
793 "ECRTE", snt.Sentence.ToStdString(), address);
794 drv_n0183->SendMessage(msg_out, address);
797 ns.direction = NavmsgStatus::Direction::kOutput;
798 multiplexer.LogOutputMessage(msg_out, ns);
802 wxString(
"-->GPS Port:") + com_name +
" Sentence: " + snt.Sentence;
807 if (g_GPS_Ident ==
"FurunoGP3X") {
808 wxString name = pr->GetName();
809 if (name.IsEmpty()) name =
"RTECOMMENT";
811 rte.Printf(
"$PFEC,GPrtc,01,");
812 rte += name.Left(16);
814 rtep.Printf(
",%c%c", 0x0d, 0x0a);
818 std::make_shared<Nmea0183Msg>(
"GPRTC", rte.ToStdString(), address);
819 drv_n0183->SendMessage(msg_out, address);
821 ns.direction = NavmsgStatus::Direction::kOutput;
822 multiplexer.LogOutputMessage(msg_out, ns);
824 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + rte;
829 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
832 std::make_shared<Nmea0183Msg>(
"GPRTC", term.ToStdString(), address);
833 drv_n0183->SendMessage(msg_outf, address);
836 ns.direction = NavmsgStatus::Direction::kOutput;
837 multiplexer.LogOutputMessage(msg_outf, ns);
839 msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
843 dlg_ctx.set_value(100);
845 wxMilliSleep(progress_stall);
849 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText = talker_save;
854 registry.Deactivate(target_driver);
857 if (b_restoreStream) {
865int SendWaypointToGPS_N0183(
RoutePoint* prp,
const wxString& com_name,
870 bool b_restoreStream =
false;
871 bool btempStream =
false;
873 auto& registry = CommDriverRegistry::GetInstance();
875 PrepareOutputChannel(com_name, dlg_ctx, params_save, b_restoreStream,
878 auto& target_driver =
879 FindDriver(registry.GetDrivers(), com_name.AfterFirst(
':').ToStdString(),
880 NavAddr::Bus::N0183);
884 if (com_name.Upper().Matches(
"*GARMIN*"))
886 auto drv_serial_n0183 =
888 if (drv_serial_n0183) {
889 drv_serial_n0183->Close();
890 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
891 drv_serial_n0183->GetParams().GetStrippedDSPort(),
892 drv_serial_n0183->GetParams().GetCommProtocol());
894 registry.Deactivate(me);
898 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
900 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
901 << v_init <<
" LastGarminError: " << GetLastGarminError();
903 ret_val = ERR_GARMIN_INITIALIZE;
905 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
906 << Garmin_GPS_GetSaveString();
909 wxLogMessage(
"Sending Waypoint...");
912 RoutePointList rplist;
915 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
918 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
919 << GetLastGarminError();
921 ret_val = ERR_GARMIN_SEND_MESSAGE;
933 if (g_bGarminHostUpload) {
938 serial_n0183->Close();
939 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
940 serial_n0183->GetParams().GetStrippedDSPort(),
941 serial_n0183->GetParams().GetCommProtocol());
942 registry.Deactivate(me);
944 RoutePointList rplist;
946 wxString short_com = com_name.Mid(7);
953 v_init = Garmin_GPS_Init(short_com);
954 if (v_init >= 0)
break;
959 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: " << com_name
960 <<
" Error Code: " << v_init
961 <<
"LastGarminError: " << GetLastGarminError();
963 ret_val = ERR_GARMIN_INITIALIZE;
966 MESSAGE_LOG <<
"Sending waypoint(s) to Garmin GPS on port: " << com_name;
967 MESSAGE_LOG <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
973 ret_val = Garmin_GPS_SendWaypoints(short_com, &rplist);
975 MESSAGE_LOG <<
"Error Sending Waypoint(s) to Garmin GPS on port, "
976 << com_name <<
" error code: " << ret_val
977 <<
", last garmin error: " << GetLastGarminError();
978 ret_val = ERR_GARMIN_SEND_MESSAGE;
990 ret_val = ERR_GPS_DRIVER_NOT_AVAILAIBLE;
994 auto address = std::make_shared<NavAddr>();
996 NMEA0183 oNMEA0183(NmeaCtxFactory());
997 oNMEA0183.TalkerID =
"EC";
998 dlg_ctx.set_range(100);
1000 if (g_GPS_Ident ==
"Generic") {
1001 if (prp->m_lat < 0.)
1002 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat,
"S");
1004 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat,
"N");
1006 if (prp->m_lon < 0.)
1007 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon,
"W");
1009 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon,
"E");
1011 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
1013 oNMEA0183.Wpl.Write(snt);
1014 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
1015 oNMEA0183.TalkerID =
"PFEC,";
1017 if (prp->m_lat < 0.)
1018 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat,
"S");
1020 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat,
"N");
1022 if (prp->m_lon < 0.)
1023 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon,
"W");
1025 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon,
"E");
1027 wxString name = prp->GetName();
1029 name.Truncate(g_maxWPNameLength);
1030 oNMEA0183.GPwpl.To = name;
1032 oNMEA0183.GPwpl.Write(snt);
1035 auto msg_out = std::make_shared<Nmea0183Msg>(
1036 "ECWPL", snt.Sentence.ToStdString(), address);
1037 drv_n0183->SendMessage(msg_out, address);
1040 ns.direction = NavmsgStatus::Direction::kOutput;
1041 multiplexer.LogOutputMessage(msg_out, ns);
1042 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: ";
1046 if (g_GPS_Ident ==
"FurunoGP3X") {
1048 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
1053 auto logmsg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
1055 wxLogMessage(logmsg);
1057 dlg_ctx.set_value(100);
1066 if (btempStream) registry.Deactivate(target_driver);
1068 if (b_restoreStream) {
Common interface for all drivers.
NMEA0183 basic parsing common parts:
Generic event handling between MVC Model and Controller based on a shared EventVar variable.
void Notify() override
Notify all listeners, no data supplied.
Handle logging and forwarding of incoming n0183/n2k messages.
Representation of message status as determined by the multiplexer.
virtual bool IsVisible() const =0
Return true if log is visible i.e., if it's any point using Add().
virtual void Add(const Logline &l)=0
Add a 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.
void MakeCommDriver(const ConnectionParams *params)
Create and register a driver for given connection.
Communication drivers factory and support.
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.
Basic DataMonitor logging interface: LogLine (reflects a line in the log) and NmeaLog,...