Index: /trunk/BNC/src/RTCM3/RTCM3Decoder.cpp
===================================================================
--- /trunk/BNC/src/RTCM3/RTCM3Decoder.cpp	(revision 8616)
+++ /trunk/BNC/src/RTCM3/RTCM3Decoder.cpp	(revision 8617)
@@ -149,4 +149,6 @@
     }
     GETBITS(i, 7);
+    frqObs->_lockTime = lti2sec(type,i);
+    frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0 && frqObs->_phaseValid);
     frqObs->_slipCounter = i;
     if (type == 1002 || type == 1004) {
@@ -193,4 +195,6 @@
       }
       GETBITS(i, 7);
+      frqObs->_lockTime = lti2sec(type,i);
+      frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0 && frqObs->_phaseValid);      
       frqObs->_slipCounter = i;
       if (type == 1004) {
@@ -714,4 +718,6 @@
                       + (rrmod[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
                   frqObs->_phaseValid = true;
+                  frqObs->_lockTime = lti2sec(type,ll[count]);
+                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);                  
                   frqObs->_slipCounter = ll[count];
                 }
@@ -728,4 +734,6 @@
                       + rrmod[numsat] * LIGHTSPEED / 1000.0 / cd.wl;
                   frqObs->_phaseValid = true;
+                  frqObs->_lockTime = lti2sec(type,ll[count]);
+                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);                  
                   frqObs->_slipCounter = ll[count];
                 }
@@ -743,4 +751,6 @@
                           / cd.wl;
                   frqObs->_phaseValid = true;
+                  frqObs->_lockTime = lti2sec(type,ll[count]);
+                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);                  
                   frqObs->_slipCounter = ll[count];
                 }
@@ -761,4 +771,6 @@
                           / cd.wl;
                   frqObs->_phaseValid = true;
+                  frqObs->_lockTime = lti2sec(type,ll[count]);
+                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);                  
                   frqObs->_slipCounter = ll[count];
                 }
@@ -784,4 +796,6 @@
                           / cd.wl;
                   frqObs->_phaseValid = true;
+                  frqObs->_lockTime = lti2sec(type,ll[count]);
+                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);                  
                   frqObs->_slipCounter = ll[count];
                 }
@@ -802,4 +816,6 @@
                           / cd.wl;
                   frqObs->_phaseValid = true;
+                  frqObs->_lockTime = lti2sec(type,ll[count]);
+                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);                  
                   frqObs->_slipCounter = ll[count];
                 }
@@ -890,4 +906,6 @@
     }
     GETBITS(i, 7);
+    frqObs->_lockTime = lti2sec(type,i);
+    frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0 && frqObs->_phaseValid);    
     frqObs->_slipCounter = i;
     if (type == 1010 || type == 1012) {
@@ -934,4 +952,6 @@
       }
       GETBITS(i, 7);
