Index: trunk/BNC/src/RTCM/GPSDecoder.cpp
===================================================================
--- trunk/BNC/src/RTCM/GPSDecoder.cpp	(revision 4376)
+++ trunk/BNC/src/RTCM/GPSDecoder.cpp	(revision 4389)
@@ -89,2 +89,162 @@
   }
 }
+
+// 
+//////////////////////////////////////////////////////////////////////////////
+double t_obs::c1() const {
+  if (_measdata[GNSSENTRY_C1DATA]  != 0.0) return _measdata[GNSSENTRY_C1DATA];
+  if (_measdata[GNSSENTRY_C1NDATA] != 0.0) return _measdata[GNSSENTRY_C1NDATA];
+  return 0.0;
+}
+
+double t_obs::c2() const {
+  if (_measdata[GNSSENTRY_C2DATA] != 0.0) return _measdata[GNSSENTRY_C2DATA];
+  return 0.0;
+}
+
+double t_obs::c5() const {
+  if (_measdata[GNSSENTRY_C5DATA]   != 0.0) return _measdata[GNSSENTRY_C5DATA];
+  if (_measdata[GNSSENTRY_C5BDATA]  != 0.0) return _measdata[GNSSENTRY_C5BDATA];
+  if (_measdata[GNSSENTRY_C5ABDATA] != 0.0) return _measdata[GNSSENTRY_C5ABDATA];
+  return 0.0;
+}
+
+double t_obs::p1() const {
+  if (_measdata[GNSSENTRY_P1DATA] != 0.0) return _measdata[GNSSENTRY_P1DATA];
+  return 0.0;
+}
+
+double t_obs::p2() const {
+  if (_measdata[GNSSENTRY_P2DATA] != 0.0) return _measdata[GNSSENTRY_P2DATA];
+  return 0.0;
+}
+
+double t_obs::l1() const {
+  if (_measdata[GNSSENTRY_L1CDATA] != 0.0) return _measdata[GNSSENTRY_L1CDATA];
+  if (_measdata[GNSSENTRY_L1PDATA] != 0.0) return _measdata[GNSSENTRY_L1PDATA];
+  if (_measdata[GNSSENTRY_L1NDATA] != 0.0) return _measdata[GNSSENTRY_L1NDATA];
+  return 0.0;
+}
+
+double t_obs::l2() const {
+  if (_measdata[GNSSENTRY_L2CDATA] != 0.0) return _measdata[GNSSENTRY_L2CDATA];
+  if (_measdata[GNSSENTRY_L2PDATA] != 0.0) return _measdata[GNSSENTRY_L2PDATA];
+  return 0.0;
+}
+
+double t_obs::l5() const {
+  if (_measdata[GNSSENTRY_L5DATA]   != 0.0) return _measdata[GNSSENTRY_L5DATA];
+  if (_measdata[GNSSENTRY_L5BDATA]  != 0.0) return _measdata[GNSSENTRY_L5BDATA];
+  if (_measdata[GNSSENTRY_L5ABDATA] != 0.0) return _measdata[GNSSENTRY_L5ABDATA];
+  return 0.0;
+}
+
+double t_obs::s1() const {
+  if (_measdata[GNSSENTRY_S1CDATA] != 0.0) return _measdata[GNSSENTRY_S1CDATA];
+  if (_measdata[GNSSENTRY_S1PDATA] != 0.0) return _measdata[GNSSENTRY_S1PDATA];
+  if (_measdata[GNSSENTRY_S1NDATA] != 0.0) return _measdata[GNSSENTRY_S1NDATA];
+  return 0.0;
+}
+
+double t_obs::s2() const {
+  if (_measdata[GNSSENTRY_S2CDATA] != 0.0) return _measdata[GNSSENTRY_S2CDATA];
+  if (_measdata[GNSSENTRY_S2PDATA] != 0.0) return _measdata[GNSSENTRY_S2PDATA];
+  return 0.0;
+}
+
+// 
+//////////////////////////////////////////////////////////////////////////////
+std::string t_obs::entry2str(int iEntry) const {
+  if (iEntry == GNSSENTRY_C1DATA   ) return "C1";
+  if (iEntry == GNSSENTRY_L1CDATA  ) return "L1C";
+  if (iEntry == GNSSENTRY_D1CDATA  ) return "D1C";
+  if (iEntry == GNSSENTRY_S1CDATA  ) return "S1C";
+  if (iEntry == GNSSENTRY_C2DATA   ) return "C2";
+  if (iEntry == GNSSENTRY_L2CDATA  ) return "L2C";
+  if (iEntry == GNSSENTRY_D2CDATA  ) return "D2C";
+  if (iEntry == GNSSENTRY_S2CDATA  ) return "S2C";
+  if (iEntry == GNSSENTRY_P1DATA   ) return "P1";
+  if (iEntry == GNSSENTRY_L1PDATA  ) return "L1P";
+  if (iEntry == GNSSENTRY_D1PDATA  ) return "D1P";
+  if (iEntry == GNSSENTRY_S1PDATA  ) return "S1P";
+  if (iEntry == GNSSENTRY_P2DATA   ) return "P2";
+  if (iEntry == GNSSENTRY_L2PDATA  ) return "L2P";
+  if (iEntry == GNSSENTRY_D2PDATA  ) return "D2P";
+  if (iEntry == GNSSENTRY_S2PDATA  ) return "S2P";
+  if (iEntry == GNSSENTRY_C5DATA   ) return "C5";
+  if (iEntry == GNSSENTRY_L5DATA   ) return "L5";
+  if (iEntry == GNSSENTRY_D5DATA   ) return "D5";
+  if (iEntry == GNSSENTRY_S5DATA   ) return "S5";
+  if (iEntry == GNSSENTRY_C6DATA   ) return "C6";
+  if (iEntry == GNSSENTRY_L6DATA   ) return "L6";
+  if (iEntry == GNSSENTRY_D6DATA   ) return "D6";
+  if (iEntry == GNSSENTRY_S6DATA   ) return "S6";
+  if (iEntry == GNSSENTRY_C5BDATA  ) return "C5B";
+  if (iEntry == GNSSENTRY_L5BDATA  ) return "L5B";
+  if (iEntry == GNSSENTRY_D5BDATA  ) return "D5B";
+  if (iEntry == GNSSENTRY_S5BDATA  ) return "S5B";
+  if (iEntry == GNSSENTRY_C5ABDATA ) return "C5AB";
+  if (iEntry == GNSSENTRY_L5ABDATA ) return "L5AB";
+  if (iEntry == GNSSENTRY_D5ABDATA ) return "D5AB";
+  if (iEntry == GNSSENTRY_S5ABDATA ) return "S5AB";
+  if (iEntry == GNSSENTRY_CSAIFDATA) return "CSAIF";
+  if (iEntry == GNSSENTRY_LSAIFDATA) return "LSAIF";
+  if (iEntry == GNSSENTRY_DSAIFDATA) return "DSAIF";
+  if (iEntry == GNSSENTRY_SSAIFDATA) return "SSAIF";
+  if (iEntry == GNSSENTRY_C1NDATA  ) return "C1N";
+  if (iEntry == GNSSENTRY_L1NDATA  ) return "L1N";
+  if (iEntry == GNSSENTRY_D1NDATA  ) return "D1N";
+  if (iEntry == GNSSENTRY_S1NDATA  ) return "S1N";
+
+  throw "Error in t_obs::entry2str";
+}
+
+// 
+//////////////////////////////////////////////////////////////////////////////
+int t_obs::str2entry(const char* strIn) const {
+
+  string str(strIn);
+
+  if (str == "C1"   ) return GNSSENTRY_C1DATA;
+  if (str == "L1C"  ) return GNSSENTRY_L1CDATA;
+  if (str == "D1C"  ) return GNSSENTRY_D1CDATA;
+  if (str == "S1C"  ) return GNSSENTRY_S1CDATA;
+  if (str == "C2"   ) return GNSSENTRY_C2DATA;
+  if (str == "L2C"  ) return GNSSENTRY_L2CDATA;
+  if (str == "D2C"  ) return GNSSENTRY_D2CDATA;
+  if (str == "S2C"  ) return GNSSENTRY_S2CDATA;
+  if (str == "P1"   ) return GNSSENTRY_P1DATA;
+  if (str == "L1P"  ) return GNSSENTRY_L1PDATA;
+  if (str == "D1P"  ) return GNSSENTRY_D1PDATA;
+  if (str == "S1P"  ) return GNSSENTRY_S1PDATA;
+  if (str == "P2"   ) return GNSSENTRY_P2DATA;
+  if (str == "L2P"  ) return GNSSENTRY_L2PDATA;
+  if (str == "D2P"  ) return GNSSENTRY_D2PDATA;
+  if (str == "S2P"  ) return GNSSENTRY_S2PDATA;
+  if (str == "C5"   ) return GNSSENTRY_C5DATA;
+  if (str == "L5"   ) return GNSSENTRY_L5DATA;
+  if (str == "D5"   ) return GNSSENTRY_D5DATA;
+  if (str == "S5"   ) return GNSSENTRY_S5DATA;
+  if (str == "C6"   ) return GNSSENTRY_C6DATA;
+  if (str == "L6"   ) return GNSSENTRY_L6DATA;
+  if (str == "D6"   ) return GNSSENTRY_D6DATA;
+  if (str == "S6"   ) return GNSSENTRY_S6DATA;
+  if (str == "C5B"  ) return GNSSENTRY_C5BDATA;
+  if (str == "L5B"  ) return GNSSENTRY_L5BDATA;
+  if (str == "D5B"  ) return GNSSENTRY_D5BDATA;
+  if (str == "S5B"  ) return GNSSENTRY_S5BDATA;
+  if (str == "C5AB" ) return GNSSENTRY_C5ABDATA;
+  if (str == "L5AB" ) return GNSSENTRY_L5ABDATA;
+  if (str == "D5AB" ) return GNSSENTRY_D5ABDATA;
+  if (str == "S5AB" ) return GNSSENTRY_S5ABDATA;
+  if (str == "CSAIF") return GNSSENTRY_CSAIFDATA;
+  if (str == "LSAIF") return GNSSENTRY_LSAIFDATA;
+  if (str == "DSAIF") return GNSSENTRY_DSAIFDATA;
+  if (str == "SSAIF") return GNSSENTRY_SSAIFDATA;
+  if (str == "C1N"  ) return GNSSENTRY_C1NDATA;
+  if (str == "L1N"  ) return GNSSENTRY_L1NDATA;
+  if (str == "D1N"  ) return GNSSENTRY_D1NDATA;
+  if (str == "S1N"  ) return GNSSENTRY_S1NDATA;
+
+  throw "Error in t_obs::str2entry";
+}
Index: trunk/BNC/src/RTCM/GPSDecoder.h
===================================================================
--- trunk/BNC/src/RTCM/GPSDecoder.h	(revision 4376)
+++ trunk/BNC/src/RTCM/GPSDecoder.h	(revision 4389)
@@ -35,4 +35,8 @@
 #include "bncrinex.h"
 
