Index: /trunk/BNC/src/PPP/pppThread.cpp
===================================================================
--- /trunk/BNC/src/PPP/pppThread.cpp	(revision 5790)
+++ /trunk/BNC/src/PPP/pppThread.cpp	(revision 5791)
@@ -162,11 +162,12 @@
   QMutexLocker locker(&_mutex);
 
+  cout << endl << "slotNewObs " << staID.data() << ' ' << obsList.size() << endl;
+
   if (string(staID.data()) != _opt->_roverName) {
     return;
   }
 
-  cout << endl << "slotNewObs " << obsList.size() << endl;
-
-  vector<t_pppSatObs*> pppSatObs;
+  // Loop over all obsevations (possible different epochs)
+  // -----------------------------------------------------
   QListIterator<t_obs> it(obsList);
   while (it.hasNext()) {
@@ -177,47 +178,70 @@
     newObs->_time.set(oldObs.GPSWeek, oldObs.GPSWeeks);
 
-    cout << newObs->_prn.toString() << ' ' << string(newObs->_time) << endl;
-
-    map<string, t_pppObs*> pppObsMap;
-    for (unsigned iEntry = 0; iEntry < GNSSENTRY_NUMBER; iEntry++) {
-      string hlp(oldObs.rnxStr(iEntry).toAscii().data());
-      if (hlp.length() == 3) {
-        char   obsType    = hlp[0];
-        string rnxType2ch = hlp.substr(1);
-        if (obsType == 'C' || obsType == 'L') {
-          t_pppObs* pppObs = 0;
-          if (pppObsMap.find(rnxType2ch) == pppObsMap.end()) {
-            pppObs                = new t_pppObs();
-            pppObsMap[rnxType2ch] = pppObs;
-            pppObs->_rnxType2ch   = rnxType2ch;
-            newObs->_obs.push_back(pppObs);
-          }
-          else {
-            pppObs = pppObsMap[rnxType2ch];
-          }
-          if      (obsType == 'C') {
-            pppObs->_code      = oldObs._measdata[iEntry];
-            pppObs->_codeValid = true;
-          }
-          else if (obsType == 'L') {
-            pppObs->_phase      = oldObs._measdata[iEntry];
-            pppObs->_phaseValid = true;
+    // Find the corresponding data epoch or create a new one
+    // -----------------------------------------------------
+    t_pppEpoData* epoData = 0;
+    deque<t_pppEpoData*>::const_iterator it;
+    for (it = _pppEpochs.begin(); it != _pppEpochs.end(); it++) {
+      if (newObs->_time == (*it)->_time) {
+        epoData = *it;
+        break;
+      }
+    }
+    if (epoData == 0) {
+      if (newObs->_time > _pppEpochs.back()->_time) {
+        epoData = new t_pppEpoData;
+        epoData->_time = newObs->_time;
+        _pppEpochs.push_back(epoData);
+      }
+    }
+
+    // Fill the new observation and add it to the corresponding epoch
+    // --------------------------------------------------------------
+    if (epoData != 0) {
+      epoData->_pppSatObs.push_back(newObs);
+      map<string, t_pppObs*> pppObsMap;
+      for (unsigned iEntry = 0; iEntry < GNSSENTRY_NUMBER; iEntry++) {
+        string hlp(oldObs.rnxStr(iEntry).toAscii().data());
+        if (hlp.length() == 3) {
+          char   obsType    = hlp[0];
+          string rnxType2ch = hlp.substr(1);
+          if (obsType == 'C' || obsType == 'L') {
+            t_pppObs* pppObs = 0;
+            if (pppObsMap.find(rnxType2ch) == pppObsMap.end()) {
+              pppObs                = new t_pppObs();
+              pppObsMap[rnxType2ch] = pppObs;
+              pppObs->_rnxType2ch   = rnxType2ch;
+              newObs->_obs.push_back(pppObs);
+            }
+            else {
+              pppObs = pppObsMap[rnxType2ch];
+            }
+            if      (obsType == 'C') {
+              pppObs->_code      = oldObs._measdata[iEntry];
+              pppObs->_codeValid = true;
+            }
+            else if (obsType == 'L') {
+              pppObs->_phase      = oldObs._measdata[iEntry];
+              pppObs->_phaseValid = true;
+            }
           }
         }
       }
     }
-
-    pppSatObs.push_back(newObs);
-  }
-
-  t_output output;
-  _pppClient->processEpoch(pppSatObs, &output);
-
-  for (unsigned ii = 0; ii < pppSatObs.size(); ii++) {
-    delete pppSatObs[ii];
-  }
-  pppSatObs.clear();
-
-  emit newMessage(QByteArray(output._log.c_str()), true);
-}
+  }
+
+  // Process the oldest epoch
+  // ------------------------
+  if (_pppEpochs.size() > 1) {
+
+    const vector<t_pppSatObs*>& pppSatObs = _pppEpochs.front()->_pppSatObs;
+
+    t_output output;
+    _pppClient->processEpoch(pppSatObs, &output);
+
+    delete _pppEpochs.front(); _pppEpochs.pop_front();
     
+    emit newMessage(QByteArray(output._log.c_str()), true);
+  }
+}
+    
Index: /trunk/BNC/src/PPP/pppThread.h
===================================================================
--- /trunk/BNC/src/PPP/pppThread.h	(revision 5790)
+++ /trunk/BNC/src/PPP/pppThread.h	(revision 5791)
@@ -2,4 +2,5 @@
 #define PPPTHREAD_H
 
+#include <deque>
 #include <vector>
 #include <QtCore>
@@ -10,4 +11,16 @@
 
 namespace BNC {
+
+class t_pppEpoData {
+ public:
+  t_pppEpoData() {}
+  ~t_pppEpoData() {
+    for (unsigned ii = 0; ii < _pppSatObs.size(); ii++) {
+      delete _pppSatObs[ii];
+    }
+  }
+  bncTime                   _time;
+  std::vector<t_pppSatObs*> _pppSatObs;
+};
 
 class t_pppRun : public QObject {
@@ -28,7 +41,8 @@
 
  private:
-  QMutex           _mutex;
-  const t_options* _opt;
-  t_pppClient*     _pppClient;
+  QMutex                    _mutex;
+  const t_options*          _opt;
+  t_pppClient*              _pppClient;
+  std::deque<t_pppEpoData*> _pppEpochs;
 };
 