+      frqObs->_lockTime = lti2sec(type,i);
+      frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0 && frqObs->_phaseValid);      
       frqObs->_slipCounter = i;
       if (type == 1012) {
Index: /trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp
===================================================================
--- /trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp	(revision 8616)
+++ /trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp	(revision 8617)
@@ -444,6 +444,6 @@
     satPhaseBias._dispBiasConstistInd = _phaseBias.DispersiveBiasConsistencyIndicator;
     satPhaseBias._MWConsistInd        = _phaseBias.MWConsistencyIndicator;
-    satPhaseBias._yawDeg     = _phaseBias.Sat[ii].YawAngle * 180.0 / M_PI;
-    satPhaseBias._yawDegRate = _phaseBias.Sat[ii].YawRate * 180.0 / M_PI;
+    satPhaseBias._yaw     = _phaseBias.Sat[ii].YawAngle;
+    satPhaseBias._yawRate = _phaseBias.Sat[ii].YawRate;
     for (unsigned jj = 0; jj < _phaseBias.Sat[ii].NumberOfPhaseBiases; jj++) {
       const PhaseBias::PhaseBiasSat::PhaseBiasEntry& biasEntry = _phaseBias.Sat[ii].Biases[jj];
Index: /trunk/BNC/src/bnccaster.cpp
===================================================================
--- /trunk/BNC/src/bnccaster.cpp	(revision 8616)
+++ /trunk/BNC/src/bnccaster.cpp	(revision 8617)
@@ -96,4 +96,5 @@
   }
 
+  _printLockTime = settings.value("printLockTime",false).toBool();
   _samplingRateMult10 = int(settings.value("outSampl").toString().split("sec").first().toDouble() * 10.0);
   _outWait            = settings.value("outWait").toDouble();
@@ -172,5 +173,5 @@
            << setw(4)  << obs._time.gpsw()                      << " "
            << setw(14) << setprecision(7) << obs._time.gpssec() << " "
-           << bncRinex::asciiSatLine(obs) << endl;
+           << bncRinex::asciiSatLine(obs,_printLockTime) << endl;
 
       string hlpStr = oStr.str();
@@ -317,5 +318,6 @@
                  << setprecision(7) << obs._time.gpssec() << endl;
           }
-          oStr << obs._staID << ' ' << bncRinex::asciiSatLine(obs) << endl;
+          oStr << obs._staID << ' '
+               << bncRinex::asciiSatLine(obs,_printLockTime) << endl;
           if (!it.hasNext()) {
             oStr << endl;
Index: /trunk/BNC/src/bnccaster.h
===================================================================
--- /trunk/BNC/src/bnccaster.h	(revision 8616)
+++ /trunk/BNC/src/bnccaster.h	(revision 8617)
@@ -77,4 +77,5 @@
    QList<QByteArray>               _staIDs;
    QList<bncGetThread*>            _threads;
+   bool                            _printLockTime;   
    int                             _samplingRateMult10;
    double                          _outWait;
Index: /trunk/BNC/src/bnchelp.html
===================================================================
--- /trunk/BNC/src/bnchelp.html	(revision 8616)
+++ /trunk/BNC/src/bnchelp.html	(revision 8617)
@@ -2688,4 +2688,8 @@
 
 <p>
+An optional valid 'Lock Time' is only presented for observations from RTCM Version 3 streams. The parameter provides a measure of the amount of time that has elapsed during which the receiver has maintained continuous lock on that satellite signal. If a cycle slip occurs during the previous measurement cycle, the lock time will be reset to Zero. The 'Lock Time' could be of interest becuase the Lock Time Inficator is different for different RTCM3 measurement types. Hence, the 'Lock Time' in seconds is computed with the respective calculation rule.
+</p>
+
+<p>
 The following table describes the format of BNC's synchronized output of GNSS observations which consists of 'Epoch Records' and 'Observation Records'. Each Epoch Record is followed by one or more Observation Records. The Observation Record is repeated for each satellite having been observed in the current epoch. The length of an Observation Record is given by the number of observation types for this satellite.
 </p>
@@ -2730,4 +2734,8 @@
 <tr><td>Observation Code</td><td><b>S</b>2W</td><td>1X,A3</td></tr>
 <tr><td>Observed Signal Strength &nbsp; &nbsp;</td><td>34.750</td><td>1X,F8.3</td></tr>
+
+<tr><td><u>Lock Time (optional)</u></td><td></td><td></td></tr>
+<tr><td>Observation Code</td><td><b>T</b>2W</td><td>1X,A3</td></tr>
+<tr><td>Computed Lock Time &nbsp; &nbsp;</td><td>937.000</td><td>1X,F8.3</td></tr>
 
 </table>
Index: /trunk/BNC/src/bncrinex.cpp
===================================================================
--- /trunk/BNC/src/bncrinex.cpp	(revision 8616)
+++ /trunk/BNC/src/bncrinex.cpp	(revision 8617)
@@ -601,5 +601,5 @@
 // One Line in ASCII (Internal) Format
 ////////////////////////////////////////////////////////////////////////////
-string bncRinex::asciiSatLine(const t_satObs& obs) {
+string bncRinex::asciiSatLine(const t_satObs& obs, bool printLockTime) {
 
   ostringstream str;
@@ -630,4 +630,9 @@
           << left  << setw(3) << "S" + frqObs->_rnxType2ch << ' '
           << right << setw(8) << setprecision(3) << frqObs->_snr;
+    }    
+    if (frqObs->_lockTimeValid && printLockTime) {
+      str << ' '
+          << left  << setw(3) << "T" + frqObs->_rnxType2ch << ' '
+          << right << setw(9) << setprecision(3) << frqObs->_lockTime;
     }
   }
Index: /trunk/BNC/src/bncrinex.h
===================================================================
--- /trunk/BNC/src/bncrinex.h	(revision 8616)
+++ /trunk/BNC/src/bncrinex.h	(revision 8617)
@@ -49,5 +49,5 @@
                                bool rnxV3,
                                QDateTime* nextEpoch = 0);
