source: ntrip/branches/BNC_2.12/src/bnccore.cpp @ 8000

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

some informations about the data source of RINEX navigation files is added into the RINEX header

File size: 23.3 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").toAscii().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 ").toAscii().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("WRONG EPHEMERIS\n" + eph->toString(3.0).toAscii());
205    return failure;
206  }
207  else if (eph->checkState() == t_eph::outdated) {
208    messagePrivate("OUTDATED EPHEMERIS\n" + eph->toString(3.0).toAscii());
209    return failure;
210  }
211  printEphHeader();
212  printEph(*eph, (ircPut == success));
213  return success;
214}
215
216// New GPS Ephemeris
217////////////////////////////////////////////////////////////////////////////
218void t_bncCore::slotNewGPSEph(t_ephGPS eph) {
219  if (checkPrintEph(&eph) == success) {
220    emit newGPSEph(eph);
221  }
222}
223
224// New Glonass Ephemeris
225////////////////////////////////////////////////////////////////////////////
226void t_bncCore::slotNewGlonassEph(t_ephGlo eph) {
227  if (checkPrintEph(&eph) == success) {
228    emit newGlonassEph(eph);
229  }
230}
231
232// New Galileo Ephemeris
233////////////////////////////////////////////////////////////////////////////
234void t_bncCore::slotNewGalileoEph(t_ephGal eph) {
235  if (checkPrintEph(&eph) == success) {
236    emit newGalileoEph(eph);
237  }
238}
239
240// New SBAS Ephemeris
241////////////////////////////////////////////////////////////////////////////
242void t_bncCore::slotNewSBASEph(t_ephSBAS eph) {
243  if (checkPrintEph(&eph) == success) {
244    emit newSBASEph(eph);
245  }
246}
247
248// New BDS Ephemeris
249////////////////////////////////////////////////////////////////////////////
250void t_bncCore::slotNewBDSEph(t_ephBDS eph) {
251  if (checkPrintEph(&eph) == success) {
252    emit newBDSEph(eph);
253  }
254}
255
256// Print Header of the output File(s)
257////////////////////////////////////////////////////////////////////////////
258void t_bncCore::printEphHeader() {
259
260  bncSettings settings;
261    QStringList comments;
262
263  QListIterator<QString> it(settings.value("mountPoints").toStringList());
264  while (it.hasNext()) {
265    QStringList hlp = it.next().split(" ");
266    if (hlp.size() < 7)
267      continue;
268    QUrl url(hlp[0]);
269    QString decoder = hlp[1];
270    comments.append("Source: " + decoder +
271                    " " + url.encodedHost() +
272                    "/" + url.path().mid(1).toAscii());
273  }
274
275  // Initialization
276  // --------------
277  if (_rinexVers == 0) {
278
279    if ( Qt::CheckState(settings.value("ephV3").toInt()) == Qt::Checked) {
280      _rinexVers = 3;
281    }
282    else {
283      _rinexVers = 2;
284    }
285
286    _ephPath = settings.value("ephPath").toString();
287
288    if ( !_ephPath.isEmpty() ) {
289      if ( _ephPath[_ephPath.length()-1] != QDir::separator() ) {
290        _ephPath += QDir::separator();
291      }
292      expandEnvVar(_ephPath);
293    }
294  }
295
296  // (Re-)Open output File(s)
297  // ------------------------
298  if (!_ephPath.isEmpty()) {
299
300    QDateTime datTim = currentDateAndTimeGPS();
301
302    QString ephFileNameGPS = _ephPath + "BRDC";
303
304    bool ephV3filenames = settings.value("ephV3filenames").toBool();
305
306    QString hlpStr = bncRinex::nextEpochStr(datTim,
307                         settings.value("ephIntr").toString(), ephV3filenames);
308
309    if (_rinexVers == 3) {
310      if (ephV3filenames) {
311        QString country = "WRD"; // WORLD
312        QString monNum = "0";
313        QString recNum = "0";
314        ephFileNameGPS += QString("%1").arg(monNum, 1, 10) +
315                          QString("%1").arg(recNum, 1, 10) +
316                          country +
317                          "_S_" +     // stream
318                          QString("%1").arg(datTim.date().year()) +
319                          QString("%1").arg(datTim.date().dayOfYear(), 3, 10, QChar('0')) +
320                          hlpStr +   // HM_period
321                          "_MN.rnx"; // mixed BRDC
322      }
323      else { // RNX v3 with old filenames
324        ephFileNameGPS +=  QString("%1").arg(datTim.date().dayOfYear(), 3, 10, QChar('0')) +
325                           hlpStr + datTim.toString(".yyP");
326      }
327    }
328    else { // RNX v2.11
329      ephFileNameGPS += QString("%1").arg(datTim.date().dayOfYear(), 3, 10, QChar('0')) +
330                        hlpStr + datTim.toString(".yyN");
331    }
332
333    if (_ephFileNameGPS == ephFileNameGPS) {
334      return;
335    }
336    else {
337      _ephFileNameGPS = ephFileNameGPS;
338    }
339
340    delete _ephStreamGPS;
341    delete _ephFileGPS;
342
343    QFlags<QIODevice::OpenModeFlag> appendFlagGPS;
344    QFlags<QIODevice::OpenModeFlag> appendFlagGlonass;
345
346    if ( Qt::CheckState(settings.value("rnxAppend").toInt()) == Qt::Checked &&
347         QFile::exists(ephFileNameGPS) ) {
348      appendFlagGPS = QIODevice::Append;
349    }
350
351    _ephFileGPS = new QFile(ephFileNameGPS);
352    _ephFileGPS->open(QIODevice::WriteOnly | appendFlagGPS);
353    _ephStreamGPS = new QTextStream();
354    _ephStreamGPS->setDevice(_ephFileGPS);
355
356    if      (_rinexVers == 3) {
357      _ephFileGlonass   = _ephFileGPS;
358      _ephStreamGlonass = _ephStreamGPS;
359      _ephFileGalileo   = _ephFileGPS;
360      _ephStreamGalileo = _ephStreamGPS;
361      _ephFileSBAS      = _ephFileGPS;
362      _ephStreamSBAS    = _ephStreamGPS;
363    }
364    else if (_rinexVers == 2) {
365      QString ephFileNameGlonass = _ephPath + "BRDC" +
366          QString("%1").arg(datTim.date().dayOfYear(), 3, 10, QChar('0')) +
367          hlpStr + datTim.toString(".yyG");
368
369      delete _ephStreamGlonass;
370      delete _ephFileGlonass;
371
372      if ( Qt::CheckState(settings.value("rnxAppend").toInt()) == Qt::Checked &&
373           QFile::exists(ephFileNameGlonass) ) {
374        appendFlagGlonass = QIODevice::Append;
375      }
376
377      _ephFileGlonass = new QFile(ephFileNameGlonass);
378      _ephFileGlonass->open(QIODevice::WriteOnly | appendFlagGlonass);
379      _ephStreamGlonass = new QTextStream();
380      _ephStreamGlonass->setDevice(_ephFileGlonass);
381    }
382
383    // Header - RINEX Version 3
384    // ------------------------
385    if (_rinexVers == 3) {
386      if ( ! (appendFlagGPS & QIODevice::Append)) {
387        QString line;
388        line.sprintf(
389          "%9.2f%11sN: GNSS NAV DATA    M: Mixed%12sRINEX VERSION / TYPE\n",
390          t_rnxNavFile::defaultRnxNavVersion3, "", "");
391        *_ephStreamGPS << line;
392
393        QString hlp = currentDateAndTimeGPS().toString("yyyyMMdd hhmmss UTC").leftJustified(20, ' ', true);
394        *_ephStreamGPS << _pgmName.toAscii().data()
395                       << _userName.toAscii().data()
396                       << hlp.toAscii().data()
397                       << "PGM / RUN BY / DATE" << endl;
398
399        QStringListIterator it(comments);
400        while (it.hasNext()) {
401          *_ephStreamGPS << it.next().trimmed().left(60).leftJustified(60) << "COMMENT\n";
402        }
403       
404        line.sprintf("%60sEND OF HEADER\n", "");
405        *_ephStreamGPS << line;
406
407        _ephStreamGPS->flush();
408      }
409    }
410
411    // Headers - RINEX Version 2
412    // -------------------------
413    else if (_rinexVers == 2) {
414      if (! (appendFlagGPS & QIODevice::Append)) {
415        QString line;
416        line.sprintf("%9.2f%11sN: GPS NAV DATA%25sRINEX VERSION / TYPE\n",
417                     t_rnxNavFile::defaultRnxNavVersion2, "", "");
418        *_ephStreamGPS << line;
419
420        QString hlp = currentDateAndTimeGPS().date().toString("dd-MMM-yyyy").leftJustified(20, ' ', true);
421        *_ephStreamGPS << _pgmName.toAscii().data()
422                       << _userName.toAscii().data()
423                       << hlp.toAscii().data()
424                       << "PGM / RUN BY / DATE" << endl;
425
426        QStringListIterator it(comments);
427        while (it.hasNext()) {
428          *_ephStreamGPS << it.next().trimmed().left(60).leftJustified(60) << "COMMENT\n";
429        }
430       
431        line.sprintf("%60sEND OF HEADER\n", "");
432        *_ephStreamGPS << line;
433
434        _ephStreamGPS->flush();
435      }
436      if (! (appendFlagGlonass & QIODevice::Append)) {
437        QString line;
438        line.sprintf("%9.2f%11sG: GLONASS NAV DATA%21sRINEX VERSION / TYPE\n",
439                     t_rnxNavFile::defaultRnxNavVersion2, "", "");
440        *_ephStreamGlonass << line;
441
442        QString hlp = currentDateAndTimeGPS().date().toString("dd-MMM-yyyy").leftJustified(20, ' ', true);
443        *_ephStreamGlonass << _pgmName.toAscii().data()
444                           << _userName.toAscii().data()
445                           << hlp.toAscii().data()
446                           << "PGM / RUN BY / DATE" << endl;
447
448        QStringListIterator it(comments);
449        while (it.hasNext()) {
450          *_ephStreamGlonass << it.next().trimmed().left(60).leftJustified(60) << "COMMENT\n";
451        }
452
453        line.sprintf("%60sEND OF HEADER\n", "");
454        *_ephStreamGlonass << line;
455
456        _ephStreamGlonass->flush();
457      }
458    }
459  }
460}
461
462// Print One Ephemeris
463////////////////////////////////////////////////////////////////////////////
464void t_bncCore::printEph(const t_eph& eph, bool printFile) {
465
466  QString strV2 = eph.toString(t_rnxNavFile::defaultRnxNavVersion2);
467  QString strV3 = eph.toString(t_rnxObsHeader::defaultRnxObsVersion3);
468
469  if     (_rinexVers == 2 && eph.type() == t_eph::GLONASS) {
470    printOutputEph(printFile, _ephStreamGlonass, strV2, strV3);
471  }
472  else if(_rinexVers == 2 && eph.type() == t_eph::GPS)  {
473    printOutputEph(printFile, _ephStreamGPS, strV2, strV3);
474  }
475  else if (_rinexVers == 3) {
476    printOutputEph(printFile, _ephStreamGPS, strV2, strV3);
477  }
478}
479
480// Output
481////////////////////////////////////////////////////////////////////////////
482void t_bncCore::printOutputEph(bool printFile, QTextStream* stream,
483                               const QString& strV2, const QString& strV3) {
484
485  // Output into file
486  // ----------------
487  if (printFile && stream) {
488    if (_rinexVers == 2) {
489      *stream << strV2.toAscii();
490    }
491    else {
492      *stream << strV3.toAscii();
493    }
494    stream->flush();
495  }
496
497  // Output into the socket
498  // ----------------------
499  if (_socketsEph) {
500    QMutableListIterator<QTcpSocket*> is(*_socketsEph);
501    while (is.hasNext()) {
502      QTcpSocket* sock = is.next();
503      if (sock->state() == QAbstractSocket::ConnectedState) {
504        if (sock->write(strV3.toAscii()) == -1) {
505          delete sock;
506          is.remove();
507        }
508      }
509      else if (sock->state() != QAbstractSocket::ConnectingState) {
510        delete sock;
511        is.remove();
512      }
513    }
514  }
515}
516
517// Set Port Number
518////////////////////////////////////////////////////////////////////////////
519void t_bncCore::setPortEph(int port) {
520  _portEph = port;
521  if (_portEph != 0) {
522    delete _serverEph;
523    _serverEph = new QTcpServer;
524    if ( !_serverEph->listen(QHostAddress::Any, _portEph) ) {
525      slotMessage("t_bncCore: Cannot listen on ephemeris port", true);
526    }
527    connect(_serverEph, SIGNAL(newConnection()), this, SLOT(slotNewConnectionEph()));
528    delete _socketsEph;
529    _socketsEph = new QList<QTcpSocket*>;
530  }
531}
532
533// Set Port Number
534////////////////////////////////////////////////////////////////////////////
535void t_bncCore::setPortCorr(int port) {
536  _portCorr = port;
537  if (_portCorr != 0) {
538    delete _serverCorr;
539    _serverCorr = new QTcpServer;
540    if ( !_serverCorr->listen(QHostAddress::Any, _portCorr) ) {
541      slotMessage("t_bncCore: Cannot listen on correction port", true);
542    }
543    connect(_serverCorr, SIGNAL(newConnection()), this, SLOT(slotNewConnectionCorr()));
544    delete _socketsCorr;
545    _socketsCorr = new QList<QTcpSocket*>;
546  }
547}
548
549// New Connection
550////////////////////////////////////////////////////////////////////////////
551void t_bncCore::slotNewConnectionEph() {
552  _socketsEph->push_back( _serverEph->nextPendingConnection() );
553}
554
555// New Connection
556////////////////////////////////////////////////////////////////////////////
557void t_bncCore::slotNewConnectionCorr() {
558  _socketsCorr->push_back( _serverCorr->nextPendingConnection() );
559}
560
561//
562////////////////////////////////////////////////////////////////////////////
563void t_bncCore::slotQuit() {
564  delete _caster; _caster = 0;
565  qApp->quit();
566}
567
568//
569////////////////////////////////////////////////////////////////////////////
570void t_bncCore::slotNewOrbCorrections(QList<t_orbCorr> orbCorrections) {
571  QMutexLocker locker(&_mutex);
572  emit newOrbCorrections(orbCorrections);
573  if (_socketsCorr) {
574    ostringstream out;
575    t_orbCorr::writeEpoch(&out, orbCorrections);
576    QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
577    while (is.hasNext()) {
578      QTcpSocket* sock = is.next();
579      if (sock->state() == QAbstractSocket::ConnectedState) {
580        if (sock->write(out.str().c_str()) == -1) {
581          delete sock;
582          is.remove();
583        }
584      }
585      else if (sock->state() != QAbstractSocket::ConnectingState) {
586        delete sock;
587        is.remove();
588      }
589    }
590  }
591}
592
593//
594////////////////////////////////////////////////////////////////////////////
595void t_bncCore::slotNewClkCorrections(QList<t_clkCorr> clkCorrections) {
596  QMutexLocker locker(&_mutex);
597  emit newClkCorrections(clkCorrections);
598  if (_socketsCorr) {
599    ostringstream out;
600    t_clkCorr::writeEpoch(&out, clkCorrections);
601    QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
602    while (is.hasNext()) {
603      QTcpSocket* sock = is.next();
604      if (sock->state() == QAbstractSocket::ConnectedState) {
605        if (sock->write(out.str().c_str()) == -1) {
606          delete sock;
607          is.remove();
608        }
609      }
610      else if (sock->state() != QAbstractSocket::ConnectingState) {
611        delete sock;
612        is.remove();
613      }
614    }
615  }
616}
617
618//
619////////////////////////////////////////////////////////////////////////////
620void t_bncCore::slotNewCodeBiases(QList<t_satCodeBias> codeBiases) {
621  QMutexLocker locker(&_mutex);
622  emit newCodeBiases(codeBiases);
623  if (_socketsCorr) {
624    ostringstream out;
625    t_satCodeBias::writeEpoch(&out, codeBiases);
626    QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
627    while (is.hasNext()) {
628      QTcpSocket* sock = is.next();
629      if (sock->state() == QAbstractSocket::ConnectedState) {
630        if (sock->write(out.str().c_str()) == -1) {
631          delete sock;
632          is.remove();
633        }
634      }
635      else if (sock->state() != QAbstractSocket::ConnectingState) {
636        delete sock;
637        is.remove();
638      }
639    }
640  }
641}
642
643//
644////////////////////////////////////////////////////////////////////////////
645void t_bncCore::slotNewPhaseBiases(QList<t_satPhaseBias> phaseBiases) {
646  QMutexLocker locker(&_mutex);
647  emit newPhaseBiases(phaseBiases);
648  if (_socketsCorr) {
649    ostringstream out;
650    t_satPhaseBias::writeEpoch(&out, phaseBiases);
651    QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
652    while (is.hasNext()) {
653      QTcpSocket* sock = is.next();
654      if (sock->state() == QAbstractSocket::ConnectedState) {
655        if (sock->write(out.str().c_str()) == -1) {
656          delete sock;
657          is.remove();
658        }
659      }
660      else if (sock->state() != QAbstractSocket::ConnectingState) {
661        delete sock;
662        is.remove();
663      }
664    }
665  }
666}
667
668//
669////////////////////////////////////////////////////////////////////////////
670void t_bncCore::slotNewTec(t_vTec vTec) {
671  QMutexLocker locker(&_mutex);
672  emit newTec(vTec);
673  if (_socketsCorr) {
674    ostringstream out;
675    t_vTec::write(&out, vTec);
676    QMutableListIterator<QTcpSocket*> is(*_socketsCorr);
677    while (is.hasNext()) {
678      QTcpSocket* sock = is.next();
679      if (sock->state() == QAbstractSocket::ConnectedState) {
680        if (sock->write(out.str().c_str()) == -1) {
681          delete sock;
682          is.remove();
683        }
684      }
685      else if (sock->state() != QAbstractSocket::ConnectingState) {
686        delete sock;
687        is.remove();
688      }
689    }
690  }
691}
692
693//
694////////////////////////////////////////////////////////////////////////////
695void t_bncCore::setConfFileName(const QString& confFileName) {
696  if (confFileName.isEmpty()) {
697    _confFileName = QDir::homePath() + QDir::separator()
698                  + ".config" + QDir::separator()
699                  + qApp->organizationName() + QDir::separator()
700                  + qApp->applicationName() + ".bnc";
701  }
702  else {
703    _confFileName = confFileName;
704  }
705}
706
707// Raw Output
708////////////////////////////////////////////////////////////////////////////
709void t_bncCore::writeRawData(const QByteArray& data, const QByteArray& staID,
710                          const QByteArray& format) {
711
712  QMutexLocker locker(&_mutex);
713
714  if (!_rawFile) {
715    bncSettings settings;
716    QByteArray fileName = settings.value("rawOutFile").toByteArray();
717    if (!fileName.isEmpty()) {
718      _rawFile = new bncRawFile(fileName, staID, bncRawFile::output);
719    }
720  }
721
722  if (_rawFile) {
723    _rawFile->writeRawData(data, staID, format);
724  }
725}
726
727//
728////////////////////////////////////////////////////////////////////////////
729void t_bncCore::initCombination() {
730  _bncComb = new bncComb();
731  if (_bncComb->nStreams() < 1) {
732    delete _bncComb;
733    _bncComb = 0;
734  }
735}
736
737//
738////////////////////////////////////////////////////////////////////////////
739void t_bncCore::stopCombination() {
740  delete _bncComb;
741  _bncComb = 0;
742}
743
744//
745////////////////////////////////////////////////////////////////////////////
746bool t_bncCore::dateAndTimeGPSSet() const {
747  QMutexLocker locker(&_mutexDateAndTimeGPS);
748  if (_dateAndTimeGPS) {
749    return true;
750  }
751  else {
752    return false;
753  }
754}
755
756//
757////////////////////////////////////////////////////////////////////////////
758QDateTime t_bncCore::dateAndTimeGPS() const {
759  QMutexLocker locker(&_mutexDateAndTimeGPS);
760  if (_dateAndTimeGPS) {
761    return *_dateAndTimeGPS;
762  }
763  else {
764    return QDateTime();
765  }
766}
767
768//
769////////////////////////////////////////////////////////////////////////////
770void t_bncCore::setDateAndTimeGPS(QDateTime dateTime) {
771  QMutexLocker locker(&_mutexDateAndTimeGPS);
772  delete _dateAndTimeGPS;
773  _dateAndTimeGPS = new QDateTime(dateTime);
774}
775
776//
777////////////////////////////////////////////////////////////////////////////
778void t_bncCore::startPPP() {
779  _pppMain->start();
780}
781
782//
783////////////////////////////////////////////////////////////////////////////
784void t_bncCore::stopPPP() {
785  _pppMain->stop();
786  emit stopRinexPPP();
787}
788
Note: See TracBrowser for help on using the repository browser.