1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-12-14 20:20:35 +00:00

RTKLIB: Switch to STL containers

...to prevent thread stack abuse.
And free up some stack space in Rtklib_Solver::get_PVT.

Signed-off-by: Vladisslav P <vladisslav2011@gmail.com>
This commit is contained in:
Vladisslav P 2022-07-14 05:44:08 +03:00 committed by Vlad P
parent 1153544fca
commit 59c9c6f8ab
10 changed files with 134 additions and 117 deletions

View File

@ -463,7 +463,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
std::map<int, Glonass_Gnav_Ephemeris>::const_iterator glonass_gnav_ephemeris_iter; std::map<int, Glonass_Gnav_Ephemeris>::const_iterator glonass_gnav_ephemeris_iter;
std::map<int, Beidou_Dnav_Ephemeris>::const_iterator beidou_ephemeris_iter; std::map<int, Beidou_Dnav_Ephemeris>::const_iterator beidou_ephemeris_iter;
const Glonass_Gnav_Utc_Model gnav_utc = this->glonass_gnav_utc_model; const Glonass_Gnav_Utc_Model &gnav_utc = this->glonass_gnav_utc_model;
this->set_averaging_flag(flag_averaging); this->set_averaging_flag(flag_averaging);
@ -900,89 +900,89 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
if ((valid_obs + glo_valid_obs) > 3) if ((valid_obs + glo_valid_obs) > 3)
{ {
int result = 0; int result = 0;
nav_t nav_data{}; d_nav_data = {};
nav_data.eph = eph_data.data(); d_nav_data.eph = eph_data.data();
nav_data.geph = geph_data.data(); d_nav_data.geph = geph_data.data();
nav_data.n = valid_obs; d_nav_data.n = valid_obs;
nav_data.ng = glo_valid_obs; d_nav_data.ng = glo_valid_obs;
if (gps_iono.valid) if (gps_iono.valid)
{ {
nav_data.ion_gps[0] = gps_iono.alpha0; d_nav_data.ion_gps[0] = gps_iono.alpha0;
nav_data.ion_gps[1] = gps_iono.alpha1; d_nav_data.ion_gps[1] = gps_iono.alpha1;
nav_data.ion_gps[2] = gps_iono.alpha2; d_nav_data.ion_gps[2] = gps_iono.alpha2;
nav_data.ion_gps[3] = gps_iono.alpha3; d_nav_data.ion_gps[3] = gps_iono.alpha3;
nav_data.ion_gps[4] = gps_iono.beta0; d_nav_data.ion_gps[4] = gps_iono.beta0;
nav_data.ion_gps[5] = gps_iono.beta1; d_nav_data.ion_gps[5] = gps_iono.beta1;
nav_data.ion_gps[6] = gps_iono.beta2; d_nav_data.ion_gps[6] = gps_iono.beta2;
nav_data.ion_gps[7] = gps_iono.beta3; d_nav_data.ion_gps[7] = gps_iono.beta3;
} }
if (!(gps_iono.valid) and gps_cnav_iono.valid) if (!(gps_iono.valid) and gps_cnav_iono.valid)
{ {
nav_data.ion_gps[0] = gps_cnav_iono.alpha0; d_nav_data.ion_gps[0] = gps_cnav_iono.alpha0;
nav_data.ion_gps[1] = gps_cnav_iono.alpha1; d_nav_data.ion_gps[1] = gps_cnav_iono.alpha1;
nav_data.ion_gps[2] = gps_cnav_iono.alpha2; d_nav_data.ion_gps[2] = gps_cnav_iono.alpha2;
nav_data.ion_gps[3] = gps_cnav_iono.alpha3; d_nav_data.ion_gps[3] = gps_cnav_iono.alpha3;
nav_data.ion_gps[4] = gps_cnav_iono.beta0; d_nav_data.ion_gps[4] = gps_cnav_iono.beta0;
nav_data.ion_gps[5] = gps_cnav_iono.beta1; d_nav_data.ion_gps[5] = gps_cnav_iono.beta1;
nav_data.ion_gps[6] = gps_cnav_iono.beta2; d_nav_data.ion_gps[6] = gps_cnav_iono.beta2;
nav_data.ion_gps[7] = gps_cnav_iono.beta3; d_nav_data.ion_gps[7] = gps_cnav_iono.beta3;
} }
if (galileo_iono.ai0 != 0.0) if (galileo_iono.ai0 != 0.0)
{ {
nav_data.ion_gal[0] = galileo_iono.ai0; d_nav_data.ion_gal[0] = galileo_iono.ai0;
nav_data.ion_gal[1] = galileo_iono.ai1; d_nav_data.ion_gal[1] = galileo_iono.ai1;
nav_data.ion_gal[2] = galileo_iono.ai2; d_nav_data.ion_gal[2] = galileo_iono.ai2;
nav_data.ion_gal[3] = 0.0; d_nav_data.ion_gal[3] = 0.0;
} }
if (beidou_dnav_iono.valid) if (beidou_dnav_iono.valid)
{ {
nav_data.ion_cmp[0] = beidou_dnav_iono.alpha0; d_nav_data.ion_cmp[0] = beidou_dnav_iono.alpha0;
nav_data.ion_cmp[1] = beidou_dnav_iono.alpha1; d_nav_data.ion_cmp[1] = beidou_dnav_iono.alpha1;
nav_data.ion_cmp[2] = beidou_dnav_iono.alpha2; d_nav_data.ion_cmp[2] = beidou_dnav_iono.alpha2;
nav_data.ion_cmp[3] = beidou_dnav_iono.alpha3; d_nav_data.ion_cmp[3] = beidou_dnav_iono.alpha3;
nav_data.ion_cmp[4] = beidou_dnav_iono.beta0; d_nav_data.ion_cmp[4] = beidou_dnav_iono.beta0;
nav_data.ion_cmp[5] = beidou_dnav_iono.beta0; d_nav_data.ion_cmp[5] = beidou_dnav_iono.beta0;
nav_data.ion_cmp[6] = beidou_dnav_iono.beta0; d_nav_data.ion_cmp[6] = beidou_dnav_iono.beta0;
nav_data.ion_cmp[7] = beidou_dnav_iono.beta3; d_nav_data.ion_cmp[7] = beidou_dnav_iono.beta3;
} }
if (gps_utc_model.valid) if (gps_utc_model.valid)
{ {
nav_data.utc_gps[0] = gps_utc_model.A0; d_nav_data.utc_gps[0] = gps_utc_model.A0;
nav_data.utc_gps[1] = gps_utc_model.A1; d_nav_data.utc_gps[1] = gps_utc_model.A1;
nav_data.utc_gps[2] = gps_utc_model.tot; d_nav_data.utc_gps[2] = gps_utc_model.tot;
nav_data.utc_gps[3] = gps_utc_model.WN_T; d_nav_data.utc_gps[3] = gps_utc_model.WN_T;
nav_data.leaps = gps_utc_model.DeltaT_LS; d_nav_data.leaps = gps_utc_model.DeltaT_LS;
} }
if (!(gps_utc_model.valid) and gps_cnav_utc_model.valid) if (!(gps_utc_model.valid) and gps_cnav_utc_model.valid)
{ {
nav_data.utc_gps[0] = gps_cnav_utc_model.A0; d_nav_data.utc_gps[0] = gps_cnav_utc_model.A0;
nav_data.utc_gps[1] = gps_cnav_utc_model.A1; d_nav_data.utc_gps[1] = gps_cnav_utc_model.A1;
nav_data.utc_gps[2] = gps_cnav_utc_model.tot; d_nav_data.utc_gps[2] = gps_cnav_utc_model.tot;
nav_data.utc_gps[3] = gps_cnav_utc_model.WN_T; d_nav_data.utc_gps[3] = gps_cnav_utc_model.WN_T;
nav_data.leaps = gps_cnav_utc_model.DeltaT_LS; d_nav_data.leaps = gps_cnav_utc_model.DeltaT_LS;
} }
if (glonass_gnav_utc_model.valid) if (glonass_gnav_utc_model.valid)
{ {
nav_data.utc_glo[0] = glonass_gnav_utc_model.d_tau_c; // ?? d_nav_data.utc_glo[0] = glonass_gnav_utc_model.d_tau_c; // ??
nav_data.utc_glo[1] = 0.0; // ?? d_nav_data.utc_glo[1] = 0.0; // ??
nav_data.utc_glo[2] = 0.0; // ?? d_nav_data.utc_glo[2] = 0.0; // ??
nav_data.utc_glo[3] = 0.0; // ?? d_nav_data.utc_glo[3] = 0.0; // ??
} }
if (galileo_utc_model.A0 != 0.0) if (galileo_utc_model.A0 != 0.0)
{ {
nav_data.utc_gal[0] = galileo_utc_model.A0; d_nav_data.utc_gal[0] = galileo_utc_model.A0;
nav_data.utc_gal[1] = galileo_utc_model.A1; d_nav_data.utc_gal[1] = galileo_utc_model.A1;
nav_data.utc_gal[2] = galileo_utc_model.tot; d_nav_data.utc_gal[2] = galileo_utc_model.tot;
nav_data.utc_gal[3] = galileo_utc_model.WNot; d_nav_data.utc_gal[3] = galileo_utc_model.WNot;
nav_data.leaps = galileo_utc_model.Delta_tLS; d_nav_data.leaps = galileo_utc_model.Delta_tLS;
} }
if (beidou_dnav_utc_model.valid) if (beidou_dnav_utc_model.valid)
{ {
nav_data.utc_cmp[0] = beidou_dnav_utc_model.A0_UTC; d_nav_data.utc_cmp[0] = beidou_dnav_utc_model.A0_UTC;
nav_data.utc_cmp[1] = beidou_dnav_utc_model.A1_UTC; d_nav_data.utc_cmp[1] = beidou_dnav_utc_model.A1_UTC;
nav_data.utc_cmp[2] = 0.0; // ?? d_nav_data.utc_cmp[2] = 0.0; // ??
nav_data.utc_cmp[3] = 0.0; // ?? d_nav_data.utc_cmp[3] = 0.0; // ??
nav_data.leaps = beidou_dnav_utc_model.DeltaT_LS; d_nav_data.leaps = beidou_dnav_utc_model.DeltaT_LS;
} }
/* update carrier wave length using native function call in RTKlib */ /* update carrier wave length using native function call in RTKlib */
@ -990,11 +990,11 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
{ {
for (int j = 0; j < NFREQ; j++) for (int j = 0; j < NFREQ; j++)
{ {
nav_data.lam[i][j] = satwavelen(i + 1, d_rtklib_freq_index[j], &nav_data); d_nav_data.lam[i][j] = satwavelen(i + 1, d_rtklib_freq_index[j], &d_nav_data);
} }
} }
result = rtkpos(&d_rtk, d_obs_data.data(), valid_obs + glo_valid_obs, &nav_data); result = rtkpos(&d_rtk, d_obs_data.data(), valid_obs + glo_valid_obs, &d_nav_data);
if (result == 0) if (result == 0)
{ {
@ -1095,7 +1095,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
// TOW // TOW
d_monitor_pvt.TOW_at_current_symbol_ms = gnss_observables_map.cbegin()->second.TOW_at_current_symbol_ms; d_monitor_pvt.TOW_at_current_symbol_ms = gnss_observables_map.cbegin()->second.TOW_at_current_symbol_ms;
// WEEK // WEEK
d_monitor_pvt.week = adjgpsweek(nav_data.eph[0].week, this->is_pre_2009()); d_monitor_pvt.week = adjgpsweek(d_nav_data.eph[0].week, this->is_pre_2009());
// PVT GPS time // PVT GPS time
d_monitor_pvt.RX_time = gnss_observables_map.cbegin()->second.RX_time; d_monitor_pvt.RX_time = gnss_observables_map.cbegin()->second.RX_time;
// User clock offset [s] // User clock offset [s]
@ -1161,7 +1161,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
tmp_uint32 = gnss_observables_map.cbegin()->second.TOW_at_current_symbol_ms; tmp_uint32 = gnss_observables_map.cbegin()->second.TOW_at_current_symbol_ms;
d_dump_file.write(reinterpret_cast<char *>(&tmp_uint32), sizeof(uint32_t)); d_dump_file.write(reinterpret_cast<char *>(&tmp_uint32), sizeof(uint32_t));
// WEEK // WEEK
tmp_uint32 = adjgpsweek(nav_data.eph[0].week, this->is_pre_2009()); tmp_uint32 = adjgpsweek(d_nav_data.eph[0].week, this->is_pre_2009());
d_dump_file.write(reinterpret_cast<char *>(&tmp_uint32), sizeof(uint32_t)); d_dump_file.write(reinterpret_cast<char *>(&tmp_uint32), sizeof(uint32_t));
// PVT GPS time // PVT GPS time
tmp_double = gnss_observables_map.cbegin()->second.RX_time; tmp_double = gnss_observables_map.cbegin()->second.RX_time;

View File

@ -132,6 +132,7 @@ private:
uint32_t d_type_of_rx; uint32_t d_type_of_rx;
bool d_flag_dump_enabled; bool d_flag_dump_enabled;
bool d_flag_dump_mat_enabled; bool d_flag_dump_mat_enabled;
nav_t d_nav_data;
}; };

View File

@ -34,6 +34,7 @@
#include "rtklib_preceph.h" #include "rtklib_preceph.h"
#include "rtklib_rtkcmn.h" #include "rtklib_rtkcmn.h"
#include "rtklib_sbas.h" #include "rtklib_sbas.h"
#include <vector>
/* constants -----------------------------------------------------------------*/ /* constants -----------------------------------------------------------------*/
@ -1023,7 +1024,7 @@ int satpos(gtime_t time, gtime_t teph, int sat, int ephopt,
void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav, void satposs(gtime_t teph, const obsd_t *obs, int n, const nav_t *nav,
int ephopt, double *rs, double *dts, double *var, int *svh) int ephopt, double *rs, double *dts, double *var, int *svh)
{ {
gtime_t time[MAXOBS] = {}; std::vector<gtime_t> time(MAXOBS);
double dt; double dt;
double pr; double pr;
int i; int i;

View File

@ -39,6 +39,7 @@
#include "rtklib_ionex.h" #include "rtklib_ionex.h"
#include "rtklib_rtkcmn.h" #include "rtklib_rtkcmn.h"
#include <cstring> #include <cstring>
#include <vector>
/* get index -----------------------------------------------------------------*/ /* get index -----------------------------------------------------------------*/
int getindex(double value, const double *range) int getindex(double value, const double *range)
@ -425,8 +426,8 @@ void readtec(const char *file, nav_t *nav, int opt)
double hgts[3] = {0}; double hgts[3] = {0};
double rb = 0.0; double rb = 0.0;
double nexp = -1.0; double nexp = -1.0;
double dcb[MAXSAT] = {0}; std::vector<double> dcb(MAXSAT, 0);
double rms[MAXSAT] = {0}; std::vector<double> rms(MAXSAT, 0);
int i; int i;
int n; int n;
char *efiles[MAXEXFILE]; char *efiles[MAXEXFILE];
@ -463,7 +464,7 @@ void readtec(const char *file, nav_t *nav, int opt)
} }
/* read ionex header */ /* read ionex header */
if (readionexh(fp, lats, lons, hgts, &rb, &nexp, dcb, rms) <= 0.0) if (readionexh(fp, lats, lons, hgts, &rb, &nexp, dcb.data(), rms.data()) <= 0.0)
{ {
trace(2, "ionex file format error %s\n", efiles[i]); trace(2, "ionex file format error %s\n", efiles[i]);
fclose(fp); fclose(fp);

View File

@ -34,6 +34,7 @@
#include "rtklib_ionex.h" #include "rtklib_ionex.h"
#include "rtklib_sbas.h" #include "rtklib_sbas.h"
#include <cstring> #include <cstring>
#include <vector>
/* pseudorange measurement error variance ------------------------------------*/ /* pseudorange measurement error variance ------------------------------------*/
double varerr(const prcopt_t *opt, double el, int sys) double varerr(const prcopt_t *opt, double el, int sys)
@ -988,8 +989,8 @@ int pntpos(const obsd_t *obs, int n, const nav_t *nav,
double *resp; double *resp;
int i; int i;
int stat; int stat;
int vsat[MAXOBS] = {0}; std::vector<int> vsat(MAXOBS, 0);
int svh[MAXOBS]; std::vector<int> svh(MAXOBS, 0);
sol->stat = SOLQ_NONE; sol->stat = SOLQ_NONE;
@ -1019,20 +1020,20 @@ int pntpos(const obsd_t *obs, int n, const nav_t *nav,
opt_.tropopt = TROPOPT_SAAS; opt_.tropopt = TROPOPT_SAAS;
} }
/* satellite positions, velocities and clocks */ /* satellite positions, velocities and clocks */
satposs(sol->time, obs, n, nav, opt_.sateph, rs, dts, var, svh); satposs(sol->time, obs, n, nav, opt_.sateph, rs, dts, var, svh.data());
/* estimate receiver position with pseudorange */ /* estimate receiver position with pseudorange */
stat = estpos(obs, n, rs, dts, var, svh, nav, &opt_, sol, azel_, vsat, resp, msg); stat = estpos(obs, n, rs, dts, var, svh.data(), nav, &opt_, sol, azel_, vsat.data(), resp, msg);
/* raim fde */ /* raim fde */
if (!stat && n >= 6 && opt->posopt[4]) if (!stat && n >= 6 && opt->posopt[4])
{ {
stat = raim_fde(obs, n, rs, dts, var, svh, nav, &opt_, sol, azel_, vsat, resp, msg); stat = raim_fde(obs, n, rs, dts, var, svh.data(), nav, &opt_, sol, azel_, vsat.data(), resp, msg);
} }
/* estimate receiver velocity with doppler */ /* estimate receiver velocity with doppler */
if (stat) if (stat)
{ {
estvel(obs, n, rs, dts, nav, &opt_, sol, azel_, vsat); estvel(obs, n, rs, dts, nav, &opt_, sol, azel_, vsat.data());
} }
if (azel) if (azel)

View File

@ -38,6 +38,7 @@
#include "rtklib_sbas.h" #include "rtklib_sbas.h"
#include "rtklib_tides.h" #include "rtklib_tides.h"
#include <cstring> #include <cstring>
#include <vector>
/* wave length of LC (m) -----------------------------------------------------*/ /* wave length of LC (m) -----------------------------------------------------*/
double lam_LC(int i, int j, int k) double lam_LC(int i, int j, int k)
@ -351,7 +352,7 @@ int sel_amb(int *sat1, int *sat2, double *N, double *var, int n)
{ {
int i; int i;
int j; int j;
int flgs[MAXSAT] = {0}; std::vector<int> flgs(MAXSAT, 0);
int max_flg = 0; int max_flg = 0;
/* sort by variance */ /* sort by variance */
@ -372,7 +373,7 @@ int sel_amb(int *sat1, int *sat2, double *N, double *var, int n)
/* select linearly independent satellite pair */ /* select linearly independent satellite pair */
for (i = j = 0; i < n; i++) for (i = j = 0; i < n; i++)
{ {
if (!is_depend(sat1[i], sat2[i], flgs, &max_flg)) if (!is_depend(sat1[i], sat2[i], flgs.data(), &max_flg))
{ {
continue; continue;
} }
@ -546,7 +547,7 @@ int fix_amb_ILS(rtk_t *rtk, int *sat1, int *sat2, int *NW, int n)
int m = 0; int m = 0;
int info; int info;
int stat; int stat;
int flgs[MAXSAT] = {0}; std::vector<int> flgs(MAXSAT, 0);
int max_flg = 0; int max_flg = 0;
lam1 = LAM_CARR[0]; lam1 = LAM_CARR[0];
@ -565,7 +566,7 @@ int fix_amb_ILS(rtk_t *rtk, int *sat1, int *sat2, int *NW, int n)
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
/* check linear independency */ /* check linear independency */
if (!is_depend(sat1[i], sat2[i], flgs, &max_flg)) if (!is_depend(sat1[i], sat2[i], flgs.data(), &max_flg))
{ {
continue; continue;
} }
@ -1362,7 +1363,7 @@ void udbias_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
{ {
double meas[2]; double meas[2];
double var[2]; double var[2];
double bias[MAXOBS] = {0}; std::vector<double> bias(MAXOBS, 0.0);
double offset = 0.0; double offset = 0.0;
double pos[3] = {0}; double pos[3] = {0};
int i; int i;
@ -1562,7 +1563,7 @@ int res_ppp(int iter __attribute__((unused)), const obsd_t *obs, int n, const do
double dtdx[3]; double dtdx[3];
double dantr[NFREQ] = {0}; double dantr[NFREQ] = {0};
double dants[NFREQ] = {0}; double dants[NFREQ] = {0};
double var[MAXOBS * 2]; std::vector<double> var(MAXOBS * 2, 0.0);
double dtrp = 0.0; double dtrp = 0.0;
double vart = 0.0; double vart = 0.0;
double varm[2] = {0}; double varm[2] = {0};
@ -1781,7 +1782,7 @@ void pppos(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
int i; int i;
int nv; int nv;
int info; int info;
int svh[MAXOBS]; std::vector<int> svh(MAXOBS);
int stat = SOLQ_SINGLE; int stat = SOLQ_SINGLE;
trace(3, "pppos : nx=%d n=%d\n", rtk->nx, n); trace(3, "pppos : nx=%d n=%d\n", rtk->nx, n);
@ -1803,7 +1804,7 @@ void pppos(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
tracemat(4, rtk->x, 1, NR_PPP(opt), 13, 4); tracemat(4, rtk->x, 1, NR_PPP(opt), 13, 4);
/* satellite positions and clocks */ /* satellite positions and clocks */
satposs(obs[0].time, obs, n, nav, rtk->opt.sateph, rs, dts, var, svh); satposs(obs[0].time, obs, n, nav, rtk->opt.sateph, rs, dts, var, svh.data());
/* exclude measurements of eclipsing satellite */ /* exclude measurements of eclipsing satellite */
if (rtk->opt.posopt[3]) if (rtk->opt.posopt[3])
@ -1821,7 +1822,7 @@ void pppos(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
for (i = 0; i < rtk->opt.niter; i++) for (i = 0; i < rtk->opt.niter; i++)
{ {
/* phase and code residuals */ /* phase and code residuals */
if ((nv = res_ppp(i, obs, n, rs, dts, var, svh, nav, xp, rtk, v, H, R, azel)) <= 0) if ((nv = res_ppp(i, obs, n, rs, dts, var, svh.data(), nav, xp, rtk, v, H, R, azel)) <= 0)
{ {
break; break;
} }
@ -1842,7 +1843,7 @@ void pppos(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav)
if (stat == SOLQ_PPP) if (stat == SOLQ_PPP)
{ {
/* postfit residuals */ /* postfit residuals */
res_ppp(1, obs, n, rs, dts, var, svh, nav, xp, rtk, v, H, R, azel); res_ppp(1, obs, n, rs, dts, var, svh.data(), nav, xp, rtk, v, H, R, azel);
/* update state and covariance matrix */ /* update state and covariance matrix */
matcpy(rtk->x, xp, rtk->nx, 1); matcpy(rtk->x, xp, rtk->nx, 1);

View File

@ -43,6 +43,7 @@
#include "rtklib_preceph.h" #include "rtklib_preceph.h"
#include "rtklib_rtkcmn.h" #include "rtklib_rtkcmn.h"
#include <cstring> #include <cstring>
#include <vector>
/* satellite code to satellite system ----------------------------------------*/ /* satellite code to satellite system ----------------------------------------*/
int code2sys(char code) int code2sys(char code)
@ -390,7 +391,7 @@ void readsp3(const char *file, nav_t *nav, int opt)
int j; int j;
int n; int n;
int ns; int ns;
int sats[MAXSAT] = {}; std::vector<int> sats(MAXSAT);
char *efiles[MAXEXFILE]; char *efiles[MAXEXFILE];
char *ext; char *ext;
char type = ' '; char type = ' ';
@ -431,10 +432,10 @@ void readsp3(const char *file, nav_t *nav, int opt)
continue; continue;
} }
/* read sp3 header */ /* read sp3 header */
ns = readsp3h(fp, &time, &type, sats, bfact, tsys); ns = readsp3h(fp, &time, &type, sats.data(), bfact, tsys);
/* read sp3 body */ /* read sp3 body */
readsp3b(fp, type, sats, ns, bfact, tsys, j++, opt, nav); readsp3b(fp, type, sats.data(), ns, bfact, tsys, j++, opt, nav);
fclose(fp); fclose(fp);
} }

View File

@ -31,6 +31,7 @@
#include "rtklib_rtkcmn.h" #include "rtklib_rtkcmn.h"
#include <glog/logging.h> #include <glog/logging.h>
#include <array>
#include <cassert> #include <cassert>
#include <cstring> #include <cstring>
#include <dirent.h> #include <dirent.h>
@ -40,6 +41,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
#include <vector>
const double GPST0[] = {1980, 1, 6, 0, 0, 0}; /* gps time reference */ const double GPST0[] = {1980, 1, 6, 0, 0, 0}; /* gps time reference */
@ -4496,7 +4498,7 @@ double satazel(const double *pos, const double *e, double *azel)
*-----------------------------------------------------------------------------*/ *-----------------------------------------------------------------------------*/
void dops(int ns, const double *azel, double elmin, double *dop) void dops(int ns, const double *azel, double elmin, double *dop)
{ {
double H[4 * MAXSAT]; std::vector<double> H(4 * MAXSAT);
double Q[16]; double Q[16];
double cosel; double cosel;
double sinel; double sinel;
@ -4525,7 +4527,7 @@ void dops(int ns, const double *azel, double elmin, double *dop)
return; return;
} }
matmul("NT", 4, 4, n, 1.0, H, H, 0.0, Q); matmul("NT", 4, 4, n, 1.0, H.data(), H.data(), 0.0, Q);
if (!matinv(Q, 4)) if (!matinv(Q, 4))
{ {
dop[0] = std::sqrt(Q[0] + Q[5] + Q[10] + Q[15]); /* GDOP */ dop[0] = std::sqrt(Q[0] + Q[5] + Q[10] + Q[15]); /* GDOP */
@ -5029,16 +5031,23 @@ void sunmoonpos(gtime_t tutc, const double *erpv, double *rsun,
*-----------------------------------------------------------------------------*/ *-----------------------------------------------------------------------------*/
void csmooth(obs_t *obs, int ns) void csmooth(obs_t *obs, int ns)
{ {
double Ps[2][MAXSAT][NFREQ] = {}; std::vector<std::array<double, NFREQ>> Ps[2];
double Lp[2][MAXSAT][NFREQ] = {}; std::vector<std::array<double, NFREQ>> Lp[2];
double dcp; double dcp;
int i; int i;
int j; int j;
int s; int s;
int r; int r;
int n[2][MAXSAT][NFREQ] = {}; std::vector<std::array<int, NFREQ>> n[2];
obsd_t *p; obsd_t *p;
Ps[0].resize(MAXSAT);
Ps[1].resize(MAXSAT);
Lp[0].resize(MAXSAT);
Lp[1].resize(MAXSAT);
n[0].resize(MAXSAT);
n[1].resize(MAXSAT);
trace(3, "csmooth: nobs=%d,ns=%d\n", obs->n, ns); trace(3, "csmooth: nobs=%d,ns=%d\n", obs->n, ns);
for (i = 0; i < obs->n; i++) for (i = 0; i < obs->n; i++)

View File

@ -37,6 +37,7 @@
#include "rtklib_tides.h" #include "rtklib_tides.h"
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <vector>
static int resamb_WLNL(rtk_t *rtk __attribute((unused)), const obsd_t *obs __attribute((unused)), const int *sat __attribute((unused)), static int resamb_WLNL(rtk_t *rtk __attribute((unused)), const obsd_t *obs __attribute((unused)), const int *sat __attribute((unused)),
const int *iu __attribute((unused)), const int *ir __attribute((unused)), int ns __attribute__((unused)), const nav_t *nav __attribute((unused)), const int *iu __attribute((unused)), const int *ir __attribute((unused)), int ns __attribute__((unused)), const nav_t *nav __attribute((unused)),
@ -2029,7 +2030,7 @@ void restamb(rtk_t *rtk, const double *bias, int nb __attribute((unused)), doubl
int n; int n;
int m; int m;
int f; int f;
int index[MAXSAT]; std::vector<int> index(MAXSAT);
int nv = 0; int nv = 0;
int nf = NF_RTK(&rtk->opt); int nf = NF_RTK(&rtk->opt);
@ -2083,7 +2084,7 @@ void holdamb(rtk_t *rtk, const double *xa)
int m; int m;
int f; int f;
int info; int info;
int index[MAXSAT]; std::vector<int> index(MAXSAT);
int nb = rtk->nx - rtk->na; int nb = rtk->nx - rtk->na;
int nv = 0; int nv = 0;
int nf = NF_RTK(&rtk->opt); int nf = NF_RTK(&rtk->opt);
@ -2371,13 +2372,13 @@ int relpos(rtk_t *rtk, const obsd_t *obs, int nu, int nr,
int ns; int ns;
int ny; int ny;
int nv; int nv;
int sat[MAXSAT]; std::vector<int> sat(MAXSAT);
int iu[MAXSAT]; std::vector<int> iu(MAXSAT);
int ir[MAXSAT]; std::vector<int> ir(MAXSAT);
int niter; int niter;
int info; int info;
int vflg[MAXOBS * NFREQ * 2 + 1]; std::vector<int> vflg(MAXOBS * NFREQ * 2 + 1);
int svh[MAXOBS * 2]; std::vector<int> svh(MAXOBS * 2);
int stat = rtk->opt.mode <= PMODE_DGPS ? SOLQ_DGPS : SOLQ_FLOAT; int stat = rtk->opt.mode <= PMODE_DGPS ? SOLQ_DGPS : SOLQ_FLOAT;
int nf = opt->ionoopt == IONOOPT_IFLC ? 1 : opt->nf; int nf = opt->ionoopt == IONOOPT_IFLC ? 1 : opt->nf;
@ -2401,10 +2402,10 @@ int relpos(rtk_t *rtk, const obsd_t *obs, int nu, int nr,
} }
} }
/* satellite positions/clocks */ /* satellite positions/clocks */
satposs(time, obs, n, nav, opt->sateph, rs, dts, var, svh); satposs(time, obs, n, nav, opt->sateph, rs, dts, var, svh.data());
/* undifferenced residuals for base station */ /* undifferenced residuals for base station */
if (!zdres(1, obs + nu, nr, rs + nu * 6, dts + nu * 2, svh + nu, nav, rtk->rb, opt, 1, if (!zdres(1, obs + nu, nr, rs + nu * 6, dts + nu * 2, &svh[nu], nav, rtk->rb, opt, 1,
y + nu * nf * 2, e + nu * 3, azel + nu * 2)) y + nu * nf * 2, e + nu * 3, azel + nu * 2))
{ {
errmsg(rtk, "initial base station position error\n"); errmsg(rtk, "initial base station position error\n");
@ -2423,7 +2424,7 @@ int relpos(rtk_t *rtk, const obsd_t *obs, int nu, int nr,
dt = intpres(time, obs + nu, nr, nav, rtk, y + nu * nf * 2); dt = intpres(time, obs + nu, nr, nav, rtk, y + nu * nf * 2);
} }
/* select common satellites between rover and base-station */ /* select common satellites between rover and base-station */
if ((ns = selsat(obs, azel, nu, nr, opt, sat, iu, ir)) <= 0) if ((ns = selsat(obs, azel, nu, nr, opt, sat.data(), iu.data(), ir.data())) <= 0)
{ {
errmsg(rtk, "no common satellite\n"); errmsg(rtk, "no common satellite\n");
@ -2436,7 +2437,7 @@ int relpos(rtk_t *rtk, const obsd_t *obs, int nu, int nr,
return 0; return 0;
} }
/* temporal update of states */ /* temporal update of states */
udstate(rtk, obs, sat, iu, ir, ns, nav); udstate(rtk, obs, sat.data(), iu.data(), ir.data(), ns, nav);
trace(4, "x(0)="); trace(4, "x(0)=");
tracemat(4, rtk->x, 1, NR_RTK(opt), 13, 4); tracemat(4, rtk->x, 1, NR_RTK(opt), 13, 4);
@ -2458,14 +2459,14 @@ int relpos(rtk_t *rtk, const obsd_t *obs, int nu, int nr,
for (i = 0; i < niter; i++) for (i = 0; i < niter; i++)
{ {
/* undifferenced residuals for rover */ /* undifferenced residuals for rover */
if (!zdres(0, obs, nu, rs, dts, svh, nav, xp, opt, 0, y, e, azel)) if (!zdres(0, obs, nu, rs, dts, svh.data(), nav, xp, opt, 0, y, e, azel))
{ {
errmsg(rtk, "rover initial position error\n"); errmsg(rtk, "rover initial position error\n");
stat = SOLQ_NONE; stat = SOLQ_NONE;
break; break;
} }
/* double-differenced residuals and partial derivatives */ /* double-differenced residuals and partial derivatives */
if ((nv = ddres(rtk, nav, dt, xp, Pp, sat, y, e, azel, iu, ir, ns, v, H, R, vflg)) < 1) if ((nv = ddres(rtk, nav, dt, xp, Pp, sat.data(), y, e, azel, iu.data(), ir.data(), ns, v, H, R, vflg.data())) < 1)
{ {
errmsg(rtk, "no double-differenced residual\n"); errmsg(rtk, "no double-differenced residual\n");
stat = SOLQ_NONE; stat = SOLQ_NONE;
@ -2482,13 +2483,13 @@ int relpos(rtk_t *rtk, const obsd_t *obs, int nu, int nr,
trace(4, "x(%d)=", i + 1); trace(4, "x(%d)=", i + 1);
tracemat(4, xp, 1, NR_RTK(opt), 13, 4); tracemat(4, xp, 1, NR_RTK(opt), 13, 4);
} }
if (stat != SOLQ_NONE && zdres(0, obs, nu, rs, dts, svh, nav, xp, opt, 0, y, e, azel)) if (stat != SOLQ_NONE && zdres(0, obs, nu, rs, dts, svh.data(), nav, xp, opt, 0, y, e, azel))
{ {
/* post-fit residuals for float solution */ /* post-fit residuals for float solution */
nv = ddres(rtk, nav, dt, xp, Pp, sat, y, e, azel, iu, ir, ns, v, nullptr, R, vflg); nv = ddres(rtk, nav, dt, xp, Pp, sat.data(), y, e, azel, iu.data(), ir.data(), ns, v, nullptr, R, vflg.data());
/* validation of float solution */ /* validation of float solution */
if (valpos(rtk, v, R, vflg, nv, 4.0)) if (valpos(rtk, v, R, vflg.data(), nv, 4.0))
{ {
/* update state and covariance matrix */ /* update state and covariance matrix */
matcpy(rtk->x, xp, rtk->nx, 1); matcpy(rtk->x, xp, rtk->nx, 1);
@ -2526,7 +2527,7 @@ int relpos(rtk_t *rtk, const obsd_t *obs, int nu, int nr,
/* resolve integer ambiguity by WL-NL */ /* resolve integer ambiguity by WL-NL */
if (stat != SOLQ_NONE && rtk->opt.modear == ARMODE_WLNL) if (stat != SOLQ_NONE && rtk->opt.modear == ARMODE_WLNL)
{ {
if (resamb_WLNL(rtk, obs, sat, iu, ir, ns, nav, azel)) if (resamb_WLNL(rtk, obs, sat.data(), iu.data(), ir.data(), ns, nav, azel))
{ {
stat = SOLQ_FIX; stat = SOLQ_FIX;
} }
@ -2534,7 +2535,7 @@ int relpos(rtk_t *rtk, const obsd_t *obs, int nu, int nr,
/* resolve integer ambiguity by TCAR */ /* resolve integer ambiguity by TCAR */
else if (stat != SOLQ_NONE && rtk->opt.modear == ARMODE_TCAR) else if (stat != SOLQ_NONE && rtk->opt.modear == ARMODE_TCAR)
{ {
if (resamb_TCAR(rtk, obs, sat, iu, ir, ns, nav, azel)) if (resamb_TCAR(rtk, obs, sat.data(), iu.data(), ir.data(), ns, nav, azel))
{ {
stat = SOLQ_FIX; stat = SOLQ_FIX;
} }
@ -2542,13 +2543,13 @@ int relpos(rtk_t *rtk, const obsd_t *obs, int nu, int nr,
/* resolve integer ambiguity by LAMBDA */ /* resolve integer ambiguity by LAMBDA */
else if (stat != SOLQ_NONE && resamb_LAMBDA(rtk, bias, xa) > 1) else if (stat != SOLQ_NONE && resamb_LAMBDA(rtk, bias, xa) > 1)
{ {
if (zdres(0, obs, nu, rs, dts, svh, nav, xa, opt, 0, y, e, azel)) if (zdres(0, obs, nu, rs, dts, svh.data(), nav, xa, opt, 0, y, e, azel))
{ {
/* post-fit reisiduals for fixed solution */ /* post-fit reisiduals for fixed solution */
nv = ddres(rtk, nav, dt, xa, nullptr, sat, y, e, azel, iu, ir, ns, v, nullptr, R, vflg); nv = ddres(rtk, nav, dt, xa, nullptr, sat.data(), y, e, azel, iu.data(), ir.data(), ns, v, nullptr, R, vflg.data());
/* validation of fixed solution */ /* validation of fixed solution */
if (valpos(rtk, v, R, vflg, nv, 4.0)) if (valpos(rtk, v, R, vflg.data(), nv, 4.0))
{ {
/* hold integer ambiguity */ /* hold integer ambiguity */
if (++rtk->nfix >= rtk->opt.minfix && if (++rtk->nfix >= rtk->opt.minfix &&

View File

@ -37,6 +37,7 @@
#include <cctype> #include <cctype>
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <vector>
/* constants and macros ------------------------------------------------------*/ /* constants and macros ------------------------------------------------------*/
@ -1654,7 +1655,7 @@ int outnmea_gsa(unsigned char *buff, const sol_t *sol,
int sat; int sat;
int sys; int sys;
int nsat; int nsat;
int prn[MAXSAT]; std::vector<int> prn(MAXSAT);
char *p = reinterpret_cast<char *>(buff); char *p = reinterpret_cast<char *>(buff);
char *q; char *q;
char *s; char *s;
@ -1683,7 +1684,7 @@ int outnmea_gsa(unsigned char *buff, const sol_t *sol,
{ {
continue; continue;
} }
sys = satsys(sat, prn + nsat); sys = satsys(sat, &prn[nsat]);
if (sys != SYS_GPS && sys != SYS_SBS) if (sys != SYS_GPS && sys != SYS_SBS)
{ {
continue; continue;
@ -1728,7 +1729,7 @@ int outnmea_gsa(unsigned char *buff, const sol_t *sol,
{ {
continue; continue;
} }
if (satsys(sat, prn + nsat) != SYS_GLO) if (satsys(sat, &prn[nsat]) != SYS_GLO)
{ {
continue; continue;
} }
@ -1769,7 +1770,7 @@ int outnmea_gsa(unsigned char *buff, const sol_t *sol,
{ {
continue; continue;
} }
if (satsys(sat, prn + nsat) != SYS_GAL) if (satsys(sat, &prn[nsat]) != SYS_GAL)
{ {
continue; continue;
} }
@ -1809,7 +1810,7 @@ int outnmea_gsa(unsigned char *buff, const sol_t *sol,
{ {
continue; continue;
} }
if (satsys(sat, prn + nsat) != SYS_BDS) if (satsys(sat, &prn[nsat]) != SYS_BDS)
{ {
continue; continue;
} }
@ -1861,7 +1862,7 @@ int outnmea_gsv(unsigned char *buff, const sol_t *sol,
int prn; int prn;
int sys; int sys;
int nmsg; int nmsg;
int sats[MAXSAT]; std::vector<int> sats(MAXSAT);
char *p = reinterpret_cast<char *>(buff); char *p = reinterpret_cast<char *>(buff);
char *q; char *q;
char *s; char *s;