-   static std::string asciiSatLine(const t_satObs& obs);
+   static std::string asciiSatLine(const t_satObs& obs, bool printLockTime);
 
  private:
Index: /trunk/BNC/src/bncsettings.cpp
===================================================================
--- /trunk/BNC/src/bncsettings.cpp	(revision 8616)
+++ /trunk/BNC/src/bncsettings.cpp	(revision 8617)
@@ -145,4 +145,5 @@
     setValue_p("outFile",             "");
     setValue_p("outUPort",            "");
+    setValue_p("printLockTime",       "0");    
     // Serial Output
     setValue_p("serialMountPoint",    "");
Index: /trunk/BNC/src/bncutils.cpp
===================================================================
--- /trunk/BNC/src/bncutils.cpp	(revision 8616)
+++ /trunk/BNC/src/bncutils.cpp	(revision 8617)
@@ -949,2 +949,70 @@
 }
 
+// Convert RTCM3 lock-time indicator to lock time in seconds
+////////////////////////////////////////////////////////////////////////////
+double lti2sec(int type, int lti) {
+
+  if ( (type>=1001 && type<=1004) ||
+       (type>=1009 && type<=1012)    ) { // RTCM3 msg 100[1...4] and 10[09...12]
+         if (lti<   0) return  -1;
+    else if (lti<  24) return   1*lti;      // [  0   1   23]
+    else if (lti<  48) return   2*lti-24;   // [ 24   2   70]
+    else if (lti<  72) return   4*lti-120;  // [ 72   4  164]
+    else if (lti<  96) return   8*lti-408;  // [168   8  352]
+    else if (lti< 120) return  16*lti-1176; // [360  16  728]
+    else if (lti< 127) return  32*lti-3096; // [744  32  905]
+    else if (lti==127) return  937;
+    else               return  -1;
+  }
+  else if (type%10==2 || type%10==3 ||
+           type%10==4 || type%10==5) {  // RTCM3 MSM-2/-3/-4/-5
+    switch(lti) {
+      case( 0) : return      0;
+      case( 1) : return     32e-3;
+      case( 2) : return     64e-3;
+      case( 3) : return    128e-3;
+      case( 4) : return    256e-3;
+      case( 5) : return    512e-3;
+      case( 6) : return   1024e-3;
+      case( 7) : return   2048e-3;
+      case( 8) : return   4096e-3;
+      case( 9) : return   8192e-3;
+      case(10) : return  16384e-3;
+      case(11) : return  32768e-3;
+      case(12) : return  65536e-3;
+      case(13) : return 131072e-3;
+      case(14) : return 262144e-3;
+      case(15) : return 524288e-3;
+      default  : return     -1;
+    };
+  }
+  else if (type%10==6 || type%10==7) {  // RTCM3 MSM-6 and MSM-7
+         if (lti<   0) return (     -1               );
+    else if (lti<  64) return (      1*lti           )*1e-3;
+    else if (lti<  96) return (      2*lti-64        )*1e-3;
+    else if (lti< 128) return (      4*lti-256       )*1e-3;
+    else if (lti< 160) return (      8*lti-768       )*1e-3;
+    else if (lti< 192) return (     16*lti-2048      )*1e-3;
+    else if (lti< 224) return (     32*lti-5120      )*1e-3;
+    else if (lti< 256) return (     64*lti-12288     )*1e-3;
+    else if (lti< 288) return (    128*lti-28672     )*1e-3;
+    else if (lti< 320) return (    256*lti-65536     )*1e-3;
+    else if (lti< 352) return (    512*lti-147456    )*1e-3;
+    else if (lti< 384) return (   1024*lti-327680    )*1e-3;
+    else if (lti< 416) return (   2048*lti-720896    )*1e-3;
+    else if (lti< 448) return (   4096*lti-1572864   )*1e-3;
+    else if (lti< 480) return (   8192*lti-3407872   )*1e-3;
+    else if (lti< 512) return (  16384*lti-7340032   )*1e-3;
+    else if (lti< 544) return (  32768*lti-15728640  )*1e-3;
+    else if (lti< 576) return (  65536*lti-33554432  )*1e-3;
+    else if (lti< 608) return ( 131072*lti-71303168  )*1e-3;
+    else if (lti< 640) return ( 262144*lti-150994944 )*1e-3;
+    else if (lti< 672) return ( 524288*lti-318767104 )*1e-3;
+    else if (lti< 704) return (1048576*lti-671088640 )*1e-3;
+    else if (lti==704) return (2097152*lti-1409286144)*1e-3;
+    else               return (     -1               );
+  }
+  else {
+    return -1;
+  };
+};
Index: /trunk/BNC/src/bncutils.h
===================================================================
--- /trunk/BNC/src/bncutils.h	(revision 8616)
+++ /trunk/BNC/src/bncutils.h	(revision 8617)
@@ -142,4 +142,9 @@
 int          factorial(int n);
 
