Index: trunk/BNC/src/ssrQc.cpp
===================================================================
--- trunk/BNC/src/ssrQc.cpp	(revision 11070)
+++ trunk/BNC/src/ssrQc.cpp	(revision 11073)
@@ -50,4 +50,5 @@
 namespace {
   const double MAX_CLK_JUMP   = 0.5;  // [m] clock change beyond its rate between consecutive epochs
+  const double EPH_WARMUP     = 120.0; // [s] no ephemeris checks at the start
   const char*  TYPE_NAME[]    = {"ORBIT", "CLOCK", "CODE_BIAS", "PHASE_BIAS"};
 
@@ -143,4 +144,7 @@
 ////////////////////////////////////////////////////////////////////////////
 void t_ssrQc::checkInterval(const bncTime& time) {
+  if (!_startTime.valid()) {
+    _startTime = time;
+  }
   if (!_intervalStart.valid()) {
     double sec = floor(time.gpssec() / _interval) * _interval;
@@ -181,5 +185,9 @@
 // Broadcast ephemeris the correction refers to
 ////////////////////////////////////////////////////////////////////////////
-void t_ssrQc::checkEph(t_satStat& stat, const QString& prnInt, unsigned iod) {
+void t_ssrQc::checkEph(t_satStat& stat, const QString& prnInt, unsigned iod, const bncTime& time) {
+  // not before all broadcast ephemerides may have been received
+  if (time - _startTime < EPH_WARMUP) {
+    return;
+  }
   t_eph* ephLast = _ephUser.ephLast(prnInt);
   t_eph* ephPrev = _ephUser.ephPrev(prnInt);
@@ -208,5 +216,5 @@
     t_satStat& stat = _satStat[QString::fromStdString(corr._staID) + ' ' + prn];
     stat.numOrb += 1;
-    checkEph(stat, QString::fromStdString(corr._prn.toInternalString()), corr._iod);
+    checkEph(stat, QString::fromStdString(corr._prn.toInternalString()), corr._iod, corr._time);
     double radial = fabs(corr._xr[0]);
     double alongCross = max(fabs(corr._xr[1]), fabs(corr._xr[2]));
@@ -226,5 +234,5 @@
     t_satStat& stat = _satStat[QString::fromStdString(corr._staID) + ' ' + prn];
     stat.numClk += 1;
-    checkEph(stat, QString::fromStdString(corr._prn.toInternalString()), corr._iod);
+    checkEph(stat, QString::fromStdString(corr._prn.toInternalString()), corr._iod, corr._time);
 
     // jump: change between consecutive epochs (same IOD) beyond the clock rate
@@ -297,4 +305,8 @@
     newEpoch(bias._staID, bias._prn.system(), PBIAS, bias._time, bias._updateInt,
              QString::fromStdString(bias._prn.toString()));
+    QString staSys = QString("%1 %2").arg(bias._staID.c_str()).arg(bias._prn.system());
+    for (const t_frqPhaseBias& frqBias : bias._bias) {
+      _phaseSignals[staSys].insert(QString::fromStdString(frqBias._rnxType2ch));
+    }
   }
 }
@@ -462,4 +474,9 @@
         }
       }
+      if (_phaseSignals.contains(staSys)) {
+        QStringList sigs = _phaseSignals[staSys].values();
+        sigs.sort();
+        lines << "phase bias signals: " + sigs.join(" ");
+      }
       addSats(QString("clock jumps > %1 m").arg(MAX_CLK_JUMP), jumps);
       if (!maxRadialPrn.isEmpty()) {
