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";
198 FindDriver(drivers, comx.ToStdString(), NavAddr::Bus::N0183).get();
203 if (com_name.Find(
"Bluetooth") != wxNOT_FOUND) {
204 wxString comm_addr = com_name.AfterFirst(
';');
206 driver =
FindDriver(drivers, comm_addr.ToStdString()).get();
211 }
else if (com_name.Lower().StartsWith(
"udp") ||
212 com_name.Lower().StartsWith(
"tcp")) {
215 FindDriver(drivers, com_name.ToStdString(), NavAddr::Bus::N0183).get();
218 NetworkProtocol protocol = UDP;
219 if (com_name.Lower().StartsWith(
"tcp")) protocol = TCP;
220 wxStringTokenizer tkz(com_name,
":");
221 wxString token = tkz.GetNextToken();
222 wxString address = tkz.GetNextToken();
223 token = tkz.GetNextToken();
229 cp.NetProtocol = protocol;
230 cp.NetworkAddress = address;
231 cp.NetworkPort = port;
232 cp.IOSelect = DS_TYPE_OUTPUT;
236 FindDriver(drivers, cp.GetStrippedDSPort(), cp.GetLastCommProtocol());
242 if (com_name.Lower().StartsWith(
"tcp")) {
244 std::string msg(_(
"Connecting to "));
246 dlg_ctx.set_message(msg);
252 for (bconnected =
false; !bconnected && (loopCount > 0); loopCount--) {
253 if (drv_net_n0183->GetSock()->IsConnected()) {
262 msg = _(
"Connected to ");
264 dlg_ctx.set_message(msg);
267 auto& me =
FindDriver(drivers, driver->iface, driver->bus);
268 registry.Deactivate(me);
275 return driver !=
nullptr;
278int PrepareOutputChannel(
const wxString& com_name,
N0183DlgCtx dlg_ctx,
282 auto& registry = CommDriverRegistry::GetInstance();
286 const std::vector<DriverPtr>& drivers = registry.GetDrivers();
287 bool is_garmin_serial =
false;
290 if (com_name.Lower().StartsWith(
"serial")) {
292 comx = com_name.AfterFirst(
':');
293 comx = comx.BeforeFirst(
' ');
294 DriverPtr& existing_driver =
FindDriver(drivers, comx.ToStdString());
295 wxLogDebug(
"Looking for old stream %s", com_name);
297 if (existing_driver) {
300 if (drv_serial_n0183) {
301 is_garmin_serial = drv_serial_n0183->GetParams().Garmin;
311 if (is_garmin_serial) {
312 params_save = drv_serial_n0183->GetParams();
313 b_restoreStream =
true;
314 drv_serial_n0183->Close();
316 FindDriver(drivers, drv_serial_n0183->GetParams().GetStrippedDSPort(),
317 drv_serial_n0183->GetParams().GetCommProtocol());
318 registry.Deactivate(me);
322 CreateOutputConnection(com_name, params_save, btempStream,
323 b_restoreStream, dlg_ctx, is_garmin_serial);
324 if (!conn_ok)
return 1;
326#ifdef xUSE_GARMINHOST
328 if (com_name.Upper().Matches(
"*GARMIN*"))
334 drv_n0183_serial->StopGarminUSBIOThread(
true);
336 if (!drv_n0183_serial->IsGarminThreadActive()) {
337 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
339 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
340 << v_init <<
" LastGarminError: " << GetLastGarminError();
342 ret_val = ERR_GARMIN_INITIALIZE;
344 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
345 << Garmin_GPS_GetSaveString();
348 wxLogMessage(
"Sending Waypoint...");
351 RoutePointList rplist;
354 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
357 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
358 << GetLastGarminError();
360 ret_val = ERR_GARMIN_SEND_MESSAGE;
371int SendRouteToGPS_N0183(
Route* pr,
const wxString& com_name,
377 bool b_restoreStream =
false;
378 bool btempStream =
false;
380 auto& registry = CommDriverRegistry::GetInstance();
382 PrepareOutputChannel(com_name, dlg_ctx, params_save, b_restoreStream,
385 std::string target_iface =
386 com_name.AfterFirst(
':').ToStdString();
387 if (com_name.Lower().StartsWith(
"udp") || com_name.Lower().StartsWith(
"tcp"))
388 target_iface = com_name.ToStdString();
390 auto& target_driver =
391 FindDriver(registry.GetDrivers(), target_iface, NavAddr::Bus::N0183);
395 return ERR_GPS_DRIVER_NOT_AVAILAIBLE;
400 if (com_name.Upper().Matches(
"*GARMIN*"))
402 auto drv_serial_n0183 =
404 if (drv_serial_n0183) {
405 drv_serial_n0183->Close();
406 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
407 drv_serial_n0183->GetParams().GetStrippedDSPort(),
408 drv_serial_n0183->GetParams().GetCommProtocol());
409 registry.Deactivate(me);
413 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
415 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, error code: "
416 << v_init <<
" LastGarminError: " << GetLastGarminError();
417 ret_val = ERR_GARMIN_INITIALIZE;
419 MESSAGE_LOG <<
"Garmin USB initialized, unit identifies as "
420 << Garmin_GPS_GetSaveString();
423 wxLogMessage(
"Sending Routes...");
424 int ret1 = Garmin_GPS_SendRoute(wxString(
"usb:"), pr, dlg_ctx);
427 MESSAGE_LOG <<
" Error sending routes, last garmin error: "
428 << GetLastGarminError();
429 ret_val = ERR_GARMIN_SEND_MESSAGE;
439 if (g_bGarminHostUpload) {
441 auto drv_serial_n0183 =
443 if (drv_serial_n0183) {
444 drv_serial_n0183->Close();
445 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
446 drv_serial_n0183->GetParams().GetStrippedDSPort(),
447 drv_serial_n0183->GetParams().GetCommProtocol());
448 registry.Deactivate(me);
452 dlg_ctx.set_value(20);
454 wxString short_com = com_name.Mid(7);
461 v_init = Garmin_GPS_Init(short_com);
462 if (v_init >= 0)
break;
467 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: "
468 << short_com <<
" Error Code: " << v_init
469 <<
" LastGarminError: " << GetLastGarminError();
471 ret_val = ERR_GARMIN_INITIALIZE;
474 MESSAGE_LOG <<
"Sendig Route to Garmin GPS on port: " << short_com
475 <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
478 dlg_ctx.set_value(40);
479 lret_val = Garmin_GPS_SendRoute(short_com, pr, dlg_ctx);
481 MESSAGE_LOG <<
"Error Sending Route to Garmin GPS on port: " << short_com
482 <<
" Error Code: " << lret_val
483 <<
" LastGarminError: " << GetLastGarminError();
484 ret_val = ERR_GARMIN_SEND_MESSAGE;
492 dlg_ctx.set_value(100);
501 std::make_shared<NavAddr>(NavAddr::Bus::N0183, drv_n0183->iface);
503 NMEA0183 oNMEA0183(NmeaCtxFactory());
504 oNMEA0183.TalkerID = _T (
"EC" );
507 dlg_ctx.set_range(100);
509 int progress_stall = 500;
516 if (bsend_waypoints) {
523 if (g_GPS_Ident ==
"Generic") {
525 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
527 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
530 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
532 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
534 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
536 oNMEA0183.Wpl.Write(snt);
538 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
541 wxString talker_save = g_TalkerIdText;
542 g_TalkerIdText.Clear();
544 oNMEA0183.TalkerID = _T (
"PFEC," );
547 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
549 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
552 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
554 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
556 wxString name = prp->GetName();
558 name.Truncate(g_maxWPNameLength);
559 oNMEA0183.GPwpl.To = name;
561 oNMEA0183.GPwpl.Write(snt);
563 g_TalkerIdText = talker_save;
566 wxString payload = snt.Sentence;
578 auto msg_out = std::make_shared<Nmea0183Msg>(
579 "ECWPL", snt.Sentence.ToStdString(), address);
581 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
582 if (g_GPS_Ident !=
"FurunoGP3X")
583 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
586 ns.direction = NavmsgStatus::Direction::kOutput;
587 multiplexer.LogOutputMessage(msg_out, ns);
589 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + snt.Sentence;
593 dlg_ctx.set_value((ip * 100) / nProg);
595 wxMilliSleep(progress_stall);
597 node = node->GetNext();
605 unsigned int max_length = 76;
606 unsigned int max_wp = 2;
610 if (g_GPS_Ident ==
"FurunoGP3X") {
616 wxString talker_save = g_TalkerIdText;
617 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText.Clear();
619 oNMEA0183.Rte.Empty();
620 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
623 oNMEA0183.Rte.RouteName = _T (
"1" );
627 if (g_GPS_Ident ==
"FurunoGP3X") {
628 oNMEA0183.Rte.RouteName = _T (
"01" );
629 oNMEA0183.TalkerID = _T (
"GP" );
630 oNMEA0183.Rte.m_complete_char =
'C';
631 oNMEA0183.Rte.m_skip_checksum = 1;
634 oNMEA0183.Rte.total_number_of_messages = 1;
635 oNMEA0183.Rte.message_number = 1;
641 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
643 if (g_GPS_Ident ==
"FurunoGP3X") {
644 name = prp->GetName();
646 name.Truncate(g_maxWPNameLength);
651 oNMEA0183.Rte.AddWaypoint(name);
652 node = node->GetNext();
655 oNMEA0183.Rte.Write(snt);
657 if ((snt.Sentence.Len() > max_length) ||
662 NMEA0183 tNMEA0183(NmeaCtxFactory());
664 tNMEA0183.TalkerID = _T (
"EC" );
666 tNMEA0183.Rte.Empty();
667 tNMEA0183.Rte.TypeOfRoute = CompleteRoute;
669 if (g_GPS_Ident !=
"FurunoGP3X") {
671 tNMEA0183.Rte.RouteName = _T (
"1" );
676 tNMEA0183.Rte.RouteName = _T (
"01" );
679 tNMEA0183.Rte.Write(tsnt);
681 unsigned int tare_length = tsnt.Sentence.Len();
684 wxArrayString sentence_array;
688 bool bnew_sentence =
true;
690 unsigned int wp_count = 0;
695 unsigned int name_len =
696 prp->GetName().Truncate(g_maxWPNameLength).Len();
697 if (g_GPS_Ident ==
"FurunoGP3X")
701 sent_len = tare_length;
702 sent_len += name_len + 1;
703 bnew_sentence =
false;
704 _node = _node->GetNext();
708 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
710 bnew_sentence =
true;
712 if (wp_count == max_wp)
713 sent_len += name_len;
715 sent_len += name_len + 1;
717 _node = _node->GetNext();
724 int final_total = n_total;
726 bnew_sentence =
true;
731 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
732 if (g_GPS_Ident ==
"FurunoGP3X") {
733 name = prp->GetName();
735 name.Truncate(g_maxWPNameLength);
740 unsigned int name_len = name.Len();
743 sent_len = tare_length;
744 sent_len += name_len + 1;
745 bnew_sentence =
false;
747 oNMEA0183.Rte.Empty();
748 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
750 if (g_GPS_Ident !=
"FurunoGP3X") {
752 oNMEA0183.Rte.RouteName =
"1";
756 oNMEA0183.Rte.RouteName =
"01";
759 oNMEA0183.Rte.total_number_of_messages = final_total;
760 oNMEA0183.Rte.message_number = n_run;
761 snt.Sentence.Clear();
764 oNMEA0183.Rte.AddWaypoint(name);
765 _node = _node->GetNext();
767 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
769 bnew_sentence =
true;
771 oNMEA0183.Rte.Write(snt);
773 sentence_array.Add(snt.Sentence);
775 sent_len += name_len + 1;
776 oNMEA0183.Rte.AddWaypoint(name);
778 _node = _node->GetNext();
783 oNMEA0183.Rte.Write(snt);
784 if (snt.Sentence.Len() > tare_length) sentence_array.Add(snt.Sentence);
786 for (
unsigned int ii = 0; ii < sentence_array.GetCount(); ii++) {
787 wxString sentence = sentence_array[ii];
789 auto msg_out = std::make_shared<Nmea0183Msg>(
790 "ECRTE", sentence.ToStdString(), std::make_shared<NavAddr>());
791 drv_n0183->SendMessage(msg_out, address);
794 ns.direction = NavmsgStatus::Direction::kOutput;
795 multiplexer.LogOutputMessage(msg_out, ns);
800 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + sentence;
804 wxMilliSleep(progress_stall);
808 auto msg_out = std::make_shared<Nmea0183Msg>(
809 "ECRTE", snt.Sentence.ToStdString(), address);
810 drv_n0183->SendMessage(msg_out, address);
813 ns.direction = NavmsgStatus::Direction::kOutput;
814 multiplexer.LogOutputMessage(msg_out, ns);
818 wxString(
"-->GPS Port:") + com_name +
" Sentence: " + snt.Sentence;
823 if (g_GPS_Ident ==
"FurunoGP3X") {
824 wxString name = pr->GetName();
825 if (name.IsEmpty()) name =
"RTECOMMENT";
827 rte.Printf(
"$PFEC,GPrtc,01,");
828 rte += name.Left(16);
830 rtep.Printf(
",%c%c", 0x0d, 0x0a);
834 std::make_shared<Nmea0183Msg>(
"GPRTC", rte.ToStdString(), address);
835 drv_n0183->SendMessage(msg_out, address);
837 ns.direction = NavmsgStatus::Direction::kOutput;
838 multiplexer.LogOutputMessage(msg_out, ns);
840 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + rte;
845 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
848 std::make_shared<Nmea0183Msg>(
"GPRTC", term.ToStdString(), address);
849 drv_n0183->SendMessage(msg_outf, address);
852 ns.direction = NavmsgStatus::Direction::kOutput;
853 multiplexer.LogOutputMessage(msg_outf, ns);
855 msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
859 dlg_ctx.set_value(100);
861 wxMilliSleep(progress_stall);
865 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText = talker_save;
870 registry.Deactivate(target_driver);
873 if (b_restoreStream) {
875 MakeCommDriver(¶ms_save);
881int SendWaypointToGPS_N0183(
RoutePoint* prp,
const wxString& com_name,
886 bool b_restoreStream =
false;
887 bool btempStream =
false;
889 auto& registry = CommDriverRegistry::GetInstance();
891 PrepareOutputChannel(com_name, dlg_ctx, params_save, b_restoreStream,
894 auto& target_driver =
895 FindDriver(registry.GetDrivers(), com_name.AfterFirst(
':').ToStdString(),
896 NavAddr::Bus::N0183);
900 if (com_name.Upper().Matches(
"*GARMIN*"))
902 auto drv_serial_n0183 =
904 if (drv_serial_n0183) {
905 drv_serial_n0183->Close();
906 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
907 drv_serial_n0183->GetParams().GetStrippedDSPort(),
908 drv_serial_n0183->GetParams().GetCommProtocol());
910 registry.Deactivate(me);
914 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
916 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
917 << v_init <<
" LastGarminError: " << GetLastGarminError();
919 ret_val = ERR_GARMIN_INITIALIZE;
921 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
922 << Garmin_GPS_GetSaveString();
925 wxLogMessage(
"Sending Waypoint...");
928 RoutePointList rplist;
931 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
934 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
935 << GetLastGarminError();
937 ret_val = ERR_GARMIN_SEND_MESSAGE;
949 if (g_bGarminHostUpload) {
954 serial_n0183->Close();
955 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
956 serial_n0183->GetParams().GetStrippedDSPort(),
957 serial_n0183->GetParams().GetCommProtocol());
958 registry.Deactivate(me);
960 RoutePointList rplist;
962 wxString short_com = com_name.Mid(7);
969 v_init = Garmin_GPS_Init(short_com);
970 if (v_init >= 0)
break;
975 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: " << com_name
976 <<
" Error Code: " << v_init
977 <<
"LastGarminError: " << GetLastGarminError();
979 ret_val = ERR_GARMIN_INITIALIZE;
982 MESSAGE_LOG <<
"Sending waypoint(s) to Garmin GPS on port: " << com_name;
983 MESSAGE_LOG <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
989 ret_val = Garmin_GPS_SendWaypoints(short_com, &rplist);
991 MESSAGE_LOG <<
"Error Sending Waypoint(s) to Garmin GPS on port, "
992 << com_name <<
" error code: " << ret_val
993 <<
", last garmin error: " << GetLastGarminError();
994 ret_val = ERR_GARMIN_SEND_MESSAGE;
1006 ret_val = ERR_GPS_DRIVER_NOT_AVAILAIBLE;
1010 auto address = std::make_shared<NavAddr>();
1012 NMEA0183 oNMEA0183(NmeaCtxFactory());
1013 oNMEA0183.TalkerID =
"EC";
1014 dlg_ctx.set_range(100);
1016 if (g_GPS_Ident ==
"Generic") {
1017 if (prp->m_lat < 0.)
1018 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat,
"S");
1020 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat,
"N");
1022 if (prp->m_lon < 0.)
1023 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon,
"W");
1025 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon,
"E");
1027 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
1029 oNMEA0183.Wpl.Write(snt);
1030 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
1031 oNMEA0183.TalkerID =
"PFEC,";
1033 if (prp->m_lat < 0.)
1034 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat,
"S");
1036 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat,
"N");
1038 if (prp->m_lon < 0.)
1039 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon,
"W");
1041 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon,
"E");
1043 wxString name = prp->GetName();
1045 name.Truncate(g_maxWPNameLength);
1046 oNMEA0183.GPwpl.To = name;
1048 oNMEA0183.GPwpl.Write(snt);
1051 auto msg_out = std::make_shared<Nmea0183Msg>(
1052 "ECWPL", snt.Sentence.ToStdString(), address);
1053 drv_n0183->SendMessage(msg_out, address);
1056 ns.direction = NavmsgStatus::Direction::kOutput;
1057 multiplexer.LogOutputMessage(msg_out, ns);
1058 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: ";
1062 if (g_GPS_Ident ==
"FurunoGP3X") {
1064 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
1069 auto logmsg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
1071 wxLogMessage(logmsg);
1073 dlg_ctx.set_value(100);
1082 if (btempStream) registry.Deactivate(target_driver);
1084 if (b_restoreStream) {
1085 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.