+extern "C" {
+#include "rtcm3torinex.h"
+}
+
 class t_obs {
  public:
@@ -44,24 +48,10 @@
     GPSWeek     = 0;
     GPSWeeks    = 0.0;
-    C1          = 0.0;
-    P1          = 0.0;
-    L1C         = 0.0;
-    D1C         = 0.0;
-    S1C         = 0.0;
-    L1P         = 0.0;
-    D1P         = 0.0;
-    S1P         = 0.0;
-    C2          = 0.0;
-    P2          = 0.0;
-    L2C         = 0.0;
-    D2C         = 0.0;
-    S2C         = 0.0;
-    L2P         = 0.0;
-    D2P         = 0.0;
-    S2P         = 0.0;
-    C5          = 0.0;
-    L5          = 0.0;
-    D5          = 0.0;
-    S5          = 0.0;
+    _dataflags  = 0;
+    _dataflags2 = 0;
+    for (int iEntry = 0; iEntry < GNSSENTRY_NUMBER; iEntry++) {
+      _measdata[iEntry] = 0.0;
+      _codetype[iEntry] = 0;
+    }
     slip_cnt_L1 = -1;
     slip_cnt_L2 = -1;
@@ -71,10 +61,16 @@
   ~t_obs() {}
 
-  double p1() const {return (P1  != 0.0 ? P1  : C1);}
-  double p2() const {return (P2  != 0.0 ? P2  : C2);}
-  double l1() const {return (L1P != 0.0 ? L1P : L1C);}
-  double l2() const {return (L2P != 0.0 ? L2P : L2C);}
-  double s1() const {return (L1P != 0.0 ? S1P : S1C);}
-  double s2() const {return (L2P != 0.0 ? S2P : S2C);}
+  double c1() const;
+  double c2() const;
+  double c5() const;
+  double p1() const;
+  double p2() const;
+  double l1() const;
+  double l2() const;
+  double l5() const;
+  double s1() const;
+  double s2() const;
+  std::string entry2str(int iEntry) const;
+  int str2entry(const char* str) const;
 
   char   StatID[20+1]; // Station ID
@@ -85,37 +81,12 @@
   double GPSWeeks;     // Second of Week (GPS-Time)
 
-  double C1;           // CA-code pseudorange (meters)
-  double L1C;          // L1 carrier phase (cycles)
-  double D1C;          // Doppler L1
-  double S1C;          // raw L1 signal strength
-  bool has1C() const {return C1 != 0.0 || L1C != 0.0 || D1C != 0.0 || S1C != 0.0;}
-
-  double P1;           // P1-code pseudorange (meters)
-  double L1P;          // L1 carrier phase (cycles)
-  double D1P;          // Doppler L1
-  double S1P;          // raw L1 signal strength
-  bool has1P() const {return P1 != 0.0 || L1P != 0.0 || D1P != 0.0 || S1P != 0.0;}
-
-  double C2;           // CA-code pseudorange (meters)
-  double L2C;          // L2 carrier phase (cycles)
-  double D2C;          // Doppler L2
-  double S2C;          // raw L2 signal strength
-  bool has2C() const {return C2 != 0.0 || L2C != 0.0 || D2C != 0.0 || S2C != 0.0;}
-
-  double P2;           // P2-code pseudorange (meters)
-  double L2P;          // L2 carrier phase (cycles)
-  double D2P;          // Doppler L2
-  double S2P;          // raw L2 signal strength
-  bool has2P() const {return P2 != 0.0 || L2P != 0.0 || D2P != 0.0 || S2P != 0.0;}
-
-  double C5;           // Pseudorange (meters)
-  double L5;           // L5 carrier phase (cycles)
-  double D5;           // Doppler L5
-  double S5;           // raw L5 signal strength
-  bool has5C() const {return C5 != 0.0 || L5 != 0.0 || D5 != 0.0 || S5 != 0.0;}
-
   int    slip_cnt_L1;  // L1 cumulative loss of continuity indicator (negative value = undefined)
   int    slip_cnt_L2;  // L2 cumulative loss of continuity indicator (negative value = undefined)
   int    slip_cnt_L5;  // L5 cumulative loss of continuity indicator (negative value = undefined)
+  
+  double             _measdata[GNSSENTRY_NUMBER];  // data fields */ 
+  unsigned long long _dataflags;                   // GNSSDF_xxx */
+  unsigned int       _dataflags2;                  // GNSSDF2_xxx */
+  const char*        _codetype[GNSSENTRY_NUMBER];
 };
 
