source: ntrip/trunk/BNS/bnswindow.cpp@ 1255

Last change on this file since 1255 was 1255, checked in by weber, 15 years ago

* empty log message *

File size: 29.8 KB
Line 
1
2/* -------------------------------------------------------------------------
3 * BKG NTRIP Server
4 * -------------------------------------------------------------------------
5 *
6 * Class: bnsWindow
7 *
8 * Purpose: This class implements the main application window.
9 *
10 * Author: L. Mervart
11 *
12 * Created: 29-Mar-2008
13 *
14 * Changes:
15 *
16 * -----------------------------------------------------------------------*/
17
18#include <iostream>
19
20#include "bnswindow.h"
21#include "bnshlpdlg.h"
22
23using namespace std;
24
25// About Dialog - Constructor
26////////////////////////////////////////////////////////////////////////////
27bnsAboutDlg::bnsAboutDlg(QWidget* parent) :
28 QDialog(parent) {
29
30 QTextBrowser* tb = new QTextBrowser;
31 QUrl url; url.setPath(":bnsabout.html");
32 tb->setSource(url);
33 tb->setReadOnly(true);
34
35 int ww = QFontMetrics(font()).width('w');
36 QPushButton* _closeButton = new QPushButton("Close");
37 _closeButton->setMaximumWidth(10*ww);
38 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
39
40 QGridLayout* dlgLayout = new QGridLayout();
41 QLabel* img = new QLabel();
42 img->setPixmap(QPixmap(":ntrip-logo.png"));
43 dlgLayout->addWidget(img, 0,0);
44 dlgLayout->addWidget(new QLabel("BKG Ntrip State Space Server (BNS) Version 1.0"), 0,1);
45 dlgLayout->addWidget(tb,1,0,1,2);
46 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
47
48 setLayout(dlgLayout);
49 resize(60*ww, 60*ww);
50 show();
51}
52
53// About Dialog - Destructor
54////////////////////////////////////////////////////////////////////////////
55bnsAboutDlg::~bnsAboutDlg() {
56};
57
58// Flowchart Dialog - Constructor
59////////////////////////////////////////////////////////////////////////////
60bnsFlowchartDlg::bnsFlowchartDlg(QWidget* parent) :
61 QDialog(parent) {
62
63 int ww = QFontMetrics(font()).width('w');
64 QPushButton* _closeButton = new QPushButton("Close");
65 _closeButton->setMaximumWidth(10*ww);
66 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
67
68 QGridLayout* dlgLayout = new QGridLayout();
69 QLabel* img = new QLabel();
70 img->setPixmap(QPixmap(":bnsflowchart.png"));
71 dlgLayout->addWidget(img, 0,0);
72 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
73
74 setLayout(dlgLayout);
75 show();
76}
77
78// Flowchart Dialog - Destructor
79////////////////////////////////////////////////////////////////////////////
80bnsFlowchartDlg::~bnsFlowchartDlg() {
81};
82
83// Constructor
84////////////////////////////////////////////////////////////////////////////
85bnsWindow::bnsWindow() {
86
87 _bns = 0;
88
89 QSettings settings;
90
91 QString fontString = settings.value("font").toString();
92 if ( !fontString.isEmpty() ) {
93 QFont newFont;
94 if (newFont.fromString(fontString)) {
95 QApplication::setFont(newFont);
96 }
97 }
98
99 int ww = QFontMetrics(this->font()).width('w');
100 setMinimumSize(77*ww, 65*ww);
101 setWindowTitle(tr("BKG Ntrip State Space Server (BNS) Version 1.0"));
102 setWindowIcon(QPixmap(":ntrip-logo.png"));
103
104 // Create Actions
105 // --------------
106 _actHelp = new QAction(tr("&Help Contents"),this);
107 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
108
109 _actAbout = new QAction(tr("&About BNS"),this);
110 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
111
112 _actFlowchart = new QAction(tr("&Flow Chart"),this);
113 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
114
115 _actFontSel = new QAction(tr("Select &Font"),this);
116 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
117
118 _actSaveOpt = new QAction(tr("&Save Options"),this);
119 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
120
121 _actQuit = new QAction(tr("&Quit"),this);
122 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
123
124 _actWhatsThis= new QAction(tr("Help=Shift+F1"),this);
125 connect(_actWhatsThis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
126
127 _actStart = new QAction(tr("Sta&rt"),this);
128 connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
129
130 _actStop = new QAction(tr("Sto&p"),this);
131 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
132 _actStop->setEnabled(false);
133
134 CreateMenu();
135 AddToolbar();
136
137 // Canvas with Editable Fields
138 // ---------------------------
139 _canvas = new QWidget;
140 setCentralWidget(_canvas);
141
142 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
143 _proxyHostLineEdit->setWhatsThis(tr("<p>If you are running BNS within a protected Local Area Network (LAN), you might need to use a proxy server to access the Internet. Enter your proxy server IP and port number in case one is operated in front of BNS. If you do not know the IP and port of your proxy server, check the proxy server settings in your Internet browser or ask your network administrator.</p><p>Note that IP streaming is sometimes not allowed in a LAN. In this case you need to ask your network administrator for an appropriate modification of the local security policy or for the installation of a TCP relay to the NTRIP broadcasters. If these are not possible, you might need to run BNS outside your LAN on a network that has unobstructed connection to the Internet.</p>"));
144 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
145 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case one is operated in front of BNS.</p>"));
146 _proxyPortLineEdit->setMaximumWidth(9*ww);
147
148 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
149 _logFileLineEdit->setWhatsThis(tr("<p>Records of BNS activities are shown in the Log section on the bottom of this window. They can be saved into a file when a valid path is specified in the 'Logfile (full path)' field.</p>"));
150 _fileAppendCheckBox = new QCheckBox();
151 _fileAppendCheckBox->setCheckState(Qt::CheckState(settings.value("fileAppend").toInt()));
152 _fileAppendCheckBox->setWhatsThis(tr("<p>When BNS is started, new files are created by default and any existing files with the same name will be overwritten. However, users might want to append already existing files following a restart of BNS, a system crash or when BNS crashed. Tick 'Append files' to continue with existing files and keep what has been recorded so far.</p>"));
153
154 _inpEchoLineEdit = new QLineEdit(settings.value("inpEcho").toString());
155 _inpEchoLineEdit->setWhatsThis(tr("Specify the full path to a file where incoming clocks and orbits are saved. Beware that the size of this file can rapidly increase. Default is an empty option field meaning that incoming clocks and orbits are not saved."));
156
157 _ephHostLineEdit = new QLineEdit(settings.value("ephHost").toString());
158 _ephHostLineEdit->setWhatsThis(tr("BNS reads Broadcast Ephemeris in RINEX Version 3 Navigation file format from an IP address. Specify the host IP e.g. of a BNC installation providing this information."));
159 _ephPortLineEdit = new QLineEdit(settings.value("ephPort").toString());
160 _ephPortLineEdit->setWhatsThis(tr("BNS reads Broadcast Ephemeris in RINEX Version 3 Navigation file format from an IP address. Specify the IP port e.g. of a BNC installation providing this information."));
161 _ephPortLineEdit->setMaximumWidth(9*ww);
162 _ephEchoLineEdit = new QLineEdit(settings.value("ephEcho").toString());
163 _ephEchoLineEdit->setWhatsThis(tr("Specify the full path to a file where incoming Broadcast Ephemeris are saved. Beware that the size of this file can rapidly increase. Default is an empty option field meaning that incoming Broadcast Ephemeris are not saved."));
164
165 _clkPortLineEdit = new QLineEdit(settings.value("clkPort").toString());
166 _clkPortLineEdit->setWhatsThis(tr("BNS reads Clocks & Orbits referring to the IGS system (X,Y,Z, ECEF) in SP3 format from an IP port. Specify a local IP port e.g. of an RTNet installation to provide this information."));
167 _clkPortLineEdit->setMaximumWidth(9*ww);
168
169 _outHost_1_LineEdit = new QLineEdit(settings.value("outHost1").toString());
170 _outHost_1_LineEdit->setWhatsThis(tr("BNS can stream clock and orbit corrections to Broadcast Ephemeris in RTCM Version 3 format. Specify the host IP of an NTRIP Broadcaster to upload the stream. An empty option field means that you don't want to upload corrections."));
171//_outHost_1_LineEdit->setMaximumWidth(9*ww); // weber
172 _outPort_1_LineEdit = new QLineEdit(settings.value("outPort1").toString());
173 _outPort_1_LineEdit->setWhatsThis(tr("Specify the IP port of an NTRIP Broadcaster to upload the stream. Default is port 80."));
174 _outPort_1_LineEdit->setMaximumWidth(9*ww);
175 _password_1_LineEdit = new QLineEdit(settings.value("password1").toString());
176 _password_1_LineEdit->setWhatsThis(tr("Specify the stream upload password protecting the mounpoint on an NTRIP Broadcaster."));
177 _password_1_LineEdit->setMaximumWidth(9*ww);
178 _password_1_LineEdit->setEchoMode(QLineEdit::Password);
179
180 _outHost_2_LineEdit = new QLineEdit(settings.value("outHost2").toString());
181 _outHost_2_LineEdit->setWhatsThis(tr("BNS can stream clock and orbit corrections to Broadcast Ephemeris in RTCM Version 3 format. Specify the host IP of an NTRIP Broadcaster to upload the stream. An empty option field means that you don't want to upload corrections."));
182 _outPort_2_LineEdit = new QLineEdit(settings.value("outPort2").toString());
183 _outPort_2_LineEdit->setWhatsThis(tr("Specify the IP port of an NTRIP Broadcaster to upload the stream. Default is port 80."));
184 _outPort_2_LineEdit->setMaximumWidth(9*ww);
185 _password_2_LineEdit = new QLineEdit(settings.value("password2").toString());
186 _password_2_LineEdit->setWhatsThis(tr("Specify the stream upload password protecting the mounpoint on an NTRIP Broadcaster."));
187 _password_2_LineEdit->setMaximumWidth(9*ww);
188 _password_2_LineEdit->setEchoMode(QLineEdit::Password);
189
190 _mountpoint_1_LineEdit = new QLineEdit(settings.value("mountpoint_1").toString());
191 _mountpoint_1_LineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
192 _mountpoint_1_LineEdit->setMaximumWidth(12*ww);
193 _mountpoint_2_LineEdit = new QLineEdit(settings.value("mountpoint_2").toString());
194 _mountpoint_2_LineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
195 _mountpoint_2_LineEdit->setMaximumWidth(12*ww);
196 _refSys_1_ComboBox = new QComboBox;
197 _refSys_1_ComboBox->setMaximumWidth(12*ww);
198 _refSys_1_ComboBox->setEditable(false);
199 _refSys_1_ComboBox->addItems(QString("IGS05,ETRF2000").split(","));
200 int ii = _refSys_1_ComboBox->findText(settings.value("refSys_1").toString());
201 if (ii != -1) {
202 _refSys_1_ComboBox->setCurrentIndex(ii);
203 }
204 _refSys_1_ComboBox->setWhatsThis(tr("Select the target reference system for outgoing clock and orbit corrections."));
205 _refSys_2_ComboBox = new QComboBox;
206 _refSys_2_ComboBox->setMaximumWidth(12*ww);
207 _refSys_2_ComboBox->setEditable(false);
208 _refSys_2_ComboBox->addItems(QString("IGS05,ETRF2000").split(","));
209 ii = _refSys_2_ComboBox->findText(settings.value("refSys_2").toString());
210 if (ii != -1) {
211 _refSys_2_ComboBox->setCurrentIndex(ii);
212 }
213 _refSys_2_ComboBox->setWhatsThis(tr("Select the target reference system for outgoing clock and orbit corrections."));
214 _outFile_1_LineEdit = new QLineEdit(settings.value("outFile_1").toString());
215 _outFile_1_LineEdit->setWhatsThis(tr("Specify the full path to a file where outgoing clock and orbit corrections to Broadcast Ephemeris are saved. Beware that the size of this file can rapidly increase. Default is an empty option field meaning that outgoing corrections are not saved."));
216 _outFile_2_LineEdit = new QLineEdit(settings.value("outFile_2").toString());
217 _outFile_2_LineEdit->setWhatsThis(tr("Specify the full path to a file where outgoing clock and orbit corrections to Broadcast Ephemeris are saved. Beware that the size of this file can rapidly increase. Default is an empty option field meaning that outgoing corrections are not saved."));
218
219 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
220 _rnxPathLineEdit->setWhatsThis(tr("Specify the path for saving the generated clock corrections as Clock RINEX files. If the specified directory does not exist, BNS will not create Clock RINEX files."));
221 _rnxIntrComboBox = new QComboBox;
222 _rnxIntrComboBox->setMaximumWidth(9*ww);
223 _rnxIntrComboBox->setEditable(false);
224 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
225 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
226 if (ii != -1) {
227 _rnxIntrComboBox->setCurrentIndex(ii);
228 }
229 _rnxIntrComboBox->setWhatsThis(tr("Select the length of the Clock RINEX file."));
230 _rnxSamplSpinBox = new QSpinBox;
231 _rnxSamplSpinBox->setMinimum(0);
232 _rnxSamplSpinBox->setMaximum(60);
233 _rnxSamplSpinBox->setSingleStep(5);
234 _rnxSamplSpinBox->setMaximumWidth(9*ww);
235 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
236 _rnxSamplSpinBox->setSuffix(" sec");
237 _rnxSamplSpinBox->setWhatsThis(tr("Select the Clock RINEX file sampling interval in seconds. A value of zero '0' tells BNS to store all available samples into Clock RINEX files."));
238
239 _sp3PathLineEdit = new QLineEdit(settings.value("sp3Path").toString());
240 _sp3PathLineEdit->setWhatsThis(tr("Specify the path for saving the generated orbit corrections as SP3 orbit files. If the specified directory does not exist, BNS will not create SP3 orbit files."));
241 _sp3IntrComboBox = new QComboBox;
242 _sp3IntrComboBox->setMaximumWidth(9*ww);
243 _sp3IntrComboBox->setEditable(false);
244 _sp3IntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
245 ii = _sp3IntrComboBox->findText(settings.value("sp3Intr").toString());
246 if (ii != -1) {
247 _sp3IntrComboBox->setCurrentIndex(ii);
248 }
249 _sp3IntrComboBox->setWhatsThis(tr("Select the length of the SP3 orbit file."));
250 _sp3SamplSpinBox = new QSpinBox;
251 _sp3SamplSpinBox->setMinimum(0);
252 _sp3SamplSpinBox->setMaximum(900);
253 _sp3SamplSpinBox->setSingleStep(60);
254 _sp3SamplSpinBox->setMaximumWidth(9*ww);
255 _sp3SamplSpinBox->setValue(settings.value("sp3Sampl").toInt());
256 _sp3SamplSpinBox->setSuffix(" sec");
257 _sp3SamplSpinBox->setWhatsThis(tr("Select the SP3 orbit file sampling interval in seconds. A value of zero '0' tells BNS to store all available samples into SP3 orbit files."));
258
259 // TabWidget
260 // ---------
261 QTabWidget* tabs = new QTabWidget();
262
263 // Proxy Tab
264 // ---------
265 QWidget* tab_prx = new QWidget();
266 tabs->setMaximumHeight(20*ww);
267 tabs->addTab(tab_prx, "Proxy");
268
269 QGridLayout* layout_prx = new QGridLayout;
270 layout_prx->setColumnMinimumWidth(0,9*ww);
271
272 layout_prx->addWidget(new QLabel("Host"), 0, 0, Qt::AlignLeft);
273 layout_prx->addWidget(_proxyHostLineEdit, 0, 1);
274 layout_prx->addWidget(new QLabel("Port"), 1, 0, Qt::AlignLeft);
275 layout_prx->addWidget(_proxyPortLineEdit, 1, 1);
276 layout_prx->addWidget(new QLabel("Settings for the proxy in protected networks, leave boxes blank if none."),2, 0, 1, 2, Qt::AlignLeft);
277 layout_prx->addWidget(new QLabel(" "), 3, 0);
278
279 tab_prx->setLayout(layout_prx);
280
281 // General Tab
282 // -----------
283 QWidget* tab_gen = new QWidget();
284 tabs->addTab(tab_gen, "General");
285
286 QGridLayout* layout_gen = new QGridLayout;
287 layout_gen->setColumnMinimumWidth(0,9*ww);
288
289 layout_gen->addWidget(new QLabel("Logfile (full path)"), 0, 0);
290 layout_gen->addWidget(_logFileLineEdit, 0, 1);
291 layout_gen->addWidget(new QLabel("Append files"), 1, 0);
292 layout_gen->addWidget(_fileAppendCheckBox, 1, 1);
293 layout_gen->addWidget(new QLabel("General settings for logfile and file handling."), 2, 0, 1, 2, Qt::AlignLeft);
294 layout_gen->addWidget(new QLabel(" "), 3, 0);
295
296 tab_gen->setLayout(layout_gen);
297
298 // Ephemeris Tab
299 // -------------
300 QWidget* tab_eph = new QWidget();
301 tabs->addTab(tab_eph, "RINEX Ephemeris");
302
303 QGridLayout* layout_eph = new QGridLayout;
304 layout_eph->setColumnMinimumWidth(0, 9*ww);
305
306 layout_eph->addWidget(new QLabel("Host"), 0, 0);
307 layout_eph->addWidget(_ephHostLineEdit, 0, 1);
308 layout_eph->addWidget(new QLabel("Port"), 1, 0);
309 layout_eph->addWidget(_ephPortLineEdit, 1, 1);
310 layout_eph->addWidget(new QLabel("Save (full path)"), 2, 0);
311 layout_eph->addWidget(_ephEchoLineEdit, 2, 1);
312 layout_eph->addWidget(new QLabel("Read broadcast ephemeris in RINEX Version 3 Navigation format."), 3, 0, 1, 2, Qt::AlignLeft);
313//layout_eph->addWidget(new QLabel(""), 4, 0);
314
315 tab_eph->setLayout(layout_eph);
316
317 // Clock & Orbit Tab
318 // -----------------
319 QWidget* tab_co = new QWidget();
320 tabs->addTab(tab_co,"Clocks && Orbits");
321
322
323 QGridLayout* layout_co = new QGridLayout;
324 layout_co->setColumnMinimumWidth(0, 9*ww);
325
326 layout_co->addWidget(new QLabel("Listening port"), 0, 0);
327 layout_co->addWidget(_clkPortLineEdit, 0, 1);
328 layout_co->addWidget(new QLabel("Save (full path)"), 1, 0);
329 layout_co->addWidget(_inpEchoLineEdit, 1, 1);
330 layout_co->addWidget(new QLabel("Read clocks and orbits in SP3 format."), 2, 0, 1, 2, Qt::AlignLeft);
331 layout_co->addWidget(new QLabel(""), 3, 0);
332
333 tab_co->setLayout(layout_co);
334
335 // Caster Tab I
336 // ------------
337 QWidget* tab_cas1 = new QWidget();
338 tabs->addTab(tab_cas1, "Ephemeris Corrections I");
339
340 QGridLayout* layout_cas1 = new QGridLayout;
341 layout_cas1->setColumnMinimumWidth(0, 9*ww);
342 layout_cas1->addWidget(new QLabel("Host"), 0, 0);
343 layout_cas1->addWidget(_outHost_1_LineEdit, 0, 1, 1, 3);
344 layout_cas1->addWidget(new QLabel("Port"), 0, 4, Qt::AlignRight);
345 layout_cas1->addWidget(_outPort_1_LineEdit, 0, 5);
346 layout_cas1->addWidget(new QLabel("Mountpoint"), 1, 0);
347 layout_cas1->addWidget(_mountpoint_1_LineEdit, 1, 1);
348 layout_cas1->addWidget(new QLabel("Password"), 1, 2, Qt::AlignRight);
349 layout_cas1->addWidget(_password_1_LineEdit, 1, 3);
350 layout_cas1->addWidget(new QLabel(" "), 1, 4);
351 layout_cas1->addWidget(new QLabel(" "), 1, 5);
352 layout_cas1->addWidget(new QLabel("System"), 2, 0);
353 layout_cas1->addWidget(_refSys_1_ComboBox, 2, 1);
354 layout_cas1->addWidget(new QLabel("Save (full path)"), 2, 2, Qt::AlignRight);
355 layout_cas1->addWidget(_outFile_1_LineEdit, 2, 3, 1, 10);
356 layout_cas1->addWidget(new QLabel("Produce broadcast ephemeris corrections, upload to caster, reference system, local storage."), 3, 0, 1, 10);
357
358 tab_cas1->setLayout(layout_cas1);
359
360 // Caster Tab II
361 // -------------
362 QWidget* tab_cas2 = new QWidget();
363 tabs->addTab(tab_cas2, "Ephemeris Corrections II");
364
365 QGridLayout* layout_cas2 = new QGridLayout;
366 layout_cas2->setColumnMinimumWidth(0, 9*ww);
367 layout_cas2->addWidget(new QLabel("Host"), 0, 0);
368 layout_cas2->addWidget(_outHost_2_LineEdit, 0, 1, 1, 3);
369 layout_cas2->addWidget(new QLabel("Port"), 0, 4, Qt::AlignRight);
370 layout_cas2->addWidget(_outPort_2_LineEdit, 0, 5);
371 layout_cas2->addWidget(new QLabel("Mountpoint"), 1, 0);
372 layout_cas2->addWidget(_mountpoint_2_LineEdit, 1, 1);
373 layout_cas2->addWidget(new QLabel("Password"), 1, 2, Qt::AlignRight);
374 layout_cas2->addWidget(_password_2_LineEdit, 1, 3);
375 layout_cas2->addWidget(new QLabel(" "), 1, 4);
376 layout_cas2->addWidget(new QLabel(" "), 1, 5);
377 layout_cas2->addWidget(new QLabel("System"), 2, 0);
378 layout_cas2->addWidget(_refSys_2_ComboBox, 2, 1);
379 layout_cas2->addWidget(new QLabel("Save (full path)"), 2, 2, Qt::AlignRight);
380 layout_cas2->addWidget(_outFile_2_LineEdit, 2, 3, 1, 10);
381 layout_cas2->addWidget(new QLabel("Produce broadcast ephemeris corrections, upload to caster, reference system, local storage."), 3, 0, 1, 10);
382
383 tab_cas2->setLayout(layout_cas2);
384
385 // RINEX Tab
386 // ---------
387 QWidget* tab_rin = new QWidget();
388 tabs->addTab(tab_rin, "RINEX Clocks ");
389
390 QGridLayout* layout_rin = new QGridLayout;
391 layout_rin->setColumnMinimumWidth(0, 9*ww);
392
393 layout_rin->addWidget(new QLabel("Directory"), 0, 0);
394 layout_rin->addWidget(_rnxPathLineEdit, 0, 1);
395 layout_rin->addWidget(new QLabel("Interval"), 1, 0);
396 layout_rin->addWidget(_rnxIntrComboBox, 1, 1);
397 layout_rin->addWidget(new QLabel("Sampling"), 2, 0);
398 layout_rin->addWidget(_rnxSamplSpinBox, 2, 1);
399 layout_rin->addWidget(new QLabel("Save clock corrections in Clock RINEX file format."), 3, 0, 1, 2, Qt::AlignLeft);
400
401 tab_rin->setLayout(layout_rin);
402
403 // SP3 Tab
404 // -------
405 QWidget* tab_sp3 = new QWidget();
406 tabs->addTab(tab_sp3, "SP3 Orbits");
407
408 QGridLayout* layout_sp3 = new QGridLayout;
409 layout_sp3->setColumnMinimumWidth(0, 9*ww);
410
411 layout_sp3->addWidget(new QLabel("Directory"), 0, 0);
412 layout_sp3->addWidget(_sp3PathLineEdit, 0, 1);
413 layout_sp3->addWidget(new QLabel("Interval"), 1, 0);
414 layout_sp3->addWidget(_sp3IntrComboBox, 1, 1);
415 layout_sp3->addWidget(new QLabel("Sampling"), 2, 0);
416 layout_sp3->addWidget(_sp3SamplSpinBox, 2, 1);
417 layout_sp3->addWidget(new QLabel("Save orbit corrections in SP3 file format."), 3, 0, 1, 2, Qt::AlignLeft);
418
419 tab_sp3->setLayout(layout_sp3);
420
421 // Log
422 // ---
423 _log = new QTextBrowser();
424 _log->setReadOnly(true);
425 _log->setWhatsThis(tr("Records of BNS's activities are shown in the Log section."));
426
427 // Status
428 // ------
429//_status = new QWidget();
430 _status = new QGroupBox(tr("Status"));
431 QGridLayout* layout_status = new QGridLayout;
432
433 _statusLbl[0] = new QLabel("0 byte(s)"); _statusCnt[0] = 0;
434 _statusLbl[1] = new QLabel("0 byte(s)"); _statusCnt[1] = 0;
435 _statusLbl[2] = new QLabel("0 byte(s)"); _statusCnt[2] = 0;
436 _statusLbl[3] = new QLabel("RINEX Ephemeris:");
437 _statusLbl[4] = new QLabel("Clocks & Orbits:");
438 _statusLbl[5] = new QLabel("Ephemeris Corrections I:");
439
440 _statusLbl[0]->setWhatsThis(tr("Status of incoming broadcast ephemeris."));
441 _statusLbl[1]->setWhatsThis(tr("Status of incoming stream of clocks and orbits."));
442 _statusLbl[2]->setWhatsThis(tr("Status of outgoing stream to NTRIP broadcaster."));
443 _statusLbl[3]->setWhatsThis(tr("Status of incoming broadcast ephemeris."));
444 _statusLbl[4]->setWhatsThis(tr("Status of incoming stream of clocks and orbits."));
445 _statusLbl[5]->setWhatsThis(tr("Status of outgoing stream to NTRIP broadcaster."));
446
447 layout_status->addWidget(_statusLbl[3], 0, 0);
448 layout_status->addWidget(_statusLbl[0], 0, 1);
449 layout_status->addWidget(_statusLbl[4], 1, 0);
450 layout_status->addWidget(_statusLbl[1], 1, 1);
451 layout_status->addWidget(_statusLbl[5], 0, 2);
452 layout_status->addWidget(_statusLbl[2], 0, 3);
453 _status->setLayout(layout_status);
454
455 // Main Layout
456 // -----------
457 QVBoxLayout* mainLayout = new QVBoxLayout;
458 mainLayout->addWidget(tabs);
459 mainLayout->addWidget(_log);
460 mainLayout->addWidget(_status);
461
462 _canvas->setLayout(mainLayout);
463}
464
465// Destructor
466////////////////////////////////////////////////////////////////////////////
467bnsWindow::~bnsWindow() {
468}
469
470// Close Application gracefully
471////////////////////////////////////////////////////////////////////////////
472void bnsWindow::closeEvent(QCloseEvent* event) {
473
474int iRet = QMessageBox::question(this, "Close", "Save Options?",
475 QMessageBox::Yes, QMessageBox::No,
476 QMessageBox::Cancel);
477
478 if (iRet == QMessageBox::Cancel) {
479 event->ignore();
480 return;
481 }
482 else if (iRet == QMessageBox::Yes) {
483 slotSaveOptions();
484 }
485
486 QMainWindow::closeEvent(event);
487}
488
489// About Message
490////////////////////////////////////////////////////////////////////////////
491void bnsWindow::slotAbout() {
492 new bnsAboutDlg(0);
493}
494
495//Flowchart
496////////////////////////////////////////////////////////////////////////////
497void bnsWindow::slotFlowchart() {
498 new bnsFlowchartDlg(0);
499}
500
501// Help Window
502////////////////////////////////////////////////////////////////////////////
503void bnsWindow::slotHelp() {
504 QUrl url;
505 url.setPath(":bnshelp.html");
506 new bnsHlpDlg(0, url);
507}
508
509// Select Fonts
510////////////////////////////////////////////////////////////////////////////
511void bnsWindow::slotFontSel() {
512 bool ok;
513 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
514 if (ok) {
515 QSettings settings;
516 settings.setValue("font", newFont.toString());
517 QApplication::setFont(newFont);
518 int ww = QFontMetrics(newFont).width('w');
519 setMinimumSize(77*ww, 65*ww);
520 }
521}
522
523// Whats This Help
524////////////////////////////////////////////////////////////////////////////
525void bnsWindow::slotWhatsThis() {
526QWhatsThis::enterWhatsThisMode();
527}
528
529// Create Menus
530////////////////////////////////////////////////////////////////////////////
531void bnsWindow::CreateMenu() {
532 _menuFile = menuBar()->addMenu(tr("&File"));
533 _menuFile->addAction(_actFontSel);
534 _menuFile->addSeparator();
535 _menuFile->addAction(_actSaveOpt);
536 _menuFile->addSeparator();
537 _menuFile->addAction(_actQuit);
538
539 _menuHlp = menuBar()->addMenu(tr("&Help"));
540 _menuHlp->addAction(_actHelp);
541 _menuHlp->addAction(_actFlowchart);
542 _menuHlp->addAction(_actAbout);
543}
544
545// Tool (Command) Bar
546////////////////////////////////////////////////////////////////////////////
547void bnsWindow::AddToolbar() {
548 QToolBar* toolBar = new QToolBar;
549 addToolBar(Qt::BottomToolBarArea, toolBar);
550 toolBar->setMovable(false);
551 toolBar->addAction(_actStart);
552 toolBar->addAction(_actStop);
553 toolBar->addWidget(new QLabel(" "));
554 toolBar->addAction(_actWhatsThis);
555}
556
557// Save Options
558////////////////////////////////////////////////////////////////////////////
559void bnsWindow::slotSaveOptions() {
560 QSettings settings;
561 settings.setValue("proxyHost", _proxyHostLineEdit->text());
562 settings.setValue("proxyPort", _proxyPortLineEdit->text());
563 settings.setValue("logFile", _logFileLineEdit->text());
564 settings.setValue("fileAppend", _fileAppendCheckBox->checkState());
565 settings.setValue("refSys_1", _refSys_1_ComboBox->currentText());
566 settings.setValue("refSys_2", _refSys_2_ComboBox->currentText());
567 settings.setValue("inpEcho", _inpEchoLineEdit->text());
568 settings.setValue("ephHost", _ephHostLineEdit->text());
569 settings.setValue("ephPort", _ephPortLineEdit->text());
570 settings.setValue("ephEcho", _ephEchoLineEdit->text());
571 settings.setValue("clkPort", _clkPortLineEdit->text());
572 settings.setValue("outHost1", _outHost_1_LineEdit->text());
573 settings.setValue("outPort1", _outPort_1_LineEdit->text());
574 settings.setValue("outHost2", _outHost_2_LineEdit->text());
575 settings.setValue("outPort2", _outPort_2_LineEdit->text());
576 settings.setValue("mountpoint_1",_mountpoint_1_LineEdit->text());
577 settings.setValue("mountpoint_2",_mountpoint_2_LineEdit->text());
578 settings.setValue("outFile_1", _outFile_1_LineEdit->text());
579 settings.setValue("outFile_2", _outFile_2_LineEdit->text());
580 settings.setValue("password1", _password_1_LineEdit->text());
581 settings.setValue("password2", _password_2_LineEdit->text());
582 settings.setValue("rnxPath", _rnxPathLineEdit->text());
583 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
584 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
585 settings.setValue("sp3Path", _sp3PathLineEdit->text());
586 settings.setValue("sp3Intr", _sp3IntrComboBox->currentText());
587 settings.setValue("sp3Sampl", _sp3SamplSpinBox->value());
588}
589
590// Display Program Messages
591////////////////////////////////////////////////////////////////////////////
592void bnsWindow::slotMessage(const QByteArray msg) {
593
594 const int maxBufferSize = 10000;
595
596 QString txt = _log->toPlainText() + "\n" +
597 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
598 _log->clear();
599 _log->append(txt.right(maxBufferSize));
600}
601
602// Delete bns
603////////////////////////////////////////////////////////////////////////////
604void bnsWindow::deleteBns() {
605 _actStart->setEnabled(true);
606 _actStop->setEnabled(false);
607 _bns->terminate();
608 _bns->wait(100);
609 delete _bns;
610 _bns = 0;
611}
612
613// Error in bns
614////////////////////////////////////////////////////////////////////////////
615void bnsWindow::slotError(const QByteArray msg) {
616 slotMessage(msg);
617 deleteBns();
618}
619
620// Stop
621////////////////////////////////////////////////////////////////////////////
622void bnsWindow::slotStop() {
623 int iRet = QMessageBox::question(this, "Stop", "Do you want to stop?",
624 QMessageBox::Yes, QMessageBox::No,
625 QMessageBox::NoButton);
626 if (iRet == QMessageBox::Yes) {
627 deleteBns();
628 }
629}
630
631// Start
632////////////////////////////////////////////////////////////////////////////
633void bnsWindow::slotStart() {
634 slotSaveOptions();
635
636 _actStart->setEnabled(false);
637 _actStop->setEnabled(true);
638
639 _bns = new t_bns(0);
640
641 connect(_bns, SIGNAL(newMessage(QByteArray)),
642 this, SLOT(slotMessage(const QByteArray)));
643
644 connect(_bns, SIGNAL(error(QByteArray)),
645 this, SLOT(slotError(const QByteArray)));
646
647 connect(_bns, SIGNAL(newEphBytes(int)), this, SLOT(slotEphBytes(int)));
648 connect(_bns, SIGNAL(newClkBytes(int)), this, SLOT(slotClkBytes(int)));
649 connect(_bns, SIGNAL(newOutBytes(int)), this, SLOT(slotOutBytes(int)));
650
651 _bns->start();
652}
653
654// Input and output bytes statistics
655////////////////////////////////////////////////////////////////////////////
656void bnsWindow::slotEphBytes(int nBytes) {
657 updateStatus(0, nBytes);
658}
659void bnsWindow::slotClkBytes(int nBytes) {
660 updateStatus(1, nBytes);
661}
662void bnsWindow::slotOutBytes(int nBytes) {
663 updateStatus(2, nBytes);
664}
665
666void bnsWindow::updateStatus(int ii, int nBytes) {
667 QMutexLocker locker(&_mutex);
668
669 _statusCnt[ii] += nBytes;
670
671 if (_statusCnt[ii] < 1e3) {
672 _statusLbl[ii]->setText(QString("%1 byte(s)").arg((int)_statusCnt[ii]));
673 }
674 else if (_statusCnt[ii] < 1e6) {
675 _statusLbl[ii]->setText(QString("%1 kb").arg(_statusCnt[ii]/1.e3, 5));
676 }
677 else {
678 _statusLbl[ii]->setText(QString("%1 Mb").arg(_statusCnt[ii]/1.e6, 5));
679 }
680}
Note: See TracBrowser for help on using the repository browser.