OpenCPN Partial API docs
Loading...
Searching...
No Matches
send_to_gps_dlg.cpp
Go to the documentation of this file.
1/**************************************************************************
2 * Copyright (C) 2010 by David S. Register *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, see <https://www.gnu.org/licenses/>. *
16 **************************************************************************/
17
24#include "gl_headers.h" // Must be included before anything using GL stuff
25
26#include <wx/arrstr.h>
27#include <wx/button.h>
28#include <wx/combobox.h>
29#include <wx/dialog.h>
30#include <wx/dynarray.h>
31#include <wx/event.h>
32#include <wx/gdicmn.h>
33#include <wx/sizer.h>
34#include <wx/stattext.h>
35#include <wx/string.h>
36#include <wx/window.h>
37
38#include "model/config_vars.h"
39#include "model/conn_params.h"
40#include "model/rest_server.h"
41#include "model/route.h"
42#include "model/route_point.h"
43#include "model/ser_ports.h"
44
45#include "ocpn_platform.h"
46#include "route_gui.h"
47#include "route_point_gui.h"
48#include "send_to_gps_dlg.h"
49
50BEGIN_EVENT_TABLE(SendToGpsDlg, wxDialog)
51EVT_BUTTON(ID_STG_CANCEL, SendToGpsDlg::OnCancelClick)
52EVT_BUTTON(ID_STG_OK, SendToGpsDlg::OnSendClick)
53END_EVENT_TABLE()
54
56 m_itemCommListBox = NULL;
57 m_pgauge = NULL;
58 m_SendButton = NULL;
59 m_CancelButton = NULL;
60 m_pRoute = NULL;
61 m_pRoutePoint = NULL;
62 premtext = NULL;
63}
64
65SendToGpsDlg::SendToGpsDlg(wxWindow* parent, wxWindowID id,
66 const wxString& caption, const wxString& hint,
67 const wxPoint& pos, const wxSize& size, long style) {
68 Create(parent, id, caption, hint, pos, size, style);
69}
70
71SendToGpsDlg::~SendToGpsDlg() {
72 delete m_itemCommListBox;
73 delete m_pgauge;
74 delete m_SendButton;
75 delete m_CancelButton;
76}
77
78bool SendToGpsDlg::Create(wxWindow* parent, wxWindowID id,
79 const wxString& caption, const wxString& hint,
80 const wxPoint& pos, const wxSize& size, long style) {
81 SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS);
82 wxDialog::Create(parent, id, caption, pos, size, style);
83
84 CreateControls(hint);
85 GetSizer()->Fit(this);
86 GetSizer()->SetSizeHints(this);
87 Centre();
88
89 return TRUE;
90}
91
92void SendToGpsDlg::CreateControls(const wxString& hint) {
93 SendToGpsDlg* itemDialog1 = this;
94
95 wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
96 itemDialog1->SetSizer(itemBoxSizer2);
97
98 // Create the ScrollBox list of available com ports in a labeled static
99 // box
100 wxStaticBox* comm_box =
101 new wxStaticBox(this, wxID_ANY, _("GPS/Plotter Port"));
102
103 wxStaticBoxSizer* comm_box_sizer = new wxStaticBoxSizer(comm_box, wxVERTICAL);
104 itemBoxSizer2->Add(comm_box_sizer, 0, wxEXPAND | wxALL, 5);
105
106 wxArrayString* pSerialArray = EnumerateSerialPorts();
107
108 m_itemCommListBox = new wxComboBox(this, ID_STG_CHOICE_COMM);
109
110 // Fill in the listbox with all detected serial ports
111 for (unsigned int iPortIndex = 0; iPortIndex < pSerialArray->GetCount();
112 iPortIndex++) {
113 wxString full_port = pSerialArray->Item(iPortIndex);
114 full_port.Prepend("Serial:");
115 m_itemCommListBox->Append(full_port);
116 }
117
118 delete pSerialArray;
119
120 // Add any defined Network connections supporting "output"
121 wxArrayString netconns;
122 for (auto* cp : TheConnectionParams()) {
123 wxString netident;
124
125 if ((cp->IOSelect != DS_TYPE_INPUT) && cp->Type == NETWORK &&
126 (cp->NetProtocol == TCP)) {
127 netident << "TCP:" << cp->NetworkAddress << ":" << cp->NetworkPort;
128 m_itemCommListBox->Append(netident);
129 netconns.Add(netident);
130 }
131 if ((cp->IOSelect != DS_TYPE_INPUT) && cp->Type == NETWORK &&
132 (cp->NetProtocol == UDP)) {
133 netident << "UDP:" << cp->NetworkAddress << ":" << cp->NetworkPort;
134 m_itemCommListBox->Append(netident);
135 netconns.Add(netident);
136 }
137 }
138
139 // Add Bluetooth, if the platform supports it natively
140 if (g_Platform) {
141 if (g_Platform->startBluetoothScan()) {
142 wxSleep(2);
143 wxArrayString btscanResults = g_Platform->getBluetoothScanResults();
144
145 unsigned int i = 1;
146 while ((i + 1) < btscanResults.GetCount()) {
147 wxString item1 = btscanResults[i] + ";";
148 wxString item2 = btscanResults.Item(i + 1);
149 wxString port = item1 + item2;
150 port.Prepend("Bluetooth:");
151 m_itemCommListBox->Append(port);
152
153 i += 2;
154 }
155
156 g_Platform->stopBluetoothScan();
157 }
158 }
159
160 // Make the proper initial selection
161 if (!g_uploadConnection.IsEmpty()) {
162 if (g_uploadConnection.Lower().StartsWith("tcp") ||
163 g_uploadConnection.Lower().StartsWith("udp")) {
164 bool b_connExists = false;
165 for (unsigned int i = 0; i < netconns.GetCount(); i++) {
166 if (g_uploadConnection.IsSameAs(netconns[i])) {
167 b_connExists = true;
168 break;
169 }
170 }
171 if (b_connExists) m_itemCommListBox->SetValue(g_uploadConnection);
172 } else
173 m_itemCommListBox->SetValue(g_uploadConnection);
174 } else
175 m_itemCommListBox->SetSelection(0);
176
177 comm_box_sizer->Add(m_itemCommListBox, 0, wxEXPAND | wxALL, 5);
178
179 // Add a reminder text box
180 itemBoxSizer2->AddSpacer(20);
181
182 premtext = new wxStaticText(
183 this, -1, _("Prepare GPS for Route/Waypoint upload and press Send..."));
184 itemBoxSizer2->Add(premtext, 0, wxEXPAND | wxALL, 10);
185
186 // Create a progress gauge
187 wxStaticBox* prog_box = new wxStaticBox(this, wxID_ANY, _("Progress..."));
188
189 wxStaticBoxSizer* prog_box_sizer = new wxStaticBoxSizer(prog_box, wxVERTICAL);
190 itemBoxSizer2->Add(prog_box_sizer, 0, wxEXPAND | wxALL, 5);
191
192 m_pgauge = new wxGauge(this, -1, 100);
193 prog_box_sizer->Add(m_pgauge, 0, wxEXPAND | wxALL, 5);
194
195 // OK/Cancel/etc.
196 wxBoxSizer* itemBoxSizer16 = new wxBoxSizer(wxHORIZONTAL);
197 itemBoxSizer2->Add(itemBoxSizer16, 0, wxALIGN_RIGHT | wxALL, 5);
198
199 m_CancelButton = new wxButton(itemDialog1, ID_STG_CANCEL, _("Cancel"),
200 wxDefaultPosition, wxDefaultSize, 0);
201 itemBoxSizer16->Add(m_CancelButton, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
202
203 m_SendButton = new wxButton(itemDialog1, ID_STG_OK, _("Send"),
204 wxDefaultPosition, wxDefaultSize, 0);
205 itemBoxSizer16->Add(m_SendButton, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
206 m_SendButton->SetDefault();
207}
208
209void SendToGpsDlg::SetMessage(wxString msg) {
210 if (premtext) {
211 premtext->SetLabel(msg);
212 premtext->Refresh(true);
213 }
214}
215
216void SendToGpsDlg::OnSendClick(wxCommandEvent& event) {
217 // Get the selected comm port
218 wxString src = m_itemCommListBox->GetValue();
219 int tail = src.Find(" - ");
220 if (tail != wxNOT_FOUND) {
221 src = src.SubString(0, tail);
222 }
223 if (!src.Lower().StartsWith("tcp") && !src.Lower().StartsWith("udp") &&
224 !src.Lower().StartsWith("serial") && !src.Lower().StartsWith("usb:") &&
225 !src.Lower().StartsWith("bluetooth")) {
226 src = src.Prepend("Serial:");
227 }
228 g_uploadConnection = src; // save for persistence
229
230 wxString destPort = src.BeforeFirst(' '); // Serial:
231
232 // For Bluetooth, we need the entire string
233 if (src.Lower().Find("bluetooth") != wxNOT_FOUND) destPort = src;
234
235 // And send it out
236 if (m_pRoute) RouteGui(*m_pRoute).SendToGPS(destPort, true, this);
237 if (m_pRoutePoint) RoutePointGui(*m_pRoutePoint).SendToGPS(destPort, this);
238
239 // Show( false );
240 // event.Skip();
241 Close();
242}
243
244void SendToGpsDlg::OnCancelClick(wxCommandEvent& event) {
245 // Show( false );
246 // event.Skip();
247 Close();
248}
Dialog for sending routes/waypoints to a GPS device.
Global variables stored in configuration file.
Connection parameters.
Platform independent GL includes.
OpenCPN Platform specific support utilities.
REST API server.
Route abstraction.
Route drawing stuff.
Waypoint or mark abstraction.
Purpose: Track and Trackpoint drawing stuff.
Send route/waypoint to GPS dialog.
Serial ports support, notably enumeration.
wxArrayString * EnumerateSerialPorts(void)
Enumerate all serial ports.