From 57ea8cf5bad39016348605aad0d9f01156a5e527 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sergi=20Hern=C3=A0ndez=20Juan?= <shernand@iri.upc.edu>
Date: Thu, 4 Feb 2016 07:22:43 +0000
Subject: [PATCH] Made available the GPS RAW subframes needed to compute the
 Ephemeris.

---
 src/asterx1_gps.cpp          |  2 +-
 src/asterx1_process.cpp      | 24 +++++++++++++++++++++++-
 src/asterx1_process.h        |  4 +++-
 src/examples/testasterx1.cpp |  3 ++-
 src/gps_types.h              | 11 +++++++++--
 5 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/src/asterx1_gps.cpp b/src/asterx1_gps.cpp
index ef62b30..79f4b92 100644
--- a/src/asterx1_gps.cpp
+++ b/src/asterx1_gps.cpp
@@ -700,7 +700,7 @@ void CasteRx1::process_gps_raw_ca(unsigned char *data,unsigned short int length)
   for(i=0;i<10;i++)
     new_frame.frame_bits[i]=gps_raw_ca.nav_bits[i];
   this->gps_raw_frames.push(new_frame);
-  this->event_server->set_event(new_gps_raw_block_event_id);
+  this->event_server->set_event(this->new_gps_raw_block_event_id);
   this->nav_access.exit();
 }
 
diff --git a/src/asterx1_process.cpp b/src/asterx1_process.cpp
index 17cf690..5e04d15 100644
--- a/src/asterx1_process.cpp
+++ b/src/asterx1_process.cpp
@@ -64,8 +64,19 @@ void CAsteRx1Process::generate_gps_nav(gpstk::EngEphemeris &ephemeris,TGPSNav &g
   }
 }
 
+unsigned int CAsteRx1Process::get_subframe_id(TGPSFrame &frame)
+{
+  unsigned long int SFword2=(unsigned long int)frame.frame_bits[1];
+  SFword2&=0x00000700;// Strip all but three bit subframe ID
+  SFword2>>=8;// Right shift to move to lsbs;
+
+  return SFword2;
+}
+
 void CAsteRx1Process::add_subframe(TGPSFrame &frame)
 {
+  TGPSFrames gps_frames;
+  unsigned int i=0,j=0;
   TGPSNav gps_nav;
 
   try{
@@ -87,7 +98,16 @@ void CAsteRx1Process::add_subframe(TGPSFrame &frame)
         // process the data and build a GPSNav structure
         this->generate_gps_nav(this->ephemeris_data[frame.sat_id].ephemeris,gps_nav);
         gps_nav.local_timestamp=frame.local_timestamp;
+        gps_frames.wn=this->ephemeris_data[frame.sat_id].ephemeris.weeknum;
+        gps_frames.sat_id=this->ephemeris_data[frame.sat_id].ephemeris.PRNID;
+        gps_frames.track_id=this->ephemeris_data[frame.sat_id].ephemeris.tracker;
+        for(i=0;i<3;i++)
+        {
+          for(j=0;j<10;j++)
+            gps_frames.subframes[i][j]=this->ephemeris_data[frame.sat_id].ephemeris.subframeStore[i][j];
+        }
         this->gps_nav_data.push(gps_nav);
+        this->gps_raw_data.push(gps_frames);
       }
     }
   }catch(gpstk::InvalidParameter &e){
@@ -107,12 +127,14 @@ bool CAsteRx1Process::is_new_gps_nav_data_available(void)
     return false;
 }
 
-void CAsteRx1Process::get_gps_nav_data(TGPSNav &gps_nav)
+void CAsteRx1Process::get_gps_nav_data(TGPSNav &gps_nav,TGPSFrames &frames)
 {
   if(this->gps_nav_data.size()>0)
   {
     gps_nav=this->gps_nav_data.front();
     this->gps_nav_data.pop();
+    frames=this->gps_raw_data.front();
+    this->gps_raw_data.pop();
   }
 }
 
diff --git a/src/asterx1_process.h b/src/asterx1_process.h
index ef73f3f..6a3df10 100644
--- a/src/asterx1_process.h
+++ b/src/asterx1_process.h
@@ -16,13 +16,15 @@ class CAsteRx1Process
   private:
     std::vector<TEphemerisData> ephemeris_data;
     std::queue<TGPSNav> gps_nav_data;
+    std::queue<TGPSFrames> gps_raw_data;
   protected:
     void generate_gps_nav(gpstk::EngEphemeris &ephemeris,TGPSNav &gps_nav);
   public:
     CAsteRx1Process();
+    static unsigned int get_subframe_id(TGPSFrame &frame);
     void add_subframe(TGPSFrame &frame);
     bool is_new_gps_nav_data_available(void);
-    void get_gps_nav_data(TGPSNav &gps_nav);
+    void get_gps_nav_data(TGPSNav &gps_nav,TGPSFrames &frames);
     ~CAsteRx1Process();
 };
 
diff --git a/src/examples/testasterx1.cpp b/src/examples/testasterx1.cpp
index b9c93a7..4decdaa 100644
--- a/src/examples/testasterx1.cpp
+++ b/src/examples/testasterx1.cpp
@@ -40,6 +40,7 @@ int main(int argc, char **argv)
   #ifdef HAVE_GPSTK
     CAsteRx1Process gps_process;
     TGPSFrame gps_frame;
+    TGPSFrames gps_frames;
     TGPSNav gps_nav;
   #else
     TGPSNav gps_nav;
@@ -81,7 +82,7 @@ int main(int argc, char **argv)
           gps_process.add_subframe(gps_frame);
           if(gps_process.is_new_gps_nav_data_available())
           {
-            gps_process.get_gps_nav_data(gps_nav);
+            gps_process.get_gps_nav_data(gps_nav,gps_frames);
             std::cout << gps_nav << std::endl;
           }
         }
diff --git a/src/gps_types.h b/src/gps_types.h
index 8078923..d106dac 100644
--- a/src/gps_types.h
+++ b/src/gps_types.h
@@ -2,12 +2,12 @@
 #define _GPS_TYPES_H
 
 // global satellite information
-typedef struct{
+typedef struct {
   unsigned int tow;
   unsigned short int wnc;
 }TBlockTimeStamp;
 
-typedef struct{
+typedef struct {
   TBlockTimeStamp gps_timestamp;
   double local_timestamp;
   long int frame_bits[10];
@@ -16,6 +16,13 @@ typedef struct{
   short int track_id;
 }TGPSFrame;
 
+typedef struct {
+  long int subframes[3][10];
+  int wn;
+  short int sat_id;
+  short int track_id;
+}TGPSFrames;
+
 // User data structures
 typedef enum {elev_setting=0,elev_rising=1,elev_unknown=3} rise_set_t;
 
-- 
GitLab