29#include "model/garmin_wrapper.h"
32#include "garmin_gps.h"
37static gpsdevh *my_gps_devh;
39wxString GetLastGarminError() {
40 return wxString(GetDeviceLastError(), wxConvUTF8);
50int Garmin_GPS_Init(
const wxString &port_name) {
55 GPS_Enable_Diagnose();
61 ret = GPS_Init(port_name.mb_str());
67int Garmin_GPS_Open(wxString &port_name) {
68 return GPS_Init(port_name.mb_str());
71int Garmin_GPS_PVT_On(wxString &port_name) {
72 return Garmin_Serial_GPS_PVT_On(port_name.mb_str());
75int Garmin_GPS_PVT_Off(wxString &port_name) {
76 return Garmin_Serial_GPS_PVT_Off(port_name.mb_str());
79int Garmin_GPS_GetPVT(
void *pvt) {
80 return GPS_Serial_Command_Pvt_Get((GPS_PPvt_Data *)pvt);
83void Garmin_GPS_ClosePortVerify() { VerifyPortClosed(); }
85wxString Garmin_GPS_GetSaveString() {
86 return wxString(gps_save_string, wxConvUTF8);
89void Garmin_GPS_PrepareWptData(GPS_PWay pway,
RoutePoint *prp) {
90 pway->lat = prp->m_lat;
91 pway->lon = prp->m_lon;
92 pway->alt_is_unknown = 1;
94 strncpy(pway->ident, (prp->GetName().Truncate(6)).mb_str(), 6);
97int Garmin_GPS_SendWaypoints(
const wxString &port_name,
98 RoutePointList *wplist) {
101 int nPoints = wplist->size();
105 GPS_SWay **ppway = (GPS_SWay **)malloc(nPoints *
sizeof(GPS_PWay));
108 for (
int i = 0; i < nPoints; i++) ppway[i] = GPS_Way_New();
111 for (
int i = 0; i < nPoints; i++) {
112 GPS_PWay pway = ppway[i];
113 auto it = wplist->begin() + i;
116 Garmin_GPS_PrepareWptData(pway, prp);
120 int xfer_result = GPS_Command_Send_Waypoint(
121 port_name.mb_str(), ppway, nPoints, 0 );
122 ret_val = xfer_result;
125 for (
int i = 0; i < nPoints; i++) GPS_Way_Del(&ppway[i]);
145GPS_SWay **Garmin_GPS_Create_A200_Route(
Route *pr,
int route_number,
148 int nPoints = wplist->size();
155 GPS_SWay **ppway = (GPS_SWay **)malloc((*size) *
sizeof(GPS_PWay));
158 for (
int i = 0; i < nPoints + 1; i++) ppway[i] = GPS_Way_New();
164 GPS_PWay pway = ppway[0];
166 pway->rte_num = route_number;
171 for (
int i = 1; i < *size; i++) {
172 GPS_PWay pway = ppway[i];
173 auto it = wplist->begin() + i;
176 Garmin_GPS_PrepareWptData(pway, prp);
197GPS_SWay **Garmin_GPS_Create_A201_Route(
Route *pr,
int route_number,
200 int nPoints = wplist->size();
206 *size = 1 + nPoints + (nPoints - 1);
208 GPS_SWay **ppway = (GPS_SWay **)malloc((*size) *
sizeof(GPS_PWay));
211 for (
int i = 0; i < *size; i++) ppway[i] = GPS_Way_New();
217 GPS_PWay pway = ppway[0];
219 pway->rte_num = route_number;
225 for (
int i = 1; i < *size; i++) {
228 GPS_PWay pway = ppway[i];
229 auto it = wplist->begin() + i;
232 Garmin_GPS_PrepareWptData(pway, prp);
236 GPS_PWay pway = ppway[i];
238 pway->rte_link_class = 0;
239 memset(pway->rte_link_subclass, 0,
sizeof(pway->rte_link_subclass));
240 memset(pway->rte_link_ident, 0,
sizeof(pway->rte_link_ident));
247int Garmin_GPS_SendRoute(
const wxString &port_name,
Route *pr,
251 int route_number = 1;
255 if ((gps_rte_hdr_type == pD200) || (gps_rte_hdr_type == pD201)) {
257 GPS_Diag(
"Garmin: trying to get free route number");
258 GPS_PWay *pprouteway;
259 int32 npacks = GPS_A200_Get(port_name.mb_str(), &pprouteway);
260 if (npacks < 0)
return npacks;
261 dlg_ctx.set_value(40);
268 for (
int i = 0; i < 10; i++) brn[i] =
false;
270 for (
int ip = 0; ip < npacks; ip++) {
271 GPS_PWay pway = pprouteway[ip];
273 if ((pway->rte_num < 10)) brn[pway->rte_num] =
true;
278 bool bfound_empty =
false;
279 for (
int i = 1; i < 10; i++) {
280 if (brn[i] ==
false) {
286 GPS_Diag(
"Using route number: %d", route_number);
290 if (!dlg_ctx.confirm_overwrite()) {
299 if (gps_route_transfer == pA201)
300 ppway = Garmin_GPS_Create_A201_Route(pr, route_number, &elements);
302 ppway = Garmin_GPS_Create_A200_Route(pr, route_number, &elements);
305 int xfer_result = GPS_Command_Send_Route(port_name.mb_str(), ppway, elements);
306 ret_val = xfer_result;
309 for (
int i = 0; i < elements; i++) GPS_Way_Del(&ppway[i]);
312 dlg_ctx.set_value(80);
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.