Changeset 1558 in ntrip
- Timestamp:
- Feb 2, 2009, 2:31:28 PM (16 years ago)
- Location:
- trunk/BNC
- Files:
-
- 2 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/bnc.pro
r1556 r1558 30 30 bncconst.h bnchtml.h bnctableitem.h bnczerodecoder.h \ 31 31 bncnetquery.h bncnetqueryv1.h bncnetqueryv2.h \ 32 bncnetqueryrtp.h bncsettings.h 32 bncnetqueryrtp.h bncsettings.h latencychecker.h \ 33 33 RTCM/GPSDecoder.h RTCM/RTCM2.h RTCM/RTCM2Decoder.h \ 34 34 RTCM/RTCM2_2021.h RTCM/rtcm_utils.h \ … … 49 49 bncconst.cpp bnchtml.cpp bnchlpdlg.cpp bnctableitem.cpp \ 50 50 bnczerodecoder.cpp bncnetqueryv1.cpp bncnetqueryv2.cpp \ 51 bncnetqueryrtp.cpp bncsettings.cpp 51 bncnetqueryrtp.cpp bncsettings.cpp latencychecker.cpp \ 52 52 RTCM/RTCM2.cpp RTCM/RTCM2Decoder.cpp \ 53 53 RTCM/RTCM2_2021.cpp RTCM/rtcm_utils.cpp \ -
trunk/BNC/bncgetthread.cpp
r1557 r1558 58 58 #include "bncnetqueryrtp.h" 59 59 #include "bncsettings.h" 60 #include "latencychecker.h" 60 61 61 62 #include "RTCM/RTCM2Decoder.h" … … 277 278 } 278 279 279 _latencyChecker = new bncGetThread::latencyChecker(_staID);280 _latencyChecker = new latencyChecker(_staID); 280 281 281 282 msleep(100); //sleep 0.1 sec … … 532 533 } 533 534 534 // Constructor535 //////////////////////////////////////////////////////////////////////////////536 bncGetThread::latencyChecker::latencyChecker(QByteArray staID) {537 538 _staID = staID;539 540 bncApp* app = (bncApp*) qApp;541 connect(this, SIGNAL(newMessage(QByteArray,bool)),542 app, SLOT(slotMessage(const QByteArray,bool)));543 544 bncSettings settings;545 546 // Notice threshold547 // ----------------548 QString obsRate = settings.value("obsRate").toString();549 _inspSegm = 0;550 if ( obsRate.isEmpty() ) {551 _inspSegm = 0;552 }553 else if ( obsRate.indexOf("5 Hz") != -1 ) {554 _inspSegm = 20;555 }556 else if ( obsRate.indexOf("1 Hz") != -1 ) {557 _inspSegm = 10;558 }559 else if ( obsRate.indexOf("0.5 Hz") != -1 ) {560 _inspSegm = 20;561 }562 else if ( obsRate.indexOf("0.2 Hz") != -1 ) {563 _inspSegm = 40;564 }565 else if ( obsRate.indexOf("0.1 Hz") != -1 ) {566 _inspSegm = 50;567 }568 _adviseFail = settings.value("adviseFail").toInt();569 _adviseReco = settings.value("adviseReco").toInt();570 if ( Qt::CheckState(settings.value("makePause").toInt()) == Qt::Checked) {571 _makePause = true;572 }573 else {574 _makePause = false;575 }576 _adviseScript = settings.value("adviseScript").toString();577 expandEnvVar(_adviseScript);578 579 // Latency interval/average580 // ------------------------581 _perfIntr = 0;582 QString perfIntr = settings.value("perfIntr").toString();583 if ( perfIntr.isEmpty() ) {584 _perfIntr = 0;585 }586 else if ( perfIntr.indexOf("2 sec") != -1 ) {587 _perfIntr = 2;588 }589 else if ( perfIntr.indexOf("10 sec") != -1 ) {590 _perfIntr = 10;591 }592 else if ( perfIntr.indexOf("1 min") != -1 ) {593 _perfIntr = 60;594 }595 else if ( perfIntr.indexOf("5 min") != -1 ) {596 _perfIntr = 300;597 }598 else if ( perfIntr.indexOf("15 min") != -1 ) {599 _perfIntr = 900;600 }601 else if ( perfIntr.indexOf("1 hour") != -1 ) {602 _perfIntr = 3600;603 }604 else if ( perfIntr.indexOf("6 hours") != -1 ) {605 _perfIntr = 21600;606 }607 else if ( perfIntr.indexOf("1 day") != -1 ) {608 _perfIntr = 86400;609 }610 611 // RTCM message types612 // ------------------613 _checkMountPoint = settings.value("miscMount").toString();614 615 // Initialize private members616 // --------------------------617 _maxDt = 600.0; // Check observation epoch618 _wrongEpoch = false;619 _decode = true;620 _numSucc = 0;621 _secSucc = 0;622 _secFail = 0;623 _initPause = 30; // Initial pause for corrupted streams624 _currPause = 0;625 _begCorrupt = false;626 _endCorrupt = false;627 _followSec = false;628 _oldSecGPS = 0;629 _newSecGPS = 0;630 _numGaps = 0;631 _diffSecGPS = 0;632 _numLat = 0;633 _sumLat = 0.0;634 _sumLatQ = 0.0;635 _meanDiff = 0.0;636 _minLat = _maxDt;637 _maxLat = -_maxDt;638 _curLat = 0.0;639 640 _decodeTime = QDateTime::currentDateTime();641 _decodeSucc = QDateTime::currentDateTime();642 }643 644 // Destructor645 //////////////////////////////////////////////////////////////////////////////646 bncGetThread::latencyChecker::~latencyChecker() {647 648 }649 650 // Perform latency checks651 //////////////////////////////////////////////////////////////////////////////652 void bncGetThread::latencyChecker::check(GPSDecoder* decoder) {653 654 // Check - once per inspect segment655 // --------------------------------656 if (decoder->_obsList.size() > 0) {657 658 _decodeTime = QDateTime::currentDateTime();659 660 if (_numSucc > 0) {661 _secSucc += _inspSegm;662 _decodeSucc = QDateTime::currentDateTime();663 if (_secSucc > _adviseReco * 60) {664 _secSucc = _adviseReco * 60 + 1;665 }666 _numSucc = 0;667 _currPause = _initPause;668 _decodePause.setDate(QDate());669 _decodePause.setTime(QTime());670 }671 else {672 _secFail += _inspSegm;673 _secSucc = 0;674 if (_secFail > _adviseFail * 60) {675 _secFail = _adviseFail * 60 + 1;676 }677 if (!_decodePause.isValid() || !_makePause) {678 _decodePause = QDateTime::currentDateTime();679 }680 else {681 _decodePause.setDate(QDate());682 _decodePause.setTime(QTime());683 _secFail = _secFail + _currPause - _inspSegm;684 _currPause = _currPause * 2;685 if (_currPause > 960) {686 _currPause = 960;687 }688 }689 }690 691 // End corrupt threshold692 // ---------------------693 if ( _begCorrupt && !_endCorrupt && _secSucc > _adviseReco * 60 ) {694 _endDateCor = QDateTime::currentDateTime().addSecs(- _adviseReco * 60).toUTC().date().toString("yy-MM-dd");695 _endTimeCor = QDateTime::currentDateTime().addSecs(- _adviseReco * 60).toUTC().time().toString("hh:mm:ss");696 emit(newMessage((_staID + ": Recovery threshold exceeded, corruption ended "697 + _endDateCor + " " + _endTimeCor).toAscii(), true));698 callScript(("End_Corrupted " + _endDateCor + " " + _endTimeCor + " Begin was " + _begDateCor + " " + _begTimeCor).toAscii());699 _endCorrupt = true;700 _begCorrupt = false;701 _secFail = 0;702 }703 else {704 705 // Begin corrupt threshold706 // -----------------------707 if ( !_begCorrupt && _secFail > _adviseFail * 60 ) {708 _begDateCor = _decodeSucc.toUTC().date().toString("yy-MM-dd");709 _begTimeCor = _decodeSucc.toUTC().time().toString("hh:mm:ss");710 emit(newMessage((_staID + ": Failure threshold exceeded, corrupted since "711 + _begDateCor + " " + _begTimeCor).toAscii(), true));712 callScript(("Begin_Corrupted " + _begDateCor + " " + _begTimeCor).toAscii());713 _begCorrupt = true;714 _endCorrupt = false;715 _secSucc = 0;716 _numSucc = 0;717 }718 }719 }720 721 // End outage threshold722 // --------------------723 if ( _decodeStart.isValid() && _decodeStart.secsTo(QDateTime::currentDateTime()) > _adviseReco * 60 ) {724 _decodeStart.setDate(QDate());725 _decodeStart.setTime(QTime());726 if (_inspSegm > 0) {727 _endDateOut = QDateTime::currentDateTime().addSecs(- _adviseReco * 60).toUTC().date().toString("yy-MM-dd");728 _endTimeOut = QDateTime::currentDateTime().addSecs(- _adviseReco * 60).toUTC().time().toString("hh:mm:ss");729 emit(newMessage((_staID + ": Recovery threshold exceeded, outage ended "730 + _endDateOut + " " + _endTimeOut).toAscii(), true));731 callScript(("End_Outage " + _endDateOut + " " + _endTimeOut + " Begin was " + _begDateOut + " " + _begTimeOut).toAscii());732 }733 }734 735 // Latency and completeness736 // ------------------------737 if ( _checkMountPoint == _staID || _checkMountPoint == "ALL" ) {738 if (_perfIntr > 0 ) {739 740 QListIterator<p_obs> it(decoder->_obsList);741 while (it.hasNext()) {742 p_obs obs = it.next();743 744 _newSecGPS = static_cast<int>(obs->_o.GPSWeeks);745 if (_newSecGPS != _oldSecGPS) {746 if (_newSecGPS % _perfIntr < _oldSecGPS % _perfIntr) {747 if (_numLat > 0) {748 if (_meanDiff > 0.0) {749 emit( newMessage(QString("%1: Mean latency %2 sec, min %3, max %4, rms %5, %6 epochs, %7 gaps")750 .arg(_staID.data())751 .arg(int(_sumLat/_numLat*100)/100.)752 .arg(int(_minLat*100)/100.)753 .arg(int(_maxLat*100)/100.)754 .arg(int((sqrt((_sumLatQ - _sumLat * _sumLat / _numLat)/_numLat))*100)/100.)755 .arg(_numLat)756 .arg(_numGaps)757 .toAscii(), true) );758 } else {759 emit( newMessage(QString("%1: Mean latency %2 sec, min %3, max %4, rms %5, %6 epochs")760 .arg(_staID.data())761 .arg(int(_sumLat/_numLat*100)/100.)762 .arg(int(_minLat*100)/100.)763 .arg(int(_maxLat*100)/100.)764 .arg(int((sqrt((_sumLatQ - _sumLat * _sumLat / _numLat)/_numLat))*100)/100.)765 .arg(_numLat)766 .toAscii(), true) );767 }768 }769 _meanDiff = _diffSecGPS / _numLat;770 _diffSecGPS = 0;771 _numGaps = 0;772 _sumLat = 0.0;773 _sumLatQ = 0.0;774 _numLat = 0;775 _minLat = _maxDt;776 _maxLat = -_maxDt;777 }778 if (_followSec) {779 _diffSecGPS += _newSecGPS - _oldSecGPS;780 if (_meanDiff>0.) {781 if (_newSecGPS - _oldSecGPS > 1.5 * _meanDiff) {782 _numGaps += 1;783 }784 }785 }786 787 // Compute the observations latency788 // --------------------------------789 int week;790 double sec;791 currentGPSWeeks(week, sec);792 const double secPerWeek = 7.0 * 24.0 * 3600.0;793 if (week < obs->_o.GPSWeek) {794 week += 1;795 sec -= secPerWeek;796 }797 if (week > obs->_o.GPSWeek) {798 week -= 1;799 sec += secPerWeek;800 }801 802 _curLat = sec - obs->_o.GPSWeeks;803 _sumLat += _curLat;804 _sumLatQ += _curLat * _curLat;805 if (_curLat < _minLat) {806 _minLat = _curLat;807 }808 if (_curLat >= _maxLat) {809 _maxLat = _curLat;810 }811 _numLat += 1;812 _oldSecGPS = _newSecGPS;813 _followSec = true;814 }815 }816 }817 }818 }819 820 // Call advisory notice script821 ////////////////////////////////////////////////////////////////////////////822 void bncGetThread::latencyChecker::callScript(const char* comment) {823 if (!_adviseScript.isEmpty()) {824 msleep(1);825 #ifdef WIN32826 QProcess::startDetached(_adviseScript, QStringList() << _staID << comment) ;827 #else828 QProcess::startDetached("nohup", QStringList() << _adviseScript << _staID << comment) ;829 #endif830 }831 } -
trunk/BNC/bncgetthread.h
r1557 r1558 38 38 class QextSerialPort; 39 39 class bncNetQuery; 40 class latencyChecker; 40 41 41 42 class bncGetThread : public QThread { … … 74 75 75 76 private: 76 77 class latencyChecker : public QObject {78 Q_OBJECT79 public:80 latencyChecker(QByteArray staID);81 ~latencyChecker();82 void check(GPSDecoder* decoder);83 signals:84 void newMessage(QByteArray msg, bool showOnScreen);85 private:86 void callScript(const char* comment);87 int _inspSegm;88 int _adviseFail;89 int _adviseReco;90 int _perfIntr;91 int _numSucc;92 int _secSucc;93 int _secFail;94 int _initPause;95 int _currPause;96 int _oldSecGPS;97 int _newSecGPS;98 int _numGaps;99 int _diffSecGPS;100 int _numLat;101 bool _makePause;102 bool _wrongEpoch;103 bool _decode;104 bool _begCorrupt;105 bool _endCorrupt;106 bool _followSec;107 double _maxDt;108 double _sumLat;109 double _sumLatQ;110 double _meanDiff;111 double _minLat;112 double _maxLat;113 double _curLat;114 QByteArray _staID;115 QString _adviseScript;116 QString _checkMountPoint;117 QString _begDateCor;118 QString _begTimeCor;119 QString _begDateOut;120 QString _begTimeOut;121 QString _endDateCor;122 QString _endTimeCor;123 QString _endDateOut;124 QString _endTimeOut;125 QDateTime _decodeTime;126 QDateTime _decodeSucc;127 QDateTime _decodeFailure;128 QDateTime _decodeStart;129 QDateTime _decodeStop;130 QDateTime _decodePause;131 };132 133 77 void initialize(); 134 78 t_irc tryReconnect();
Note:
See TracChangeset
for help on using the changeset viewer.