+/** Convert RTCM3 lock-time indicator to lock time in seconds
+* depending on input message format. Returns -1 if format is
+* unknown or indicator is invalid
+*/
+double       lti2sec(int type, int lti);
 
 // CRC24Q checksum calculation function (only full bytes supported).
Index: /trunk/BNC/src/bncwindow.cpp
===================================================================
--- /trunk/BNC/src/bncwindow.cpp	(revision 8616)
+++ /trunk/BNC/src/bncwindow.cpp	(revision 8617)
@@ -307,4 +307,6 @@
   _outFileLineEdit    = new QLineEdit(settings.value("outFile").toString());
   _outUPortLineEdit   = new QLineEdit(settings.value("outUPort").toString());
+  _printLockTimeCheckBox = new QCheckBox();
+  _printLockTimeCheckBox->setCheckState(Qt::CheckState(settings.value("printLockTime").toInt()));  
 
   connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
@@ -312,4 +314,7 @@
 
   connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
+          this, SLOT(slotBncTextChanged()));
+          
+  connect(_printLockTimeCheckBox, SIGNAL(stateChanged(int)),
           this, SLOT(slotBncTextChanged()));
 
@@ -824,6 +829,8 @@
   sLayout->addWidget(new QLabel("Port (unsynchronized)"),           4, 0);
   sLayout->addWidget(_outUPortLineEdit,                             4, 1);
-  sLayout->addWidget(new QLabel(""),                                5, 1);
-  sLayout->setRowStretch(6, 999);
+  sLayout->addWidget(new QLabel("Print lock time"),                 5, 0);
+  sLayout->addWidget(_printLockTimeCheckBox,                        5, 1);
+  sLayout->addWidget(new QLabel(""),                                6, 1);
+  sLayout->setRowStretch(7, 999);
 
   sgroup->setLayout(sLayout);
