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"
59wxString FormatPrintableMessage(wxString msg_raw) {
61 std::string str = msg_raw.ToStdString();
62 for (std::string::iterator it = str.begin(); it != str.end(); ++it) {
67 bin_print.Printf(
"<0x%02X>", *it);
72 return wxString(fmsg.c_str());
75void LogBroadcastOutputMessageColor(
const wxString& msg,
76 const wxString& stream_name,
77 const wxString& color,
NmeaLog& nmea_log) {
79 wxDateTime now = wxDateTime::Now();
82 ss = now.FormatISOTime();
86 ss.Append(stream_name);
91 nmea_log.
Add(ss.ToStdString());
95void BroadcastNMEA0183Message(
const wxString& msg,
NmeaLog& nmea_log,
97 auto& registry = CommDriverRegistry::GetInstance();
98 const std::vector<std::unique_ptr<AbstractCommDriver>>& drivers =
99 registry.GetDrivers();
101 for (
auto& driver : drivers) {
102 if (driver->bus == NavAddr::Bus::N0183) {
106 params = drv_serial->GetParams();
110 params = drv_net->GetParams();
117 params = drv_bluetooth->GetParams();
123 if (params.IOSelect == DS_TYPE_INPUT_OUTPUT ||
124 params.IOSelect == DS_TYPE_OUTPUT) {
125 bool bout_filter = params.SentencePassesFilter(msg, FILTER_OUTPUT);
127 std::string
id = msg.ToStdString().substr(1, 5);
128 auto msg_out = std::make_shared<Nmea0183Msg>(
129 id, msg.ToStdString(), std::make_shared<NavAddr>());
132 driver->SendMessage(msg_out, std::make_shared<NavAddr>());
135 LogBroadcastOutputMessageColor(msg, params.GetDSPort(),
"<BLUE>",
138 LogBroadcastOutputMessageColor(msg, params.GetDSPort(),
"<RED>",
141 LogBroadcastOutputMessageColor(msg, params.GetDSPort(),
"<CORAL>",
147 on_msg_sent.
Notify(msg.ToStdString());
150bool CreateOutputConnection(
const wxString& com_name,
155 auto& registry = CommDriverRegistry::GetInstance();
156 const std::vector<DriverPtr>& drivers = registry.GetDrivers();
160 bool bGarmin =
false;
161 if (com_name.Lower().StartsWith(
"serial")) {
162 comx = com_name.AfterFirst(
':');
164 comx.BeforeFirst(
' ');
165 DriverPtr& old_driver =
FindDriver(drivers, comx.ToStdString());
166 wxLogDebug(
"Looking for old stream %s", com_name);
169 auto drv_serial_n0183 =
171 if (drv_serial_n0183) {
172 params_save = drv_serial_n0183->GetParams();
173 baud = params_save.Baudrate;
174 bGarmin = params_save.Garmin;
176 drv_serial_n0183->Close();
177 registry.Deactivate(old_driver);
179 b_restoreStream =
true;
182 if (baud == 0) baud = 4800;
184 if (com_name.Lower().StartsWith(
"serial")) {
189 cp.Garmin = bGarminIn || bGarmin;
190 cp.IOSelect = DS_TYPE_OUTPUT;
199 if (drv_serial_n0183) {
200 if ((wxNOT_FOUND != com_name.Upper().Find(
"USB")) &&
201 (wxNOT_FOUND != com_name.Upper().Find(
"GARMIN"))) {
204 while (!drv_serial_n0183->IsGarminThreadActive() && (timeout < 50)) {
210 if (!drv_serial_n0183->IsGarminThreadActive()) {
211 MESSAGE_LOG <<
"-->GPS Port:" << com_name
212 <<
" ...Could not be opened for writing";
217 while (!drv_serial_n0183->IsSecThreadActive() && (timeout < 50)) {
222 if (!drv_serial_n0183->IsSecThreadActive()) {
223 MESSAGE_LOG <<
"-->GPS Port:" << com_name
224 <<
" ...Could not be opened for writing";
230 driver =
FindDriver(drivers, com_name.ToStdString()).get();
232 if (com_name.Find(
"Bluetooth") != wxNOT_FOUND) {
233 wxString comm_addr = com_name.AfterFirst(
';');
235 driver =
FindDriver(drivers, comm_addr.ToStdString()).get();
242 wxStringTokenizer tkz(com_name,
";");
243 wxString name = tkz.GetNextToken();
244 wxString mac = tkz.GetNextToken();
255 FindDriver(drivers, mac.ToStdString(), NavAddr::Bus::Undef).get();
258 }
else if (com_name.Lower().StartsWith(
"udp") ||
259 com_name.Lower().StartsWith(
"tcp")) {
263 NetworkProtocol protocol = UDP;
264 if (com_name.Lower().StartsWith(
"tcp")) protocol = TCP;
265 wxStringTokenizer tkz(com_name,
":");
266 wxString token = tkz.GetNextToken();
267 wxString address = tkz.GetNextToken();
268 token = tkz.GetNextToken();
274 cp.NetProtocol = protocol;
275 cp.NetworkAddress = address;
276 cp.NetworkPort = port;
277 cp.IOSelect = DS_TYPE_INPUT_OUTPUT;
281 FindDriver(drivers, cp.GetStrippedDSPort(), cp.GetLastCommProtocol());
287 if (com_name.Lower().StartsWith(
"tcp")) {
289 std::string msg(_(
"Connecting to "));
291 dlg_ctx.set_message(msg);
296 bool bconnected =
false;
297 while (!bconnected && (loopCount > 0)) {
298 if (drv_net_n0183->GetSock()->IsConnected()) {
309 msg = _(
"Connected to ");
311 dlg_ctx.set_message(msg);
314 auto& me =
FindDriver(drivers, driver->iface, driver->bus);
315 registry.Deactivate(me);
322 return driver !=
nullptr;
325int PrepareOutputChannel(
const wxString& com_name,
N0183DlgCtx dlg_ctx,
326 std::unique_ptr<AbstractCommDriver>& new_driver,
330 auto& registry = CommDriverRegistry::GetInstance();
334 const std::vector<DriverPtr>& drivers = registry.GetDrivers();
335 bool is_garmin_serial =
false;
338 if (com_name.Lower().StartsWith(
"serial")) {
340 comx = com_name.AfterFirst(
':');
341 comx = comx.BeforeFirst(
' ');
342 DriverPtr& existing_driver =
FindDriver(drivers, comx.ToStdString());
343 wxLogDebug(
"Looking for old stream %s", com_name);
345 if (existing_driver) {
348 if (drv_serial_n0183) {
349 is_garmin_serial = drv_serial_n0183->GetParams().Garmin;
359 if (is_garmin_serial) {
360 params_save = drv_serial_n0183->GetParams();
361 b_restoreStream =
true;
362 drv_serial_n0183->Close();
364 FindDriver(drivers, drv_serial_n0183->GetParams().GetStrippedDSPort(),
365 drv_serial_n0183->GetParams().GetCommProtocol());
366 registry.Deactivate(me);
370 CreateOutputConnection(com_name, params_save, btempStream,
371 b_restoreStream, dlg_ctx, is_garmin_serial);
372 if (!conn_ok)
return 1;
374#ifdef xUSE_GARMINHOST
376 if (com_name.Upper().Matches(
"*GARMIN*"))
382 drv_n0183_serial->StopGarminUSBIOThread(
true);
384 if (!drv_n0183_serial->IsGarminThreadActive()) {
385 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
387 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
388 << v_init <<
" LastGarminError: " << GetLastGarminError();
390 ret_val = ERR_GARMIN_INITIALIZE;
392 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
393 << Garmin_GPS_GetSaveString();
396 wxLogMessage(
"Sending Waypoint...");
399 RoutePointList rplist;
402 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
405 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
406 << GetLastGarminError();
408 ret_val = ERR_GARMIN_GENERAL;
419int SendRouteToGPS_N0183(
Route* pr,
const wxString& com_name,
424 std::unique_ptr<AbstractCommDriver> target_driver;
426 bool b_restoreStream =
false;
427 bool btempStream =
false;
429 auto& registry = CommDriverRegistry::GetInstance();
431 int rv = PrepareOutputChannel(com_name, dlg_ctx, target_driver, params_save,
432 b_restoreStream, btempStream);
438 if (com_name.Upper().Matches(
"*GARMIN*"))
440 auto drv_serial_n0183 =
442 if (drv_serial_n0183) {
443 drv_serial_n0183->Close();
444 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
445 drv_serial_n0183->GetParams().GetStrippedDSPort(),
446 drv_serial_n0183->GetParams().GetCommProtocol());
447 registry.Deactivate(me);
451 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
453 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, error code: "
454 << v_init <<
" LastGarminError: " << GetLastGarminError();
455 ret_val = ERR_GARMIN_INITIALIZE;
457 MESSAGE_LOG <<
"Garmin USB initialized, unit identifies as "
458 << Garmin_GPS_GetSaveString();
461 wxLogMessage(
"Sending Routes...");
462 int ret1 = Garmin_GPS_SendRoute(wxString(
"usb:"), pr, dlg_ctx);
465 MESSAGE_LOG <<
" Error sending routes, last garmin error: "
466 << GetLastGarminError();
467 ret_val = ERR_GARMIN_GENERAL;
477 if (g_bGarminHostUpload) {
479 auto drv_serial_n0183 =
481 if (drv_serial_n0183) {
482 drv_serial_n0183->Close();
483 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
484 drv_serial_n0183->GetParams().GetStrippedDSPort(),
485 drv_serial_n0183->GetParams().GetCommProtocol());
486 registry.Deactivate(me);
490 dlg_ctx.set_value(20);
492 wxString short_com = com_name.Mid(7);
499 v_init = Garmin_GPS_Init(short_com);
500 if (v_init >= 0)
break;
505 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: "
506 << short_com <<
" Error Code: " << v_init
507 <<
" LastGarminError: " << GetLastGarminError();
509 ret_val = ERR_GARMIN_INITIALIZE;
512 MESSAGE_LOG <<
"Sendig Route to Garmin GPS on port: " << short_com
513 <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
516 dlg_ctx.set_value(40);
517 lret_val = Garmin_GPS_SendRoute(short_com, pr, dlg_ctx);
519 MESSAGE_LOG <<
"Error Sending Route to Garmin GPS on port: " << short_com
520 <<
" Error Code: " << lret_val
521 <<
" LastGarminError: " << GetLastGarminError();
522 ret_val = ERR_GARMIN_GENERAL;
530 dlg_ctx.set_value(100);
538 auto address = std::make_shared<NavAddr>();
540 NMEA0183 oNMEA0183(NmeaCtxFactory());
541 oNMEA0183.TalkerID = _T (
"EC" );
543 int nProg = pr->pRoutePointList->GetCount() + 1;
544 dlg_ctx.set_range(100);
546 int progress_stall = 500;
547 if (pr->pRoutePointList->GetCount() > 10) progress_stall = 200;
553 if (bsend_waypoints) {
554 wxRoutePointListNode* node = pr->pRoutePointList->GetFirst();
560 if (g_GPS_Ident ==
"Generic") {
562 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
564 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
567 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
569 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
571 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
573 oNMEA0183.Wpl.Write(snt);
575 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
578 wxString talker_save = g_TalkerIdText;
579 g_TalkerIdText.Clear();
581 oNMEA0183.TalkerID = _T (
"PFEC," );
584 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
586 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
589 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
591 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
593 wxString name = prp->GetName();
595 name.Truncate(g_maxWPNameLength);
596 oNMEA0183.GPwpl.To = name;
598 oNMEA0183.GPwpl.Write(snt);
600 g_TalkerIdText = talker_save;
603 wxString payload = snt.Sentence;
615 auto msg_out = std::make_shared<Nmea0183Msg>(
616 "ECWPL", snt.Sentence.ToStdString(), address);
618 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
619 if (g_GPS_Ident !=
"FurunoGP3X")
620 drv_n0183->SendMessage(msg_out, std::make_shared<NavAddr>());
622 multiplexer.LogOutputMessage(snt.Sentence, com_name.ToStdString(),
625 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + snt.Sentence;
629 dlg_ctx.set_value((ip * 100) / nProg);
631 wxMilliSleep(progress_stall);
633 node = node->GetNext();
641 unsigned int max_length = 76;
642 unsigned int max_wp = 2;
646 if (g_GPS_Ident ==
"FurunoGP3X") {
652 wxString talker_save = g_TalkerIdText;
653 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText.Clear();
655 oNMEA0183.Rte.Empty();
656 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
658 if (pr->m_RouteNameString.IsEmpty())
659 oNMEA0183.Rte.RouteName = _T (
"1" );
661 oNMEA0183.Rte.RouteName = pr->m_RouteNameString;
663 if (g_GPS_Ident ==
"FurunoGP3X") {
664 oNMEA0183.Rte.RouteName = _T (
"01" );
665 oNMEA0183.TalkerID = _T (
"GP" );
666 oNMEA0183.Rte.m_complete_char =
'C';
667 oNMEA0183.Rte.m_skip_checksum = 1;
670 oNMEA0183.Rte.total_number_of_messages = 1;
671 oNMEA0183.Rte.message_number = 1;
674 auto node = pr->pRoutePointList->GetFirst();
677 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
679 if (g_GPS_Ident ==
"FurunoGP3X") {
680 name = prp->GetName();
682 name.Truncate(g_maxWPNameLength);
687 oNMEA0183.Rte.AddWaypoint(name);
688 node = node->GetNext();
691 oNMEA0183.Rte.Write(snt);
693 if ((snt.Sentence.Len() > max_length) ||
694 (pr->pRoutePointList->GetCount() >
698 NMEA0183 tNMEA0183(NmeaCtxFactory());
700 tNMEA0183.TalkerID = _T (
"EC" );
702 tNMEA0183.Rte.Empty();
703 tNMEA0183.Rte.TypeOfRoute = CompleteRoute;
705 if (g_GPS_Ident !=
"FurunoGP3X") {
706 if (pr->m_RouteNameString.IsEmpty())
707 tNMEA0183.Rte.RouteName = _T (
"1" );
709 tNMEA0183.Rte.RouteName = pr->m_RouteNameString;
712 tNMEA0183.Rte.RouteName = _T (
"01" );
715 tNMEA0183.Rte.Write(tsnt);
717 unsigned int tare_length = tsnt.Sentence.Len();
720 wxArrayString sentence_array;
724 bool bnew_sentence =
true;
726 unsigned int wp_count = 0;
728 auto node = pr->pRoutePointList->GetFirst();
731 unsigned int name_len =
732 prp->GetName().Truncate(g_maxWPNameLength).Len();
733 if (g_GPS_Ident ==
"FurunoGP3X")
737 sent_len = tare_length;
738 sent_len += name_len + 1;
739 bnew_sentence =
false;
740 node = node->GetNext();
744 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
746 bnew_sentence =
true;
748 if (wp_count == max_wp)
749 sent_len += name_len;
751 sent_len += name_len + 1;
753 node = node->GetNext();
760 int final_total = n_total;
762 bnew_sentence =
true;
764 node = pr->pRoutePointList->GetFirst();
767 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
768 if (g_GPS_Ident ==
"FurunoGP3X") {
769 name = prp->GetName();
771 name.Truncate(g_maxWPNameLength);
776 unsigned int name_len = name.Len();
779 sent_len = tare_length;
780 sent_len += name_len + 1;
781 bnew_sentence =
false;
783 oNMEA0183.Rte.Empty();
784 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
786 if (g_GPS_Ident !=
"FurunoGP3X") {
787 if (pr->m_RouteNameString.IsEmpty())
788 oNMEA0183.Rte.RouteName =
"1";
790 oNMEA0183.Rte.RouteName = pr->m_RouteNameString;
792 oNMEA0183.Rte.RouteName =
"01";
795 oNMEA0183.Rte.total_number_of_messages = final_total;
796 oNMEA0183.Rte.message_number = n_run;
797 snt.Sentence.Clear();
800 oNMEA0183.Rte.AddWaypoint(name);
801 node = node->GetNext();
803 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
805 bnew_sentence =
true;
807 oNMEA0183.Rte.Write(snt);
809 sentence_array.Add(snt.Sentence);
811 sent_len += name_len + 1;
812 oNMEA0183.Rte.AddWaypoint(name);
814 node = node->GetNext();
819 oNMEA0183.Rte.Write(snt);
820 if (snt.Sentence.Len() > tare_length) sentence_array.Add(snt.Sentence);
822 for (
unsigned int ii = 0; ii < sentence_array.GetCount(); ii++) {
823 wxString sentence = sentence_array[ii];
825 auto msg_out = std::make_shared<Nmea0183Msg>(
826 "ECRTE", sentence.ToStdString(), std::make_shared<NavAddr>());
827 drv_n0183->SendMessage(msg_out, address);
829 wxString fmsg = FormatPrintableMessage(sentence);
830 multiplexer.LogOutputMessageColor(fmsg, com_name,
"<BLUE>");
835 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + sentence;
839 wxMilliSleep(progress_stall);
843 auto msg_out = std::make_shared<Nmea0183Msg>(
844 "ECRTE", snt.Sentence.ToStdString(), address);
845 drv_n0183->SendMessage(msg_out, address);
847 wxString fmsg = FormatPrintableMessage(snt.Sentence);
848 multiplexer.LogOutputMessageColor(fmsg, com_name,
"<BLUE>");
852 wxString(
"-->GPS Port:") + com_name +
" Sentence: " + snt.Sentence;
857 if (g_GPS_Ident ==
"FurunoGP3X") {
858 wxString name = pr->GetName();
859 if (name.IsEmpty()) name =
"RTECOMMENT";
861 rte.Printf(
"$PFEC,GPrtc,01,");
862 rte += name.Left(16);
864 rtep.Printf(
",%c%c", 0x0d, 0x0a);
868 std::make_shared<Nmea0183Msg>(
"GPRTC", rte.ToStdString(), address);
869 drv_n0183->SendMessage(msg_out, address);
870 multiplexer.LogOutputMessage(rte, com_name.ToStdString(),
false);
872 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + rte;
877 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
880 std::make_shared<Nmea0183Msg>(
"GPRTC", term.ToStdString(), address);
881 drv_n0183->SendMessage(msg_outf, address);
883 multiplexer.LogOutputMessage(term, com_name.ToStdString(),
false);
885 msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
889 dlg_ctx.set_value(100);
891 wxMilliSleep(progress_stall);
895 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText = talker_save;
900 registry.Deactivate(target_driver);
903 if (b_restoreStream) {
905 MakeCommDriver(¶ms_save);
911int SendWaypointToGPS_N0183(
RoutePoint* prp,
const wxString& com_name,
915 std::unique_ptr<AbstractCommDriver> target_driver;
917 bool b_restoreStream =
false;
918 bool btempStream =
false;
920 auto& registry = CommDriverRegistry::GetInstance();
922 int rv = PrepareOutputChannel(com_name, dlg_ctx, target_driver, params_save,
923 b_restoreStream, btempStream);
927 if (com_name.Upper().Matches(
"*GARMIN*"))
929 auto drv_serial_n0183 =
931 if (drv_serial_n0183) {
932 drv_serial_n0183->Close();
933 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
934 drv_serial_n0183->GetParams().GetStrippedDSPort(),
935 drv_serial_n0183->GetParams().GetCommProtocol());
937 registry.Deactivate(me);
941 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
943 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
944 << v_init <<
" LastGarminError: " << GetLastGarminError();
946 ret_val = ERR_GARMIN_INITIALIZE;
948 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
949 << Garmin_GPS_GetSaveString();
952 wxLogMessage(
"Sending Waypoint...");
955 RoutePointList rplist;
958 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
961 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
962 << GetLastGarminError();
964 ret_val = ERR_GARMIN_GENERAL;
976 if (g_bGarminHostUpload) {
981 serial_n0183->Close();
982 auto& me =
FindDriver(CommDriverRegistry::GetInstance().GetDrivers(),
983 serial_n0183->GetParams().GetStrippedDSPort(),
984 serial_n0183->GetParams().GetCommProtocol());
985 registry.Deactivate(me);
987 RoutePointList rplist;
989 wxString short_com = com_name.Mid(7);
996 v_init = Garmin_GPS_Init(short_com);
997 if (v_init >= 0)
break;
1002 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: " << com_name
1003 <<
" Error Code: " << v_init
1004 <<
"LastGarminError: " << GetLastGarminError();
1006 ret_val = ERR_GARMIN_INITIALIZE;
1009 MESSAGE_LOG <<
"Sending waypoint(s) to Garmin GPS on port: " << com_name;
1010 MESSAGE_LOG <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
1016 ret_val = Garmin_GPS_SendWaypoints(short_com, &rplist);
1018 MESSAGE_LOG <<
"Error Sending Waypoint(s) to Garmin GPS on port, "
1019 << com_name <<
" error code: " << ret_val
1020 <<
", last garmin error: " << GetLastGarminError();
1021 ret_val = ERR_GARMIN_GENERAL;
1033 auto address = std::make_shared<NavAddr>();
1035 NMEA0183 oNMEA0183(NmeaCtxFactory());
1036 oNMEA0183.TalkerID =
"EC";
1037 dlg_ctx.set_range(100);
1039 if (g_GPS_Ident ==
"Generic") {
1040 if (prp->m_lat < 0.)
1041 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat,
"S");
1043 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat,
"N");
1045 if (prp->m_lon < 0.)
1046 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon,
"W");
1048 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon,
"E");
1050 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
1052 oNMEA0183.Wpl.Write(snt);
1053 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
1054 oNMEA0183.TalkerID =
"PFEC,";
1056 if (prp->m_lat < 0.)
1057 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat,
"S");
1059 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat,
"N");
1061 if (prp->m_lon < 0.)
1062 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon,
"W");
1064 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon,
"E");
1066 wxString name = prp->GetName();
1068 name.Truncate(g_maxWPNameLength);
1069 oNMEA0183.GPwpl.To = name;
1071 oNMEA0183.GPwpl.Write(snt);
1074 auto msg_out = std::make_shared<Nmea0183Msg>(
1075 "ECWPL", snt.Sentence.ToStdString(), address);
1076 drv_n0183->SendMessage(msg_out, address);
1078 multiplexer.LogOutputMessage(snt.Sentence, com_name,
false);
1079 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: ";
1083 if (g_GPS_Ident ==
"FurunoGP3X") {
1085 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
1090 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
1094 dlg_ctx.set_value(100);
1103 if (btempStream) registry.Deactivate(target_driver);
1105 if (b_restoreStream) {
1106 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.
virtual void Add(const wxString &s)=0
Add an formatted string to log output.
virtual bool Active() const =0
Return true if log is visible i.
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.