diff --git a/include/gnss_utils/gnss_utils.h b/include/gnss_utils/gnss_utils.h index d6429ef7f3ea39318ce1248285ea0d6373677248..cbbaa5ee3dfbbad5fb6ba6a15cf9c69dbaf9d221 100644 --- a/include/gnss_utils/gnss_utils.h +++ b/include/gnss_utils/gnss_utils.h @@ -56,6 +56,7 @@ namespace GNSSUtils double *resp, char *msg); Eigen::Vector3d ecefToLatLon(const Eigen::Vector3d & _ecef); + Eigen::Vector3d latLonToEcef(const Eigen::Vector3d & _latlon); double computeSatElevation(const Eigen::Vector3d& receiver_ecef, const Eigen::Vector3d& sat_ecef); diff --git a/include/gnss_utils/navigation.h b/include/gnss_utils/navigation.h index d93ed0fe4c1715c3ee11bada887674e452dade2f..f448a53268191d131a010eedae9a6a47ab61e96a 100644 --- a/include/gnss_utils/navigation.h +++ b/include/gnss_utils/navigation.h @@ -5,7 +5,6 @@ #include <iostream> #include <memory> - extern "C" { #include "rtklib.h" @@ -13,50 +12,53 @@ extern "C" namespace GNSSUtils { - class Navigation - { +class Navigation +{ public: - // Constructor & Destructor - Navigation(); - ~Navigation(); + // Constructor & Destructor + Navigation(); + ~Navigation(); - // Public objects + // Public objects - // Public methods + // Public methods - void clearNavigation(); + void clearNavigation(); - void setNavigation(nav_t nav); + void setNavigation(nav_t nav); + void loadFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt = 0.0, const char* opt = ""); - const nav_t & getNavigation() const; - nav_t & getNavigation(); + const nav_t & getNavigation() const; + nav_t & getNavigation(); - /****************** Array memory management ******************/ + /****************** Array memory management ******************/ + // Ephemeris + bool addEphemeris(const eph_t& eph); + bool addGLONASSEphemeris(const geph_t& geph); + bool addSBASEphemeris(const seph_t& seph); + bool addAlmanac(const alm_t& alm); + //void allocateEphemeris(int n_sat = MAXSAT); + //void deleteEphemeris(); - // Ephemeris - void allocateEphemeris(int n_sat = MAXSAT); - void deleteEphemeris(); + //void allocateGLONASSEphemeris(int n_sat = NSATGLO); + //void deleteGLONASSEphemeris(); - void allocateGLONASSEphemeris(int n_sat = NSATGLO); - void deleteGLONASSEphemeris(); + //void allocateSBASEphemeris(int n_sat = NSATSBS*2); //SBAS + //void deleteSBASEphemeris(); - void allocateSBASEphemeris(int n_sat = NSATSBS*2); //SBAS - void deleteSBASEphemeris(); - - void allocateAlmanac(int n_sat = MAXSAT); - void deleteAlmanac(); - void print(); + //void allocateAlmanac(int n_sat = MAXSAT); + //void deleteAlmanac(); + void print(); private: - // rtklib-like attribute to represent the different navigation msgs for a given epoch - nav_t nav_; - - // Private methods + // rtklib-like attribute to represent the different navigation msgs for a given epoch + nav_t nav_; + // Private methods +}; - }; } #endif diff --git a/include/gnss_utils/observations.h b/include/gnss_utils/observations.h index 3e7f56e1b116f1d5680680d78f728cdd9e00c8dc..9c72e9d00dbf91e0a453461710fe70f123a36b2d 100644 --- a/include/gnss_utils/observations.h +++ b/include/gnss_utils/observations.h @@ -32,6 +32,7 @@ class Observations void clearObservations(); void addObservation(const obsd_t & obs); + void loadFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt=0.0, const char* opt=""); void removeObservationByIdx(const int& _idx); void removeObservationBySat(const int& _sat); diff --git a/src/examples/gnss_utils_test.cpp b/src/examples/gnss_utils_test.cpp index 829192b42efaa91ce47317b7d5faabecf9eb6a43..92970a4de850872b3dade941f1219d331efa106c 100644 --- a/src/examples/gnss_utils_test.cpp +++ b/src/examples/gnss_utils_test.cpp @@ -1,5 +1,6 @@ #include "gnss_utils/observations.h" #include "gnss_utils/navigation.h" +#include "gnss_utils/gnss_utils.h" #include <typeinfo> @@ -15,7 +16,7 @@ extern "C" using namespace GNSSUtils; -int createObsAndNav(Observations* observations, char* obs_path, Navigation* navigation, char* nav_path) +int createObsAndNav(Observations& observations, const char* obs_path, Navigation& navigation, const char* nav_path) { // Time double ts_d[] = {2018, 5, 17, 14, 1, 2}; @@ -27,17 +28,19 @@ int createObsAndNav(Observations* observations, char* obs_path, Navigation* nav double tint = 0.1; // Create options container - char* opt = "-SYS=G"; + const char* opt = "-SYS=G"; // Create receiver identifier int rcv = 1; // Create object types - rnxopt_t rnx_opt; +// rnxopt_t rnx_opt; // Create obsd_t object to hold the observations obs_t obs; obs.data = (obsd_t *) malloc(sizeof(obsd_t)*MAXSAT); + obs.n = 0; + obs.nmax = MAXSAT; /* header */ std::cout << "------------" << std::endl; @@ -47,34 +50,29 @@ int createObsAndNav(Observations* observations, char* obs_path, Navigation* nav if (readrnx(obs_path, rcv, opt, &obs, NULL, NULL)) { sortobs(&obs); - obs.data[0].P[0] = 21597659.275; - obs.data[1].P[0] = 22348322.550; - obs.data[2].P[0] = 20873167.574; - obs.data[3].P[0] = 20920707.830; + //obs.data[0].P[0] = 21597659.275; + //obs.data[1].P[0] = 22348322.550; + //obs.data[2].P[0] = 20873167.574; + //obs.data[3].P[0] = 20920707.830; std::cout << "Obs number: " << obs.n << std::endl; - - } - - else { std::cout << "Couldn't load provided observation file" << std::endl; return 0; } - - for (int i=0; i < obs.n; i++) { std::cout << "time: " << time_str(obs.data[i].time, 3) << " | sat: " << int(obs.data[i].sat) << " | rcv: " << int(obs.data[i].rcv) << " | SNR: " << int(obs.data[i].SNR[0]) << " | LLI: " << int(obs.data[i].LLI[0]) << " | code: " << int(obs.data[i].code[0]) << " | L: " << obs.data[i].L[0] << " | P: " << obs.data[i].P[0] << " | D: " << obs.data[i].D[0] << std::endl; - observations->addObservation(obs.data[i]); + observations.addObservation(obs.data[i]); } free(obs.data); + observations.print(); /* header */ std::cout << "----------" << std::endl; @@ -82,17 +80,17 @@ int createObsAndNav(Observations* observations, char* obs_path, Navigation* nav std::cout << "----------" << std::endl; /* Load _nav attribute into nav variable */ - nav_t nav = navigation->getNavigation(); + //nav_t nav = navigation.getNavigation(); - if (readrnx(nav_path, rcv, opt, NULL, &nav, NULL)) + if (readrnx(nav_path, 1, opt, NULL, &navigation.getNavigation(), NULL)) { std::cout << "Navigation file loaded." << std::endl; - std::cout << "GPS satellites in navigation file: " << nav.n << std::endl; - std::cout << "GLONASS satellites in navigation file: " << nav.ng << std::endl; - std::cout << "SBAS satellites in navigation file: " << nav.ns << std::endl; - std::cout << "Almanac satellites in navigation file: " << nav.na << std::endl; - uniqnav(&nav); + std::cout << "GPS satellites in navigation file: " << navigation.getNavigation().n << std::endl; + std::cout << "GLONASS satellites in navigation file: " << navigation.getNavigation().ng << std::endl; + std::cout << "SBAS satellites in navigation file: " << navigation.getNavigation().ns << std::endl; + std::cout << "Almanac satellites in navigation file: " << navigation.getNavigation().na << std::endl; + uniqnav(&navigation.getNavigation()); } @@ -104,30 +102,45 @@ int createObsAndNav(Observations* observations, char* obs_path, Navigation* nav /* Print Constellation Satellites ids */ - for (int i=0;i<nav.n;i++) + for (int i=0;i<navigation.getNavigation().n;i++) { - std::cout << i << " GPS Sat Id: " << nav.eph[i].sat << std::endl; + std::cout << i << " GPS Sat Id: " << navigation.getNavigation().eph[i].sat << std::endl; } - for (int i=0;i<nav.ng;i++) + for (int i=0;i<navigation.getNavigation().ng;i++) { - std::cout << i << " GLONASS Sat Id: " << nav.geph[i].sat << std::endl; + std::cout << i << " GLONASS Sat Id: " << navigation.getNavigation().geph[i].sat << std::endl; } - for (int i=0;i<nav.ns;i++) + for (int i=0;i<navigation.getNavigation().ns;i++) { - std::cout << i << " SBAS Sat Id: " << nav.seph[i].sat << std::endl; + std::cout << i << " SBAS Sat Id: " << navigation.getNavigation().seph[i].sat << std::endl; } /* Load nav into Navigation object*/ - navigation->setNavigation(nav); + //navigation.setNavigation(nav); std::cout << "Navigation message loaded to Navigation class." << std::endl; return 1; } + +void createObsAndNavNew(Observations& observations, const std::string& obs_path, Navigation& navigation, const std::string& nav_path) +{ + gtime_t t_start{0,0}; // no limit + gtime_t t_end{0,0}; // no limit + double dt = 0.0; // no limit + const char* opt = "-SYS=G"; // only GPS | GPS+GAL: "-SYS=G,L" | ALL: "" + + observations.loadFromRinex(obs_path, t_start, t_end, dt, opt); + observations.print(); + + navigation.loadFromRinex(nav_path, t_start, t_end, dt, opt); + navigation.print(); +} + int main(int argc, char *argv[]) { /* header */ @@ -137,16 +150,13 @@ int main(int argc, char *argv[]) // create Observations object - Observations observations; + Observations observations, observations2; // create Navigation object - Navigation navigation; - - createObsAndNav(&observations, "../src/examples/raw_201805171357.obs", &navigation, "../src/examples/raw_201805171357.nav"); + Navigation navigation,navigation2; - nav_t nav = navigation.getNavigation(); - - std::cout << "Navigation eph number " << nav.n << std::endl; + createObsAndNav(observations, "../src/examples/raw_201805171357.obs", navigation, "../src/examples/raw_201805171357.nav"); + createObsAndNavNew(observations2, "../src/examples/raw_201805171357.obs", navigation2, "../src/examples/raw_201805171357.nav"); /* Set processing options */ @@ -160,19 +170,20 @@ int main(int argc, char *argv[]) prcopt.soltype = 0; prcopt.nf = 1; prcopt.navsys = SYS_GPS; - //prcopt.elmin = 1.05; // 60 degrees = 1.05 rad + prcopt.elmin = 0.525; // 60 degrees = 1.05 rad prcopt.sateph = EPHOPT_BRDC; prcopt.ionoopt = IONOOPT_OFF; prcopt.tropopt = TROPOPT_OFF; prcopt.dynamics = 0; prcopt.tidecorr = 0; prcopt.sbascorr = SBSOPT_FCORR; - prcopt.ru[0] = 4789374.0336; - prcopt.ru[1] = 177048.3292; - prcopt.ru[2] = 4194542.6444; + prcopt.ru[0] = 0;//4789374.0336; + prcopt.ru[1] = 0;//177048.3292; + prcopt.ru[2] = 0;//4194542.6444; std::cout << "Processing options defined" << std::endl; + Eigen::Vector3d lla_gt(41.383293114*M_PI/180.0, 2.116101115*M_PI/180.0, -91.6641); //Compute spp @@ -187,8 +198,9 @@ int main(int argc, char *argv[]) char msg[128]=""; - std::vector<obsd_t> obs = observations.getObservations(); + std::cout << "OBS1:\n"; + std::vector<obsd_t> obs = observations.getObservations(); for (int i=0; i < obs.size(); i++) { std::cout << "time: " << time_str(obs[i].time, 3) << " | sat: " << int(obs[i].sat) << " | rcv: " << int(obs[i].rcv) << @@ -198,12 +210,37 @@ int main(int argc, char *argv[]) std::cout << "obs.size(): " << obs.size() << std::endl; - stat = pntpos(&obs[0], obs.size(), &nav, &prcopt, &solb, NULL, NULL, msg); + stat = pntpos(&obs[0], obs.size(), &navigation.getNavigation(), &prcopt, &solb, NULL, NULL, msg); + + std::cout << "msg: " << msg << std::endl; + + std::cout << "sol.stat: " << int(solb.stat) << std::endl; + + std::cout << "Position: " << solb.rr[0] << ", " << solb.rr[1] << ", " << solb.rr[2] << std::endl; + std::cout << "Position GT: " << latLonToEcef(lla_gt).transpose() << std::endl; + std::cout << "Position LLA: " << ecefToLatLon(Eigen::Vector3d(solb.rr[0],solb.rr[1],solb.rr[2])).transpose() << std::endl; + std::cout << "Position GT LLA: " << lla_gt.transpose() << std::endl; + + std::cout << "OBS2:\n"; + std::vector<obsd_t> obs2 = observations2.getObservations(); + for (int i=0; i < obs2.size(); i++) + { + std::cout << "time: " << time_str(obs2[i].time, 3) << " | sat: " << int(obs2[i].sat) << " | rcv: " << int(obs2[i].rcv) << + " | SNR: " << int(obs2[i].SNR[0]) << " | LLI: " << int(obs2[i].LLI[0]) << " | code: " << int(obs2[i].code[0]) << + " | L: " << obs2[i].L[0] << " | P: " << obs2[i].P[0] << " | D: " << obs2[i].D[0] << std::endl; + } + + std::cout << "obs2.size(): " << obs2.size() << std::endl; + + stat = pntpos(&obs2[0], obs2.size(), &navigation.getNavigation(), &prcopt, &solb, NULL, NULL, msg); std::cout << "msg: " << msg << std::endl; - std::cout << "sol.stat: " << solb.stat << std::endl; + std::cout << "sol.stat: " << int(solb.stat) << std::endl; std::cout << "Position: " << solb.rr[0] << ", " << solb.rr[1] << ", " << solb.rr[2] << std::endl; + std::cout << "Position GT: " << latLonToEcef(lla_gt).transpose() << std::endl; + std::cout << "Position LLA: " << ecefToLatLon(Eigen::Vector3d(solb.rr[0],solb.rr[1],solb.rr[2])).transpose() << std::endl; + std::cout << "Position GT LLA: " << lla_gt.transpose() << std::endl; } diff --git a/src/gnss_utils.cpp b/src/gnss_utils.cpp index c7b69bc3fa6cb1ac8a061477ad8ab614efa0926b..ff9621aa036998d61c1003aaaf5626376a7fa7b2 100644 --- a/src/gnss_utils.cpp +++ b/src/gnss_utils.cpp @@ -255,6 +255,14 @@ Eigen::Vector3d ecefToLatLon(const Eigen::Vector3d & _ecef) return pos; } +Eigen::Vector3d latLonToEcef(const Eigen::Vector3d & _pos) +{ + Eigen::Vector3d ecef; + pos2ecef(_pos.data(), ecef.data()); + + return ecef; +} + double computeSatElevation(const Eigen::Vector3d& receiver_ecef, const Eigen::Vector3d& sat_ecef) { // ecef 2 geodetic diff --git a/src/navigation.cpp b/src/navigation.cpp index d53cf51287ae59572b4885aa0fba47cf0420dbe4..f9326b7fbddd9a36dcb92e841e2a2be79e27d27c 100644 --- a/src/navigation.cpp +++ b/src/navigation.cpp @@ -6,24 +6,24 @@ using namespace GNSSUtils; Navigation::Navigation() { - allocateEphemeris(0); - allocateGLONASSEphemeris(0); - allocateSBASEphemeris(0); - allocateAlmanac(0); +// allocateEphemeris(0); +// allocateGLONASSEphemeris(0); +// allocateSBASEphemeris(0); +// allocateAlmanac(0); } Navigation::~Navigation() { clearNavigation(); - //free(_nav); } void Navigation::clearNavigation() { - deleteEphemeris(); - deleteGLONASSEphemeris(); - deleteSBASEphemeris(); - deleteAlmanac(); + freenav(&nav_,255); +// deleteEphemeris(); +// deleteGLONASSEphemeris(); +// deleteSBASEphemeris(); +// deleteAlmanac(); } void Navigation::setNavigation(nav_t _nav) @@ -42,56 +42,157 @@ nav_t & Navigation::getNavigation() return nav_; } - -/****************** Array memory management ******************/ -void Navigation::allocateEphemeris(int n_sat) -{ - eph_t eph0 ={0,-1,-1}; - int i; - nav_.eph = (eph_t *) malloc(sizeof(eph_t)*n_sat); - for (i=0;i<n_sat;i++) nav_.eph[i] = eph0; -} -void Navigation::deleteEphemeris() +void Navigation::loadFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt, const char* opt) { - free(nav_.eph); + auto stat = readrnxt(rnx_file.c_str(), 1, t_start, t_end, dt, opt, NULL, &nav_, NULL); + if (stat == 0) + { + std::cout << "Navigation file loaded." << std::endl; + std::cout << "GPS satellites in navigation file: " << nav_.n << std::endl; + std::cout << "GLONASS satellites in navigation file: " << nav_.ng << std::endl; + std::cout << "SBAS satellites in navigation file: " << nav_.ns << std::endl; + std::cout << "Almanac satellites in navigation file: " << nav_.na << std::endl; + uniqnav(&nav_); + } + else + std::cout << "Couldn't load provided observation file, reason: " << (stat == 0 ? "no data" : "error") << std::endl; } -void Navigation::allocateGLONASSEphemeris(int n_sat) +bool Navigation::addEphemeris(const eph_t& eph) { - geph_t geph0={0,-1}; - int i; - nav_.geph = (geph_t *)malloc(sizeof(geph_t)*n_sat); + // "inspired" from RTKLIB rinex.c + eph_t *nav_eph; + + if (nav_.nmax<=nav_.n) { + nav_.nmax+=1024; + if (!(nav_eph=(eph_t *)realloc(nav_.eph,sizeof(eph_t)*nav_.nmax))) { + printf("addEphemeris malloc error: n=%d\n",nav_.nmax); + free(nav_.eph); nav_.eph=NULL; nav_.n=nav_.nmax=0; + return false; + } + nav_.eph=nav_eph; + } + nav_.eph[nav_.n++]=eph; + return true; } -void Navigation::deleteGLONASSEphemeris() +bool Navigation::addGLONASSEphemeris(const geph_t& geph) { - free(nav_.geph); + // "inspired" from RTKLIB rinex.c + geph_t *nav_geph; + + if (nav_.ngmax<=nav_.ng) { + nav_.ngmax+=1024; + if (!(nav_geph=(geph_t *)realloc(nav_.geph,sizeof(geph_t)*nav_.ngmax))) { + printf("addGLONASSEphemeris malloc error: n=%d\n",nav_.ngmax); + free(nav_.geph); nav_.geph=NULL; nav_.ng=nav_.ngmax=0; + return false; + } + nav_.geph=nav_geph; + } + nav_.geph[nav_.ng++]=geph; + return true; } - -void Navigation::allocateSBASEphemeris(int n_sat) +bool Navigation::addSBASEphemeris(const seph_t& seph) { - seph_t seph0={0}; - int i; - - nav_.seph = (seph_t *)malloc(sizeof(seph_t)*n_sat); - for (i=0; i<n_sat; i++) nav_.seph[i] = seph0; + // "inspired" from RTKLIB rinex.c + seph_t *nav_seph; + + if (nav_.nsmax<=nav_.ns) { + nav_.nsmax+=1024; + if (!(nav_seph=(seph_t *)realloc(nav_.seph,sizeof(seph_t)*nav_.nsmax))) { + printf("addSBASEphemeris malloc error: n=%d\n",nav_.nsmax); + free(nav_.seph); nav_.seph=NULL; nav_.ns=nav_.nsmax=0; + return false; + } + nav_.seph=nav_seph; + } + nav_.seph[nav_.ns++]=seph; + return true; } -void Navigation::deleteSBASEphemeris() +bool Navigation::addAlmanac(const alm_t& alm) { - free(nav_.seph); + // "inspired" from RTKLIB rinex.c + alm_t *nav_alm; + + if (nav_.namax<=nav_.na) { + nav_.namax+=1024; + if (!(nav_alm=(alm_t *)realloc(nav_.alm,sizeof(alm_t)*nav_.namax))) { + printf("addAlmanac malloc error: n=%d\n",nav_.namax); + free(nav_.alm); nav_.alm=NULL; nav_.na=nav_.namax=0; + return false; + } + nav_.alm=nav_alm; + } + nav_.alm[nav_.na++]=alm; + return true; } -void Navigation::allocateAlmanac(int n_sat) -{ - alm_t alm0 ={0,-1}; - int i; - - nav_.alm = (alm_t *)malloc(sizeof(alm_t)*n_sat); - for (i=0; i<n_sat; i++) nav_.alm[i] = alm0; -} -void Navigation::deleteAlmanac() -{ - free(nav_.alm); -} +/****************** Array memory management ******************/ +//void Navigation::allocateEphemeris(int n_sat) +//{ +// eph_t eph0 ={0,-1,-1}; +// int i; +// nav_.eph = (eph_t *) malloc(sizeof(eph_t)*n_sat); +// for (i=0;i<n_sat;i++) nav_.eph[i] = eph0; +//} +//void Navigation::deleteEphemeris() +//{ +// std::cout << "Navigation::deleteEphemeris...\n"; +// free(nav_.eph); +// nav_.eph =NULL; +// nav_.n = 0; +// nav_.nmax =0; +// std::cout << "deleted!\n"; +//} + +//void Navigation::allocateGLONASSEphemeris(int n_sat) +//{ +// geph_t geph0={0,-1}; +// int i; +// nav_.geph = (geph_t *)malloc(sizeof(geph_t)*n_sat); +//} +//void Navigation::deleteGLONASSEphemeris() +//{ +// std::cout << "Navigation::deleteGLONASSEphemeris...\n"; +// free(nav_.geph); +// nav_.geph =NULL; +// nav_.ng = 0; +// nav_.ngmax =0; +// std::cout << "deleted!\n"; +//} + +//void Navigation::allocateSBASEphemeris(int n_sat) +//{ +// seph_t seph0={0}; +// int i; +// +// nav_.seph = (seph_t *)malloc(sizeof(seph_t)*n_sat); +// for (i=0; i<n_sat; i++) nav_.seph[i] = seph0; +//} +//void Navigation::deleteSBASEphemeris() +//{ +// std::cout << "Navigation::deleteSBASEphemeris...\n"; +// free(nav_.seph); +// nav_.seph =NULL; +// nav_.ns = 0; +// nav_.nsmax =0; +// std::cout << "deleted!\n"; +//} + +//void Navigation::allocateAlmanac(int n_sat) +//{ +// alm_t alm0 ={0,-1}; +// int i; +// +// nav_.alm = (alm_t *)malloc(sizeof(alm_t)*n_sat); +// for (i=0; i<n_sat; i++) nav_.alm[i] = alm0; +//} +//void Navigation::deleteAlmanac() +//{ +// std::cout << "Navigation::deleteAlmanac...\n"; +// free(nav_.alm); +// std::cout << "deleted!\n"; +//} void Navigation::print() { diff --git a/src/observations.cpp b/src/observations.cpp index 3ac4ee43fcba98225ce52878877372cbae484243..59d1dfb0020c5f9ad42aa0a7599f2ee183d8d16b 100644 --- a/src/observations.cpp +++ b/src/observations.cpp @@ -29,11 +29,39 @@ void Observations::addObservation(const obsd_t & obs) sat_2_idx_[obs.sat] = obs_.size()-1; } +void Observations::loadFromRinex(const std::string& rnx_file, gtime_t t_start, gtime_t t_end, double dt, const char* opt) +{ + obs_t obs; + obs.data = (obsd_t *) malloc(sizeof(obsd_t)*MAXSAT); + obs.n = 0; + obs.nmax = MAXSAT; + + //const char* opt = ""; + auto stat = readrnxt(rnx_file.c_str(), 1, t_start, t_end, dt, opt, &obs, NULL, NULL); + if (stat == 1) + sortobs(&obs); + else + { + std::cout << "Couldn't load provided observation file, reason: " << (stat == 0 ? "no data" : "error") << std::endl; + return; + } + + for (int i=0; i < obs.n; i++) + { + // std::cout << "time: " << time_str(obs.data[i].time, 3) << " | sat: " << int(obs.data[i].sat) << " | rcv: " << int(obs.data[i].rcv) << + // " | SNR: " << int(obs.data[i].SNR[0]) << " | LLI: " << int(obs.data[i].LLI[0]) << " | code: " << int(obs.data[i].code[0]) << + // " | L: " << obs.data[i].L[0] << " | P: " << obs.data[i].P[0] << " | D: " << obs.data[i].D[0] << std::endl; + addObservation(obs.data[i]); + } + + free(obs.data); +} + void Observations::print(obsd_t & _obs) { std::string msg = "Observation of satellite #" + std::to_string(_obs.sat); GNSSUtils::print(msg); - std::cout << "Time [s]: " << _obs.time.time << "\n"; + std::cout << "Time [s]: " << _obs.time.time << " + " << _obs.time.sec << "\n"; printArray("SNR: ", _obs.SNR, ARRAY_SIZE(_obs.SNR)); printArray("LLI: ", _obs.LLI, ARRAY_SIZE(_obs.LLI)); printArray("code: ", _obs.code, ARRAY_SIZE(_obs.code));