@@ -1342,4 +1349,5 @@
   _outFileLineEdit->setWhatsThis(tr("<p>Specify the full path to a file where synchronized observations are saved in plain ASCII format.</p><p>Beware that the size of this file can rapidly increase depending on the number of incoming streams. <i>[key: outFile]</i></p>"));
   _outUPortLineEdit->setWhatsThis(tr("<p>BNC can produce unsynchronized observations in a plain ASCII format on your local host via IP port.</p><p>Specify a port number to activate this function. <i>[key: outUPort]</i></p>"));
+  _printLockTimeCheckBox->setWhatsThis(tr("<p>Print the lock time in seconds in the feed engine output.</p>"));
 
   // WhatsThis, Serial Output
@@ -1373,20 +1381,19 @@
   // WhatsThis, PPP (1)
   // ------------------
-  _pppWidgets._dataSource->setWhatsThis(tr("<p>Select 'Real-time Streams' for real-time PPP from RTCM streams or 'RINEX Files' for post processing PPP from RINEX files.</p><p><ul><li>Real-time PPP requires that you pull a RTCM stream carrying GNSS observations plus a stream providing corrections to Broadcast Ephemeris. If the observations stream does not contain Broadcast Ephemeris then you must in addition pull a Broadcast Ephemeris stream like 'RTCM3EPH' from Ntrip Broadcaster <u>products.igs-ip.net</u>.<br></li><li>Post processing PPP requires RINEX Observation files, RINEX Navigation files and a file with corrections to Broadcast Ephemeris in plain ASCII format as saved beforehand using BNC.</li></ul></p><p>Note that BNC allows to carry out PPP solutions simultaneously for several stations. <i>[key: PPP/dataSource]</i></p>"));
-  _pppWidgets._rinexObs->setWhatsThis(tr("<p>Specify the RINEX Observation file. <i>[key: PPP/rinexObs]</i></p>"));
-  _pppWidgets._rinexNav->setWhatsThis(tr("<p>Specify the RINEX Navigation file. <i>[key: PPP/rinexNav]</i></p>"));
-  _pppWidgets._corrMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides corrections to Broadcast Ephemeris.</p><p>If you don't specify a corrections stream via this option, BNC will fall back to Single Point Positioning (SPP, positioning from observations and Broadcast Ephemeris only) instead of doing PPP. <i>[key: PPP/corrMount]</i></p>"));
-  _pppWidgets._corrFile->setWhatsThis(tr("<p>Specify the Broadcast Ephemeris Corrections file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will fall back to Single Point Positioning (SPP, positioning from RINEX Obs and RINEX Nav files only) instead of doing PPP. <i>[key: PPP/corrFile]</i></p>"));
-  _pppWidgets._antexFile->setWhatsThis(tr("<p>Observations in RTCM streams or RINEX files should be referred to the receiver's and to the satellite's Antenna Phase Center (APC) and therefore be corrected for<ul><li>Receiver APC offsets</li><li>Receiver APC variations</li><li>Satellite APC offsets.</li></ul> Specify the full path to an IGS 'ANTEX file' which contains APC offsets and variations.</p><p>If you don't specify an 'ANTEX file' then observations will not be corrected for APC offsets and variations. <i>[key: PPP/antexFile]</i></p>"));
-  _pppWidgets._blqFile->setWhatsThis(tr("<p>Enter the full path to an ocean loading file in BLQ format. It contains a record for each site, which shows a header with information on the ocean tide model, the site name and the geographic coordinates. The first three rows of numbers designate amplitudes (meter), radial, west, south, and are followed by three lines with the corresponding phase values (degrees). <i>[key: PPP/blqFile]</i></p>"));
-  _pppWidgets._crdFile->setWhatsThis(tr("<p>Enter the full path to an ASCII file which specifies the streams or files of those stations you want to process. Specifying a 'Coordinates file' is optional. If it exists, it should contain one record per station with the following parameters separated by blank character:<p><ul><li>Specify the station either by<ul><li>the 'Mountpoint' of the station's RTCM stream (when in real-time PPP mode), or</li><li>the 4-charater station ID of the RINEX Observations file (when in post processing PPP mode).</li></ul></li><li>Approximate X,Y,Z coordinate of station's Antenna Reference Point [m] (ARP, specify '0.0 0.0 0.0' if unknown).</li><li>North, East and Up component of antenna eccentricity [m] (specify '0.0 0.0 0.0' if unknown).</li><li>20 Characters describing the antenna type and radome following the IGS 'ANTEX file' standard (leave blank if unknown).</li><li>Receiver type following the naming conventions for IGS equipment.</li></ul></p><p>Records with exclamation mark '!' in the first column or blank records will be interpreted as comment lines and ignored. <i>[key: PPP/crdFile]</i></p>"));
-  _pppWidgets._v3filenames->setWhatsThis(tr("<p>Tick 'Version 3 filenames' to let BNC create so-called extended filenames for PPP logfiles, NMEA files and SINEX Troposphere files following the RINEX Version 3 standard.</p><p>Default is an empty check box, meaning to create filenames following the RINEX Version 2 standard. The file content is not affected by this option. It only concerns the filenames. <i>[key: PPP/v3filenames]</i></p>"));
-  _pppWidgets._logPath->setWhatsThis(tr("<p>Specify a directory for saving daily PPP logfiles. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no PPP logfiles shall be produced. <i>[key: PPP/logPath]</i></p>"));
-  _pppWidgets._nmeaPath->setWhatsThis(tr("<p>Specify a directory for saving coordinates in daily NMEA files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no NMEA file shall be produced. <i>[key: PPP/nmeaPath]</i></p>"));
-  _pppWidgets._snxtroPath->setWhatsThis(tr("<p>Specify a directory for saving SINEX Troposphere files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no SINEX Troposphere files shall be produced. <i>[key: PPP/snxtroPath]</i></p>"));
-  _pppWidgets._snxtroIntr->setWhatsThis(tr("<p>Select a length for SINEX Troposphere files.</p><p>Default 'SNX TRO interval' for saving SINEX Troposphere files on disk is '1 hour'. <i>[key: PPP/snxtroIntr]</i></p>"));
-  _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters. <i>[key: PPP/snxtroSampl]</i></p>"));
-  _pppWidgets._snxtroAc->setWhatsThis(tr("<p>Specify a 3-character abbreviation describing you as the generating Analysis Center (AC) in your SINEX troposphere files. <i>[key: PPP/snxtroAc]</i></p>"));
-  _pppWidgets._snxtroSol->setWhatsThis(tr("<p>Specify a 4-character solution ID to allow a distingtion between different solutions per AC. <i>[key: PPP/snxtroSol]</i></p>"));
+  _pppWidgets._dataSource->setWhatsThis(tr("<p>Select 'Real-time Streams' for real-time PPP from RTCM streams or 'RINEX Files' for post processing PPP from RINEX files.</p><p><ul><li>Real-time PPP requires that you pull a RTCM stream carrying GNSS observations plus a stream providing corrections to Broadcast Ephemeris. If the observations stream does not contain Broadcast Ephemeris then you must in addition pull a Broadcast Ephemeris stream like 'RTCM3EPH' from Ntrip Broadcaster <u>products.igs-ip.net</u>.<br></li><li>Post processing PPP requires RINEX Observation files, RINEX Navigation files and a file with corrections to Broadcast Ephemeris in plain ASCII format as saved beforehand using BNC.</li></ul></p><p>Note that BNC allows to carry out PPP solutions simultaneously for several stations.</p>"));
+  _pppWidgets._rinexObs->setWhatsThis(tr("<p>Specify the RINEX Observation file.</p>"));
+  _pppWidgets._rinexNav->setWhatsThis(tr("<p>Specify the RINEX Navigation file.</p>"));
+  _pppWidgets._corrMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides corrections to Broadcast Ephemeris.</p><p>If you don't specify a corrections stream via this option, BNC will fall back to Single Point Positioning (SPP, positioning from observations and Broadcast Ephemeris only) instead of doing PPP.</p>"));
+  _pppWidgets._corrFile->setWhatsThis(tr("<p>Specify the Broadcast Ephemeris Corrections file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will fall back to Single Point Positioning (SPP, positioning from RINEX Obs and RINEX Nav files only) instead of doing PPP.</p>"));
+  _pppWidgets._antexFile->setWhatsThis(tr("<p>Observations in RTCM streams or RINEX files should be referred to the receiver's and to the satellite's Antenna Phase Center (APC) and therefore be corrected for<ul><li>Receiver APC offsets</li><li>Receiver APC variations</li><li>Satellite APC offsets.</li></ul> Specify the full path to an IGS 'ANTEX file' which contains APC offsets and variations.</p><p>If you don't specify an 'ANTEX file' then observations will not be corrected for APC offsets and variations.</p>"));
+  _pppWidgets._crdFile->setWhatsThis(tr("<p>Enter the full path to an ASCII file which specifies the streams or files of those stations you want to process. Specifying a 'Coordinates file' is optional. If it exists, it should contain one record per station with the following parameters separated by blank character:<p><ul><li>Specify the station either by<ul><li>the 'Mountpoint' of the station's RTCM stream (when in real-time PPP mode), or</li><li>the 4-charater station ID of the RINEX Observations file (when in post processing PPP mode).</li></ul></li><li>Approximate X,Y,Z coordinate of station's Antenna Reference Point [m] (ARP, specify '0.0 0.0 0.0' if unknown).</li><li>North, East and Up component of antenna eccentricity [m] (specify '0.0 0.0 0.0' if unknown).</li><li>20 Characters describing the antenna type and radome following the IGS 'ANTEX file' standard (leave blank if unknown).</li><li>Receiver type following the naming conventions for IGS equipment.</li></ul></p><p>Records with exclamation mark '!' in the first column or blank records will be interpreted as comment lines and ignored.</p>"));
+  _pppWidgets._v3filenames->setWhatsThis(tr("<p>Tick 'Version 3 filenames' to let BNC create so-called extended filenames for PPP logfiles, NMEA files and SINEX Troposphere files following the RINEX Version 3 standard.</p><p>Default is an empty check box, meaning to create filenames following the RINEX Version 2 standard. The file content is not affected by this option. It only concerns the filenames.</p>"));
+  _pppWidgets._logPath->setWhatsThis(tr("<p>Specify a directory for saving daily PPP logfiles. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no PPP logfiles shall be produced.</p>"));
+  _pppWidgets._nmeaPath->setWhatsThis(tr("<p>Specify a directory for saving coordinates in daily NMEA files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no NMEA file shall be produced.</p>"));
+  _pppWidgets._snxtroPath->setWhatsThis(tr("<p>Specify a directory for saving SINEX Troposphere files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no SINEX Troposphere files shall be produced.</p>"));
+  _pppWidgets._snxtroIntr->setWhatsThis(tr("<p>Select a length for SINEX Troposphere files.</p><p>Default 'SNX TRO interval' for saving SINEX Troposphere files on disk is '1 hour'.</p>"));
+  _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters.</p>"));
+  _pppWidgets._snxtroAc->setWhatsThis(tr("<p>Specify a 3-character abbreviation describing you as the generating Analysis Center (AC) in your SINEX troposphere files.</p>"));
+  _pppWidgets._snxtroSol->setWhatsThis(tr("<p>Specify a 4-character solution ID to allow a distingtion between different solutions per AC.</p>"));
 
   // WhatsThis, PPP (3)
