Index: /trunk/BNC/bncmodel.cpp
===================================================================
--- /trunk/BNC/bncmodel.cpp	(revision 3635)
+++ /trunk/BNC/bncmodel.cpp	(revision 3636)
@@ -49,7 +49,7 @@
 #include "bancroft.h"
 #include "bncutils.h"
-#include "bncsettings.h"
 #include "bnctides.h"
 #include "bncantex.h"
+#include "pppopt.h"
 
 using namespace std;
@@ -138,85 +138,22 @@
 // Constructor
 ////////////////////////////////////////////////////////////////////////////
-bncModel::bncModel(QByteArray staID) {
-
-  _staID   = staID;
+bncModel::bncModel(QByteArray staID, const t_pppOpt* opt) {
+
+  _staID = staID;
+  _opt   = opt;
 
   connect(this, SIGNAL(newMessage(QByteArray,bool)), 
           ((bncApp*)qApp), SLOT(slotMessage(const QByteArray,bool)));
 
-  bncSettings settings;
-
-  // Observation Sigmas
-  // ------------------
-  _sigP3 = 5.0;
-  if (!settings.value("pppSigmaCode").toString().isEmpty()) {
-    _sigP3 = settings.value("pppSigmaCode").toDouble();
-  }
-  _sigL3 = 0.02;
-  if (!settings.value("pppSigmaPhase").toString().isEmpty()) {
-    _sigL3 = settings.value("pppSigmaPhase").toDouble();
-  }
-
-  // Parameter Sigmas
-  // ----------------
-  _sigCrd0 = 100.0;
-  if (!settings.value("pppSigCrd0").toString().isEmpty()) {
-    _sigCrd0 = settings.value("pppSigCrd0").toDouble();
-  }
-  _sigCrdP = 100.0;
-  if (!settings.value("pppSigCrdP").toString().isEmpty()) {
-    _sigCrdP = settings.value("pppSigCrdP").toDouble();
-  }
-  _sigTrp0 = 0.1;
-  if (!settings.value("pppSigTrp0").toString().isEmpty()) {
-    _sigTrp0 = settings.value("pppSigTrp0").toDouble();
-  }
-  _sigTrpP = 1e-6;
-  if (!settings.value("pppSigTrpP").toString().isEmpty()) {
-    _sigTrpP = settings.value("pppSigTrpP").toDouble();
-  }
-  _sigClk0           = 1000.0;
-  _sigAmb0           = 1000.0;
-  _sigGalileoOffset0 = 1000.0;
-  _sigGalileoOffsetP =    0.0;
-
-  // Quick-Start Mode
-  // ----------------
-  _quickStart = 0;
-  if (settings.value("pppRefCrdX").toString() != "" &&
-      settings.value("pppRefCrdY").toString() != "" &&
-      settings.value("pppRefCrdZ").toString() != "" &&
-      !settings.value("pppQuickStart").toString().isEmpty()) {
-    _quickStart = settings.value("pppQuickStart").toDouble();
-  }
-
-  // Several options
-  // ---------------
-  _usePhase = false;
-  if ( Qt::CheckState(settings.value("pppUsePhase").toInt()) == Qt::Checked) {
-    _usePhase = true;
-  }
-
-  _estTropo = false;
-  if ( Qt::CheckState(settings.value("pppEstTropo").toInt()) == Qt::Checked) {
-    _estTropo = true;
-  }
-
-  _useGalileo = false;
-  if ( Qt::CheckState(settings.value("pppGalileo").toInt()) == Qt::Checked) {
-    _useGalileo = true;
-  }
-
   // NMEA Output
   // -----------
-  QString nmeaFileName = settings.value("nmeaFile").toString();
-  if (nmeaFileName.isEmpty()) {
+  if (_opt->nmeaFile.isEmpty()) {
     _nmeaFile   = 0;
     _nmeaStream = 0;
   }
   else {
-    expandEnvVar(nmeaFileName);
-    _nmeaFile = new QFile(nmeaFileName);
-    if ( Qt::CheckState(settings.value("rnxAppend").toInt()) == Qt::Checked) {
+    QString hlpName = _opt->nmeaFile; expandEnvVar(hlpName);
+    _nmeaFile = new QFile(hlpName);
+    if (_opt->rnxAppend) {
       _nmeaFile->open(QIODevice::WriteOnly | QIODevice::Append);
     }
@@ -231,22 +168,12 @@
   // ------------------------
   _antex = 0;
-  QString antexFileName = settings.value("pppAntex").toString();
-  if (!antexFileName.isEmpty()) {
+  if (!_opt->antexFile.isEmpty()) {
     _antex = new bncAntex();
-    if (_antex->readFile(antexFileName) != success) {
+    if (_antex->readFile(_opt->antexFile) != success) {
       emit newMessage("wrong ANTEX file", true);
       delete _antex;
       _antex = 0;
     }
-    else {
-      _antennaName = settings.value("pppAntenna").toString();
-    }
-  }
-
-  // Antenna Eccentricities
-  // ----------------------
-  _dN = settings.value("pppRefdN").toDouble();
-  _dE = settings.value("pppRefdE").toDouble();
-  _dU = settings.value("pppRefdU").toDouble();
+  }
 
   // Bancroft Coordinates
@@ -294,8 +221,8 @@
   _params.push_back(new bncParam(bncParam::CRD_Z,  ++nextPar, ""));
   _params.push_back(new bncParam(bncParam::RECCLK, ++nextPar, ""));
-  if (_estTropo) {
+  if (_opt->estTropo) {
     _params.push_back(new bncParam(bncParam::TROPO, ++nextPar, ""));
   }
-  if (_useGalileo) {
+  if (_opt->useGalileo) {
     _params.push_back(new bncParam(bncParam::GALILEO_OFFSET, ++nextPar, ""));
   }
@@ -307,14 +234,14 @@
     pp->xx = 0.0;
     if      (pp->isCrd()) {
-      _QQ(iPar,iPar) = _sigCrd0 * _sigCrd0; 
+      _QQ(iPar,iPar) = _opt->sigCrd0 * _opt->sigCrd0; 
     }
     else if (pp->type == bncParam::RECCLK) {
-      _QQ(iPar,iPar) = _sigClk0 * _sigClk0; 
+      _QQ(iPar,iPar) = _opt->sigClk0 * _opt->sigClk0; 
     }
     else if (pp->type == bncParam::TROPO) {
-      _QQ(iPar,iPar) = _sigTrp0 * _sigTrp0; 
+      _QQ(iPar,iPar) = _opt->sigTrp0 * _opt->sigTrp0; 
     }
     else if (pp->type == bncParam::GALILEO_OFFSET) {
-      _QQ(iPar,iPar) = _sigGalileoOffset0 * _sigGalileoOffset0; 
+      _QQ(iPar,iPar) = _opt->sigGalileoOffset0 * _opt->sigGalileoOffset0; 
     }
   }
@@ -409,18 +336,20 @@
   if (_antex) { 
     bool found;
-    phaseCenter = _antex->pco(_antennaName, satData->eleSat, found);
+    phaseCenter = _antex->pco(_opt->antennaName, satData->eleSat, found);
     if (!found) {
       emit newMessage("ANTEX: antenna >" 
-                      + _antennaName.toAscii() + "< not found", true);
+                      + _opt->antennaName.toAscii() + "< not found", true);
     }
   }
 
   double antennaOffset = 0.0;
-  if (_dN != 0.0 || _dE != 0.0 || _dU != 0.0) {
+  if (_opt->antEccSet()) {
     double cosa = cos(satData->azSat);
     double sina = sin(satData->azSat);
     double cose = cos(satData->eleSat);
     double sine = sin(satData->eleSat);
-    antennaOffset = -_dN * cosa*cose - _dE * sina*cose - _dU * sine;
+    antennaOffset = -_opt->antEccNEU[0] * cosa*cose 
+                    -_opt->antEccNEU[1] * sina*cose 
+                    -_opt->antEccNEU[2] * sine;
   }
 
@@ -478,10 +407,6 @@
   if (iPhase == 0) {
 
-    bncSettings settings;
-    
-    _maxSolGap = settings.value("pppMaxSolGap").toDouble();
-    
     bool firstCrd = false;
-    if (!_lastTimeOK.valid() || (_maxSolGap > 0 && _time - _lastTimeOK > _maxSolGap)) {
+    if (!_lastTimeOK.valid() || (_opt->maxSolGap > 0 && _time - _lastTimeOK > _opt->maxSolGap)) {
       firstCrd = true;
       _startTime = epoData->tt;
@@ -491,6 +416,6 @@
     // Use different white noise for Quick-Start mode
     // ----------------------------------------------
-    double sigCrdP_used   = _sigCrdP;
-    if ( _quickStart > 0.0 && _quickStart > (epoData->tt - _startTime) ) {
+    double sigCrdP_used = _opt->sigCrdP;
+    if ( _opt->quickStart > 0.0 && _opt->quickStart > (epoData->tt - _startTime) ) {
       sigCrdP_used   = 0.0;
     }
@@ -505,8 +430,6 @@
       if      (pp->type == bncParam::CRD_X) {
         if (firstCrd) {
-          if (settings.value("pppRefCrdX").toString() != "" &&
-              settings.value("pppRefCrdY").toString() != "" &&
-              settings.value("pppRefCrdZ").toString() != "") {
-            pp->xx = settings.value("pppRefCrdX").toDouble();
+          if (_opt->refCrdSet()) {
+            pp->xx = _opt->refCrd[0];
           }
           else {
@@ -518,8 +441,6 @@
       else if (pp->type == bncParam::CRD_Y) {
         if (firstCrd) {
-          if (settings.value("pppRefCrdX").toString() != "" &&
-              settings.value("pppRefCrdY").toString() != "" &&
-              settings.value("pppRefCrdZ").toString() != "") {
-            pp->xx = settings.value("pppRefCrdY").toDouble();
+          if (_opt->refCrdSet()) {
+            pp->xx = _opt->refCrd[1];
           }
           else {
@@ -531,8 +452,6 @@
       else if (pp->type == bncParam::CRD_Z) {
         if (firstCrd) {
-          if (settings.value("pppRefCrdX").toString() != "" &&
-              settings.value("pppRefCrdY").toString() != "" &&
-              settings.value("pppRefCrdZ").toString() != "") {
-            pp->xx = settings.value("pppRefCrdZ").toDouble();
+          if (_opt->refCrdSet()) {
+            pp->xx = _opt->refCrd[2];
           }
           else {
@@ -550,5 +469,5 @@
           _QQ(iPar, jj) = 0.0;
         }
-        _QQ(iPar,iPar) = _sigClk0 * _sigClk0;
+        _QQ(iPar,iPar) = _opt->sigClk0 * _opt->sigClk0;
       }
     
@@ -556,5 +475,5 @@
       // ------------------
       else if (pp->type == bncParam::TROPO) {
-        _QQ(iPar,iPar) += _sigTrpP * _sigTrpP;
+        _QQ(iPar,iPar) += _opt->sigTrpP * _opt->sigTrpP;
       }
     
@@ -562,5 +481,5 @@
       // --------------
       else if (pp->type == bncParam::GALILEO_OFFSET) {
-        _QQ(iPar,iPar) += _sigGalileoOffsetP * _sigGalileoOffsetP;
+        _QQ(iPar,iPar) += _opt->sigGalileoOffsetP * _opt->sigGalileoOffsetP;
       }
     }
@@ -569,5 +488,5 @@
   // Add New Ambiguities if necessary
   // --------------------------------
-  if (_usePhase) {
+  if (_opt->usePhase) {
 
     // Make a copy of QQ and xx, set parameter indices
@@ -627,5 +546,5 @@
       bncParam* par = _params[ii-1];
       if (par->index_old == 0) {
-        _QQ(par->index, par->index) = _sigAmb0 * _sigAmb0;
+        _QQ(par->index, par->index) = _opt->sigAmb0 * _opt->sigAmb0;
       }
       par->index_old = par->index;
@@ -640,11 +559,9 @@
   Tracer tracer("bncModel::update");
 
-  bncSettings settings;
-
   _log.clear();  
 
   _time = epoData->tt; // current epoch time
 
-  if (settings.value("pppSPP").toString() == "PPP") {
+  if (_opt->pppMode) {
     _log += "Precise Point Positioning of Epoch " 
           + QByteArray(_time.timestr(1).c_str()) +
@@ -724,20 +641,11 @@
   // NEU Output
   // ----------
-  double xyzRef[3];
-
-  if (settings.value("pppRefCrdX").toString() != "" &&
-      settings.value("pppRefCrdY").toString() != "" &&
-      settings.value("pppRefCrdZ").toString() != "") {
-
-    xyzRef[0] = settings.value("pppRefCrdX").toDouble();
-    xyzRef[1] = settings.value("pppRefCrdY").toDouble();
-    xyzRef[2] = settings.value("pppRefCrdZ").toDouble();
-
-    newPos->xnt[0] = x() - xyzRef[0];
-    newPos->xnt[1] = y() - xyzRef[1];
-    newPos->xnt[2] = z() - xyzRef[2];
+  if (_opt->refCrdSet()) {
+    newPos->xnt[0] = x() - _opt->refCrd[0];
+    newPos->xnt[1] = y() - _opt->refCrd[1];
+    newPos->xnt[2] = z() - _opt->refCrd[2];
 
     double ellRef[3];
-    xyz2ell(xyzRef, ellRef);
+    xyz2ell(_opt->refCrd, ellRef);
     xyz2neu(ellRef, newPos->xnt, &newPos->xnt[3]);
 
@@ -751,5 +659,5 @@
   emit newMessage(QByteArray(strC.str().c_str()), true);
 
-  if (settings.value("pppAverage").toString() == "") {
+  if (_opt->pppAverage == 0.0) {
     delete newPos;
   }
@@ -758,14 +666,4 @@
    _posAverage.push_back(newPos); 
 
-    // Time Span for Average Computation
-    // ---------------------------------
-    double tRangeAverage = settings.value("pppAverage").toDouble() * 60.;
-    if (tRangeAverage < 0) {
-      tRangeAverage = 0;
-    }
-    if (tRangeAverage > 86400) {
-      tRangeAverage = 86400;
-    }
-
     // Compute the Mean
     // ----------------
@@ -775,5 +673,5 @@
     while (it.hasNext()) {
       pppPos* pp = it.next();
-      if ( (epoData->tt - pp->time) >= tRangeAverage ) {
+      if ( (epoData->tt - pp->time) >= _opt->pppAverage ) {
         delete pp;
         it.remove();
@@ -806,16 +704,13 @@
       }
 
-      if (settings.value("pppRefCrdX").toString() != "" &&
-          settings.value("pppRefCrdY").toString() != "" &&
-          settings.value("pppRefCrdZ").toString() != "") {
-       
+      if (_opt->refCrdSet()) {
         ostringstream strD; strD.setf(ios::fixed);
         strD << _staID.data() << "  AVE-XYZ " 
              << epoData->tt.timestr(1) << " "
-             << setw(13) << setprecision(3) << mean[0] + xyzRef[0] << " +- "
+             << setw(13) << setprecision(3) << mean[0] + _opt->refCrd[0] << " +- "
              << setw(6)  << setprecision(3) << std[0]   << " "
-             << setw(14) << setprecision(3) << mean[1] + xyzRef[1] << " +- "
+             << setw(14) << setprecision(3) << mean[1] + _opt->refCrd[1] << " +- "
              << setw(6)  << setprecision(3) << std[1]   << " "
-             << setw(14) << setprecision(3) << mean[2] + xyzRef[2] << " +- "
+             << setw(14) << setprecision(3) << mean[2] + _opt->refCrd[2] << " +- "
              << setw(6)  << setprecision(3) << std[2];
         emit newMessage(QByteArray(strD.str().c_str()), true);
@@ -832,5 +727,5 @@
         emit newMessage(QByteArray(strE.str().c_str()), true);
 
-        if ( Qt::CheckState(settings.value("pppEstTropo").toInt()) == Qt::Checked) {
+        if (_opt->estTropo) {
           ostringstream strF; strF.setf(ios::fixed);
           strF << _staID.data() << "  AVE-TRP " 
@@ -1141,5 +1036,5 @@
   if (iPhase == 1) {
     ll(iObs)      = satData->L3 - cmpValue(satData, true);
-    double sigL3 = _sigL3;
+    double sigL3 = _opt->sigL3;
     if (satData->system() == 'R') {
       sigL3 *= GLONASS_WEIGHT_FACTOR;
@@ -1159,5 +1054,5 @@
   else {
     ll(iObs)      = satData->P3 - cmpValue(satData, false);
-    PP(iObs,iObs) = 1.0 / (_sigP3 * _sigP3) / (ellWgtCoef * ellWgtCoef);
+    PP(iObs,iObs) = 1.0 / (_opt->sigP3 * _opt->sigP3) / (ellWgtCoef * ellWgtCoef);
     for (int iPar = 1; iPar <= _params.size(); iPar++) {
       AA(iObs, iPar) = _params[iPar-1]->partial(satData, false);
@@ -1252,5 +1147,5 @@
     // First update using code observations, then phase observations
     // -------------------------------------------------------------      
-    for (int iPhase = 0; iPhase <= (_usePhase ? 1 : 0); iPhase++) {
+    for (int iPhase = 0; iPhase <= (_opt->usePhase ? 1 : 0); iPhase++) {
     
       // Status Prediction
@@ -1315,5 +1210,5 @@
         }
 
-        if (!_usePhase || iPhase == 1) {
+        if (!_opt->usePhase || iPhase == 1) {
           if (_outlierGPS.size() > 0 || _outlierGlo.size() > 0) {
             _log += "Neglected PRNs: ";
Index: /trunk/BNC/bncmodel.h
===================================================================
--- /trunk/BNC/bncmodel.h	(revision 3635)
+++ /trunk/BNC/bncmodel.h	(revision 3636)
@@ -36,4 +36,5 @@
 class t_satData;
 class bncAntex;
+class t_pppOpt;
 
 class bncParam {
@@ -57,5 +58,5 @@
  Q_OBJECT
  public:
-  bncModel(QByteArray staID);
+  bncModel(QByteArray staID, const t_pppOpt* opt);
   ~bncModel();
   t_irc update(t_epoData* epoData);
@@ -135,4 +136,5 @@
   };
 
+  const t_pppOpt*       _opt;
   bncTime               _time;
   bncTime               _lastTimeOK;
@@ -145,7 +147,4 @@
   ColumnVector          _xcBanc;
   ColumnVector          _ellBanc;
-  bool                  _usePhase;
-  bool                  _estTropo;
-  bool                  _useGalileo;
   QByteArray            _log;
   QFile*                _nmeaFile;
@@ -154,23 +153,7 @@
   QMap<QString, double> _windUpSum;
   QVector<pppPos*>      _posAverage;
-  double                _quickStart;
-  double                _maxSolGap;
-  double                _sigCrd0;
-  double                _sigCrdP;
-  double                _sigTrp0;
-  double                _sigTrpP;
-  double                _sigGalileoOffset0;
-  double                _sigGalileoOffsetP;
-  double                _sigL3;
-  double                _sigP3;
-  double                _sigAmb0;
-  double                _sigClk0;
-  double                _dN;
-  double                _dE;
-  double                _dU;
-  bncAntex*             _antex;
-  QString               _antennaName;
   QStringList           _outlierGPS;
   QStringList           _outlierGlo;
+  bncAntex*             _antex;
 };
 
Index: /trunk/BNC/bncpppclient.cpp
===================================================================
--- /trunk/BNC/bncpppclient.cpp	(revision 3635)
+++ /trunk/BNC/bncpppclient.cpp	(revision 3636)
@@ -66,5 +66,5 @@
 
   _staID = staID;
-  _model = new bncModel(staID);
+  _model = new bncModel(staID, _opt);
 
   connect(this, SIGNAL(newMessage(QByteArray,bool)), 
Index: /trunk/BNC/pppopt.cpp
===================================================================
--- /trunk/BNC/pppopt.cpp	(revision 3635)
+++ /trunk/BNC/pppopt.cpp	(revision 3636)
@@ -50,6 +50,6 @@
   bncSettings settings;
 
-  sigmaCode    = settingsToDouble("pppSigmaCode",    5.0);
-  sigmaPhase   = settingsToDouble("pppSigmaPhase",  0.02);
+  sigP3        = settingsToDouble("pppSigmaCode",    5.0);
+  sigL3        = settingsToDouble("pppSigmaPhase",  0.02);
   sigCrd0      = settingsToDouble("pppSigCrd0",    100.0);
   sigCrdP      = settingsToDouble("pppSigCrdP",    100.0);
@@ -65,4 +65,11 @@
   quickStart   = settingsToDouble("pppQuickStart"); 
   corrSync     = settingsToDouble("pppSync");       
+  pppAverage   = settingsToDouble("pppAverage") * 60.0;
+  if (pppAverage < 0.0) {
+    pppAverage = 0.0;
+  }
+  else if (pppAverage > 86400.0) {
+    pppAverage = 86400.0;
+  }
 
   pppCorrMount = settings.value("pppCorrMount").toString();
@@ -80,4 +87,9 @@
   if (!refCrdSet()) quickStart = 0.0;
   if (!pppMode)     corrSync   = 0.0;
+
+  sigGalileoOffset0 = 1000.0;
+  sigGalileoOffsetP =    0.0;
+  sigClk0           = 1000.0;
+  sigAmb0           = 1000.0;
 }
 
Index: /trunk/BNC/pppopt.h
===================================================================
--- /trunk/BNC/pppopt.h	(revision 3635)
+++ /trunk/BNC/pppopt.h	(revision 3636)
@@ -32,9 +32,12 @@
   t_pppOpt();
   ~t_pppOpt();
-  bool refCrdSet() {
+  bool refCrdSet() const {
     return refCrd[0] != 0.0 || refCrd[1] != 0 || refCrd[2] != 0.0;
   }
-  double  sigmaCode;
-  double  sigmaPhase;
+  bool antEccSet() const {
+    return antEccNEU[0] != 0.0 || antEccNEU[1] != 0.0 || antEccNEU[2] != 0.0;
+  }
+  double  sigL3;
+  double  sigP3;
   double  sigCrd0;
   double  sigCrdP;
@@ -46,4 +49,5 @@
   double  quickStart;
   double  corrSync;
+  double  pppAverage;
   QString pppCorrMount;
   QString nmeaFile;
@@ -56,4 +60,8 @@
   bool    useGlonass;
   bool    useGalileo;
+  double  sigGalileoOffset0;
+  double  sigGalileoOffsetP;
+  double  sigAmb0;
+  double  sigClk0;
  private:
   double settingsToDouble(const QByteArray& keyName, double defaultValue = 0.0) const;