Index: trunk/BNC/src/RTCM/RTCM2Decoder.cpp
===================================================================
--- trunk/BNC/src/RTCM/RTCM2Decoder.cpp	(revision 4376)
+++ trunk/BNC/src/RTCM/RTCM2Decoder.cpp	(revision 4389)
@@ -148,9 +148,9 @@
           obs.GPSWeek       = epochWeek;
           obs.GPSWeeks      = epochSecs;
-          obs.C1            = _ObsBlock.rng_C1[iSat];
-          obs.P1            = _ObsBlock.rng_P1[iSat];
-          obs.P2            = _ObsBlock.rng_P2[iSat];
-          obs.L1P           = _ObsBlock.resolvedPhase_L1(iSat);
-          obs.L2P           = _ObsBlock.resolvedPhase_L2(iSat);
+          obs._measdata[obs.str2entry("C1")] = _ObsBlock.rng_C1[iSat];
+          obs._measdata[obs.str2entry("P1")] = _ObsBlock.rng_P1[iSat];
+          obs._measdata[obs.str2entry("P2")] = _ObsBlock.rng_P2[iSat];
+          obs._measdata[obs.str2entry("L1")] = _ObsBlock.resolvedPhase_L1(iSat);
+          obs._measdata[obs.str2entry("L2")] = _ObsBlock.resolvedPhase_L2(iSat);
 	  obs.slip_cnt_L1   = _ObsBlock.slip_L1[iSat];
 	  obs.slip_cnt_L2   = _ObsBlock.slip_L2[iSat];
