Index: trunk/BNC/RTCM3/RTCM3Decoder.cpp
===================================================================
--- trunk/BNC/RTCM3/RTCM3Decoder.cpp	(revision 688)
+++ trunk/BNC/RTCM3/RTCM3Decoder.cpp	(revision 689)
@@ -72,4 +72,7 @@
 
   const int LEAPSECONDS = 14; /* only needed for approx. time */
+
+// Ensure, that the Decoder uses the "old" convention for the data structure for Rinex2. Perlt
+  _Parser.rinex3 = 0;
 
   time_t tim;
@@ -133,6 +136,9 @@
             for (int jj = 0; jj < _Parser.numdatatypesGPS; jj++) {
               int v = 0;
-              int df = _Parser.dataflag[jj];
-              int pos = _Parser.datapos[jj];
+// sepearated declaration and initalization of df and pos. Perlt
+              int df;
+              int pos;
+              df = _Parser.dataflag[jj];
+              pos = _Parser.datapos[jj];
               if ( (_Parser.Data.dataflags[ii] & df)
                    && !isnan(_Parser.Data.measdata[ii][pos])
@@ -154,15 +160,16 @@
               else
               {
-                if      (_Parser.dataflag[jj] & GNSSDF_C1DATA) {
-                  obs->_o.C1 = _Parser.Data.measdata[ii][_Parser.datapos[jj]];
-                }
-                else if (_Parser.dataflag[jj] & GNSSDF_C2DATA) {
-                  obs->_o.C2 = _Parser.Data.measdata[ii][_Parser.datapos[jj]];
-                }
-                else if (_Parser.dataflag[jj] & GNSSDF_P1DATA) {
-                  obs->_o.P1 = _Parser.Data.measdata[ii][_Parser.datapos[jj]];
-                }
-                else if (_Parser.dataflag[jj] & GNSSDF_P2DATA) {
-                  obs->_o.P2 = _Parser.Data.measdata[ii][_Parser.datapos[jj]];
+// variables df and pos are used consequently. Perlt
+                if      (df & GNSSDF_C1DATA) {
+                  obs->_o.C1 = _Parser.Data.measdata[ii][pos];
+                }
+                else if (df & GNSSDF_C2DATA) {
+                  obs->_o.C2 = _Parser.Data.measdata[ii][pos];
+                }
+                else if (df & GNSSDF_P1DATA) {
+                  obs->_o.P1 = _Parser.Data.measdata[ii][pos];
+                }
+                else if (df & GNSSDF_P2DATA) {
+                  obs->_o.P2 = _Parser.Data.measdata[ii][pos];
                 }
                 else if (df & (GNSSDF_L1CDATA|GNSSDF_L1PDATA)) {
Index: trunk/BNC/RTCM3/rtcm3torinex.c
===================================================================
--- trunk/BNC/RTCM3/rtcm3torinex.c	(revision 688)
+++ trunk/BNC/RTCM3/rtcm3torinex.c	(revision 689)
@@ -1,5 +1,5 @@
 /*
   Converter for RTCM3 data to RINEX.
-  $Id: rtcm3torinex.c,v 1.25 2007/10/25 09:37:42 stoecker Exp $
+  $Id: rtcm3torinex.c,v 1.8 2007/10/28 08:50:37 mervart Exp $
   Copyright (C) 2005-2006 by Dirk Stoecker <stoecker@alberding.eu>
 
@@ -51,5 +51,5 @@
 
 /* CVS revision and version */
-static char revisionstr[] = "$Revision: 1.25 $";
+static char revisionstr[] = "$Revision: 1.8 $";
 
 #ifndef COMPILEDATE
@@ -846,7 +846,100 @@
 }
 
+// Inserted parts for BNC Perlt
+#ifdef NO_RTCM3_MAIN
+#define NUMSTARTSKIP 1
+#else
 #define NUMSTARTSKIP 3
+#endif
+
 void HandleHeader(struct RTCM3ParserData *Parser)
 {
+#ifdef NO_RTCM3_MAIN
+// Part of Handle Header for data request for BNC (independently on actually delivered data), original is commented out by ifndef NO_RTCM3_MAIN. Perlt
+  int i;
+  if(Parser->rinex3)
+  {
+#define CHECKFLAGSNEW(a, b, c) \
+    { \
+      Parser->dataflag##a[Parser->numdatatypes##a] = GNSSDF_##b##DATA; \
+      Parser->datapos##a[Parser->numdatatypes##a] = GNSSENTRY_##b##DATA; \
+      ++Parser->numdatatypes##a; \
+    }
+
+    CHECKFLAGSNEW(GPS, C1,  C1C)
+    CHECKFLAGSNEW(GPS, L1C, L1C)
+    CHECKFLAGSNEW(GPS, D1C, D1C)
+    CHECKFLAGSNEW(GPS, S1C, S1C)
+    CHECKFLAGSNEW(GPS, P1,  C1P)
+    CHECKFLAGSNEW(GPS, L1P, L1P)
+    CHECKFLAGSNEW(GPS, D1P, D1P)
+    CHECKFLAGSNEW(GPS, S1P, S1P)
+    CHECKFLAGSNEW(GPS, P2,  C2P)
+    CHECKFLAGSNEW(GPS, L2P, L2P)
+    CHECKFLAGSNEW(GPS, D2P, D2P)
+    CHECKFLAGSNEW(GPS, S2P, S2P)
+    CHECKFLAGSNEW(GPS, C2,  C2X)
+    CHECKFLAGSNEW(GPS, L2C, L2X)
+    CHECKFLAGSNEW(GPS, D2C, D2X)
+    CHECKFLAGSNEW(GPS, S2C, S2X)
+    CHECKFLAGSNEW(GLO, C1,  C1C)
+    CHECKFLAGSNEW(GLO, L1C, L1C)
+    CHECKFLAGSNEW(GLO, D1C, D1C)
+    CHECKFLAGSNEW(GLO, S1C, S1C)
+    CHECKFLAGSNEW(GLO, P1,  C1P)
+    CHECKFLAGSNEW(GLO, L1P, L1P)
+    CHECKFLAGSNEW(GLO, D1P, D1P)
+    CHECKFLAGSNEW(GLO, S1P, S1P)
+    CHECKFLAGSNEW(GLO, P2,  C2P)
+    CHECKFLAGSNEW(GLO, L2P, L2P)
+    CHECKFLAGSNEW(GLO, D2P, D2P)
+    CHECKFLAGSNEW(GLO, S2P, S2P)
+    CHECKFLAGSNEW(GLO, C2,  C2C)
+    CHECKFLAGSNEW(GLO, L2C, L2C)
+    CHECKFLAGSNEW(GLO, D2C, D2C)
+    CHECKFLAGSNEW(GLO, S2C, S2C)
+
+  }
+  else
+  {
+#define CHECKFLAGS(a, b) \
+    { \
+      if(data[RINEXENTRY_##b##DATA]) \
+      { \
+        Parser->dataflagGPS[data[RINEXENTRY_##b##DATA]-1] = GNSSDF_##a##DATA; \
+        Parser->dataposGPS[data[RINEXENTRY_##b##DATA]-1] = GNSSENTRY_##a##DATA; \
+      } \
+      else \
+      { \
+        Parser->dataflag[Parser->numdatatypesGPS] = GNSSDF_##a##DATA; \
+        Parser->datapos[Parser->numdatatypesGPS] = GNSSENTRY_##a##DATA; \
+        data[RINEXENTRY_##b##DATA] = ++Parser->numdatatypesGPS; \
+      } \
+    }
+
+    int data[RINEXENTRY_NUMBER];
+    for(i = 0; i < RINEXENTRY_NUMBER; ++i) data[i] = 0;
+
+    CHECKFLAGS(C1,C1)
+    CHECKFLAGS(C2,C2)
+    CHECKFLAGS(P1,P1)
+    CHECKFLAGS(P2,P2)
+    CHECKFLAGS(L1C,L1)
+    CHECKFLAGS(L1P,L1)
+    CHECKFLAGS(L2C,L2)
+    CHECKFLAGS(L2P,L2)
+    CHECKFLAGS(D1C,D1)
+    CHECKFLAGS(D1P,D1)
+    CHECKFLAGS(D2C,D2)
+    CHECKFLAGS(D2P,D2)
+    CHECKFLAGS(S1C,S1)
+    CHECKFLAGS(S1P,S1)
+    CHECKFLAGS(S2C,S2)
+    CHECKFLAGS(S2P,S2)
+  }
+// End Part of Handle Header for BNC Perlt
+#endif
+
+#ifndef NO_RTCM3_MAIN
   struct HeaderData hdata;
   char thebuffer[MAXHEADERBUFFERSIZE];
@@ -1139,5 +1232,4 @@
   }
 
-#ifndef NO_RTCM3_MAIN
   for(i = 0; i < hdata.numheaders; ++i)
   {
@@ -1536,5 +1628,5 @@
 
 #ifndef NO_RTCM3_MAIN
-static char datestr[]     = "$Date: 2007/10/25 09:37:42 $";
+static char datestr[]     = "$Date: 2007/10/28 08:50:37 $";
 
 /* The string, which is send as agent in HTTP request */
Index: trunk/BNC/bncrinex.cpp
===================================================================
--- trunk/BNC/bncrinex.cpp	(revision 688)
+++ trunk/BNC/bncrinex.cpp	(revision 689)
@@ -404,7 +404,8 @@
       else if (line.indexOf("# / TYPES OF OBSERV") != -1) {
         if (_rinexVers == 3) {
-          _out << "G    6 C1C L1C S1C C2P L2P S2P                              SYS / # / OBS TYPES" << endl;
-          _out << "R    6 C1C L1C S1C C2P L2P S2P                              SYS / # / OBS TYPES" << endl;
-          _out << "S    6 C1C L1C S1C C2P L2P S2P                              SYS / # / OBS TYPES" << endl;
+// Changed declaration of data types, consistent with Rinex3 Perlt  
+          _out << "G   10 C1C C1P L1C S1C C2X C2P L2X S2X L2P S2P              SYS / # / OBS TYPES" << endl;
+          _out << "R   10 C1C C1P L1C S1C C2C C2P L2C S2C L2P S2P              SYS / # / OBS TYPES" << endl;
+          _out << "S    3 C1C L1C S1C                                          SYS / # / OBS TYPES" << endl;
         }
         else { 
@@ -420,4 +421,15 @@
                       _mountPoint.path())).leftJustified(60, ' ', true);
         _out << hlp.toAscii().data() << "COMMENT" << endl;
+      }
+// Added header line for Rinex3 regarding mandatory MARKER TYPE field Perlt
+      else if (line.indexOf("MARKER NAME") != -1) {
+        if (_rinexVers == 3) {
+          _out << line.toAscii().data() << endl;
+          _out << setw(71) << "GEODETIC                                                    MARKER TYPE" << endl;
+        } 
+        else {
+          _out << line.toAscii().data() << endl;
+        }
+// End
       }
       else {
@@ -447,4 +459,9 @@
     _out.setf(ios::left);
     _out << setw(60) << _statID.data()                               << "MARKER NAME"          << endl;
+// Added header line for Rinex3 regarding mandatory MARKER TYPE field Perlt
+    if (_rinexVers == 3) {
+      _out << setw(60) << "unknown"                                  << "MARKER TYPE      "    << endl;
+    }
+// End
     _out << setw(60) << "unknown             unknown"                << "OBSERVER / AGENCY"    << endl;
     _out << setw(20) << "unknown"    
@@ -464,7 +481,8 @@
          << "                  "                                     << "ANTENNA: DELTA H/E/N" << endl;
     if (_rinexVers == 3) {
-      _out << "G    6 C1C L1C S1C C2P L2P S2P                              SYS / # / OBS TYPES" << endl;
-      _out << "R    6 C1C L1C S1C C2P L2P S2P                              SYS / # / OBS TYPES" << endl;
-      _out << "S    6 C1C L1C S1C C2P L2P S2P                              SYS / # / OBS TYPES" << endl;
+// Changed declaration of data types, consistent with Rinex3 Perlt  
+      _out << "G   10 C1C C1P L1C S1C C2X C2P L2X S2X L2P S2P              SYS / # / OBS TYPES" << endl;
+      _out << "R   10 C1C C1P L1C S1C C2C C2P L2C S2C L2P S2P              SYS / # / OBS TYPES" << endl;
+      _out << "S    3 C1C L1C S1C                                          SYS / # / OBS TYPES" << endl;
 
     }
@@ -545,4 +563,5 @@
   // ---------------
   if (_rinexVers == 3) {
+    char sbasflag = 'S';
     _out << datTim.toString("> yyyy MM dd hh mm ").toAscii().data()
          << setw(10) << setprecision(7) << sec
@@ -552,15 +571,38 @@
     while (it.hasNext()) {
       p_obs obs = it.next();
+// Changed data output, C1P, C2C|X, L2C|X, S2C|X added. Changed Output for SBAS Perlt  
+      if (sbasflag != obs->_o.satSys) {
       _out << obs->_o.satSys 
            << setw(2) << setfill('0') << obs->_o.satNum << setfill(' ')
            << setw(14) << setprecision(3) << obs->_o.C1 << "  "  
+           << setw(14) << setprecision(3) << obs->_o.P1 << "  "  
            << setw(14) << setprecision(3) << obs->_o.L1 << " " 
            << setw(1)                     << obs->_o.SNR1
            << setw(14) << setprecision(3) << obs->_o.S1 << "  " 
-           << setw(14) << setprecision(3) << obs->_o.P2 << "  " 
-           << setw(14) << setprecision(3) << obs->_o.L2 << " " 
-           << setw(1)                     << obs->_o.SNR2
-           << setw(14) << setprecision(3) << obs->_o.S2
-           << endl;
+           << setw(14) << setprecision(3) << obs->_o.C2 << "  "  
+           << setw(14) << setprecision(3) << obs->_o.P2 << "  " ;
+      if ((obs->_o.C2 != 0.0) && (obs->_o.P2 == 0.0)) {
+       _out << setw(14) << setprecision(3) << obs->_o.L2 << " " 
+            << setw(1)                     << obs->_o.SNR2
+            << setw(14) << setprecision(3) << obs->_o.S2 << "  "
+            << "                              ";
+      }
+      else {
+       _out << "                                " 
+            << setw(14) << setprecision(3) << obs->_o.L2 << " " 
+            << setw(1)                     << obs->_o.SNR2
+            << setw(14) << setprecision(3) << obs->_o.S2;
+      } 
+      _out << endl;
+      }
+      else {
+      _out << obs->_o.satSys 
+           << setw(2) << setfill('0') << obs->_o.satNum << setfill(' ')
+           << setw(14) << setprecision(3) << obs->_o.C1 << "  "  
+           << setw(14) << setprecision(3) << obs->_o.P1 << "  "  
+           << setw(14) << setprecision(3) << obs->_o.L1 << " " 
+           << setw(1)                     << obs->_o.SNR1
+           << setw(14) << setprecision(3) << obs->_o.S1 << endl; 
+      }
       delete obs;
     }
Index: trunk/BNC/bncwindow.cpp
===================================================================
--- trunk/BNC/bncwindow.cpp	(revision 688)
+++ trunk/BNC/bncwindow.cpp	(revision 689)
@@ -607,5 +607,4 @@
 
     getThread->start();
-    _mountPointsTable->setSortingEnabled(true);
   }
 }
