From b20087184304d6f29d72cd5606ac20274dacaf8a Mon Sep 17 00:00:00 2001
From: PepMS <jmarti@iri.upc.edu>
Date: Mon, 11 May 2020 09:01:09 +0200
Subject: [PATCH] [refactor] added receiver base class

---
 CMakeLists.txt                                |  4 +-
 .../{ublox_raw.h => receiver_raw_base.h}      | 33 +++++-----
 .../gnss_utils/{ => receivers}/novatel_raw.h  | 11 ++--
 include/gnss_utils/receivers/ublox_raw.h      | 22 +++++++
 src/novatel_raw.cpp                           |  0
 src/receiver_raw_base.cpp                     | 34 ++++++++++
 src/receivers/novatel_raw.cpp                 | 66 +++++++++++++++++++
 src/{ => receivers}/ublox_raw.cpp             | 31 ++-------
 8 files changed, 151 insertions(+), 50 deletions(-)
 rename include/gnss_utils/{ublox_raw.h => receiver_raw_base.h} (56%)
 rename include/gnss_utils/{ => receivers}/novatel_raw.h (74%)
 create mode 100644 include/gnss_utils/receivers/ublox_raw.h
 delete mode 100644 src/novatel_raw.cpp
 create mode 100644 src/receiver_raw_base.cpp
 create mode 100644 src/receivers/novatel_raw.cpp
 rename src/{ => receivers}/ublox_raw.cpp (72%)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b3beddc..9ec32ee 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -85,7 +85,9 @@ SET(SOURCES
     src/navigation.cpp
     src/snapshot.cpp
     src/tdcp.cpp
-    src/ublox_raw.cpp)
+    src/receiver_raw_base.cpp
+    src/receivers/ublox_raw.cpp
+    src/receivers/novatel_raw.cpp)
 
 SET(RTKLIB_SRC
     ${RTKLIB_SRC_DIR}/pntpos.c
diff --git a/include/gnss_utils/ublox_raw.h b/include/gnss_utils/receiver_raw_base.h
similarity index 56%
rename from include/gnss_utils/ublox_raw.h
rename to include/gnss_utils/receiver_raw_base.h
index f03bb73..61db460 100644
--- a/include/gnss_utils/ublox_raw.h
+++ b/include/gnss_utils/receiver_raw_base.h
@@ -1,11 +1,12 @@
-#ifndef INCLUDE_GNSS_UTILS_UBLOX_RAW_H_
-#define INCLUDE_GNSS_UTILS_UBLOX_RAW_H_
+#ifndef INCLUDE_GNSS_UTILS_RECEIVER_RAW_BASE_H_
+#define INCLUDE_GNSS_UTILS_RECEIVER_RAW_BASE_H_
 
 #include "gnss_utils/observations.h"
 #include "gnss_utils/navigation.h"
 
 namespace GnssUtils
 {
+
 enum RawDataType : int
 {
   NO       = 0,
@@ -20,45 +21,43 @@ enum RawDataType : int
   ERROR    = -1
 };
 
-class UBloxRaw
+class ReceiverRawAbstract
 {
 public:
-  UBloxRaw();
-  ~UBloxRaw();
+  ReceiverRawAbstract();
+  ~ReceiverRawAbstract();
 
-  RawDataType addDataStream(const std::vector<u_int8_t>& data_stream);
+  virtual RawDataType addDataStream(const std::vector<uint8_t>& data_stream) = 0;
 
   const Observations& getObservations();
   const Navigation&   getNavigation();
 
   RawDataType getRawDataType() const;
 
-private:
-  raw_t raw_data_;
-
-  Observations obs_;
-  Navigation   nav_;
+protected:
+  void updateObservations();
 
+  raw_t       raw_data_;
   RawDataType raw_data_type_;
 
-  void updateObservations();
+  Observations obs_;
+  Navigation   nav_;
 };
 
-inline const Observations& UBloxRaw::getObservations()
+inline const Observations& ReceiverRawAbstract::getObservations()
 {
   return obs_;
 }
 
-inline const Navigation& UBloxRaw::getNavigation()
+inline const Navigation& ReceiverRawAbstract::getNavigation()
 {
   return nav_;
 }
 
-inline RawDataType UBloxRaw::getRawDataType() const
+inline RawDataType ReceiverRawAbstract::getRawDataType() const
 {
   return raw_data_type_;
 }
 
 }  // namespace GnssUtils
-
-#endif  // INCLUDE_GNSS_UTILS_UBLOX_RAW_H_
+#endif
diff --git a/include/gnss_utils/novatel_raw.h b/include/gnss_utils/receivers/novatel_raw.h
similarity index 74%
rename from include/gnss_utils/novatel_raw.h
rename to include/gnss_utils/receivers/novatel_raw.h
index cb907ff..522cf8c 100644
--- a/include/gnss_utils/novatel_raw.h
+++ b/include/gnss_utils/receivers/novatel_raw.h
@@ -1,8 +1,7 @@
 #ifndef INCLUDE_GNSS_UTILS_NOVATEL_RAW_H_
 #define INCLUDE_GNSS_UTILS_NOVATEL_RAW_H_
 
-#include "gnss_utils/observations.h"
-#include "gnss_utils/navigation.h"
+#include "gnss_utils/receiver_raw_base.h"
 
 namespace GnssUtils
 {
@@ -12,7 +11,7 @@ public:
   NovatelRaw();
   ~NovatelRaw();
 
-  
+  RawDataType addDataStream(const std::vector<uint8_t>& data_stream);
 
 private:
   raw_t raw_data_;
@@ -20,10 +19,10 @@ private:
   Observations obs_;
   Navigation   nav_;
 
-  RawDataType raw_data_type_;
-
   void updateObservations();
-}
+
+  RawDataType raw_data_type_;
+};
 } // namespace GnssUtils
 
 #endif