@@ -368,22 +368,22 @@
 	switch (ii) {
 	case 0: // --- L1 ---
-	  new_obs->L1P = *obsVal / LAMBDA_1;
+          new_obs->_measdata[new_obs->str2entry("L1")] = *obsVal / LAMBDA_1;
 	  new_obs->slip_cnt_L1   = corr->lock1;
 	  break;
 	case 1: // --- L2 ---
-	  new_obs->L2P = *obsVal / LAMBDA_2;
+          new_obs->_measdata[new_obs->str2entry("L2")] = *obsVal / LAMBDA_2;
 	  new_obs->slip_cnt_L2   = corr->lock2;
 	  break;
 	case 2: // --- C1 / P1 ---
 	  if ( corr->Pind1 )
-	    new_obs->P1 = *obsVal;
+            new_obs->_measdata[new_obs->str2entry("P1")] = *obsVal;
 	  else
-	    new_obs->C1 = *obsVal;
+            new_obs->_measdata[new_obs->str2entry("C1")] = *obsVal;
 	  break;
 	case 3: // --- C2 / P2 ---
 	  if ( corr->Pind2 )
-	    new_obs->P2 = *obsVal;
+            new_obs->_measdata[new_obs->str2entry("P2")] = *obsVal;
 	  else
-	    new_obs->C2 = *obsVal;
+            new_obs->_measdata[new_obs->str2entry("C2")] = *obsVal;
 	  break;
 	default:
