Index: trunk/BNC/src/bncephuser.cpp
===================================================================
--- trunk/BNC/src/bncephuser.cpp	(revision 4783)
+++ trunk/BNC/src/bncephuser.cpp	(revision 4784)
@@ -268,2 +268,84 @@
   return success;
 }
+
+// 
+////////////////////////////////////////////////////////////////////////////
+t_irc t_bias::readLine(const QString& line) {
+
+  if (line[0] == '!') {
+    return failure;
+  }
+
+  QTextStream in(line.toAscii());
+
+  int messageType;
+  in >> messageType;
+
+  if (messageType != BTYPE_GPS && messageType != BTYPE_GLONASS) {
+    return failure;
+  }
+
+  int     updateInterval;
+  int     GPSweek;
+  double  GPSweeks;
+  int     numBiases;
+  in >> updateInterval >> GPSweek >> GPSweeks >> _prn >> numBiases;
+  
+  _time.set(GPSweek, GPSweeks);
+
+  for (int ii = 0; ii < numBiases; ii++) {
+    int    bType;
+    double bValue;
+    in >> bType >> bValue;
+    if      (bType == CODETYPEGPS_L1_CA) {
+      _value["1C"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L1_P) {
+      _value["1P"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L1_Z) {
+      _value["1W"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L2_CA) {
+      _value["2C"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_SEMI_CODELESS) {
+      _value["2N"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L2_CM) {
+      _value["2M"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L2_CL) {
+      _value["2L"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L2_CML) {
+      _value["2X"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L2_P) {
+      _value["2P"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L2_Z) {
+      _value["2W"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L5_I) {
+      _value["5I"] = bValue;
+    }
+    else if (bType == CODETYPEGPS_L5_Q) {
+      _value["5Q"] = bValue;
+    }
+    else if (bType == CODETYPEGLONASS_L1_CA) {
+      _value["1C"] = bValue;
+    }
+    else if (bType == CODETYPEGLONASS_L1_P) {
+      _value["1P"] = bValue;
+    }
+    else if (bType == CODETYPEGLONASS_L2_CA) {
+      _value["2C"] = bValue;
+    }
+    else if (bType == CODETYPEGLONASS_L2_P) {
+      _value["2P"] = bValue;
+    }
+  }
+
+  return success;
+}
Index: trunk/BNC/src/bncephuser.h
===================================================================
--- trunk/BNC/src/bncephuser.h	(revision 4783)
+++ trunk/BNC/src/bncephuser.h	(revision 4784)
@@ -87,4 +87,22 @@
 };
 
+class t_bias {
+ public:
+  t_bias() {}
+  ~t_bias() {}
+  t_irc readLine(const QString& line);
+  double value(const QByteArray& rnxStr) const {
+    if (_value.contains(rnxStr)) {
+      return _value[rnxStr];
+    }
+    else {
+      return 0.0;
+    }
+  }
+  QString                  _prn;
+  bncTime                  _time;
+  QMap<QByteArray, double> _value;
+};
+
 class bncEphUser : public QObject {
  Q_OBJECT
Index: trunk/BNC/src/bncpppclient.cpp
===================================================================
--- trunk/BNC/src/bncpppclient.cpp	(revision 4783)
+++ trunk/BNC/src/bncpppclient.cpp	(revision 4784)
@@ -157,70 +157,43 @@
   }
 
-  // Set Observations GPS
-  // --------------------
-  if      (obs.satSys == 'G') {
-    double C1 = obs.measdata("C1C", 3.0);
-    double P1 = obs.measdata("C1P", 3.0);
-    double P2 = obs.measdata("C2P", 3.0);
-    double L1 = obs.measdata("L1P", 3.0); if (L1 == 0.0) L1 = obs.measdata("L1C", 3.0);
-    double L2 = obs.measdata("L2P", 3.0); if (L2 == 0.0) L2 = obs.measdata("L2C", 3.0);
-    if ( (C1 || P1) && P2 && L1 && L2 ) {
-      double f1 = t_CST::freq1;
-      double f2 = t_CST::freq2;
-      double c1 =   f1 * f1 / (f1 * f1 - f2 * f2);
-      double c2 = - f2 * f2 / (f1 * f1 - f2 * f2);
-      if (P1) {
-        satData->P1 = P1 + (bb ? bb->p1 : 0.0);
-      }
-      else {
-        satData->P1 = C1 + (bb ? bb->c1 : 0.0);
-      }
-      satData->P2 = P2 + (bb ? bb->p2 : 0.0);
-
-      satData->L1      = L1 * t_CST::c / f1;
-      satData->L2      = L2 * t_CST::c / f2;
-      satData->P3      = c1 * satData->P1 + c2 * satData->P2;
-      satData->L3      = c1 * satData->L1 + c2 * satData->L2;
-      satData->lambda3 = c1 * t_CST::c / f1 + c2 * t_CST::c / f2;
-
-      _epoData.back()->satData[satData->prn] = satData;
-    }
-    else {
-      delete satData;
-    }
-  }
-
-  // Set Observations GLONASS
-  // ------------------------
-  else if (obs.satSys == 'R') {
-    double C1 = obs.measdata("C1C", 3.0);
-    double P1 = obs.measdata("C1P", 3.0);
-    double C2 = obs.measdata("C2C", 3.0);
-    double P2 = obs.measdata("C2P", 3.0);
-    double L1 = obs.measdata("L1P", 3.0); if (L1 == 0.0) L1 = obs.measdata("L1C", 3.0);
-    double L2 = obs.measdata("L2P", 3.0); if (L2 == 0.0) L2 = obs.measdata("L2C", 3.0);
-    if ( (P1 || C1) && (P2 || P2) && L1 && L2 ) {
-      double f1 = t_CST::f1(obs.satSys, obs.slotNum); 
-      double f2 = t_CST::f2(obs.satSys, obs.slotNum); 
-      double c1 =   f1 * f1 / (f1 * f1 - f2 * f2);
-      double c2 = - f2 * f2 / (f1 * f1 - f2 * f2);
-      if (P1) {
-        satData->P1 = P1 + (bb ? bb->p1 : 0.0);
-      }
-      else {
-        satData->P1 = C1 + (bb ? bb->c1 : 0.0);
-      }
-      if (P2) {
-        satData->P2 = P2 + (bb ? bb->p2 : 0.0);
-      }
-      else {
-        satData->P2 = C2;
-      }
-      satData->L1      = L1 * t_CST::c / f1;
-      satData->L2      = L2 * t_CST::c / f2;
-      satData->P3      = c1 * satData->P1 + c2 * satData->P2;
-      satData->L3      = c1 * satData->L1 + c2 * satData->L2;
-      satData->lambda3 = c1 * t_CST::c / f1 + c2 * t_CST::c / f2;
-
+  // Set Observations GPS and Glonass
+  // --------------------------------
+  if      (obs.satSys == 'G' || obs.satSys == 'R') {
+    const QByteArray preferedTypes("WPC");
+    for (int ii = preferedTypes.length()-1; ii >= 0; ii--) {
+      double p1 = obs.measdata("C1" + preferedTypes[ii], 3.0);
+      if (p1 != 0.0) {
+        satData->P1 = p1;
+        if (bb) {
+          satData->P1 += bb->value("1" + preferedTypes[ii]);
+        }
+      } 
+      double p2 = obs.measdata("C2" + preferedTypes[ii], 3.0);
+      if (p2 != 0.0) {
+        satData->P2 = p2;
+        if (bb) {
+          satData->P1 += bb->value("2" + preferedTypes[ii]);
+        }
+      } 
+      double l1 = obs.measdata("L1" + preferedTypes[ii], 3.0);
+      if (l1 != 0.0) {
+        satData->L1 = l1;
+      } 
+      double l2 = obs.measdata("L2" + preferedTypes[ii], 3.0);
+      if (l2 != 0.0) {
+        satData->L2 = l2;
+      } 
+    }
+    if (satData->P1 != 0.0 && satData->P2 != 0.0 && 
+        satData->L1 != 0.0 && satData->L2 != 0.0 ) {
+      double f1 = t_CST::f1(obs.satSys, obs.slotNum);
+      double f2 = t_CST::f2(obs.satSys, obs.slotNum);
+      double a1 =   f1 * f1 / (f1 * f1 - f2 * f2);
+      double a2 = - f2 * f2 / (f1 * f1 - f2 * f2);
+      satData->L1      = satData->L1 * t_CST::c / f1;
+      satData->L2      = satData->L2 * t_CST::c / f2;
+      satData->P3      = a1 * satData->P1 + a2 * satData->P2;
+      satData->L3      = a1 * satData->L1 + a2 * satData->L2;
+      satData->lambda3 = a1 * t_CST::c / f1 + a2 * t_CST::c / f2;
       _epoData.back()->satData[satData->prn] = satData;
     }
@@ -233,21 +206,19 @@
   // ------------------------
   else if (obs.satSys == 'E') {
-    double C1 = obs.measdata("C1", 3.0);
-    double L1 = obs.measdata("L1", 3.0);
-    double C5 = obs.measdata("C5", 3.0);
-    double L5 = obs.measdata("L5", 3.0);
-    if ( C1 && C5 && L1 && L5) {
+    satData->P1 = obs.measdata("C1", 3.0);
+    satData->L1 = obs.measdata("L1", 3.0);
+    satData->P5 = obs.measdata("C5", 3.0);
+    satData->L5 = obs.measdata("L5", 3.0);
+    if (satData->P1 != 0.0 && satData->P5 != 0.0 && 
+        satData->L1 != 0.0 && satData->L5 != 0.0 ) {
       double f1 = t_CST::freq1;
       double f5 = t_CST::freq5;
-      double c1 =   f1 * f1 / (f1 * f1 - f5 * f5);
-      double c5 = - f5 * f5 / (f1 * f1 - f5 * f5);
-
-      satData->P1      = C1;
-      satData->P5      = C5;
-      satData->L1      = L1 * t_CST::c / f1;
-      satData->L5      = L5 * t_CST::c / f5;
-      satData->P3      = c1 * satData->P1 + c5 * satData->P5;
-      satData->L3      = c1 * satData->L1 + c5 * satData->L5;
-      satData->lambda3 = c1 * t_CST::c / f1 + c5 * t_CST::c / f5;
+      double a1 =   f1 * f1 / (f1 * f1 - f5 * f5);
+      double a5 = - f5 * f5 / (f1 * f1 - f5 * f5);
+      satData->L1      = satData->L1 * t_CST::c / f1;
+      satData->L5      = satData->L5 * t_CST::c / f5;
+      satData->P3      = a1 * satData->P1 + a5 * satData->P5;
+      satData->L3      = a1 * satData->L1 + a5 * satData->L5;
+      satData->lambda3 = a1 * t_CST::c / f1 + a5 * t_CST::c / f5;
       _epoData.back()->satData[satData->prn] = satData;
     }
@@ -303,10 +274,8 @@
         _corr[prn] = cc;
       }
-
       cc->readLine(line);
       _corr_tt = cc->tClk;
     }
-    else if ( messageType == BTYPE_GPS ) { 
-
+    else if ( messageType == BTYPE_GPS || messageType == BTYPE_GLONASS ) { 
       t_bias* bb = 0;
       if (_bias.contains(prn)) {
@@ -317,23 +286,5 @@
         _bias[prn] = bb;
       }
-
-      bb->tt.set(GPSweek, GPSweeks);
-
-      int numBiases;
-      in >> numBiases;
-      for (int ii = 0; ii < numBiases; ++ii) {
-        int    bType;
-        double bValue;
-	in >> bType >> bValue;
-        if      (bType ==  CODETYPEGPS_L1_Z) {
-          bb->p1 = bValue;
-	}
-        else if (bType ==  CODETYPEGPS_L1_CA) {
-          bb->c1 = bValue;
-	}
-        else if (bType == CODETYPEGPS_L2_Z) {
-          bb->p2 = bValue;
-	}
-      }
+      bb->readLine(line);
     }
   }
Index: trunk/BNC/src/bncpppclient.h
===================================================================
--- trunk/BNC/src/bncpppclient.h	(revision 4783)
+++ trunk/BNC/src/bncpppclient.h	(revision 4784)
@@ -37,4 +37,12 @@
   t_satData() {
     obsIndex = 0;
+    P1 = 0.0;
+    P2 = 0.0;
+    P5 = 0.0;
+    P3 = 0.0;
+    L1 = 0.0;
+    L2 = 0.0;
+    L5 = 0.0;
+    L3 = 0.0;
   }
   ~t_satData() {}
@@ -105,17 +113,4 @@
 };
 
-class t_bias {
- public:
-  t_bias() {
-    p1 = 0.0;
-    p2 = 0.0;
-    c1 = 0.0;
-  }
-  bncTime tt;
-  double  p1;
-  double  p2;
-  double  c1;
-};
-
 class bncPPPclient : public bncEphUser {
  Q_OBJECT
