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);
99 auto msg_out = std::make_shared<Nmea0183Msg>(
100 id, msg.ToStdString(), std::make_shared<NavAddr>());
102 ns.direction = NavmsgStatus::Direction::kOutput;
103 if (params.SentencePassesFilter(msg, FILTER_OUTPUT)) {
105 driver->SendMessage(msg_out, std::make_shared<NavAddr>());
106 if (!xmit_ok) ns.status = NavmsgStatus::State::kTxError;
108 ns.accepted = NavmsgStatus::Accepted::kFilteredDropped;
110 LogBroadcastOutputMessageColor(msg_out, ns, nmea_log);
115 on_msg_sent.
Notify(msg.ToStdString());
118bool CreateOutputConnection(
const wxString& com_name,
123 auto& registry = CommDriverRegistry::GetInstance();
124 const std::vector<DriverPtr>& drivers = registry.GetDrivers();
128 bool bGarmin =
false;
129 if (com_name.Lower().StartsWith(
"serial")) {
130 comx = com_name.AfterFirst(
':');
132 comx.BeforeFirst(
' ');
133 DriverPtr& old_driver =
FindDriver(drivers, comx.ToStdString());
134 wxLogDebug(
"Looking for old stream %s", com_name);
137 auto drv_serial_n0183 =
139 if (drv_serial_n0183) {
140 params_save = drv_serial_n0183->GetParams();
141 baud = params_save.Baudrate;
142 bGarmin = params_save.Garmin;
143 drv_serial_n0183->Close();
145 registry.Deactivate(old_driver);
147 b_restoreStream =
true;
150 if (baud == 0) baud = 4800;
152 if (com_name.Lower().StartsWith(
"serial")) {
157 cp.Garmin = bGarminIn || bGarmin;
158 cp.IOSelect = DS_TYPE_OUTPUT;
167 if (drv_serial_n0183) {
168 if ((wxNOT_FOUND != com_name.Upper().Find(
"USB")) &&
169 (wxNOT_FOUND != com_name.Upper().Find(
"GARMIN"))) {
172 while (!drv_serial_n0183->IsGarminThreadActive() && (timeout < 50)) {
178 if (!drv_serial_n0183->IsGarminThreadActive()) {
179 MESSAGE_LOG <<
"-->GPS Port:" << com_name
180 <<
" ...Could not be opened for writing";
185 while (!drv_serial_n0183->IsSecThreadActive() && (timeout < 50)) {
190 if (!drv_serial_n0183->IsSecThreadActive()) {
191 MESSAGE_LOG <<
"-->GPS Port:" << com_name
192 <<
" ...Could not be opened for writing";
198 driver =
FindDriver(drivers, com_name.ToStdString()).get();
200 if (com_name.Find(
"Bluetooth") != wxNOT_FOUND) {
201 wxString comm_addr = com_name.AfterFirst(
';');
203 driver =
FindDriver(drivers, comm_addr.ToStdString()).get();
208 }
else if (com_name.Lower().StartsWith(
"udp") ||
209 com_name.Lower().StartsWith(
"tcp")) {
212 NetworkProtocol protocol = UDP;
213 if (com_name.Lower().StartsWith(
"tcp")) protocol = TCP;
214 wxStringTokenizer tkz(com_name,
":");
215 wxString token = tkz.GetNextToken();
216 wxString address = tkz.GetNextToken();
217 token = tkz.GetNextToken();
223 cp.NetProtocol = protocol;
224 cp.NetworkAddress = address;
225 cp.NetworkPort = port;
226 cp.IOSelect = DS_TYPE_INPUT_OUTPUT;
230 FindDriver(drivers, cp.GetStrippedDSPort(), cp.GetLastCommProtocol());
236 if (com_name.Lower().StartsWith(
"tcp")) {
238 std::string msg(_(
"Connecting to "));
240 dlg_ctx.set_message(msg);
246 for (bconnected =
false; !bconnected && (loopCount > 0); loopCount--) {
247 if (drv_net_n0183->GetSock()->IsConnected()) {
256 msg = _(
"Connected to ");
258 dlg_ctx.set_message(msg);
261 auto& me =
FindDriver(drivers, driver->iface, driver->bus);
262 registry.Deactivate(me);
269 return driver !=
nullptr;
272int PrepareOutputChannel(
const wxString& com_name,
N0183DlgCtx dlg_ctx,
276 auto& registry = CommDriverRegistry::GetInstance();
280 const std::vector<DriverPtr>& drivers = registry.GetDrivers();
281 bool is_garmin_serial =
false;
284 if (com_name.Lower().StartsWith(
"serial")) {
286 comx = com_name.AfterFirst(
':');
287 comx = comx.BeforeFirst(
' ');
288 DriverPtr& existing_driver =
FindDriver(drivers, comx.ToStdString());
289 wxLogDebug(
"Looking for old stream %s", com_name);
291 if (existing_driver) {
294 if (drv_serial_n0183) {
295 is_garmin_serial = drv_serial_n0183->GetParams().Garmin;
305 if (is_garmin_serial) {
306 params_save = drv_serial_n0183->GetParams();
307 b_restoreStream =
true;
308 drv_serial_n0183->Close();
310 FindDriver(drivers, drv_serial_n0183->GetParams().GetStrippedDSPort(),
311 drv_serial_n0183->GetParams().GetCommProtocol());
312 registry.Deactivate(me);
316 CreateOutputConnection(com_name, params_save, btempStream,
317 b_restoreStream, dlg_ctx, is_garmin_serial);
318 if (!conn_ok)
return 1;
320#ifdef xUSE_GARMINHOST
322 if (com_name.Upper().Matches(
"*GARMIN*"))
328 drv_n0183_serial->StopGarminUSBIOThread(
true);
330 if (!drv_n0183_serial->IsGarminThreadActive()) {
331 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
333 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
334 << v_init <<
" LastGarminError: " << GetLastGarminError();
336 ret_val = ERR_GARMIN_INITIALIZE;
338 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
339 << Garmin_GPS_GetSaveString();
342 wxLogMessage(
"Sending Waypoint...");
345 RoutePointList rplist;
348 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
351 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
352 << GetLastGarminError();
354 ret_val = ERR_GARMIN_SEND_MESSAGE;
365int SendRouteToGPS_N0183(
Route* pr,
const wxString& com_name,
370 std::unique_ptr<AbstractCommDriver> target_driver;
372 bool b_restoreStream =
false;
373 bool btempStream =
false;
375 auto& registry = CommDriverRegistry::GetInstance();
377 PrepareOutputChannel(com_name, dlg_ctx, params_save, b_restoreStream,
382 return ERR_GPS_DRIVER_NOT_AVAILAIBLE;
387 if (com_name.Upper().Matches(
"*GARMIN*"))
389 auto drv_serial_n0183 =
391 if (drv_serial_n0183) {
392 drv_serial_n0183->Close();
393 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
394 drv_serial_n0183->GetParams().GetStrippedDSPort(),
395 drv_serial_n0183->GetParams().GetCommProtocol());
396 registry.Deactivate(me);
400 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
402 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, error code: "
403 << v_init <<
" LastGarminError: " << GetLastGarminError();
404 ret_val = ERR_GARMIN_INITIALIZE;
406 MESSAGE_LOG <<
"Garmin USB initialized, unit identifies as "
407 << Garmin_GPS_GetSaveString();
410 wxLogMessage(
"Sending Routes...");
411 int ret1 = Garmin_GPS_SendRoute(wxString(
"usb:"), pr, dlg_ctx);
414 MESSAGE_LOG <<
" Error sending routes, last garmin error: "
415 << GetLastGarminError();
416 ret_val = ERR_GARMIN_SEND_MESSAGE;
426 if (g_bGarminHostUpload) {
428 auto drv_serial_n0183 =
430 if (drv_serial_n0183) {
431 drv_serial_n0183->Close();
432 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
433 drv_serial_n0183->GetParams().GetStrippedDSPort(),
434 drv_serial_n0183->GetParams().GetCommProtocol());
435 registry.Deactivate(me);
439 dlg_ctx.set_value(20);
441 wxString short_com = com_name.Mid(7);
448 v_init = Garmin_GPS_Init(short_com);
449 if (v_init >= 0)
break;
454 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: "
455 << short_com <<
" Error Code: " << v_init
456 <<
" LastGarminError: " << GetLastGarminError();
458 ret_val = ERR_GARMIN_INITIALIZE;
461 MESSAGE_LOG <<
"Sendig Route to Garmin GPS on port: " << short_com
462 <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
465 dlg_ctx.set_value(40);
466 lret_val = Garmin_GPS_SendRoute(short_com, pr, dlg_ctx);
468 MESSAGE_LOG <<
"Error Sending Route to Garmin GPS on port: " << short_com
469 <<
" Error Code: " << lret_val
470 <<
" LastGarminError: " << GetLastGarminError();
471 ret_val = ERR_GARMIN_SEND_MESSAGE;
479 dlg_ctx.set_value(100);
488 std::make_shared<NavAddr>(NavAddr::Bus::N0183, drv_n0183->iface);
490 NMEA0183 oNMEA0183(NmeaCtxFactory());
491 oNMEA0183.TalkerID = _T (
"EC" );
493 int nProg = pr->pRoutePointList->GetCount() + 1;
494 dlg_ctx.set_range(100);
496 int progress_stall = 500;
497 if (pr->pRoutePointList->GetCount() > 10) progress_stall = 200;
503 if (bsend_waypoints) {
504 wxRoutePointListNode* node = pr->pRoutePointList->GetFirst();
510 if (g_GPS_Ident ==
"Generic") {
512 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
514 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
517 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
519 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
521 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
523 oNMEA0183.Wpl.Write(snt);
525 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
528 wxString talker_save = g_TalkerIdText;
529 g_TalkerIdText.Clear();
531 oNMEA0183.TalkerID = _T (
"PFEC," );
534 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
536 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
539 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
541 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
543 wxString name = prp->GetName();
545 name.Truncate(g_maxWPNameLength);
546 oNMEA0183.GPwpl.To = name;
548 oNMEA0183.GPwpl.Write(snt);
550 g_TalkerIdText = talker_save;
553 wxString payload = snt.Sentence;
565 auto msg_out = std::make_shared<Nmea0183Msg>(
566 "ECWPL", snt.Sentence.ToStdString(), address);
568 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
569 if (g_GPS_Ident !=
"FurunoGP3X")
570 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
573 ns.direction = NavmsgStatus::Direction::kOutput;
574 multiplexer.LogOutputMessage(msg_out, ns);
576 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + snt.Sentence;
580 dlg_ctx.set_value((ip * 100) / nProg);
582 wxMilliSleep(progress_stall);
584 node = node->GetNext();
592 unsigned int max_length = 76;
593 unsigned int max_wp = 2;
597 if (g_GPS_Ident ==
"FurunoGP3X") {
603 wxString talker_save = g_TalkerIdText;
604 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText.Clear();
606 oNMEA0183.Rte.Empty();
607 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
609 if (pr->m_RouteNameString.IsEmpty())
610 oNMEA0183.Rte.RouteName = _T (
"1" );
612 oNMEA0183.Rte.RouteName = pr->m_RouteNameString;
614 if (g_GPS_Ident ==
"FurunoGP3X") {
615 oNMEA0183.Rte.RouteName = _T (
"01" );
616 oNMEA0183.TalkerID = _T (
"GP" );
617 oNMEA0183.Rte.m_complete_char =
'C';
618 oNMEA0183.Rte.m_skip_checksum = 1;
621 oNMEA0183.Rte.total_number_of_messages = 1;
622 oNMEA0183.Rte.message_number = 1;
625 auto node = pr->pRoutePointList->GetFirst();
628 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
630 if (g_GPS_Ident ==
"FurunoGP3X") {
631 name = prp->GetName();
633 name.Truncate(g_maxWPNameLength);
638 oNMEA0183.Rte.AddWaypoint(name);
639 node = node->GetNext();
642 oNMEA0183.Rte.Write(snt);
644 if ((snt.Sentence.Len() > max_length) ||
645 (pr->pRoutePointList->GetCount() >
649 NMEA0183 tNMEA0183(NmeaCtxFactory());
651 tNMEA0183.TalkerID = _T (
"EC" );
653 tNMEA0183.Rte.Empty();
654 tNMEA0183.Rte.TypeOfRoute = CompleteRoute;
656 if (g_GPS_Ident !=
"FurunoGP3X") {
657 if (pr->m_RouteNameString.IsEmpty())
658 tNMEA0183.Rte.RouteName = _T (
"1" );
660 tNMEA0183.Rte.RouteName = pr->m_RouteNameString;
663 tNMEA0183.Rte.RouteName = _T (
"01" );
666 tNMEA0183.Rte.Write(tsnt);
668 unsigned int tare_length = tsnt.Sentence.Len();
671 wxArrayString sentence_array;
675 bool bnew_sentence =
true;
677 unsigned int wp_count = 0;
679 auto _node = pr->pRoutePointList->GetFirst();
682 unsigned int name_len =
683 prp->GetName().Truncate(g_maxWPNameLength).Len();
684 if (g_GPS_Ident ==
"FurunoGP3X")
688 sent_len = tare_length;
689 sent_len += name_len + 1;
690 bnew_sentence =
false;
691 _node = _node->GetNext();
695 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
697 bnew_sentence =
true;
699 if (wp_count == max_wp)
700 sent_len += name_len;
702 sent_len += name_len + 1;
704 _node = _node->GetNext();
711 int final_total = n_total;
713 bnew_sentence =
true;
715 _node = pr->pRoutePointList->GetFirst();
718 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
719 if (g_GPS_Ident ==
"FurunoGP3X") {
720 name = prp->GetName();
722 name.Truncate(g_maxWPNameLength);
727 unsigned int name_len = name.Len();
730 sent_len = tare_length;
731 sent_len += name_len + 1;
732 bnew_sentence =
false;
734 oNMEA0183.Rte.Empty();
735 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
737 if (g_GPS_Ident !=
"FurunoGP3X") {
738 if (pr->m_RouteNameString.IsEmpty())
739 oNMEA0183.Rte.RouteName =
"1";
741 oNMEA0183.Rte.RouteName = pr->m_RouteNameString;
743 oNMEA0183.Rte.RouteName =
"01";
746 oNMEA0183.Rte.total_number_of_messages = final_total;
747 oNMEA0183.Rte.message_number = n_run;
748 snt.Sentence.Clear();
751 oNMEA0183.Rte.AddWaypoint(name);
752 _node = _node->GetNext();
754 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
756 bnew_sentence =
true;
758 oNMEA0183.Rte.Write(snt);
760 sentence_array.Add(snt.Sentence);
762 sent_len += name_len + 1;
763 oNMEA0183.Rte.AddWaypoint(name);
765 _node = _node->GetNext();
770 oNMEA0183.Rte.Write(snt);
771 if (snt.Sentence.Len() > tare_length) sentence_array.Add(snt.Sentence);
773 for (
unsigned int ii = 0; ii < sentence_array.GetCount(); ii++) {
774 wxString sentence = sentence_array[ii];
776 auto msg_out = std::make_shared<Nmea0183Msg>(
777 "ECRTE", sentence.ToStdString(), std::make_shared<NavAddr>());
778 drv_n0183->SendMessage(msg_out, address);
781 ns.direction = NavmsgStatus::Direction::kOutput;
782 multiplexer.LogOutputMessage(msg_out, ns);
787 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + sentence;
791 wxMilliSleep(progress_stall);
795 auto msg_out = std::make_shared<Nmea0183Msg>(
796 "ECRTE", snt.Sentence.ToStdString(), address);
797 drv_n0183->SendMessage(msg_out, address);
800 ns.direction = NavmsgStatus::Direction::kOutput;
801 multiplexer.LogOutputMessage(msg_out, ns);
805 wxString(
"-->GPS Port:") + com_name +
" Sentence: " + snt.Sentence;
810 if (g_GPS_Ident ==
"FurunoGP3X") {
811 wxString name = pr->GetName();
812 if (name.IsEmpty()) name =
"RTECOMMENT";
814 rte.Printf(
"$PFEC,GPrtc,01,");
815 rte += name.Left(16);
817 rtep.Printf(
",%c%c", 0x0d, 0x0a);
821 std::make_shared<Nmea0183Msg>(
"GPRTC", rte.ToStdString(), address);
822 drv_n0183->SendMessage(msg_out, address);
824 ns.direction = NavmsgStatus::Direction::kOutput;
825 multiplexer.LogOutputMessage(msg_out, ns);
827 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + rte;
832 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
835 std::make_shared<Nmea0183Msg>(
"GPRTC", term.ToStdString(), address);
836 drv_n0183->SendMessage(msg_outf, address);
839 ns.direction = NavmsgStatus::Direction::kOutput;
840 multiplexer.LogOutputMessage(msg_outf, ns);
842 msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
846 dlg_ctx.set_value(100);
848 wxMilliSleep(progress_stall);
852 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText = talker_save;
857 registry.Deactivate(target_driver);
860 if (b_restoreStream) {
862 MakeCommDriver(¶ms_save);
868int SendWaypointToGPS_N0183(
RoutePoint* prp,
const wxString& com_name,
872 std::unique_ptr<AbstractCommDriver> target_driver;
874 bool b_restoreStream =
false;
875 bool btempStream =
false;
877 auto& registry = CommDriverRegistry::GetInstance();
879 PrepareOutputChannel(com_name, dlg_ctx, params_save, b_restoreStream,
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) {
1069 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 IsActive() 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.
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.