source: ntrip/trunk/BNC/src/bnccore.cpp@ 9213

Last change on this file since 9213 was 9213, checked in by stuerze, 3 years ago

minor changes

File size: 23.9 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: t_bncCore
30 *
31 * Purpose: This class implements the main application
32 *
33 * Author: L. Mervart
34 *
35 * Created: 29-Aug-2006
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42#include <sstream>
43#include <QMessageBox>
44#include <cmath>
45
46#include "bnccore.h"
47#include "bncutils.h"
48#include "bncrinex.h"
49#include "bncsettings.h"
50#include "bncversion.h"
51#include "ephemeris.h"
52#include "rinex/rnxobsfile.h"
53#include "rinex/rnxnavfile.h"
54#include "pppMain.h"
55#include "combination/bnccomb.h"
56
57using namespace std;
58
59// Singleton
60////////////////////////////////////////////////////////////////////////////
61t_bncCore* t_bncCore::instance() {
62 static t_bncCore _bncCore;
63 return &_bncCore;
64}
65
66// Constructor
67////////////////////////////////////////////////////////////////////////////
68t_bncCore::t_bncCore() : _ephUser(false) {
69 _GUIenabled = true;
70 _logFileFlag = 0;
71 _logFile = 0;
72 _logStream = 0;
73 _rawFile = 0;
74 _caster = 0;
75 _bncComb = 0;
76
77 // Eph file(s)
78 // -----------
79 _rinexVers = 0;
80 _ephFileGPS = 0;
81 _ephStreamGPS = 0;
82 _ephFileGlonass = 0;
83 _ephStreamGlonass = 0;
84 _ephFileGalileo = 0;
85 _ephStreamGalileo = 0;
86 _ephFileSBAS = 0;
87 _ephStreamSBAS = 0;
88
89 _portEph = 0;
90 _serverEph = 0;
91 _socketsEph = 0;
92
93 _portCorr = 0;
94 _serverCorr = 0;
95 _socketsCorr = 0;
96
97 _pgmName = QString(BNCPGMNAME).leftJustified(20, ' ', true);
98#ifdef WIN32
99 _userName = QString("${USERNAME}");
100#else
101 _userName = QString("${USER}");
102#endif
103 expandEnvVar(_userName);
104
105 _userName = _userName.leftJustified(20, ' ', true);
106 _dateAndTimeGPS = 0;
107 _mainWindow = 0;
108
109 _pppMain = new BNC_PPP::t_pppMain();
110 qRegisterMetaType< QVector<double> > ("QVector<double>");
111 qRegisterMetaType<bncTime> ("bncTime");
112 qRegisterMetaType<t_ephGPS> ("t_ephGPS");
113 qRegisterMetaType<t_ephGlo> ("t_ephGlo");
114 qRegisterMetaType<t_ephGal> ("t_ephGal");
115 qRegisterMetaType<t_ephSBAS> ("t_ephSBAS");
116 qRegisterMetaType<t_ephBDS> ("t_ephBDS");
117 qRegisterMetaType<QList<t_orbCorr> > ("QList<t_orbCorr>");
118 qRegisterMetaType<QList<t_clkCorr> > ("QList<t_clkCorr>");
119 qRegisterMetaType<QList<t_satCodeBias> > ("QList<t_satCodeBias>");
120 qRegisterMetaType<QList<t_satPhaseBias> > ("QList<t_satPhaseBias>");
121 qRegisterMetaType<t_vTec> ("t_vTec");
122}
123
124// Destructor
125////////////////////////////////////////////////////////////////////////////
126t_bncCore::~t_bncCore() {
127 delete _logStream;
128 delete _logFile;
129 delete _ephStreamGPS;
130 delete _ephFileGPS;
131 delete _serverEph;
132 delete _socketsEph;
133 delete _serverCorr;
134 delete _socketsCorr;
135 if (_rinexVers == 2) {
136 delete _ephStreamGlonass;
137 delete _ephFileGlonass;
138 }
139
140 delete _dateAndTimeGPS;
141 delete _rawFile;
142 delete _bncComb;
143 delete _pppMain;
144}
145
146// Write a Program Message
147////////////////////////////////////////////////////////////////////////////
148void t_bncCore::slotMessage(QByteArray msg, bool showOnScreen) {
149
150 QMutexLocker locker(&_mutexMessage);
151
152 messagePrivate(msg);
153 emit newMessage(msg, showOnScreen);
154}
155
156// Write a Program Message (private, no lock)
157////////////////////////////////////////////////////////////////////////////
158void t_bncCore::messagePrivate(const QByteArray& msg) {
159
160 // First time resolve the log file name
161 // ------------------------------------
162 QDate currDate = currentDateAndTimeGPS().date();
163 if (_logFileFlag == 0 || _fileDate != currDate) {
164 delete _logStream; _logStream = 0;
165 delete _logFile; _logFile = 0;
166 _logFileFlag = 1;
167 bncSettings settings;
168 QString logFileName = settings.value("logFile").toString();
169 if ( !logFileName.isEmpty() ) {
170 expandEnvVar(logFileName);
171 _logFile = new QFile(logFileName + "_" +
172 currDate.toString("yyMMdd").toLatin1().data());
173 _fileDate = currDate;
174 if ( Qt::CheckState(settings.value("rnxAppend").toInt()) == Qt::Checked) {
175 _logFile->open(QIODevice::WriteOnly | QIODevice::Append);
176 }
177 else {
178 _logFile->open(QIODevice::WriteOnly);
179 }
180 _logStream = new QTextStream();
181 _logStream->setDevice(_logFile);
182 }
183 }
184
185 if (_logStream) {
186 QByteArray msgLocal = msg;
187 if (msg.indexOf('\n') == 0) {
188 *_logStream << endl;
189 msgLocal = msg.mid(1);
190 }
191 *_logStream << currentDateAndTimeGPS().toString("yy-MM-dd hh:mm:ss ").toLatin1().data();
192 *_logStream << msgLocal.data() << endl;
193 _logStream->flush();
194 _logFile->flush();
195 }
196}
197
198//
199////////////////////////////////////////////////////////////////////////////
200t_irc t_bncCore::checkPrintEph(t_eph* eph) {
201 QMutexLocker locker(&_mutex);
202 t_irc ircPut = _ephUser.putNewEph(eph, true);
203 if (eph->checkState() == t_eph::bad) {
204 messagePrivate(QString("WRONG EPHEMERIS %1 received from %2 (%4)")
205 .arg(eph->prn().toString().c_str()).arg(eph->receptStaID())
206 .arg(eph->rinexDateStr(eph->TOC(), eph->prn(), 3.0)).toLatin1());
207 return failure;
208 }
209 else if (eph->checkState() == t_eph::outdated) {
210 messagePrivate(QString("OUTDATED EPHEMERIS %1 received from %2 (%4)")
211 .arg(eph->prn().toString().c_str()).arg(eph->receptStaID())
212 .arg(eph->rinexDateStr(eph->TOC(), eph->prn(), 3.0)).toLatin1());
213 return failure;
214 }
215 else if (eph->checkState() == t_eph::unhealthy) {
216 messagePrivate(QString("UNHEALTHY EPHEMERIS %1 received from %2 (%4)")
217 .arg(eph->prn().toString().c_str()).arg(eph->receptStaID())
218 .arg(eph->rinexDateStr(eph->TOC(), eph->prn(), 3.0)).toLatin1());
219 }
220 printEphHeader();
221 printEph(*eph, (ircPut == success));
222 return success;
223}
224
225// New GPS Ephemeris
226////////////////////////////////////////////////////////////////////////////
227void t_bncCore::slotNewGPSEph(t_ephGPS eph) {
228 if (checkPrintEph(&eph) == success) {
229 emit newGPSEph(eph);
230 }
231}
232
233// New Glonass Ephemeris
234////////////////////////////////////////////////////////////////////////////
235void t_bncCore::slotNewGlonassEph(t_ephGlo eph) {
236 if (checkPrintEph(&eph) == success) {
237 emit newGlonassEph(eph);
238 }
239}
240
241// New Galileo Ephemeris
242////////////////////////////////////////////////////////////////////////////
243void t_bncCore::slotNewGalileoEph(t_ephGal eph) {
244 if (checkPrintEph(&eph) == success) {
245 emit newGalileoEph(eph);
246 }
247}
248
249// New SBAS Ephemeris
250////////////////////////////////////////////////////////////////////////////
251void t_bncCore::slotNewSBASEph(t_ephSBAS eph) {
252 if (checkPrintEph(&eph) == success) {
253 emit newSBASEph(eph);
254 }
255}
256
257// New BDS Ephemeris
258////////////////////////////////////////////////////////////////////////////
259void t_bncCore::slotNewBDSEph(t_ephBDS eph) {
260 if (checkPrintEph(&eph) == success) {
261 emit newBDSEph(eph);
262 }
263}
264
265// Print Header of the output File(s)
266////////////////////////////////////////////////////////////////////////////
267void t_bncCore::printEphHeader() {
268
269 bncSettings settings;
270 QStringList comments;
271
272 QListIterator<QString> it(settings.value("mountPoints").toStringList());
273 while (it.hasNext()) {
274 QStringList hlp = it.next().split(" ");
275 if (hlp.size() < 7)
276 continue;
277 QUrl url(hlp[0]);
278 QString decoder = hlp[1];
279 comments.append("Source: " + decoder +
280 " " + QUrl::toAce(url.host()) +
281 "/" + url.path().mid(1).toLatin1());
282 }
283
284 // Initialization
285 // --------------
286 if (_rinexVers == 0) {
287
288 if ( Qt::CheckState(settings.value("ephV2").toInt()) == Qt::Checked) {
289 _rinexVers = 2;
290 }
291 else {
292 _rinexVers = 3;
293 }
294
295 _ephPath = settings.value("ephPath").toString();
296
297 if ( !_ephPath.isEmpty() ) {
298 if ( _ephPath[_ephPath.length()-1] != QDir::separator() ) {
299 _ephPath += QDir::separator();
300 }
301 expandEnvVar(_ephPath);
302 }
303 }
304
305 // (Re-)Open output File(s)
306 // ------------------------
307 if (!_ephPath.isEmpty()) {
308
309 QDateTime datTim = currentDateAndTimeGPS();
310
311 QString ephFileNameGPS = _ephPath + "BRDC";
312
313 bool ephV2 = (_rinexVers == 2)? true : false;
314
315 QString hlpStr = bncRinex::nextEpochStr(datTim,
316 settings.value("ephIntr").toString(), ephV2);
317
318 if (_rinexVers == 3) {
319 QString country = "WRD"; // WORLD
320 QString monNum = "0";
321 QString recNum = "0";
322 ephFileNameGPS += QString("%1").arg(monNum, 1, 10) +
323 QString("%1").arg(recNum, 1, 10) +
324 country +
325 "_S_" + // stream
326 QString("%1").arg(datTim.date().year()) +
327 QString("%1").arg(datTim.date().dayOfYear(), 3, 10, QChar('0')) +
328 hlpStr + // HM_period
329 "_MN.rnx"; // mixed BRDC
330 }
331 else { // RNX v2.11
332 ephFileNameGPS += QString("%1").arg(datTim.date().dayOfYear(), 3, 10, QChar('0')) +
333 hlpStr + datTim.toString(".yyN");
334 }
335
336 if (_ephFileNameGPS == ephFileNameGPS) {
337 return;
338 }
339 else {
340 _ephFileNameGPS = ephFileNameGPS;
341 }
342
343 delete _ephStreamGPS;
344 delete _ephFileGPS;
345
346 QFlags<QIODevice::OpenModeFlag> appendFlagGPS;
347 QFlags<QIODevice::OpenModeFlag> appendFlagGlonass;
348
349 if ( Qt::CheckState(settings.value("rnxAppend").toInt()) == Qt::Checked &&
350 QFile::exists(ephFileNameGPS) ) {
351 appendFlagGPS = QIODevice::Append;
352 }
353
354 _ephFileGPS = new QFile(ephFileNameGPS);
355 _ephFileGPS->open(QIODevice::WriteOnly | appendFlagGPS);
356 _ephStreamGPS = new QTextStream();
357 _ephStreamGPS->setDevice(_ephFileGPS);
358
359 if (_rinexVers == 3) {
360 _ephFileGlonass = _ephFileGPS;
361 _ephStreamGlonass = _ephStreamGPS;
362 _ephFileGalileo = _ephFileGPS;
363 _ephStreamGalileo = _ephStreamGPS;
364 _ephFileSBAS = _ephFileGPS;
365 _ephStreamSBAS = _ephStreamGPS;
366 }
367 else if (_rinexVers == 2) {
368 QString ephFileNameGlonass = _ephPath + "BRDC" +
369 QString("%1").arg(datTim.date().dayOfYear(), 3, 10, QChar('0')) +
370 hlpStr + datTim.toString(".yyG");
371
372 delete _ephStreamGlonass;
373 delete _ephFileGlonass;
374
375 if ( Qt::CheckState(settings.value("rnxAppend").toInt()) == Qt::Checked &&
376 QFile::exists(ephFileNameGlonass) ) {
377 appendFlagGlonass = QIODevice::Append;
378 }
379
380 _ephFileGlonass = new QFile(ephFileNameGlonass);
381 _ephFileGlonass->open(QIODevice::WriteOnly | appendFlagGlonass);
382 _ephStreamGlonass = new QTextStream();
383 _ephStreamGlonass->setDevice(_ephFileGlonass);
384 }
385
386 // Header - RINEX Version 3
387 // ------------------------
388 if (_rinexVers == 3) {
389 if ( ! (appendFlagGPS & QIODevice::Append)) {
390 QString line;
391 line.sprintf(
392 "%9.2f%11sN: GNSS NAV DATA M: Mixed%12sRINEX VERSION / TYPE\n",
393 defaultRnxNavVersion3, "", "");
394 *_ephStreamGPS << line;
395
396 QString hlp = currentDateAndTimeGPS().toString("yyyyMMdd hhmmss UTC").leftJustified(20, ' ', true);
397 *_ephStreamGPS << _pgmName.toLatin1().data()
398 << _userName.toLatin1().data()
399 << hlp.toLatin1().data()
400 << "PGM / RUN BY / DATE" << endl;
401
402 QStringListIterator it(comments);
403 while (it.hasNext()) {
404 *_ephStreamGPS << it.next().trimmed().left(60).leftJustified(60) << "COMMENT\n";
405 }
406
407 line.sprintf("%60sEND OF HEADER\n", "");
408 *_ephStreamGPS << line;
409
410 _ephStreamGPS->flush();
411 }
412 }
413
414 // Headers - RINEX Version 2
415 // -------------------------
416 else if (_rinexVers == 2) {
417 if (! (appendFlagGPS & QIODevice::Append)) {
418 QString line;
419 line.sprintf("%9.2f%11sN: GPS NAV DATA%25sRINEX VERSION / TYPE\n",
420 defaultRnxNavVersion2, "", "");
421 *_ephStreamGPS << line;
422
423 QString hlp = currentDateAndTimeGPS().date().toString("dd-MMM-yyyy").leftJustified(20, ' ', true);
424 *_ephStreamGPS << _pgmName.toLatin1().data()
425 << _userName.toLatin1().data()
426 << hlp.toLatin1().data()
427 << "PGM / RUN BY / DATE" << endl;
428
429 QStringListIterator it(comments);
430 while (it.hasNext()) {
431 *_ephStreamGPS << it.next().trimmed().left(60).leftJustified(60) << "COMMENT\n";
432 }
433
434 line.sprintf("%60sEND OF HEADER\n", "");
435 *_ephStreamGPS << line;
436
437 _ephStreamGPS->flush();
438 }
439 if (! (appendFlagGlonass & QIODevice::Append)) {
440 QString line;
441 line.sprintf("%9.2f%11sG: GLONASS NAV DATA%21sRINEX VERSION / TYPE\n",
442 defaultRnxNavVersion2, "", "");
443 *_ephStreamGlonass << line;
444
445 QString hlp = currentDateAndTimeGPS().date().toString("dd-MMM-yyyy").leftJustified(20, ' ', true);
446 *_ephStreamGlonass << _pgmName.toLatin1().data()
447 << _userName.toLatin1().data()
448 << hlp.toLatin1().data()
449 << "PGM / RUN BY / DATE" << endl;
450
451 QStringListIterator it(comments);
452 while (it.hasNext()) {
453 *_ephStreamGlonass << it.next().trimmed().left(60).leftJustified(60) << "COMMENT\n";
454 }
455
456 line.sprintf("%60sEND OF HEADER\n", "");
457 *_ephStreamGlonass << line;
458
459 _ephStreamGlonass->flush();
460 }
461 }
462 }
463}
464
465// Print One Ephemeris
466////////////////////////////////////////////////////////////////////////////
467void t_bncCore::printEph(const t_eph& eph, bool printFile) {
468
469 QString strV2 = eph.toString(defaultRnxNavVersion2);
470 QString strV3 = eph.toString(defaultRnxObsVersion3);
471
472 if (_rinexVers == 2 && eph.type() == t_eph::GLONASS) {
473 printOutputEph(printFile, _ephStreamGlonass, strV2, strV3);
474 }
475 else if(_rinexVers == 2 && eph.type() == t_eph::GPS) {
476 printOutputEph(printFile, _ephStreamGPS, strV2, strV3);
477 }
478 else if (_rinexVers == 3) {
479 printOutputEph(printFile, _ephStreamGPS, strV2, strV3);
480 }
481}
482
483// Output
484////////////////////////////////////////////////////////////////////////////
485void t_bncCore::printOutputEph(bool printFile, QTextStream* stream,
486 const QString& strV2, const QString& strV3) {
487
488 // Output into file
489 // ----------------
490 if (printFile && stream) {
491 if (_rinexVers == 2) {
492 *stream << strV2.toLatin1();
493 }
494 else {
495 *stream << strV3.toLatin1();
496 }
497 stream->flush();
498 }
499
500 // Output into the socket
501 // ----------------------
502 if (_socketsEph) {
503 QMutableListIterator<QTcpSocket*> is(*_socketsEph);
504 while (is.hasNext()) {
505 QTcpSocket* sock = is.next();
506 if (sock->state() == QAbstractSocket::ConnectedState) {
507 if (sock->write(strV3.toLatin1()) == -1) {
508 delete sock;
509 is.remove();
510 }
511 }
512 else if (sock->state() != QAbstractSocket::ConnectingState) {
513 delete sock;
514 is.remove();
515 }
516 }
517 }
518}
519
520// Set Port Number
521////////////////////////////////////////////////////////////////////////////
522void t_bncCore::setPortEph(int port) {
523 _portEph = port;
524 if (_portEph != 0) {
525 delete _serverEph;
526 _serverEph = new QTcpServer;
527 _serverEph->setProxy(QNetworkProxy::NoProxy);
528 if ( !_serverEph->listen(QHostAddress::Any, _portEph) ) {
529 QString message = "t_bncCore: Cannot listen on ephemeris port "
530 + QByteArray::number(_portEph) + ": "
531 + _serverEph->errorString();
532 slotMessage(message.toLatin1(), true);
533 }
534 connect(_serverEph, SIGNAL(newConnection()), this, SLOT(slotNewConnectionEph()));
535 delete _socketsEph;
536 _socketsEph = new QList<QTcpSocket*>;
537 }
538}
539
540// Set Port Number
541////////////////////////////////////////////////////////////////////////////
542void t_bncCore::setPortCorr(int port) {
543 _portCorr = port;
544 if (_portCorr != 0) {
545 delete _serverCorr;
546 _serverCorr = new QTcpServer;
547 _serverCorr->setProxy(QNetworkProxy::NoProxy);
548 if ( !_serverCorr->listen(QHostAddress::Any, _portCorr) ) {
549 QString message = "t_bncCore: Cannot listen on correction port "
550 + QByteArray::number(_portCorr) + ": "
551 + _serverCorr->errorString();
552 slotMessage(message.toLatin1(), true);
553 }
554 connect(_serverCorr, SIGNAL(newConnection()), this, SLOT(slotNewConnectionCorr()));
555 delete _socketsCorr;
556 _socketsCorr = new QList<QTcpSocket*>;
557 }
558}
559
560// New Connection
561////////////////////////////////////////////////////////////////////////////
562void t_bncCore::slotNewConnectionEph() {
563 _socketsEph->push_back( _serverEph->nextPendingConnection() );
564}
565
566// New Connection
567////////////////////////////////////////////////////////////////////////////
568void t_bncCore::slotNewConnectionCorr() {
569 _socketsCorr->push_back( _serverCorr->nextPendingConnection() );
570}
571
572//
573////////////////////////////////////////////////////////////////////////////
574void t_bncCore::slotQuit() {
575 delete _caster; _caster = 0;
576 qApp->quit();
577}
578
579//
580////////////////////////////////////////////////////////////////////////////
581void t_bncCore::slotNewOrbCorrections(QList<t_orbCorr> orbCorrections) {
582 QMutexLocker locker(&_mutex);
583 emit newOrbCorrections(orbCorrections);
584 if (_socketsCorr) {
585 ostringstream out;
586 t_orbCorr::writeEpoch(&out, orbCorrections);
587 QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
588 while (is.hasNext()) {
589 QTcpSocket* sock = is.next();
590 if (sock->state() == QAbstractSocket::ConnectedState) {
591 if (sock->write(out.str().c_str()) == -1) {
592 delete sock;
593 is.remove();
594 }
595 }
596 else if (sock->state() != QAbstractSocket::ConnectingState) {
597 delete sock;
598 is.remove();
599 }
600 }
601 }
602}
603
604//
605////////////////////////////////////////////////////////////////////////////
606void t_bncCore::slotNewClkCorrections(QList<t_clkCorr> clkCorrections) {
607 QMutexLocker locker(&_mutex);
608 emit newClkCorrections(clkCorrections);
609 if (_socketsCorr) {
610 ostringstream out;
611 t_clkCorr::writeEpoch(&out, clkCorrections);
612 QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
613 while (is.hasNext()) {
614 QTcpSocket* sock = is.next();
615 if (sock->state() == QAbstractSocket::ConnectedState) {
616 if (sock->write(out.str().c_str()) == -1) {
617 delete sock;
618 is.remove();
619 }
620 }
621 else if (sock->state() != QAbstractSocket::ConnectingState) {
622 delete sock;
623 is.remove();
624 }
625 }
626 }
627}
628
629//
630////////////////////////////////////////////////////////////////////////////
631void t_bncCore::slotNewCodeBiases(QList<t_satCodeBias> codeBiases) {
632 QMutexLocker locker(&_mutex);
633 emit newCodeBiases(codeBiases);
634 if (_socketsCorr) {
635 ostringstream out;
636 t_satCodeBias::writeEpoch(&out, codeBiases);
637 QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
638 while (is.hasNext()) {
639 QTcpSocket* sock = is.next();
640 if (sock->state() == QAbstractSocket::ConnectedState) {
641 if (sock->write(out.str().c_str()) == -1) {
642 delete sock;
643 is.remove();
644 }
645 }
646 else if (sock->state() != QAbstractSocket::ConnectingState) {
647 delete sock;
648 is.remove();
649 }
650 }
651 }
652}
653
654//
655////////////////////////////////////////////////////////////////////////////
656void t_bncCore::slotNewPhaseBiases(QList<t_satPhaseBias> phaseBiases) {
657 QMutexLocker locker(&_mutex);
658 emit newPhaseBiases(phaseBiases);
659 if (_socketsCorr) {
660 ostringstream out;
661 t_satPhaseBias::writeEpoch(&out, phaseBiases);
662 QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
663 while (is.hasNext()) {
664 QTcpSocket* sock = is.next();
665 if (sock->state() == QAbstractSocket::ConnectedState) {
666 if (sock->write(out.str().c_str()) == -1) {
667 delete sock;
668 is.remove();
669 }
670 }
671 else if (sock->state() != QAbstractSocket::ConnectingState) {
672 delete sock;
673 is.remove();
674 }
675 }
676 }
677}
678
679//
680////////////////////////////////////////////////////////////////////////////
681void t_bncCore::slotNewTec(t_vTec vTec) {
682 QMutexLocker locker(&_mutex);
683 emit newTec(vTec);
684 if (_socketsCorr) {
685 ostringstream out;
686 t_vTec::write(&out, vTec);
687 QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
688 while (is.hasNext()) {
689 QTcpSocket* sock = is.next();
690 if (sock->state() == QAbstractSocket::ConnectedState) {
691 if (sock->write(out.str().c_str()) == -1) {
692 delete sock;
693 is.remove();
694 }
695 }
696 else if (sock->state() != QAbstractSocket::ConnectingState) {
697 delete sock;
698 is.remove();
699 }
700 }
701 }
702}
703
704//
705////////////////////////////////////////////////////////////////////////////
706void t_bncCore::setConfFileName(const QString& confFileName) {
707 if (confFileName.isEmpty()) {
708 _confFileName = QDir::homePath() + QDir::separator()
709 + ".config" + QDir::separator()
710 + qApp->organizationName() + QDir::separator()
711 + qApp->applicationName() + ".bnc";
712 }
713 else {
714 _confFileName = confFileName;
715 }
716}
717
718// Raw Output
719////////////////////////////////////////////////////////////////////////////
720void t_bncCore::writeRawData(const QByteArray& data, const QByteArray& staID,
721 const QByteArray& format) {
722
723 QMutexLocker locker(&_mutex);
724
725 if (!_rawFile) {
726 bncSettings settings;
727 QByteArray fileName = settings.value("rawOutFile").toByteArray();
728 if (!fileName.isEmpty()) {
729 _rawFile = new bncRawFile(fileName, staID, bncRawFile::output);
730 }
731 }
732
733 if (_rawFile) {
734 _rawFile->writeRawData(data, staID, format);
735 }
736}
737
738//
739////////////////////////////////////////////////////////////////////////////
740void t_bncCore::initCombination() {
741 _bncComb = new bncComb();
742 if (_bncComb->nStreams() < 1) {
743 delete _bncComb;
744 _bncComb = 0;
745 }
746}
747
748//
749////////////////////////////////////////////////////////////////////////////
750void t_bncCore::stopCombination() {
751 delete _bncComb;
752 _bncComb = 0;
753}
754
755//
756////////////////////////////////////////////////////////////////////////////
757bool t_bncCore::dateAndTimeGPSSet() const {
758 QMutexLocker locker(&_mutexDateAndTimeGPS);
759 if (_dateAndTimeGPS) {
760 return true;
761 }
762 else {
763 return false;
764 }
765}
766
767//
768////////////////////////////////////////////////////////////////////////////
769QDateTime t_bncCore::dateAndTimeGPS() const {
770 QMutexLocker locker(&_mutexDateAndTimeGPS);
771 if (_dateAndTimeGPS) {
772 return *_dateAndTimeGPS;
773 }
774 else {
775 return QDateTime();
776 }
777}
778
779//
780////////////////////////////////////////////////////////////////////////////
781void t_bncCore::setDateAndTimeGPS(QDateTime dateTime) {
782 QMutexLocker locker(&_mutexDateAndTimeGPS);
783 delete _dateAndTimeGPS;
784 _dateAndTimeGPS = new QDateTime(dateTime);
785}
786
787//
788////////////////////////////////////////////////////////////////////////////
789void t_bncCore::startPPP() {
790 _pppMain->start();
791}
792
793//
794////////////////////////////////////////////////////////////////////////////
795void t_bncCore::stopPPP() {
796 _pppMain->stop();
797 emit stopRinexPPP();
798}
799
Note: See TracBrowser for help on using the repository browser.