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

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

* empty log message *

File size: 14.7 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 "bncnetquery.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,AUTO").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, const QByteArray& ntripVersion,
153 QStringList& allLines, 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 bncNetQuery 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 _ntripVersionComboBox->currentText().toAscii(),
202 _allLines) != success ) {
203 QMessageBox::warning(0, "BNC", "Cannot retrieve table of data");
204 _buttonGet->setEnabled(true);
205 return;
206 }
207
208 QStringList lines;
209 QStringListIterator it(_allLines);
210 while (it.hasNext()) {
211 QString line = it.next();
212 if (line.indexOf("STR") == 0) {
213 lines.push_back(line);
214 }
215 }
216
217 static const QStringList labels = QString("mountpoint,identifier,format,"
218 "format-details,carrier,system,network,country,latitude,longitude,"
219 "nmea,solution,generator,compress.,authentic.,fee,bitrate,"
220 "misc").split(",");
221
222 if (lines.size() > 0) {
223 _table->setSelectionMode(QAbstractItemView::ExtendedSelection);
224 _table->setSelectionBehavior(QAbstractItemView::SelectRows);
225
226 QStringList hlp = lines[0].split(";");
227 _table->setColumnCount(hlp.size()-1);
228 _table->setRowCount(lines.size());
229
230 QListIterator<QString> it(lines);
231 int nRow = -1;
232 while (it.hasNext()) {
233 QStringList columns = it.next().split(";");
234 ++nRow;
235 for (int ic = 0; ic < columns.size()-1; ic++) {
236
237 if (ic+1 == 11) { if (columns[ic+1] == "0") { columns[ic+1] = "no"; } else { columns[ic+1] = "yes"; }}
238
239 QTableWidgetItem* it = new QTableWidgetItem(columns[ic+1]);
240 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
241 _table->setItem(nRow, ic, it);
242 }
243 }
244 _table->sortItems(0);
245 _table->setHorizontalHeaderLabels(labels);
246 _table->setSortingEnabled(true);
247
248 int ww = QFontMetrics(this->font()).width('w');
249 _table->horizontalHeader()->resizeSection(0,10*ww);
250 _table->horizontalHeader()->resizeSection(2,8*ww);
251 _table->horizontalHeader()->resizeSection(3,15*ww);
252 _table->horizontalHeader()->resizeSection(4,8*ww);
253 _table->horizontalHeader()->resizeSection(5,8*ww);
254 _table->horizontalHeader()->resizeSection(6,8*ww);
255 _table->horizontalHeader()->resizeSection(7,8*ww);
256 _table->horizontalHeader()->resizeSection(8,8*ww);
257 _table->horizontalHeader()->resizeSection(9,8*ww);
258 _table->horizontalHeader()->resizeSection(10,8*ww);
259 _table->horizontalHeader()->resizeSection(11,8*ww);
260 _table->horizontalHeader()->resizeSection(12,15*ww);
261 _table->horizontalHeader()->resizeSection(13,8*ww);
262 _table->horizontalHeader()->resizeSection(14,8*ww);
263 _table->horizontalHeader()->resizeSection(15,8*ww);
264 _table->horizontalHeader()->resizeSection(16,8*ww);
265 _table->horizontalHeader()->resizeSection(17,15*ww);
266 }
267}
268
269// Accept slot
270////////////////////////////////////////////////////////////////////////////
271void bncTableDlg::accept() {
272
273 QSettings settings;
274 settings.setValue("casterHost", _casterHostLineEdit->currentText());
275 QStringList casterHostList;
276 for (int ii = 0; ii < _casterHostLineEdit->count(); ii++) {
277 casterHostList.push_back(_casterHostLineEdit->itemText(ii));
278 }
279 settings.setValue("casterHostList", casterHostList);
280 settings.setValue("casterPort", _casterPortLineEdit->text());
281 settings.setValue("ntripVersion", _ntripVersionComboBox->currentText());
282 settings.setValue("casterUser", _casterUserLineEdit->text());
283 settings.setValue("casterPassword", _casterPasswordLineEdit->text());
284
285 QStringList* mountPoints = new QStringList;
286
287 if (_table) {
288 for (int ir = 0; ir < _table->rowCount(); ir++) {
289 QTableWidgetItem* item = _table->item(ir,0);
290 QString format = _table->item(ir,2)->text();
291 QString latitude = _table->item(ir,8)->text();
292 QString longitude = _table->item(ir,9)->text();
293 QString nmea = _table->item(ir,10)->text();
294 QString ntripVersion = _ntripVersionComboBox->currentText();
295 format.replace(" ", "_");
296 if (_table->isItemSelected(item)) {
297 QUrl url;
298 url.setUserName(QUrl::toPercentEncoding(_casterUserLineEdit->text()));
299 url.setPassword(QUrl::toPercentEncoding(_casterPasswordLineEdit->text()));
300 url.setHost(_casterHostLineEdit->currentText());
301 url.setPort(_casterPortLineEdit->text().toInt());
302 url.setPath(item->text());
303
304 mountPoints->push_back(url.toString() + " " + format + " " + latitude
305 + " " + longitude + " " + nmea + " " + ntripVersion);
306 }
307 }
308 }
309 emit newMountPoints(mountPoints);
310
311 QDialog::accept();
312}
313
314// User changed the selection of mountPoints
315////////////////////////////////////////////////////////////////////////////
316void bncTableDlg::slotSelectionChanged() {
317 if (_table->selectedItems().isEmpty()) {
318 }
319}
320
321// Create RINEX skeleton header
322////////////////////////////////////////////////////////////////////////////
323void bncTableDlg::slotSkl() {
324
325 int nRows = _table->rowCount();
326 for (int iRow = 0; iRow < nRows; iRow++) {
327 if (_table->isItemSelected(_table->item(iRow,1))) {
328 QString staID = _table->item(iRow,0)->text();
329 QString net = _table->item(iRow,6)->text();
330
331 QString ftpDir;
332 QStringListIterator it(_allLines);
333 while (it.hasNext()) {
334 QString line = it.next();
335 if (line.indexOf("NET") == 0) {
336 QStringList tags = line.split(';');
337 if (tags.at(1) == net) {
338 ftpDir = tags.at(6);
339 break;
340 }
341 }
342 }
343
344 if (!ftpDir.isEmpty()) {
345 QUrl url(ftpDir);
346 QMessageBox::warning(0, "Warning", url.host() + "\n" + url.path() +
347 "\nnot yet implemented");
348 }
349 }
350 }
351}
352
353// Whats This Help
354void bncTableDlg::slotWhatsThis() {
355QWhatsThis::enterWhatsThisMode();
356}
357
358
Note: See TracBrowser for help on using the repository browser.