\ No newline at end of file
diff --git a/include/gnss_utils/receivers/ublox_raw.h b/include/gnss_utils/receivers/ublox_raw.h
new file mode 100644
index 0000000..a1ba0c6
--- /dev/null
+++ b/include/gnss_utils/receivers/ublox_raw.h
@@ -0,0 +1,22 @@
+#ifndef INCLUDE_GNSS_UTILS_UBLOX_RAW_H_
+#define INCLUDE_GNSS_UTILS_UBLOX_RAW_H_
+
+#include "gnss_utils/receiver_raw_base.h"
+
+namespace GnssUtils
+{
+class UBloxRaw : public ReceiverRawAbstract
+{
+public:
+  UBloxRaw();
+  ~UBloxRaw();
+
+  RawDataType addDataStream(const std::vector<uint8_t>& data_stream);
+
+private:
+
+};
+
+}  // namespace GnssUtils
+
+#endif  // INCLUDE_GNSS_UTILS_UBLOX_RAW_H_
diff --git a/src/novatel_raw.cpp b/src/novatel_raw.cpp
deleted file mode 100644
index e69de29..0000000
diff --git a/src/receiver_raw_base.cpp b/src/receiver_raw_base.cpp
new file mode 100644
index 0000000..1e28ca9
--- /dev/null
+++ b/src/receiver_raw_base.cpp
@@ -0,0 +1,34 @@
+#include "gnss_utils/receiver_raw_base.h"
+
+namespace GnssUtils
+{
+ReceiverRawAbstract::ReceiverRawAbstract() : raw_data_type_(NO)
+{
+  if (init_raw(&raw_data_, STRFMT_UBX) == 0)
+  {
+    assert("Failed when allocating memory for raw_t");
+    return;
+  }
+}
+
+ReceiverRawAbstract::~ReceiverRawAbstract()
+{
+  free_raw(&raw_data_);
+}
+
+void ReceiverRawAbstract::updateObservations()
+{
+  // sort and remove duplicated observations
+  sortobs(&raw_data_.obs);
+  // std::cout << "---------------------------JUST BEFORE!-------------------" << std::endl;
+  // obs_.print();
+
+  obs_.clearObservations();
+  for (int ii = 0; ii < raw_data_.obs.n; ++ii)
+    obs_.addObservation(raw_data_.obs.data[ii]);
+
+  // std::cout << "--------------------------JUST AFTER!---------------------" << std::endl;
+  // obs_.print();
+}
+
+}  // namespace GnssUtils
\ No newline at end of file
diff --git a/src/receivers/novatel_raw.cpp b/src/receivers/novatel_raw.cpp
new file mode 100644
index 0000000..93cacf4
--- /dev/null
+++ b/src/receivers/novatel_raw.cpp
@@ -0,0 +1,66 @@
+#include "gnss_utils/receivers/novatel_raw.h"
+
+using namespace GnssUtils;
+
+NovatelRaw::NovatelRaw() : raw_data_type_(NO)
+{
+}
+
+NovatelRaw::~NovatelRaw()
+{
+}
+
+RawDataType NovatelRaw::addDataStream(const std::vector<uint8_t>& data_stream)
+{
+ 
+ for (auto data_byte = data_stream.begin(); data_byte != data_stream.end(); ++data_byte)
+  {
+    raw_data_type_ = input_oem4(&raw_data_, (unsigned char)*data_byte);
+
+    switch (raw_data_type_)
+    {
+      case NO:  //
+        // std::cout << "0 received!\n";
+        break;
+
+      case OBS:  // Observations
+        std::cout << "Observations Novatel received!\n";
+        break;
+
+      case NAV_EPH:  // Ephemeris
+        std::cout << "Ephemeris received!\n";
+        // std::cout << "Ephemeris copied!\n";
+        break;
+
+      case NAV_SBAS:  // SBAS
+        std::cout << "SBAS received!\n";
+        // std::cout << "SBAS added!\n";
+        break;
+
+      case NAV_ALM:  // Almanac and ion/utc parameters
+        std::cout << "Almanac and ion/utc parameters received!\n";
+        // std::cout << "Almanac freed!\n";
+        break;
+
+      // Not handled messages
+      case NAV_ANT:
+        std::cout << "UBloxRaw: Received antenna postion parameters. Not handled.\n";
+        break;
+      case NAV_DGPS:
+        std::cout << "UBloxRaw: Received dgps correction. Not handled.\n";
+        break;
+      case NAV_SSR:
+        std::cout << "UBloxRaw: Received ssr message. Not handled.\n";
+        break;
+      case NAV_LEX:
+        std::cout << "UBloxRaw: Received lex message. Not handled.\n";
+        break;
+      case ERROR:
+        std::cout << "UBloxRaw: Received error message. Not handled.\n";
+        break;
+      default:
+        std::cout << "UBloxRaw: Received unknown message. Not handled.\n";
+        break;
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/ublox_raw.cpp b/src/receivers/ublox_raw.cpp
similarity index 72%
rename from src/ublox_raw.cpp
rename to src/receivers/ublox_raw.cpp
index 7c12df5..e3529ee 100644
--- a/src/ublox_raw.cpp
+++ b/src/receivers/ublox_raw.cpp
@@ -1,22 +1,16 @@
-#include "gnss_utils/ublox_raw.h"
+#include "gnss_utils/receivers/ublox_raw.h"
 
 using namespace GnssUtils;
 
-UBloxRaw::UBloxRaw() : raw_data_type_(NO)
+UBloxRaw::UBloxRaw()
 {
-  if (init_raw(&raw_data_, STRFMT_UBX) == 0)
-  {
-    assert("Failed when allocating memory for raw_t");
-    return;
-  }
-};
+}
 
 UBloxRaw::~UBloxRaw()
 {
-  free_raw(&raw_data_);
-};
+}
 
-RawDataType UBloxRaw::addDataStream(const std::vector<u_int8_t>& data_stream)
+RawDataType UBloxRaw::addDataStream(const std::vector<uint8_t>& data_stream)
 {
   // Update type based on RTKLIB
   for (auto data_byte = data_stream.begin(); data_byte != data_stream.end(); ++data_byte)
@@ -81,18 +75,3 @@ RawDataType UBloxRaw::addDataStream(const std::vector<u_int8_t>& data_stream)
 
   return raw_data_type_;
 }
-
-void UBloxRaw::updateObservations()
-{
-  // sort and remove duplicated observations
-  sortobs(&raw_data_.obs);
-  // std::cout << "---------------------------JUST BEFORE!-------------------" << std::endl;
-  // obs_.print();
-
-  obs_.clearObservations();
-  for (int ii = 0; ii < raw_data_.obs.n; ++ii)
-    obs_.addObservation(raw_data_.obs.data[ii]);
-
-  // std::cout << "--------------------------JUST AFTER!---------------------" << std::endl;
-  // obs_.print();
-}
-- 
GitLab