source: ntrip/trunk/BNC/bnctabledlg.cpp@ 1387

Last change on this file since 1387 was 1387, checked in by mervart, 15 years ago

* empty log message *

File size: 14.6 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncTableDlg
30 *
31 * Purpose: Displays the source table, allows mountpoints selection
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include "bnctabledlg.h"
44#include "bncgetthread.h"
45#include "bncnetqueryv2.h"
46
47using namespace std;
48
49// Constructor
50////////////////////////////////////////////////////////////////////////////
51bncTableDlg::bncTableDlg(QWidget* parent) : QDialog(parent) {
52
53 setMinimumSize(600,400);
54 setWindowTitle(tr("Add Mountpoints"));
55
56 QVBoxLayout* mainLayout = new QVBoxLayout(this);
57
58 QSettings settings;
59 _casterHostLineEdit = new QComboBox();
60 _casterHostLineEdit->setDuplicatesEnabled(false);
61 _casterHostLineEdit->setEditable(true);
62 int ww = QFontMetrics(_casterHostLineEdit->font()).width('w');
63 _casterHostLineEdit->setMaximumWidth(20*ww);
64 QStringList casterHostList = settings.value("casterHostList").toStringList();
65 _casterHostLineEdit->addItem(settings.value("casterHost").toString());
66 for (int ii = 0; ii < casterHostList.count(); ii++) {
67 QString item = casterHostList[ii];
68 if (_casterHostLineEdit->findText(item, Qt::MatchFixedString) < 0) {
69 _casterHostLineEdit->addItem(item);
70 }
71 }
72 _casterPortLineEdit = new QLineEdit(settings.value("casterPort").toString());
73 _casterPortLineEdit->setMaximumWidth(9*ww);
74 _casterUserLineEdit = new QLineEdit(settings.value("casterUser").toString());
75 _casterUserLineEdit->setMaximumWidth(9*ww);
76 _casterPasswordLineEdit = new QLineEdit(settings.value("casterPassword").toString());
77 _casterPasswordLineEdit->setMaximumWidth(9*ww);
78 _casterPasswordLineEdit->setEchoMode(QLineEdit::Password);
79
80 _ntripVersionComboBox = new QComboBox();
81 _ntripVersionComboBox->addItems(QString("1,2").split(","));
82 int kk = _ntripVersionComboBox->findText(settings.value("ntripVersion").toString());
83 if (kk != -1) {
84 _ntripVersionComboBox->setCurrentIndex(kk);
85 }
86
87 // WhatsThis
88 // ---------
89 _casterUserLineEdit->setWhatsThis(tr("Access to some streams on NTRIP broadcasters may be restricted. You'll need to enter a valid 'User ID' and 'Password' for access to these protected streams. Accounts are usually provided per NTRIP broadcaster through a registration process. Register through <u>http://igs.bkg.bund.de/index_ntrip_reg.htm</u> for access to protected streams on <u>www.euref-ip.net</u> and <u>www.igs-ip.net</u>."));
90 _casterPortLineEdit->setWhatsThis(tr("Enter the NTRIP broadcaster hostname or IP number and port number. <u>http://www.rtcm-ntrip.org/home</u> provides information about known NTRIP broadcaster installations. Note that EUREF and IGS operate NTRIP broadcasters at <u>http://www.euref-ip.net/home</u> and <u>http://www.igs-ip.net/home</u>."));
91 _casterHostLineEdit->setWhatsThis(tr("Enter the NTRIP broadcaster hostname or IP number and port number. <u>http://www.rtcm-ntrip.org/home</u> provides information about known NTRIP broadcaster installations. Note that EUREF and IGS operate NTRIP broadcasters at <u>http://www.euref-ip.net/home</u> and <u>http://www.igs-ip.net/home</u>."));
92 _casterPasswordLineEdit->setWhatsThis(tr("Access to some streams on NTRIP broadcasters may be restricted. You'll need to enter a valid 'User ID' and 'Password' for access to these protected streams. Accounts are usually provided per NTRIP broadcaster through a registration procedure. Register through <u>http://igs.bkg.bund.de/index_ntrip_reg.htm</u> for access to protected streams on <u>www.euref-ip.net</u> and <u>www.igs-ip.net</u>."));
93
94 QGridLayout* editLayout = new QGridLayout;
95 editLayout->addWidget(new QLabel(tr("Caster host")), 0, 0);
96 editLayout->addWidget(_casterHostLineEdit, 0, 1);
97 editLayout->addWidget(new QLabel(tr("Caster port")), 0, 2);
98 editLayout->addWidget(_casterPortLineEdit, 0, 3);
99 editLayout->addWidget(new QLabel(tr("NTRIP Version")), 0, 4);
100 editLayout->addWidget(_ntripVersionComboBox, 0, 5);
101 editLayout->addWidget(new QLabel(tr("User")), 1, 0);
102 editLayout->addWidget(_casterUserLineEdit, 1, 1);
103 editLayout->addWidget(new QLabel(tr("Password")), 1, 2);
104 editLayout->addWidget(_casterPasswordLineEdit, 1, 3);
105
106 mainLayout->addLayout(editLayout);
107
108 _table = new QTableWidget(this);
109 _table->setWhatsThis(tr("<p>Use the 'Get Table' button to download the sourcetable from the NTRIP broadcaster. Select the desired streams line by line, using +Shift and +Ctrl when necessary. Hit 'OK' to return to the main window.</p><p>Pay attention to data fields 'format' and 'format-details'. Keep in mind that BNC can only decode and convert streams that come in RTCM Version 2.x, RTCM Version 3.x, or RTIGS format. RTCM Version 2.x streams must contain message Type 18 and 19 or 20 and 21 while RTCM Version 3.x streams must contain GPS or SBAS message Type 1002 or 1004 and may contain GLONASS message types 1010 or 1012. See data field 'format-details' for available message types and their repetition rates in brackets.</p><p>Note that in order to produce RINEX Navigation files, RTCM Version 3.x streams containing message Type 1019 (GPS) and 1020 (GLONASS) or RTIGS streams are required.</p><p>Search for RTCM Version 3.x streams containing (premature) message Types 4056 and 4057 if you need corrections to Broadcast Ephemeris.</p><p>The content of data field 'nmea' tells you whether a stream retrieval needs to be initiated by BNC by sending an NMEA-GGA message containing the user (or virtual reference station)'s coordinate.</p>"));
110 connect(_table, SIGNAL(itemSelectionChanged()),
111 this, SLOT(slotSelectionChanged()));
112 mainLayout->addWidget(_table);
113
114 _buttonWhatsThis = new QPushButton(tr("Help=Shift+F1"), this);
115 connect(_buttonWhatsThis, SIGNAL(clicked()), this, SLOT(slotWhatsThis()));
116
117 _buttonGet = new QPushButton(tr("Get table"), this);
118 _buttonGet->setDefault(true);
119 connect(_buttonGet, SIGNAL(clicked()), this, SLOT(slotGetTable()));
120
121 _buttonCancel = new QPushButton(tr("Cancel"), this);
122 connect(_buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
123
124 _buttonOK = new QPushButton(tr("OK"), this);
125 connect(_buttonOK, SIGNAL(clicked()), this, SLOT(accept()));
126
127 QHBoxLayout* buttonLayout = new QHBoxLayout;
128 buttonLayout->addWidget(_buttonWhatsThis);
129 buttonLayout->addStretch(1);
130 buttonLayout->addWidget(_buttonGet);
131 buttonLayout->addWidget(_buttonCancel);
132 buttonLayout->addWidget(_buttonOK);
133
134 mainLayout->addLayout(buttonLayout);
135}
136
137// Destructor
138////////////////////////////////////////////////////////////////////////////
139bncTableDlg::~bncTableDlg() {
140 if (_table) {
141 for (int ir = 0; ir < _table->rowCount(); ir++) {
142 for (int ic = 0; ic < _table->columnCount(); ic++) {
143 delete _table->item(ir,ic);
144 }
145 }
146 }
147}
148
149// Read Table the caster (static)
150////////////////////////////////////////////////////////////////////////////
151t_irc bncTableDlg::getFullTable(const QString& casterHost,
152 int casterPort, QStringList& allLines,
153 bool alwaysRead) {
154
155 static QMutex mutex;
156 static QMap<QString, QStringList> allTables;
157
158 QMutexLocker locker(&mutex);
159
160 if (!alwaysRead && allTables.find(casterHost) != allTables.end()) {
161 allLines = allTables.find(casterHost).value();
162 return success;
163 }
164
165 allLines.clear();
166
167 QUrl url;
168 url.setHost(casterHost);
169 url.setPort(casterPort);
170 url.setScheme("http");
171 url.setPath("/");
172
173 bncNetQueryV2 query;
174 QByteArray outData;
175 query.waitForRequestResult(url, outData);
176 if (query.status() == bncNetQuery::finished) {
177 QTextStream in(outData);
178 QString line = in.readLine();
179 while ( !line.isNull() ) {
180 allLines.append(line);
181 line = in.readLine();
182 }
183 allTables.insert(casterHost, allLines);
184 return success;
185 }
186 else {
187 return failure;
188 }
189}
190
191// Read Table from Caster
192////////////////////////////////////////////////////////////////////////////
193void bncTableDlg::slotGetTable() {
194
195 _buttonGet->setEnabled(false);
196
197 _allLines.clear();
198
199 if ( getFullTable(_casterHostLineEdit->currentText(),
200 _casterPortLineEdit->text().toInt(),
201 _allLines) != success ) {
202 QMessageBox::warning(0, "BNC", "Cannot retrieve table of data");
203 _buttonGet->setEnabled(true);
204 return;
205 }
206
207 QStringList lines;
208 QStringListIterator it(_allLines);
209 while (it.hasNext()) {
210 QString line = it.next();
211 if (line.indexOf("STR") == 0) {
212 lines.push_back(line);
213 }
214 }
215
216 static const QStringList labels = QString("mountpoint,identifier,format,"
217 "format-details,carrier,system,network,country,latitude,longitude,"
218 "nmea,solution,generator,compress.,authentic.,fee,bitrate,"
219 "misc").split(",");
220
221 if (lines.size() > 0) {
222 _table->setSelectionMode(QAbstractItemView::ExtendedSelection);
223 _table->setSelectionBehavior(QAbstractItemView::SelectRows);
224
225 QStringList hlp = lines[0].split(";");
226 _table->setColumnCount(hlp.size()-1);
227 _table->setRowCount(lines.size());
228
229 QListIterator<QString> it(lines);
230 int nRow = -1;
231 while (it.hasNext()) {
232 QStringList columns = it.next().split(";");
233 ++nRow;
234 for (int ic = 0; ic < columns.size()-1; ic++) {
235
236 if (ic+1 == 11) { if (columns[ic+1] == "0") { columns[ic+1] = "no"; } else { columns[ic+1] = "yes"; }}
237
238 QTableWidgetItem* it = new QTableWidgetItem(columns[ic+1]);
239 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
240 _table->setItem(nRow, ic, it);
241 }
242 }
243 _table->sortItems(0);
244 _table->setHorizontalHeaderLabels(labels);
245 _table->setSortingEnabled(true);
246
247 int ww = QFontMetrics(this->font()).width('w');
248 _table->horizontalHeader()->resizeSection(0,10*ww);
249 _table->horizontalHeader()->resizeSection(2,8*ww);
250 _table->horizontalHeader()->resizeSection(3,15*ww);
251 _table->horizontalHeader()->resizeSection(4,8*ww);
252 _table->horizontalHeader()->resizeSection(5,8*ww);
253 _table->horizontalHeader()->resizeSection(6,8*ww);
254 _table->horizontalHeader()->resizeSection(7,8*ww);
255 _table->horizontalHeader()->resizeSection(8,8*ww);
256 _table->horizontalHeader()->resizeSection(9,8*ww);
257 _table->horizontalHeader()->resizeSection(10,8*ww);
258 _table->horizontalHeader()->resizeSection(11,8*ww);
259 _table->horizontalHeader()->resizeSection(12,15*ww);
260 _table->horizontalHeader()->resizeSection(13,8*ww);
261 _table->horizontalHeader()->resizeSection(14,8*ww);
262 _table->horizontalHeader()->resizeSection(15,8*ww);
263 _table->horizontalHeader()->resizeSection(16,8*ww);
264 _table->horizontalHeader()->resizeSection(17,15*ww);
265 }
266}
267
268// Accept slot
269////////////////////////////////////////////////////////////////////////////
270void bncTableDlg::accept() {
271
272 QSettings settings;
273 settings.setValue("casterHost", _casterHostLineEdit->currentText());
274 QStringList casterHostList;
275 for (int ii = 0; ii < _casterHostLineEdit->count(); ii++) {
276 casterHostList.push_back(_casterHostLineEdit->itemText(ii));
277 }
278 settings.setValue("casterHostList", casterHostList);
279 settings.setValue("casterPort", _casterPortLineEdit->text());
280 settings.setValue("ntripVersion", _ntripVersionComboBox->currentText());
281 settings.setValue("casterUser", _casterUserLineEdit->text());
282 settings.setValue("casterPassword", _casterPasswordLineEdit->text());
283
284 QStringList* mountPoints = new QStringList;
285
286 if (_table) {
287 for (int ir = 0; ir < _table->rowCount(); ir++) {
288 QTableWidgetItem* item = _table->item(ir,0);
289 QString format = _table->item(ir,2)->text();
290 QString latitude = _table->item(ir,8)->text();
291 QString longitude = _table->item(ir,9)->text();
292 QString nmea = _table->item(ir,10)->text();
293 QString ntripVersion = _ntripVersionComboBox->currentText();
294 format.replace(" ", "_");
295 if (_table->isItemSelected(item)) {
296 QUrl url;
297 url.setUserName(QUrl::toPercentEncoding(_casterUserLineEdit->text()));
298 url.setPassword(QUrl::toPercentEncoding(_casterPasswordLineEdit->text()));
299 url.setHost(_casterHostLineEdit->currentText());
300 url.setPort(_casterPortLineEdit->text().toInt());
301 url.setPath(item->text());
302
303 mountPoints->push_back(url.toString() + " " + format + " " + latitude
304 + " " + longitude + " " + nmea + " " + ntripVersion);
305 }
306 }
307 }
308 emit newMountPoints(mountPoints);
309
310 QDialog::accept();
311}
312
313// User changed the selection of mountPoints
314////////////////////////////////////////////////////////////////////////////
315void bncTableDlg::slotSelectionChanged() {
316 if (_table->selectedItems().isEmpty()) {
317 }
318}
319
320// Create RINEX skeleton header
321////////////////////////////////////////////////////////////////////////////
322void bncTableDlg::slotSkl() {
323
324 int nRows = _table->rowCount();
325 for (int iRow = 0; iRow < nRows; iRow++) {
326 if (_table->isItemSelected(_table->item(iRow,1))) {
327 QString staID = _table->item(iRow,0)->text();
328 QString net = _table->item(iRow,6)->text();
329
330 QString ftpDir;
331 QStringListIterator it(_allLines);
332 while (it.hasNext()) {
333 QString line = it.next();
334 if (line.indexOf("NET") == 0) {
335 QStringList tags = line.split(';');
336 if (tags.at(1) == net) {
337 ftpDir = tags.at(6);
338 break;
339 }
340 }
341 }
342
343 if (!ftpDir.isEmpty()) {
344 QUrl url(ftpDir);
345 QMessageBox::warning(0, "Warning", url.host() + "\n" + url.path() +
346 "\nnot yet implemented");
347 }
348 }
349 }
350}
351
352// Whats This Help
353void bncTableDlg::slotWhatsThis() {
354QWhatsThis::enterWhatsThisMode();
355}
356
357
Note: See TracBrowser for help on using the repository browser.