24 #include "model/garmin_wrapper.h"
27 #include "garmin_gps.h"
28 #include "gpsserial.h"
32 static gpsdevh *my_gps_devh;
34 wxString GetLastGarminError(
void) {
35 return wxString(GetDeviceLastError(), wxConvUTF8);
45 int Garmin_GPS_Init(
const wxString &port_name) {
50 GPS_Enable_Diagnose();
56 ret = GPS_Init(port_name.mb_str());
62 int Garmin_GPS_Open(wxString &port_name) {
63 return GPS_Init(port_name.mb_str());
66 int Garmin_GPS_PVT_On(wxString &port_name) {
67 return Garmin_Serial_GPS_PVT_On(port_name.mb_str());
70 int Garmin_GPS_PVT_Off(wxString &port_name) {
71 return Garmin_Serial_GPS_PVT_Off(port_name.mb_str());
74 int Garmin_GPS_GetPVT(
void *pvt) {
75 return GPS_Serial_Command_Pvt_Get((GPS_PPvt_Data *)pvt);
78 void Garmin_GPS_ClosePortVerify(
void) { VerifyPortClosed(); }
80 wxString Garmin_GPS_GetSaveString() {
81 return wxString(gps_save_string, wxConvUTF8);
84 void Garmin_GPS_PrepareWptData(GPS_PWay pway,
RoutePoint *prp) {
85 pway->lat = prp->m_lat;
86 pway->lon = prp->m_lon;
87 pway->alt_is_unknown = 1;
89 strncpy(pway->ident, (prp->GetName().Truncate(6)).mb_str(), 6);
92 int Garmin_GPS_SendWaypoints(
const wxString &port_name,
93 RoutePointList *wplist) {
96 int nPoints = wplist->GetCount();
100 GPS_SWay **ppway = (GPS_SWay **)malloc(nPoints *
sizeof(GPS_PWay));
103 for (
int i = 0; i < nPoints; i++) ppway[i] = GPS_Way_New();
106 for (
int i = 0; i < nPoints; i++) {
107 GPS_PWay pway = ppway[i];
108 wxRoutePointListNode *node = wplist->Item(i);
111 Garmin_GPS_PrepareWptData(pway, prp);
115 int xfer_result = GPS_Command_Send_Waypoint(
116 port_name.mb_str(), ppway, nPoints, 0 );
117 ret_val = xfer_result;
120 for (
int i = 0; i < nPoints; i++) GPS_Way_Del(&ppway[i]);
140 GPS_SWay **Garmin_GPS_Create_A200_Route(
Route *pr,
int route_number,
142 RoutePointList *wplist = pr->pRoutePointList;
143 int nPoints = wplist->GetCount();
150 GPS_SWay **ppway = (GPS_SWay **)malloc((*size) *
sizeof(GPS_PWay));
153 for (
int i = 0; i < nPoints + 1; i++) ppway[i] = GPS_Way_New();
159 GPS_PWay pway = ppway[0];
161 pway->rte_num = route_number;
162 strncpy(pway->rte_ident, (pr->m_RouteNameString.Truncate(255)).mb_str(), 255);
163 strncpy(pway->rte_cmnt, (pr->m_RouteNameString.Truncate(19)).mb_str(), 19);
166 for (
int i = 1; i < *size; i++) {
167 GPS_PWay pway = ppway[i];
168 wxRoutePointListNode *node = wplist->Item(i - 1);
171 Garmin_GPS_PrepareWptData(pway, prp);
192 GPS_SWay **Garmin_GPS_Create_A201_Route(
Route *pr,
int route_number,
194 RoutePointList *wplist = pr->pRoutePointList;
195 int nPoints = wplist->GetCount();
201 *size = 1 + nPoints + (nPoints - 1);
203 GPS_SWay **ppway = (GPS_SWay **)malloc((*size) *
sizeof(GPS_PWay));
206 for (
int i = 0; i < *size; i++) ppway[i] = GPS_Way_New();
212 GPS_PWay pway = ppway[0];
214 pway->rte_num = route_number;
215 strncpy(pway->rte_ident, (pr->m_RouteNameString.Truncate(255)).mb_str(), 255);
216 strncpy(pway->rte_cmnt, (pr->m_RouteNameString.Truncate(19)).mb_str(), 19);
220 for (
int i = 1; i < *size; i++) {
223 GPS_PWay pway = ppway[i];
224 wxRoutePointListNode *node = wplist->Item((i - 1) / 2);
227 Garmin_GPS_PrepareWptData(pway, prp);
231 GPS_PWay pway = ppway[i];
233 pway->rte_link_class = 0;
234 memset(pway->rte_link_subclass, 0,
sizeof(pway->rte_link_subclass));
235 memset(pway->rte_link_ident, 0,
sizeof(pway->rte_link_ident));
242 int Garmin_GPS_SendRoute(
const wxString &port_name,
Route *pr,
246 int route_number = 1;
250 if ((gps_rte_hdr_type == pD200) || (gps_rte_hdr_type == pD201)) {
252 GPS_Diag(
"Garmin: trying to get free route number");
253 GPS_PWay *pprouteway;
254 int32 npacks = GPS_A200_Get(port_name.mb_str(), &pprouteway);
255 if (npacks < 0)
return npacks;
256 dlg_ctx.set_value(40);
263 for (
int i = 0; i < 10; i++) brn[i] =
false;
265 for (
int ip = 0; ip < npacks; ip++) {
266 GPS_PWay pway = pprouteway[ip];
268 if ((pway->rte_num < 10)) brn[pway->rte_num] =
true;
273 bool bfound_empty =
false;
274 for (
int i = 1; i < 10; i++) {
275 if (brn[i] ==
false) {
281 GPS_Diag(
"Using route number: %d", route_number);
285 if (!dlg_ctx.confirm_overwrite()) {
294 if (gps_route_transfer == pA201)
295 ppway = Garmin_GPS_Create_A201_Route(pr, route_number, &elements);
297 ppway = Garmin_GPS_Create_A200_Route(pr, route_number, &elements);
300 int xfer_result = GPS_Command_Send_Route(port_name.mb_str(), ppway, elements);
301 ret_val = xfer_result;
304 for (
int i = 0; i < elements; i++) GPS_Way_Del(&ppway[i]);
307 dlg_ctx.set_value(80);