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

Last change on this file since 1089 was 1089, checked in by weber, 16 years ago

* empty log message *

File size: 27.6 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 plain ASCII 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 _outHostLineEdit = new QLineEdit(settings.value("outHost").toString());
170 _outHostLineEdit->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 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
172 _outPortLineEdit->setWhatsThis(tr("Specify the IP port of an NTRIP Broadcaster to upload the stream. Default is port 80."));
173 _outPortLineEdit->setMaximumWidth(9*ww);
174 _passwordLineEdit = new QLineEdit(settings.value("password").toString());
175 _passwordLineEdit->setWhatsThis(tr("Specify the stream upload password protecting the mounpoint on an NTRIP Broadcaster."));
176 _passwordLineEdit->setMaximumWidth(9*ww);
177 _passwordLineEdit->setEchoMode(QLineEdit::Password);
178 _mountpoint_1_LineEdit = new QLineEdit(settings.value("mountpoint_1").toString());
179 _mountpoint_1_LineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
180 _mountpoint_1_LineEdit->setMaximumWidth(9*ww);
181 _mountpoint_2_LineEdit = new QLineEdit(settings.value("mountpoint_2").toString());
182 _mountpoint_2_LineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
183 _mountpoint_2_LineEdit->setMaximumWidth(9*ww);
184 _refSys_1_ComboBox = new QComboBox;
185 _refSys_1_ComboBox->setMaximumWidth(9*ww);
186 _refSys_1_ComboBox->setEditable(false);
187 _refSys_1_ComboBox->addItems(QString("IGS05,ETRS89").split(","));
188 int ii = _refSys_1_ComboBox->findText(settings.value("refSys_1").toString());
189 if (ii != -1) {
190 _refSys_1_ComboBox->setCurrentIndex(ii);
191 }
192 _refSys_1_ComboBox->setWhatsThis(tr("Select the target reference system for outgoing clock and orbit corrections."));
193 _refSys_2_ComboBox = new QComboBox;
194 _refSys_2_ComboBox->setMaximumWidth(9*ww);
195 _refSys_2_ComboBox->setEditable(false);
196 _refSys_2_ComboBox->addItems(QString("IGS05,ETRS89").split(","));
197 ii = _refSys_2_ComboBox->findText(settings.value("refSys_2").toString());
198 if (ii != -1) {
199 _refSys_2_ComboBox->setCurrentIndex(ii);
200 }
201 _refSys_2_ComboBox->setWhatsThis(tr("Select the target reference system for outgoing clock and orbit corrections."));
202 _outFile_1_LineEdit = new QLineEdit(settings.value("outFile_1").toString());
203 _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."));
204 _outFile_2_LineEdit = new QLineEdit(settings.value("outFile_2").toString());
205 _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."));
206
207 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
208 _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."));
209 _rnxIntrComboBox = new QComboBox;
210 _rnxIntrComboBox->setMaximumWidth(9*ww);
211 _rnxIntrComboBox->setEditable(false);
212 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
213 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
214 if (ii != -1) {
215 _rnxIntrComboBox->setCurrentIndex(ii);
216 }
217 _rnxIntrComboBox->setWhatsThis(tr("Select the length of the Clock RINEX file."));
218 _rnxSamplSpinBox = new QSpinBox;
219 _rnxSamplSpinBox->setMinimum(0);
220 _rnxSamplSpinBox->setMaximum(60);
221 _rnxSamplSpinBox->setSingleStep(5);
222 _rnxSamplSpinBox->setMaximumWidth(9*ww);
223 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
224 _rnxSamplSpinBox->setSuffix(" sec");
225 _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."));
226
227 _sp3PathLineEdit = new QLineEdit(settings.value("sp3Path").toString());
228 _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."));
229 _sp3IntrComboBox = new QComboBox;
230 _sp3IntrComboBox->setMaximumWidth(9*ww);
231 _sp3IntrComboBox->setEditable(false);
232 _sp3IntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
233 ii = _sp3IntrComboBox->findText(settings.value("sp3Intr").toString());
234 if (ii != -1) {
235 _sp3IntrComboBox->setCurrentIndex(ii);
236 }
237 _sp3IntrComboBox->setWhatsThis(tr("Select the length of the SP3 orbit file."));
238 _sp3SamplSpinBox = new QSpinBox;
239 _sp3SamplSpinBox->setMinimum(0);
240 _sp3SamplSpinBox->setMaximum(900);
241 _sp3SamplSpinBox->setSingleStep(60);
242 _sp3SamplSpinBox->setMaximumWidth(9*ww);
243 _sp3SamplSpinBox->setValue(settings.value("sp3Sampl").toInt());
244 _sp3SamplSpinBox->setSuffix(" sec");
245 _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."));
246
247 // TabWidget
248 // ---------
249 QTabWidget* tabs = new QTabWidget();
250
251 // Proxy Tab
252 // ---------
253 QWidget* tab_prx = new QWidget();
254 tabs->setMaximumHeight(20*ww);
255 tabs->addTab(tab_prx, "Proxy");
256
257 QGridLayout* layout_prx = new QGridLayout;
258 layout_prx->setColumnMinimumWidth(0,9*ww);
259
260 layout_prx->addWidget(new QLabel("Host"), 0, 0, Qt::AlignLeft);
261 layout_prx->addWidget(_proxyHostLineEdit, 0, 1);
262 layout_prx->addWidget(new QLabel("Port"), 1, 0, Qt::AlignLeft);
263 layout_prx->addWidget(_proxyPortLineEdit, 1, 1);
264 layout_prx->addWidget(new QLabel("Settings for the proxy in protected networks, leave boxes blank if none."),2, 0, 1, 2, Qt::AlignLeft);
265 layout_prx->addWidget(new QLabel(" "), 3, 0);
266
267 tab_prx->setLayout(layout_prx);
268
269 // General Tab
270 // -----------
271 QWidget* tab_gen = new QWidget();
272 tabs->addTab(tab_gen, "General");
273
274 QGridLayout* layout_gen = new QGridLayout;
275 layout_gen->setColumnMinimumWidth(0,9*ww);
276
277 layout_gen->addWidget(new QLabel("Logfile (full path)"), 0, 0);
278 layout_gen->addWidget(_logFileLineEdit, 0, 1);
279 layout_gen->addWidget(new QLabel("Append files"), 1, 0);
280 layout_gen->addWidget(_fileAppendCheckBox, 1, 1);
281 layout_gen->addWidget(new QLabel("General settings for logfile and file handling."), 2, 0, 1, 2, Qt::AlignLeft);
282 layout_gen->addWidget(new QLabel(" "), 3, 0);
283
284 tab_gen->setLayout(layout_gen);
285
286 // Ephemeris Tab
287 // -------------
288 QWidget* tab_eph = new QWidget();
289 tabs->addTab(tab_eph, "RINEX Ephemeris");
290
291 QGridLayout* layout_eph = new QGridLayout;
292 layout_eph->setColumnMinimumWidth(0, 9*ww);
293
294 layout_eph->addWidget(new QLabel("Host"), 0, 0);
295 layout_eph->addWidget(_ephHostLineEdit, 0, 1);
296 layout_eph->addWidget(new QLabel("Port"), 1, 0);
297 layout_eph->addWidget(_ephPortLineEdit, 1, 1);
298 layout_eph->addWidget(new QLabel("Save (full path)"), 2, 0);
299 layout_eph->addWidget(_ephEchoLineEdit, 2, 1);
300 layout_eph->addWidget(new QLabel("Read broadcast ephemeris."), 3, 0, 1, 2, Qt::AlignLeft);
301 layout_eph->addWidget(new QLabel(""), 4, 0);
302
303 tab_eph->setLayout(layout_eph);
304
305 // Clock & Orbit Tab
306 // -----------------
307 QWidget* tab_co = new QWidget();
308 tabs->addTab(tab_co,"Clocks && Orbits");
309
310
311 QGridLayout* layout_co = new QGridLayout;
312 layout_co->setColumnMinimumWidth(0, 9*ww);
313
314 layout_co->addWidget(new QLabel("Listening port"), 0, 0);
315 layout_co->addWidget(_clkPortLineEdit, 0, 1);
316 layout_co->addWidget(new QLabel("Save (full path)"), 1, 0);
317 layout_co->addWidget(_inpEchoLineEdit, 1, 1);
318 layout_co->addWidget(new QLabel("Read IGS clocks and orbits."), 2, 0, 1, 2, Qt::AlignLeft);
319 layout_co->addWidget(new QLabel(""), 3, 0);
320
321 tab_co->setLayout(layout_co);
322
323 // Caster Tab
324 // ----------
325 QWidget* tab_cas = new QWidget();
326 tabs->addTab(tab_cas, "Ephemeris Corrections");
327
328 QGridLayout* layout_cas = new QGridLayout;
329 layout_cas->setColumnMinimumWidth(0, 9*ww);
330
331 layout_cas->addWidget(new QLabel("Host"), 0, 0, Qt::AlignLeft);
332 layout_cas->addWidget(_outHostLineEdit, 0, 1, 1, 2);
333 layout_cas->addWidget(new QLabel("Port"), 0, 3, Qt::AlignRight);
334 layout_cas->addWidget(_outPortLineEdit, 0, 4);
335 layout_cas->addWidget(new QLabel("Password"), 0, 5, Qt::AlignRight);
336 layout_cas->addWidget(_passwordLineEdit, 0, 6);
337
338 layout_cas->addWidget(new QLabel("Mountpoint 1"), 1, 0, Qt::AlignLeft);
339 layout_cas->addWidget(_mountpoint_1_LineEdit, 1, 1);
340 layout_cas->addWidget(new QLabel(" System"), 1, 2, Qt::AlignRight);
341 layout_cas->addWidget(_refSys_1_ComboBox, 1, 3);
342 layout_cas->addWidget(new QLabel(" Save (full path)"), 1, 4, Qt::AlignRight);
343 layout_cas->addWidget(_outFile_1_LineEdit, 1, 5, 1, 8);
344
345 layout_cas->addWidget(new QLabel("Mountpoint 2"), 2, 0, Qt::AlignLeft);
346 layout_cas->addWidget(_mountpoint_2_LineEdit, 2, 1);
347 layout_cas->addWidget(new QLabel(" System"), 2, 2, Qt::AlignRight);
348 layout_cas->addWidget(_refSys_2_ComboBox, 2, 3);
349 layout_cas->addWidget(new QLabel(" Save (full path)"), 2, 4, Qt::AlignRight);
350 layout_cas->addWidget(_outFile_2_LineEdit, 2, 5, 1, 8);
351
352 layout_cas->addWidget(new QLabel("Broadcast ephemeris corrections, upload to caster, reference system, local storage."), 3, 0, 1, 8, Qt::AlignLeft);
353
354 tab_cas->setLayout(layout_cas);
355
356 // RINEX Tab
357 // ---------
358 QWidget* tab_rin = new QWidget();
359 tabs->addTab(tab_rin, "RINEX Clocks ");
360
361 QGridLayout* layout_rin = new QGridLayout;
362 layout_rin->setColumnMinimumWidth(0, 9*ww);
363
364 layout_rin->addWidget(new QLabel("Directory"), 0, 0);
365 layout_rin->addWidget(_rnxPathLineEdit, 0, 1);
366 layout_rin->addWidget(new QLabel("Interval"), 1, 0);
367 layout_rin->addWidget(_rnxIntrComboBox, 1, 1);
368 layout_rin->addWidget(new QLabel("Sampling"), 2, 0);
369 layout_rin->addWidget(_rnxSamplSpinBox, 2, 1);
370 layout_rin->addWidget(new QLabel("Save clock corrections in Clock RINEX file format."), 3, 0, 1, 2, Qt::AlignLeft);
371
372 tab_rin->setLayout(layout_rin);
373
374 // SP3 Tab
375 // -------
376 QWidget* tab_sp3 = new QWidget();
377 tabs->addTab(tab_sp3, "SP3 Orbits");
378
379 QGridLayout* layout_sp3 = new QGridLayout;
380 layout_sp3->setColumnMinimumWidth(0, 9*ww);
381
382 layout_sp3->addWidget(new QLabel("Directory"), 0, 0);
383 layout_sp3->addWidget(_sp3PathLineEdit, 0, 1);
384 layout_sp3->addWidget(new QLabel("Interval"), 1, 0);
385 layout_sp3->addWidget(_sp3IntrComboBox, 1, 1);
386 layout_sp3->addWidget(new QLabel("Sampling"), 2, 0);
387 layout_sp3->addWidget(_sp3SamplSpinBox, 2, 1);
388 layout_sp3->addWidget(new QLabel("Save orbit corrections in SP3 file format."), 3, 0, 1, 2, Qt::AlignLeft);
389
390 tab_sp3->setLayout(layout_sp3);
391
392 // Log
393 // ---
394 _log = new QTextBrowser();
395 _log->setReadOnly(true);
396 _log->setWhatsThis(tr("Records of BNS's activities are shown in the Log section."));
397
398 // Status
399 // ------
400//_status = new QWidget();
401 _status = new QGroupBox(tr("Status"));
402 QGridLayout* layout_status = new QGridLayout;
403
404 _statusLbl[0] = new QLabel("0 byte(s)"); _statusCnt[0] = 0;
405 _statusLbl[1] = new QLabel("0 byte(s)"); _statusCnt[1] = 0;
406 _statusLbl[2] = new QLabel("0 byte(s)"); _statusCnt[2] = 0;
407 _statusLbl[3] = new QLabel("RINEX Ephemeris:");
408 _statusLbl[4] = new QLabel("Clocks & Orbits:");
409 _statusLbl[5] = new QLabel("Ephemeris Corrections:");
410
411 _statusLbl[0]->setWhatsThis(tr("Status of incoming broadcast ephemeris."));
412 _statusLbl[1]->setWhatsThis(tr("Status of incoming stream of clocks and orbits."));
413 _statusLbl[2]->setWhatsThis(tr("Status of outgoing stream to NTRIP broadcaster."));
414 _statusLbl[3]->setWhatsThis(tr("Status of incoming broadcast ephemeris."));
415 _statusLbl[4]->setWhatsThis(tr("Status of incoming stream of clocks and orbits."));
416 _statusLbl[5]->setWhatsThis(tr("Status of outgoing stream to NTRIP broadcaster."));
417
418 layout_status->addWidget(_statusLbl[3], 0, 0);
419 layout_status->addWidget(_statusLbl[0], 0, 1);
420 layout_status->addWidget(_statusLbl[4], 1, 0);
421 layout_status->addWidget(_statusLbl[1], 1, 1);
422 layout_status->addWidget(_statusLbl[5], 0, 2);
423 layout_status->addWidget(_statusLbl[2], 0, 3);
424 _status->setLayout(layout_status);
425
426 // Main Layout
427 // -----------
428 QVBoxLayout* mainLayout = new QVBoxLayout;
429 mainLayout->addWidget(tabs);
430 mainLayout->addWidget(_log);
431 mainLayout->addWidget(_status);
432
433 _canvas->setLayout(mainLayout);
434}
435
436// Destructor
437////////////////////////////////////////////////////////////////////////////
438bnsWindow::~bnsWindow() {
439}
440
441// Close Application gracefully
442////////////////////////////////////////////////////////////////////////////
443void bnsWindow::closeEvent(QCloseEvent* event) {
444
445int iRet = QMessageBox::question(this, "Close", "Save Options?",
446 QMessageBox::Yes, QMessageBox::No,
447 QMessageBox::Cancel);
448
449 if (iRet == QMessageBox::Cancel) {
450 event->ignore();
451 return;
452 }
453 else if (iRet == QMessageBox::Yes) {
454 slotSaveOptions();
455 }
456
457 QMainWindow::closeEvent(event);
458}
459
460// About Message
461////////////////////////////////////////////////////////////////////////////
462void bnsWindow::slotAbout() {
463 new bnsAboutDlg(0);
464}
465
466//Flowchart
467////////////////////////////////////////////////////////////////////////////
468void bnsWindow::slotFlowchart() {
469 new bnsFlowchartDlg(0);
470}
471
472// Help Window
473////////////////////////////////////////////////////////////////////////////
474void bnsWindow::slotHelp() {
475 QUrl url;
476 url.setPath(":bnshelp.html");
477 new bnsHlpDlg(0, url);
478}
479
480// Select Fonts
481////////////////////////////////////////////////////////////////////////////
482void bnsWindow::slotFontSel() {
483 bool ok;
484 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
485 if (ok) {
486 QSettings settings;
487 settings.setValue("font", newFont.toString());
488 QApplication::setFont(newFont);
489 int ww = QFontMetrics(newFont).width('w');
490 setMinimumSize(77*ww, 65*ww);
491 }
492}
493
494// Whats This Help
495////////////////////////////////////////////////////////////////////////////
496void bnsWindow::slotWhatsThis() {
497QWhatsThis::enterWhatsThisMode();
498}
499
500// Create Menus
501////////////////////////////////////////////////////////////////////////////
502void bnsWindow::CreateMenu() {
503 _menuFile = menuBar()->addMenu(tr("&File"));
504 _menuFile->addAction(_actFontSel);
505 _menuFile->addSeparator();
506 _menuFile->addAction(_actSaveOpt);
507 _menuFile->addSeparator();
508 _menuFile->addAction(_actQuit);
509
510 _menuHlp = menuBar()->addMenu(tr("&Help"));
511 _menuHlp->addAction(_actHelp);
512 _menuHlp->addAction(_actFlowchart);
513 _menuHlp->addAction(_actAbout);
514}
515
516// Tool (Command) Bar
517////////////////////////////////////////////////////////////////////////////
518void bnsWindow::AddToolbar() {
519 QToolBar* toolBar = new QToolBar;
520 addToolBar(Qt::BottomToolBarArea, toolBar);
521 toolBar->setMovable(false);
522 toolBar->addAction(_actStart);
523 toolBar->addAction(_actStop);
524 toolBar->addWidget(new QLabel(" "));
525 toolBar->addAction(_actWhatsThis);
526}
527
528// Save Options
529////////////////////////////////////////////////////////////////////////////
530void bnsWindow::slotSaveOptions() {
531 QSettings settings;
532 settings.setValue("proxyHost", _proxyHostLineEdit->text());
533 settings.setValue("proxyPort", _proxyPortLineEdit->text());
534 settings.setValue("logFile", _logFileLineEdit->text());
535 settings.setValue("fileAppend", _fileAppendCheckBox->checkState());
536 settings.setValue("refSys_1", _refSys_1_ComboBox->currentText());
537 settings.setValue("refSys_2", _refSys_2_ComboBox->currentText());
538 settings.setValue("inpEcho", _inpEchoLineEdit->text());
539 settings.setValue("ephHost", _ephHostLineEdit->text());
540 settings.setValue("ephPort", _ephPortLineEdit->text());
541 settings.setValue("ephEcho", _ephEchoLineEdit->text());
542 settings.setValue("clkPort", _clkPortLineEdit->text());
543 settings.setValue("outHost", _outHostLineEdit->text());
544 settings.setValue("outPort", _outPortLineEdit->text());
545 settings.setValue("mountpoint_1", _mountpoint_1_LineEdit->text());
546 settings.setValue("mountpoint_2", _mountpoint_2_LineEdit->text());
547 settings.setValue("outFile_1", _outFile_1_LineEdit->text());
548 settings.setValue("outFile_2", _outFile_2_LineEdit->text());
549 settings.setValue("password", _passwordLineEdit->text());
550 settings.setValue("rnxPath", _rnxPathLineEdit->text());
551 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
552 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
553 settings.setValue("sp3Path", _sp3PathLineEdit->text());
554 settings.setValue("sp3Intr", _sp3IntrComboBox->currentText());
555 settings.setValue("sp3Sampl", _sp3SamplSpinBox->value());
556}
557
558// Display Program Messages
559////////////////////////////////////////////////////////////////////////////
560void bnsWindow::slotMessage(const QByteArray msg) {
561
562 const int maxBufferSize = 10000;
563
564 QString txt = _log->toPlainText() + "\n" +
565 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
566 _log->clear();
567 _log->append(txt.right(maxBufferSize));
568}
569
570// Delete bns
571////////////////////////////////////////////////////////////////////////////
572void bnsWindow::deleteBns() {
573 _actStart->setEnabled(true);
574 _actStop->setEnabled(false);
575 _bns->terminate();
576 _bns->wait(100);
577 delete _bns;
578 _bns = 0;
579}
580
581// Error in bns
582////////////////////////////////////////////////////////////////////////////
583void bnsWindow::slotError(const QByteArray msg) {
584 slotMessage(msg);
585 deleteBns();
586}
587
588// Stop
589////////////////////////////////////////////////////////////////////////////
590void bnsWindow::slotStop() {
591 int iRet = QMessageBox::question(this, "Stop", "Do you want to stop?",
592 QMessageBox::Yes, QMessageBox::No,
593 QMessageBox::NoButton);
594 if (iRet == QMessageBox::Yes) {
595 deleteBns();
596 }
597}
598
599// Start
600////////////////////////////////////////////////////////////////////////////
601void bnsWindow::slotStart() {
602 slotSaveOptions();
603
604 _actStart->setEnabled(false);
605 _actStop->setEnabled(true);
606
607 _bns = new t_bns(0);
608
609 connect(_bns, SIGNAL(newMessage(QByteArray)),
610 this, SLOT(slotMessage(const QByteArray)));
611
612 connect(_bns, SIGNAL(error(QByteArray)),
613 this, SLOT(slotError(const QByteArray)));
614
615 connect(_bns, SIGNAL(newEphBytes(int)), this, SLOT(slotEphBytes(int)));
616 connect(_bns, SIGNAL(newClkBytes(int)), this, SLOT(slotClkBytes(int)));
617 connect(_bns, SIGNAL(newOutBytes(int)), this, SLOT(slotOutBytes(int)));
618
619 _bns->start();
620}
621
622// Input and output bytes statistics
623////////////////////////////////////////////////////////////////////////////
624void bnsWindow::slotEphBytes(int nBytes) {
625 updateStatus(0, nBytes);
626}
627void bnsWindow::slotClkBytes(int nBytes) {
628 updateStatus(1, nBytes);
629}
630void bnsWindow::slotOutBytes(int nBytes) {
631 updateStatus(2, nBytes);
632}
633
634void bnsWindow::updateStatus(int ii, int nBytes) {
635 QMutexLocker locker(&_mutex);
636
637 _statusCnt[ii] += nBytes;
638
639 if (_statusCnt[ii] < 1e3) {
640 _statusLbl[ii]->setText(QString("%1 byte(s)").arg((int)_statusCnt[ii]));
641 }
642 else if (_statusCnt[ii] < 1e6) {
643 _statusLbl[ii]->setText(QString("%1 kb").arg(_statusCnt[ii]/1.e3, 5));
644 }
645 else {
646 _statusLbl[ii]->setText(QString("%1 Mb").arg(_statusCnt[ii]/1.e6, 5));
647 }
648}
Note: See TracBrowser for help on using the repository browser.