27 #include <wx/wxprec.h>
35 #include <wx/jsonreader.h>
36 #include <wx/jsonval.h>
37 #include <wx/jsonwriter.h>
38 #include <wx/tokenzr.h>
40 #include "model/comm_driver.h"
41 #include "model/comm_drv_factory.h"
42 #include "model/comm_drv_n0183_android_bt.h"
43 #include "model/comm_drv_n0183_net.h"
45 #include "model/comm_drv_registry.h"
46 #include "model/comm_n0183_output.h"
47 #include "model/config_vars.h"
48 #include "model/conn_params.h"
49 #include "model/logger.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"
59 wxString 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());
75 void 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());
95 void BroadcastNMEA0183Message(
const wxString& msg,
NmeaLog& nmea_log,
97 auto& registry = CommDriverRegistry::GetInstance();
98 const std::vector<std::shared_ptr<AbstractCommDriver>>& drivers =
99 registry.GetDrivers();
101 for (
auto& driver : drivers) {
102 if (driver->bus == NavAddr::Bus::N0183) {
105 std::dynamic_pointer_cast<CommDriverN0183Serial>(driver);
107 params = drv_serial->GetParams();
109 auto drv_net = std::dynamic_pointer_cast<CommDriverN0183Net>(driver);
111 params = drv_net->GetParams();
116 std::dynamic_pointer_cast<CommDriverN0183AndroidBT>(driver);
118 params = drv_bluetooth->GetParams();
124 if (params.IOSelect == DS_TYPE_INPUT_OUTPUT ||
125 params.IOSelect == DS_TYPE_OUTPUT) {
126 bool bout_filter = params.SentencePassesFilter(msg, FILTER_OUTPUT);
128 std::string
id = msg.ToStdString().substr(1, 5);
129 auto msg_out = std::make_shared<Nmea0183Msg>(
130 id, msg.ToStdString(),
131 std::make_shared<NavAddr0183>(driver->iface));
133 bool bxmit_ok = driver->SendMessage(
134 msg_out, std::make_shared<NavAddr0183>(driver->iface));
137 LogBroadcastOutputMessageColor(msg, params.GetDSPort(),
"<BLUE>",
140 LogBroadcastOutputMessageColor(msg, params.GetDSPort(),
"<RED>",
143 LogBroadcastOutputMessageColor(msg, params.GetDSPort(),
"<CORAL>",
149 on_msg_sent.
Notify(msg.ToStdString());
152 std::shared_ptr<AbstractCommDriver> CreateOutputConnection(
154 bool& b_restoreStream,
N0183DlgCtx dlg_ctx,
bool bGarminIn) {
155 std::shared_ptr<AbstractCommDriver> driver;
156 auto& registry = CommDriverRegistry::GetInstance();
157 const std::vector<std::shared_ptr<AbstractCommDriver>>& drivers =
158 registry.GetDrivers();
162 bool bGarmin =
false;
163 if (com_name.Lower().StartsWith(
"serial")) {
164 comx = com_name.AfterFirst(
':');
166 comx.BeforeFirst(
' ');
167 std::shared_ptr<AbstractCommDriver> old_driver;
168 old_driver = FindDriver(drivers, comx.ToStdString());
169 wxLogDebug(
"Looking for old stream %s", com_name);
172 auto drv_serial_n0183 =
173 std::dynamic_pointer_cast<CommDriverN0183Serial>(old_driver);
174 if (drv_serial_n0183) {
175 params_save = drv_serial_n0183->GetParams();
176 baud = params_save.Baudrate;
177 bGarmin = params_save.Garmin;
179 drv_serial_n0183->Close();
180 registry.Deactivate(old_driver);
182 b_restoreStream =
true;
185 if (baud == 0) baud = 4800;
187 if (com_name.Lower().StartsWith(
"serial")) {
192 cp.Garmin = bGarminIn || bGarmin;
193 cp.IOSelect = DS_TYPE_OUTPUT;
195 driver = MakeCommDriver(&cp);
201 auto drv_serial_n0183 =
202 std::dynamic_pointer_cast<CommDriverN0183Serial>(driver);
203 if (drv_serial_n0183) {
204 if ((wxNOT_FOUND != com_name.Upper().Find(
"USB")) &&
205 (wxNOT_FOUND != com_name.Upper().Find(
"GARMIN"))) {
208 while (!drv_serial_n0183->IsGarminThreadActive() && (timeout < 50)) {
214 if (!drv_serial_n0183->IsGarminThreadActive()) {
215 MESSAGE_LOG <<
"-->GPS Port:" << com_name
216 <<
" ...Could not be opened for writing";
221 while (!drv_serial_n0183->IsSecThreadActive() && (timeout < 50)) {
226 if (!drv_serial_n0183->IsSecThreadActive()) {
227 MESSAGE_LOG <<
"-->GPS Port:" << com_name
228 <<
" ...Could not be opened for writing";
234 driver = FindDriver(drivers, com_name.ToStdString());
236 if (com_name.Find(
"Bluetooth") != wxNOT_FOUND) {
237 wxString comm_addr = com_name.AfterFirst(
';');
239 driver = FindDriver(drivers, comm_addr.ToStdString());
246 wxStringTokenizer tkz(com_name,
";");
247 wxString name = tkz.GetNextToken();
248 wxString mac = tkz.GetNextToken();
260 }
else if (com_name.Lower().StartsWith(
"udp") ||
261 com_name.Lower().StartsWith(
"tcp")) {
262 std::shared_ptr<CommDriverN0183Net> drv_net_n0183;
265 NetworkProtocol protocol = UDP;
266 if (com_name.Lower().StartsWith(
"tcp")) protocol = TCP;
267 wxStringTokenizer tkz(com_name,
":");
268 wxString token = tkz.GetNextToken();
269 wxString address = tkz.GetNextToken();
270 token = tkz.GetNextToken();
276 cp.NetProtocol = protocol;
277 cp.NetworkAddress = address;
278 cp.NetworkPort = port;
279 cp.IOSelect = DS_TYPE_INPUT_OUTPUT;
281 driver = MakeCommDriver(&cp);
284 drv_net_n0183 = std::dynamic_pointer_cast<CommDriverN0183Net>(driver);
286 if (com_name.Lower().StartsWith(
"tcp")) {
288 std::string msg(_(
"Connecting to "));
290 dlg_ctx.set_message(msg);
295 bool bconnected =
false;
296 while (!bconnected && (loopCount > 0)) {
297 if (drv_net_n0183->GetSock()->IsConnected()) {
308 msg = _(
"Connected to ");
310 dlg_ctx.set_message(msg);
313 registry.Deactivate(driver);
323 int PrepareOutputChannel(
const wxString& com_name,
325 std::shared_ptr<AbstractCommDriver>& new_driver,
327 bool& b_restoreStream,
331 auto& registry = CommDriverRegistry::GetInstance();
335 const std::vector<std::shared_ptr<AbstractCommDriver>>& drivers = registry.GetDrivers();
336 bool is_garmin_serial =
false;
337 std::shared_ptr<AbstractCommDriver> existing_driver;
338 std::shared_ptr<CommDriverN0183Serial> drv_serial_n0183;
340 if (com_name.Lower().StartsWith(
"serial")) {
342 comx = com_name.AfterFirst(
':');
343 comx = comx.BeforeFirst(
345 existing_driver = FindDriver(drivers, comx.ToStdString());
346 wxLogDebug(
"Looking for old stream %s", com_name);
348 if (existing_driver) {
350 std::dynamic_pointer_cast<CommDriverN0183Serial>(existing_driver);
351 if (drv_serial_n0183) {
352 is_garmin_serial = drv_serial_n0183->GetParams().Garmin;
362 if (is_garmin_serial) {
363 params_save = drv_serial_n0183->GetParams();
364 b_restoreStream =
true;
365 drv_serial_n0183->Close();
366 registry.Deactivate(drv_serial_n0183);
369 new_driver = CreateOutputConnection(com_name, params_save, btempStream,
370 b_restoreStream, dlg_ctx, is_garmin_serial);
371 if (!new_driver)
return 1;
373 #ifdef xUSE_GARMINHOST
375 if (com_name.Upper().Matches(
"*GARMIN*"))
380 auto drv_n0183_serial =
381 std::dynamic_pointer_cast<CommDriverN0183Serial>(driver);
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;
419 int SendRouteToGPS_N0183(
Route* pr,
const wxString& com_name,
424 std::shared_ptr<AbstractCommDriver> target_driver;
426 bool b_restoreStream =
false;
427 bool btempStream =
false;
429 auto& registry = CommDriverRegistry::GetInstance();
431 int rv = PrepareOutputChannel(com_name,
438 auto drv_n0183 = std::dynamic_pointer_cast<CommDriverN0183>(target_driver);
440 #ifdef USE_GARMINHOST
442 if (com_name.Upper().Matches(
"*GARMIN*"))
444 auto drv_serial_n0183 =
445 std::dynamic_pointer_cast<CommDriverN0183Serial>(target_driver);
446 if (drv_serial_n0183) {
447 drv_serial_n0183->Close();
448 registry.Deactivate(drv_serial_n0183);
452 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
454 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, error code: "
455 << v_init <<
" LastGarminError: " << GetLastGarminError();
456 ret_val = ERR_GARMIN_INITIALIZE;
458 MESSAGE_LOG <<
"Garmin USB initialized, unit identifies as "
459 << Garmin_GPS_GetSaveString();
462 wxLogMessage(
"Sending Routes...");
463 int ret1 = Garmin_GPS_SendRoute(wxString(
"usb:"), pr, dlg_ctx);
466 MESSAGE_LOG <<
" Error sending routes, last garmin error: "
467 << GetLastGarminError();
468 ret_val = ERR_GARMIN_GENERAL;
478 if (g_bGarminHostUpload) {
480 auto drv_serial_n0183 =
481 std::dynamic_pointer_cast<CommDriverN0183Serial>(target_driver);
482 if (drv_serial_n0183) {
483 drv_serial_n0183->Close();
484 registry.Deactivate(drv_serial_n0183);
488 dlg_ctx.set_value(20);
490 wxString short_com = com_name.Mid(7);
497 v_init = Garmin_GPS_Init(short_com);
498 if (v_init >= 0)
break;
503 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: "
504 << short_com <<
" Error Code: " << v_init
505 <<
" LastGarminError: " << GetLastGarminError();
507 ret_val = ERR_GARMIN_INITIALIZE;
510 MESSAGE_LOG <<
"Sendig Route to Garmin GPS on port: " << short_com
511 <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
514 dlg_ctx.set_value(40);
515 lret_val = Garmin_GPS_SendRoute(short_com, pr, dlg_ctx);
517 MESSAGE_LOG <<
"Error Sending Route to Garmin GPS on port: " << short_com
518 <<
" Error Code: " << lret_val
519 <<
" LastGarminError: " << GetLastGarminError();
520 ret_val = ERR_GARMIN_GENERAL;
528 dlg_ctx.set_value(100);
537 auto address = std::make_shared<NavAddr0183>(drv_n0183->iface);
539 NMEA0183 oNMEA0183(NmeaCtxFactory());
540 oNMEA0183.TalkerID = _T (
"EC" );
542 int nProg = pr->pRoutePointList->GetCount() + 1;
543 dlg_ctx.set_range(100);
545 int progress_stall = 500;
546 if (pr->pRoutePointList->GetCount() > 10) progress_stall = 200;
552 if (bsend_waypoints) {
553 wxRoutePointListNode* node = pr->pRoutePointList->GetFirst();
559 if (g_GPS_Ident ==
"Generic") {
561 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
563 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
566 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
568 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
570 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
572 oNMEA0183.Wpl.Write(snt);
574 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
577 wxString talker_save = g_TalkerIdText;
578 g_TalkerIdText.Clear();
580 oNMEA0183.TalkerID = _T (
"PFEC," );
583 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat, _T (
"S" ));
585 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat, _T (
"N" ));
588 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon, _T (
"W" ));
590 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon, _T (
"E" ));
592 wxString name = prp->GetName();
594 name.Truncate(g_maxWPNameLength);
595 oNMEA0183.GPwpl.To = name;
597 oNMEA0183.GPwpl.Write(snt);
599 g_TalkerIdText = talker_save;
602 wxString payload = snt.Sentence;
614 auto msg_out = std::make_shared<Nmea0183Msg>(
615 std::string(
"ECWPL"), snt.Sentence.ToStdString(), address);
617 drv_n0183->SendMessage(msg_out, address);
618 if (g_GPS_Ident !=
"FurunoGP3X")
619 drv_n0183->SendMessage(msg_out, address);
621 multiplexer.LogOutputMessage(snt.Sentence, com_name.ToStdString(),
624 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + snt.Sentence;
628 dlg_ctx.set_value((ip * 100) / nProg);
630 wxMilliSleep(progress_stall);
632 node = node->GetNext();
640 unsigned int max_length = 76;
641 unsigned int max_wp = 2;
645 if (g_GPS_Ident ==
"FurunoGP3X") {
651 wxString talker_save = g_TalkerIdText;
652 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText.Clear();
654 oNMEA0183.Rte.Empty();
655 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
657 if (pr->m_RouteNameString.IsEmpty())
658 oNMEA0183.Rte.RouteName = _T (
"1" );
660 oNMEA0183.Rte.RouteName = pr->m_RouteNameString;
662 if (g_GPS_Ident ==
"FurunoGP3X") {
663 oNMEA0183.Rte.RouteName = _T (
"01" );
664 oNMEA0183.TalkerID = _T (
"GP" );
665 oNMEA0183.Rte.m_complete_char =
'C';
666 oNMEA0183.Rte.m_skip_checksum = 1;
669 oNMEA0183.Rte.total_number_of_messages = 1;
670 oNMEA0183.Rte.message_number = 1;
673 auto node = pr->pRoutePointList->GetFirst();
676 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
678 if (g_GPS_Ident ==
"FurunoGP3X") {
679 name = prp->GetName();
681 name.Truncate(g_maxWPNameLength);
686 oNMEA0183.Rte.AddWaypoint(name);
687 node = node->GetNext();
690 oNMEA0183.Rte.Write(snt);
692 if ((snt.Sentence.Len() > max_length) ||
693 (pr->pRoutePointList->GetCount() >
697 NMEA0183 tNMEA0183(NmeaCtxFactory());
699 tNMEA0183.TalkerID = _T (
"EC" );
701 tNMEA0183.Rte.Empty();
702 tNMEA0183.Rte.TypeOfRoute = CompleteRoute;
704 if (g_GPS_Ident !=
"FurunoGP3X") {
705 if (pr->m_RouteNameString.IsEmpty())
706 tNMEA0183.Rte.RouteName = _T (
"1" );
708 tNMEA0183.Rte.RouteName = pr->m_RouteNameString;
711 tNMEA0183.Rte.RouteName = _T (
"01" );
714 tNMEA0183.Rte.Write(tsnt);
716 unsigned int tare_length = tsnt.Sentence.Len();
719 wxArrayString sentence_array;
723 bool bnew_sentence =
true;
725 unsigned int wp_count = 0;
727 auto node = pr->pRoutePointList->GetFirst();
730 unsigned int name_len =
731 prp->GetName().Truncate(g_maxWPNameLength).Len();
732 if (g_GPS_Ident ==
"FurunoGP3X")
736 sent_len = tare_length;
737 sent_len += name_len + 1;
738 bnew_sentence =
false;
739 node = node->GetNext();
743 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
745 bnew_sentence =
true;
747 if (wp_count == max_wp)
748 sent_len += name_len;
750 sent_len += name_len + 1;
752 node = node->GetNext();
759 int final_total = n_total;
761 bnew_sentence =
true;
763 node = pr->pRoutePointList->GetFirst();
766 wxString name = prp->GetName().Truncate(g_maxWPNameLength);
767 if (g_GPS_Ident ==
"FurunoGP3X") {
768 name = prp->GetName();
770 name.Truncate(g_maxWPNameLength);
775 unsigned int name_len = name.Len();
778 sent_len = tare_length;
779 sent_len += name_len + 1;
780 bnew_sentence =
false;
782 oNMEA0183.Rte.Empty();
783 oNMEA0183.Rte.TypeOfRoute = CompleteRoute;
785 if (g_GPS_Ident !=
"FurunoGP3X") {
786 if (pr->m_RouteNameString.IsEmpty())
787 oNMEA0183.Rte.RouteName =
"1";
789 oNMEA0183.Rte.RouteName = pr->m_RouteNameString;
791 oNMEA0183.Rte.RouteName =
"01";
794 oNMEA0183.Rte.total_number_of_messages = final_total;
795 oNMEA0183.Rte.message_number = n_run;
796 snt.Sentence.Clear();
799 oNMEA0183.Rte.AddWaypoint(name);
800 node = node->GetNext();
802 if ((sent_len + name_len > max_length) || (wp_count >= max_wp)) {
804 bnew_sentence =
true;
806 oNMEA0183.Rte.Write(snt);
808 sentence_array.Add(snt.Sentence);
810 sent_len += name_len + 1;
811 oNMEA0183.Rte.AddWaypoint(name);
813 node = node->GetNext();
818 oNMEA0183.Rte.Write(snt);
819 if (snt.Sentence.Len() > tare_length) sentence_array.Add(snt.Sentence);
821 for (
unsigned int ii = 0; ii < sentence_array.GetCount(); ii++) {
822 wxString sentence = sentence_array[ii];
824 auto msg_out = std::make_shared<Nmea0183Msg>(
825 std::string(
"ECRTE"), sentence.ToStdString(), address);
826 drv_n0183->SendMessage(msg_out, address);
828 wxString fmsg = FormatPrintableMessage(sentence);
829 multiplexer.LogOutputMessageColor(fmsg, com_name,
"<BLUE>");
834 wxString(
"-->GPS Port: ") + com_name +
" Sentence: " + sentence;
838 wxMilliSleep(progress_stall);
842 auto msg_out = std::make_shared<Nmea0183Msg>(
843 std::string(
"ECRTE"), snt.Sentence.ToStdString(), address);
844 drv_n0183->SendMessage(msg_out, address);
846 wxString fmsg = FormatPrintableMessage(snt.Sentence);
847 multiplexer.LogOutputMessageColor(fmsg, com_name,
"<BLUE>");
851 wxString(
"-->GPS Port:") + com_name +
" Sentence: " + snt.Sentence;
856 if (g_GPS_Ident ==
"FurunoGP3X") {
857 wxString name = pr->GetName();
858 if (name.IsEmpty()) name =
"RTECOMMENT";
860 rte.Printf(
"$PFEC,GPrtc,01,");
861 rte += name.Left(16);
863 rtep.Printf(
",%c%c", 0x0d, 0x0a);
866 auto msg_out = std::make_shared<Nmea0183Msg>(std::string(
"GPRTC"),
867 rte.ToStdString(), address);
868 drv_n0183->SendMessage(msg_out, address);
869 multiplexer.LogOutputMessage(rte, com_name.ToStdString(),
false);
871 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + rte;
876 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
878 auto msg_outf = std::make_shared<Nmea0183Msg>(
879 std::string(
"GPRTC"), term.ToStdString(), address);
880 drv_n0183->SendMessage(msg_outf, address);
882 multiplexer.LogOutputMessage(term, com_name.ToStdString(),
false);
884 msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
888 dlg_ctx.set_value(100);
890 wxMilliSleep(progress_stall);
894 if (g_GPS_Ident ==
"FurunoGP3X") g_TalkerIdText = talker_save;
899 registry.Deactivate(target_driver);
902 if (b_restoreStream) {
904 MakeCommDriver(¶ms_save);
910 int SendWaypointToGPS_N0183(
RoutePoint* prp,
const wxString& com_name,
914 std::shared_ptr<AbstractCommDriver> target_driver;
916 bool b_restoreStream =
false;
917 bool btempStream =
false;
919 auto& registry = CommDriverRegistry::GetInstance();
921 int rv = PrepareOutputChannel(com_name,
928 #ifdef USE_GARMINHOST
930 if (com_name.Upper().Matches(
"*GARMIN*"))
932 auto drv_serial_n0183 =
933 std::dynamic_pointer_cast<CommDriverN0183Serial>(target_driver);
934 if (drv_serial_n0183) {
935 drv_serial_n0183->Close();
936 registry.Deactivate(drv_serial_n0183);
940 int v_init = Garmin_GPS_Init(wxString(
"usb:"));
942 MESSAGE_LOG <<
"Garmin USB GPS could not be initialized, last error: "
943 << v_init <<
" LastGarminError: " << GetLastGarminError();
945 ret_val = ERR_GARMIN_INITIALIZE;
947 MESSAGE_LOG <<
"Garmin USB Initialized, unit identifies as: "
948 << Garmin_GPS_GetSaveString();
951 wxLogMessage(
"Sending Waypoint...");
954 RoutePointList rplist;
957 int ret1 = Garmin_GPS_SendWaypoints(wxString(
"usb:"), &rplist);
960 MESSAGE_LOG <<
"Error Sending Waypoint to Garmin USB, last error: "
961 << GetLastGarminError();
963 ret_val = ERR_GARMIN_GENERAL;
973 #ifdef USE_GARMINHOST
975 if (g_bGarminHostUpload) {
978 auto drv_serial_n0183 =
979 std::dynamic_pointer_cast<CommDriverN0183Serial>(target_driver);
980 if (drv_serial_n0183) {
981 drv_serial_n0183->Close();
982 registry.Deactivate(drv_serial_n0183);
986 RoutePointList rplist;
988 wxString short_com = com_name.Mid(7);
995 v_init = Garmin_GPS_Init(short_com);
996 if (v_init >= 0)
break;
1001 MESSAGE_LOG <<
"Garmin GPS could not be initialized on port: " << com_name
1002 <<
" Error Code: " << v_init
1003 <<
"LastGarminError: " << GetLastGarminError();
1005 ret_val = ERR_GARMIN_INITIALIZE;
1008 MESSAGE_LOG <<
"Sending waypoint(s) to Garmin GPS on port: " << com_name;
1009 MESSAGE_LOG <<
"Unit identifies as: " << Garmin_GPS_GetSaveString();
1015 ret_val = Garmin_GPS_SendWaypoints(short_com, &rplist);
1017 MESSAGE_LOG <<
"Error Sending Waypoint(s) to Garmin GPS on port, "
1018 << com_name <<
" error code: " << ret_val
1019 <<
", last garmin error: " << GetLastGarminError();
1020 ret_val = ERR_GARMIN_GENERAL;
1030 auto drv_n0183 = std::dynamic_pointer_cast<CommDriverN0183>(target_driver);
1032 auto address = std::make_shared<NavAddr0183>(drv_n0183->iface);
1034 NMEA0183 oNMEA0183(NmeaCtxFactory());
1035 oNMEA0183.TalkerID =
"EC";
1036 dlg_ctx.set_range(100);
1038 if (g_GPS_Ident ==
"Generic") {
1039 if (prp->m_lat < 0.)
1040 oNMEA0183.Wpl.Position.Latitude.Set(-prp->m_lat,
"S");
1042 oNMEA0183.Wpl.Position.Latitude.Set(prp->m_lat,
"N");
1044 if (prp->m_lon < 0.)
1045 oNMEA0183.Wpl.Position.Longitude.Set(-prp->m_lon,
"W");
1047 oNMEA0183.Wpl.Position.Longitude.Set(prp->m_lon,
"E");
1049 oNMEA0183.Wpl.To = prp->GetName().Truncate(g_maxWPNameLength);
1051 oNMEA0183.Wpl.Write(snt);
1052 }
else if (g_GPS_Ident ==
"FurunoGP3X") {
1053 oNMEA0183.TalkerID =
"PFEC,";
1055 if (prp->m_lat < 0.)
1056 oNMEA0183.GPwpl.Position.Latitude.Set(-prp->m_lat,
"S");
1058 oNMEA0183.GPwpl.Position.Latitude.Set(prp->m_lat,
"N");
1060 if (prp->m_lon < 0.)
1061 oNMEA0183.GPwpl.Position.Longitude.Set(-prp->m_lon,
"W");
1063 oNMEA0183.GPwpl.Position.Longitude.Set(prp->m_lon,
"E");
1065 wxString name = prp->GetName();
1067 name.Truncate(g_maxWPNameLength);
1068 oNMEA0183.GPwpl.To = name;
1070 oNMEA0183.GPwpl.Write(snt);
1073 auto msg_out = std::make_shared<Nmea0183Msg>(
1074 std::string(
"ECWPL"), snt.Sentence.ToStdString(), address);
1075 drv_n0183->SendMessage(msg_out, address);
1077 multiplexer.LogOutputMessage(snt.Sentence, com_name,
false);
1078 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: ";
1082 if (g_GPS_Ident ==
"FurunoGP3X") {
1084 term.Printf(
"$PFEC,GPxfr,CTL,E%c%c", 0x0d, 0x0a);
1089 auto msg = wxString(
"-->GPS Port:") + com_name +
" Sentence: " + term;
1093 dlg_ctx.set_value(100);
1104 registry.Deactivate(target_driver);
1106 if (b_restoreStream) {
1107 MakeCommDriver(¶ms_save);
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.