@@ -1515,4 +1522,5 @@
   delete _outFileLineEdit;
   delete _outUPortLineEdit;
+  delete _printLockTimeCheckBox;  
   delete _serialMountPointLineEdit;
   delete _serialPortNameLineEdit;
@@ -1967,5 +1975,6 @@
   settings.setValue("outSampl",    _outSamplComboBox->currentText());
   settings.setValue("outFile",     _outFileLineEdit->text());
-  settings.setValue("outUPort",    _outUPortLineEdit->text());
+  settings.setValue("printLockTime",_printLockTimeCheckBox->checkState());    settings.setValue("outUPort",    _outUPortLineEdit->text());
+
 // Serial Output
   settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
Index: /trunk/BNC/src/bncwindow.h
===================================================================
--- /trunk/BNC/src/bncwindow.h	(revision 8616)
+++ /trunk/BNC/src/bncwindow.h	(revision 8617)
@@ -138,4 +138,5 @@
     QLineEdit* _outPortLineEdit;
     QLineEdit* _outUPortLineEdit;
+    QCheckBox* _printLockTimeCheckBox;        
     QLineEdit* _ephOutPortLineEdit;
     QLineEdit* _corrPortLineEdit;
Index: /trunk/BNC/src/satObs.cpp
===================================================================
--- /trunk/BNC/src/satObs.cpp	(revision 8616)
+++ /trunk/BNC/src/satObs.cpp	(revision 8617)
@@ -284,6 +284,6 @@
     }
     *out << satPhaseBias._prn.toString() << ' '
-         << setw(12) << setprecision(8) << satPhaseBias._yawDeg << ' '
-         << setw(12) << setprecision(8) << satPhaseBias._yawDegRate << "   "
+         << setw(12) << setprecision(8) << satPhaseBias._yaw  * 180.0 / M_PI << ' '
+         << setw(12) << setprecision(8) << satPhaseBias._yawRate  * 180.0 / M_PI<< "   "
          << setw(2) << satPhaseBias._bias.size();
     for (unsigned ii = 0; ii < satPhaseBias._bias.size(); ii++) {
@@ -330,6 +330,8 @@
 
     int numBias;
-    in >> satPhaseBias._prn  >> satPhaseBias._yawDeg >> satPhaseBias._yawDegRate
-      >> numBias;
+    double yawDeg, yawDegRate;
+    in >> satPhaseBias._prn  >> yawDeg >> yawDegRate  >> numBias;
+    satPhaseBias._yaw = yawDeg * M_PI / 180.0;
+    satPhaseBias._yawRate = yawDegRate * M_PI / 180.0;
 
     while (in.good()) {
Index: /trunk/BNC/src/satObs.h
===================================================================
--- /trunk/BNC/src/satObs.h	(revision 8616)
+++ /trunk/BNC/src/satObs.h	(revision 8617)
@@ -23,4 +23,6 @@
     _snr             = 0.0;
     _snrValid        = false;
+    _lockTime        = 0.0;
+    _lockTimeValid   = false;    
     _slip            = false;
     _slipCounter     = 0;
@@ -36,4 +38,6 @@
   double            _snr;
   bool              _snrValid;
+  double            _lockTime;
+  bool              _lockTimeValid;    
   bool              _slip;
   int               _slipCounter;
@@ -164,6 +168,6 @@
     _dispBiasConstistInd = 0;
     _MWConsistInd = 0;
-    _yawDeg     = 0.0;
-    _yawDegRate = 0.0;
+    _yaw        = 0.0;
+    _yawRate    = 0.0;
   }
   static void writeEpoch(std::ostream* out, const QList<t_satPhaseBias>& biasList);
@@ -175,6 +179,6 @@
   unsigned int                _dispBiasConstistInd; // not satellite specific
   unsigned int                _MWConsistInd;        // not satellite specific
-  double                      _yawDeg;
-  double                      _yawDegRate;
+  double                      _yaw;
+  double                      _yawRate;
   std::vector<t_frqPhaseBias> _bias;
 };
