From eff3d2459255e502e6b099de97d1e8c94402561c Mon Sep 17 00:00:00 2001 From: Scott Kovach Date: Tue, 21 Jul 2015 12:12:41 -0700 Subject: [PATCH 1/6] add raim_flag to gnss_solution, clarify dgnss_baseline --- include/libswiftnav/dgnss_management.h | 1 + include/libswiftnav/pvt.h | 4 +++ src/dgnss_management.c | 45 +++++++++++++++++++------- src/pvt.c | 21 ++++++++---- tests/check_dgnss_management.c | 6 ++-- tests/check_pvt.c | 4 +++ 6 files changed, 62 insertions(+), 19 deletions(-) diff --git a/include/libswiftnav/dgnss_management.h b/include/libswiftnav/dgnss_management.h index 657187f8..672e8807 100644 --- a/include/libswiftnav/dgnss_management.h +++ b/include/libswiftnav/dgnss_management.h @@ -62,6 +62,7 @@ s8 dgnss_iar_get_single_hyp(double *hyp); void dgnss_reset_iar(void); void dgnss_init_known_baseline(u8 num_sats, sdiff_t *sdiffs, double receiver_ecef[3], double b[3]); void dgnss_update_ambiguity_state(ambiguity_state_t *s); +u8 baseline_flag(s8 ret, bool fixed); s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs, const double ref_ecef[3], const ambiguity_state_t *s, u8 *num_used, double b[3], diff --git a/include/libswiftnav/pvt.h b/include/libswiftnav/pvt.h index 7f4c490b..cb342ef0 100644 --- a/include/libswiftnav/pvt.h +++ b/include/libswiftnav/pvt.h @@ -77,6 +77,10 @@ typedef struct __attribute__((packed)) { u8 valid; /* Number of channels used in the soluton. */ u8 n_used; + /* bit 0: raim available? + * bit 1: raim repair used? + */ + u8 raim_flag; } gnss_solution; s8 calc_PVT(const u8 n_used, diff --git a/src/dgnss_management.c b/src/dgnss_management.c index 80625cdf..8dac8de7 100644 --- a/src/dgnss_management.c +++ b/src/dgnss_management.c @@ -395,6 +395,23 @@ void dgnss_update_ambiguity_state(ambiguity_state_t *s) } } +/** Formats flag bits for sbp. + * bit positions: + * -`0`: fixed mode? + * -`3`: RAIM available? + * -`4`: RAIM repair used? + * + * \param ret return code from baseline() + * \param fixed 1 for fixed, 0 for float + * \return formatted flag value + */ +u8 baseline_flag(s8 ret, bool fixed) +{ + return (ret == 1) << 4 /* RAIM repair? */ + | (ret != 2) << 3 /* RAIM available? */ + | fixed; /* Fixed mode? */ +} + /** Finds the baseline using low latency sdiffs. * The low latency sdiffs are not guaranteed to match up with either the * amb_test's or the float sdiffs, and thus care must be taken to transform them @@ -410,37 +427,43 @@ void dgnss_update_ambiguity_state(ambiguity_state_t *s) * \param b Output baseline. * \param disable_raim Flag to turn off raim checks/repair. * \param raim_threshold raim check threshold - * \return 1 if we are using an IAR resolved baseline. - * 2 if we are using a float baseline. - * -1 if we can't give a baseline. + * \return positive value: SBP baseline msg flags + * negative value: baseline error code */ s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs, const double ref_ecef[3], const ambiguity_state_t *s, u8 *num_used, double b[3], bool disable_raim, double raim_threshold) { - s8 ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->fixed_ambs, num_used, b, + s8 ret; + + /* Try IAR resolved baseline */ + ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->fixed_ambs, num_used, b, disable_raim, raim_threshold); if (ret >= 0) { - if (ret == 1) /* TODO: Export this rather than just printing */ + if (ret == 1) log_warn("dgnss_baseline: Fixed baseline RAIM repair"); log_debug("fixed solution"); DEBUG_EXIT(); - return 1; + return baseline_flag(ret, true); } + /* We weren't able to get an IAR resolved baseline, check if we can get a * float baseline. */ - if ((ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->float_ambs, num_used, b, - disable_raim, raim_threshold)) - >= 0) { - if (ret == 1) /* TODO: Export this rather than just printing */ + ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->float_ambs, num_used, b, + disable_raim, raim_threshold); + if (ret >= 0) { + if (ret == 1) log_warn("dgnss_baseline: Float baseline RAIM repair"); log_debug("float solution"); DEBUG_EXIT(); - return 2; + return baseline_flag(ret, false); } log_debug("no baseline solution"); DEBUG_EXIT(); + + /* Must be negative! */ + assert(ret < 0); return ret; } diff --git a/src/pvt.c b/src/pvt.c index b4629322..845d1642 100644 --- a/src/pvt.c +++ b/src/pvt.c @@ -536,17 +536,26 @@ s8 calc_PVT(const u8 n_used, soln->n_used = n_used; // Keep track of number of working channels u8 removed_prn = -1; - s8 raim_flag = pvt_solve_raim(rx_state, n_used, nav_meas, disable_raim, - H, &removed_prn, 0); + s8 code = pvt_solve_raim(rx_state, n_used, nav_meas, disable_raim, + H, &removed_prn, 0); - if (raim_flag < 0) { + if (code < 0) { /* Didn't converge or least squares integrity check failed. */ - return raim_flag - 3; + return code - 3; } + soln->raim_flag = 0; + /* Initial solution failed, but repair was successful. */ - if (raim_flag == 1) { + if (code == 1) { soln->n_used--; + soln->raim_flag = (1 << 1) | 1; /* 11 */ + } else if (code == 2) { + soln->raim_flag = 0; /* 00 */ + } else if (code == 0) { + soln->raim_flag = 1; /* 01 */ + } else { + log_error("Invalid pvt_solve_raim return code: %d\n", code); } /* Compute various dilution of precision metrics. */ @@ -597,6 +606,6 @@ s8 calc_PVT(const u8 n_used, soln->valid = 1; - return raim_flag; + return code; } diff --git a/tests/check_dgnss_management.c b/tests/check_dgnss_management.c index 7cce1799..c796f1cf 100644 --- a/tests/check_dgnss_management.c +++ b/tests/check_dgnss_management.c @@ -212,7 +212,8 @@ START_TEST(test_dgnss_baseline_1) s.fixed_ambs.n = 0; s8 valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b, false, DEFAULT_RAIM_THRESHOLD); - fail_unless(valid == 2); + /* baseline_flag(initial solution ok, float mode) */ + fail_unless(valid == baseline_flag(0, false)); fail_unless(num_used == 5); fail_unless(within_epsilon(b[0], -0.742242)); fail_unless(within_epsilon(b[1], -0.492905)); @@ -222,7 +223,8 @@ START_TEST(test_dgnss_baseline_1) s.fixed_ambs.n = 4; valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b, false, DEFAULT_RAIM_THRESHOLD); - fail_unless(valid == 1); + /* baseline_flag(initial solution ok, fixed mode) */ + fail_unless(valid == baseline_flag(0, true)); fail_unless(num_used == 5); fail_unless(within_epsilon(b[0], -0.417486)); fail_unless(within_epsilon(b[1], -0.358386)); diff --git a/tests/check_pvt.c b/tests/check_pvt.c index 279e1660..d3667772 100644 --- a/tests/check_pvt.c +++ b/tests/check_pvt.c @@ -86,6 +86,8 @@ START_TEST(test_pvt_repair) s8 code = calc_PVT(n_used, nms, false, &soln, &dops); fail_unless(code == 1, "Return code should be 1 (pvt repair). Saw: %d\n", code); + fail_unless(soln.raim_flag == 3, + "raim_flag should be 11, saw: %d\n", soln.raim_flag); fail_unless(soln.n_used == n_used - 1, "PVT solver failed to repair solution."); } @@ -104,6 +106,8 @@ START_TEST(test_disable_pvt_raim) s8 code = calc_PVT(n_used, nms, true, &soln, &dops); fail_unless(code == 2, "Return code should be 2 (raim not used). Saw: %d\n", code); + fail_unless(soln.raim_flag == 0, + "raim_flag should be 00, saw: %d\n", soln.raim_flag); fail_unless(soln.valid == 1, "Solution should be valid!"); } From ca460983ccfbb761e06c20c5a49f54914ea0f504 Mon Sep 17 00:00:00 2001 From: Scott Kovach Date: Thu, 23 Jul 2015 11:43:08 -0700 Subject: [PATCH 2/6] added flag accessors --- include/libswiftnav/dgnss_management.h | 3 +++ src/dgnss_management.c | 15 +++++++++++++++ src/pvt.c | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/libswiftnav/dgnss_management.h b/include/libswiftnav/dgnss_management.h index 672e8807..898c806b 100644 --- a/include/libswiftnav/dgnss_management.h +++ b/include/libswiftnav/dgnss_management.h @@ -63,6 +63,9 @@ void dgnss_reset_iar(void); void dgnss_init_known_baseline(u8 num_sats, sdiff_t *sdiffs, double receiver_ecef[3], double b[3]); void dgnss_update_ambiguity_state(ambiguity_state_t *s); u8 baseline_flag(s8 ret, bool fixed); +u8 flag_raim_repaired(u8 flag); +u8 flag_raim_available(u8 flag); +u8 flag_fixed_mode(u8 flag); s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs, const double ref_ecef[3], const ambiguity_state_t *s, u8 *num_used, double b[3], diff --git a/src/dgnss_management.c b/src/dgnss_management.c index 8dac8de7..abc2895b 100644 --- a/src/dgnss_management.c +++ b/src/dgnss_management.c @@ -412,6 +412,21 @@ u8 baseline_flag(s8 ret, bool fixed) | fixed; /* Fixed mode? */ } +u8 flag_raim_repaired(u8 flag) +{ + return flag & (1 << 4); +} + +u8 flag_raim_available(u8 flag) +{ + return flag & (1 << 3); +} + +u8 flag_fixed_mode(u8 flag) +{ + return flag & 1; +} + /** Finds the baseline using low latency sdiffs. * The low latency sdiffs are not guaranteed to match up with either the * amb_test's or the float sdiffs, and thus care must be taken to transform them diff --git a/src/pvt.c b/src/pvt.c index 845d1642..0bb90f8d 100644 --- a/src/pvt.c +++ b/src/pvt.c @@ -546,11 +546,12 @@ s8 calc_PVT(const u8 n_used, soln->raim_flag = 0; - /* Initial solution failed, but repair was successful. */ if (code == 1) { + /* Initial solution failed, but repair was successful. */ soln->n_used--; soln->raim_flag = (1 << 1) | 1; /* 11 */ } else if (code == 2) { + /* raim was unavailable */ soln->raim_flag = 0; /* 00 */ } else if (code == 0) { soln->raim_flag = 1; /* 01 */ From 8d2298ed1df51a8ccff202a4988570123156a0de Mon Sep 17 00:00:00 2001 From: Scott Kovach Date: Fri, 31 Jul 2015 14:40:02 -0700 Subject: [PATCH 3/6] add baseline solution struct, move flag logic out to piksi_firmware --- include/libswiftnav/dgnss_management.h | 20 +++++++--- src/dgnss_management.c | 52 ++++++++------------------ tests/check_dgnss_management.c | 36 +++++++++--------- 3 files changed, 48 insertions(+), 60 deletions(-) diff --git a/include/libswiftnav/dgnss_management.h b/include/libswiftnav/dgnss_management.h index 898c806b..880e48f1 100644 --- a/include/libswiftnav/dgnss_management.h +++ b/include/libswiftnav/dgnss_management.h @@ -39,6 +39,19 @@ typedef struct { ambiguities_t float_ambs; } ambiguity_state_t; +typedef struct { + /* Baseline estimate */ + double b[3]; + /* Number of sdiffs used in the soluton. */ + u8 num_used; + /* bool: fixed or float filter derived */ + u8 fixed_mode; + /* bool: raim available for least squares baseline estimate */ + u8 raim_available; + /* bool: raim used to repair baseline */ + u8 raim_repair; +} dgnss_baseline_t; + extern dgnss_settings_t dgnss_settings; void dgnss_set_settings(double phase_var_test, double code_var_test, @@ -62,13 +75,10 @@ s8 dgnss_iar_get_single_hyp(double *hyp); void dgnss_reset_iar(void); void dgnss_init_known_baseline(u8 num_sats, sdiff_t *sdiffs, double receiver_ecef[3], double b[3]); void dgnss_update_ambiguity_state(ambiguity_state_t *s); -u8 baseline_flag(s8 ret, bool fixed); -u8 flag_raim_repaired(u8 flag); -u8 flag_raim_available(u8 flag); -u8 flag_fixed_mode(u8 flag); +void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution); s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs, const double ref_ecef[3], const ambiguity_state_t *s, - u8 *num_used, double b[3], + dgnss_baseline_t *solution, bool disable_raim, double raim_threshold); void measure_amb_kf_b(u8 num_sdiffs, sdiff_t *sdiffs, const double receiver_ecef[3], double *b); diff --git a/src/dgnss_management.c b/src/dgnss_management.c index abc2895b..f3210968 100644 --- a/src/dgnss_management.c +++ b/src/dgnss_management.c @@ -395,36 +395,12 @@ void dgnss_update_ambiguity_state(ambiguity_state_t *s) } } -/** Formats flag bits for sbp. - * bit positions: - * -`0`: fixed mode? - * -`3`: RAIM available? - * -`4`: RAIM repair used? - * - * \param ret return code from baseline() - * \param fixed 1 for fixed, 0 for float - * \return formatted flag value - */ -u8 baseline_flag(s8 ret, bool fixed) -{ - return (ret == 1) << 4 /* RAIM repair? */ - | (ret != 2) << 3 /* RAIM available? */ - | fixed; /* Fixed mode? */ -} - -u8 flag_raim_repaired(u8 flag) -{ - return flag & (1 << 4); -} - -u8 flag_raim_available(u8 flag) -{ - return flag & (1 << 3); -} - -u8 flag_fixed_mode(u8 flag) +/* Interpret raim-related content of baseline function return code. */ +void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution) { - return flag & 1; + solution->raim_repair = ret == 1; + solution->raim_available = ret != 2; + solution->fixed_mode = fixed; } /** Finds the baseline using low latency sdiffs. @@ -442,37 +418,41 @@ u8 flag_fixed_mode(u8 flag) * \param b Output baseline. * \param disable_raim Flag to turn off raim checks/repair. * \param raim_threshold raim check threshold - * \return positive value: SBP baseline msg flags + * \return 0: solution ok * negative value: baseline error code */ s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs, const double ref_ecef[3], const ambiguity_state_t *s, - u8 *num_used, double b[3], + dgnss_baseline_t *solution, bool disable_raim, double raim_threshold) { s8 ret; /* Try IAR resolved baseline */ - ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->fixed_ambs, num_used, b, - disable_raim, raim_threshold); + ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->fixed_ambs, + &solution->num_used, solution->b, + disable_raim, raim_threshold); if (ret >= 0) { if (ret == 1) log_warn("dgnss_baseline: Fixed baseline RAIM repair"); log_debug("fixed solution"); DEBUG_EXIT(); - return baseline_flag(ret, true); + fill_property_flags(ret, true, solution); + return 0; } /* We weren't able to get an IAR resolved baseline, check if we can get a * float baseline. */ - ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->float_ambs, num_used, b, + ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->float_ambs, + &solution->num_used, solution->b, disable_raim, raim_threshold); if (ret >= 0) { if (ret == 1) log_warn("dgnss_baseline: Float baseline RAIM repair"); log_debug("float solution"); DEBUG_EXIT(); - return baseline_flag(ret, false); + fill_property_flags(ret, false, solution); + return 0; } log_debug("no baseline solution"); DEBUG_EXIT(); diff --git a/tests/check_dgnss_management.c b/tests/check_dgnss_management.c index c796f1cf..1048912e 100644 --- a/tests/check_dgnss_management.c +++ b/tests/check_dgnss_management.c @@ -5,6 +5,7 @@ #include "check_utils.h" #include "dgnss_management.h" #include "ambiguity_test.h" +#include "printing_utils.h" #include "amb_kf.h" #include "printing_utils.h" @@ -205,41 +206,38 @@ START_TEST(test_dgnss_baseline_1) } }; - double b[3]; - u8 num_used; + dgnss_baseline_t solution; /* Float only */ s.fixed_ambs.n = 0; - s8 valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b, + s8 valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &solution, false, DEFAULT_RAIM_THRESHOLD); /* baseline_flag(initial solution ok, float mode) */ - fail_unless(valid == baseline_flag(0, false)); - fail_unless(num_used == 5); - fail_unless(within_epsilon(b[0], -0.742242)); - fail_unless(within_epsilon(b[1], -0.492905)); - fail_unless(within_epsilon(b[2], -0.0533294)); + fail_unless(valid == 0); + fail_unless(solution.fixed_mode == 0); + fail_unless(solution.num_used == 5); + double expected1[] = {-0.742242, -0.492905, -0.0533294}; + fail_unless(arr_within_epsilon(3, solution.b, expected1)); /* Fixed and float */ s.fixed_ambs.n = 4; - valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b, + valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &solution, false, DEFAULT_RAIM_THRESHOLD); /* baseline_flag(initial solution ok, fixed mode) */ - fail_unless(valid == baseline_flag(0, true)); - fail_unless(num_used == 5); - fail_unless(within_epsilon(b[0], -0.417486)); - fail_unless(within_epsilon(b[1], -0.358386)); - fail_unless(within_epsilon(b[2], 0.271427)); + fail_unless(valid == 0); + fail_unless(solution.fixed_mode == 1); + fail_unless(solution.num_used == 5); + double expected2[] = {-0.622609, -0.432371, -0.00461595}; + fail_unless(arr_within_epsilon(3, solution.b, expected2)); /* No solution possible */ s.fixed_ambs.n = 0; s.float_ambs.n = 0; - valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b, + valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &solution, false, DEFAULT_RAIM_THRESHOLD); fail_unless(valid == -1); - fail_unless(num_used == 5); - fail_unless(within_epsilon(b[0], -0.417486)); - fail_unless(within_epsilon(b[1], -0.358386)); - fail_unless(within_epsilon(b[2], 0.271427)); + fail_unless(solution.num_used == 5); + fail_unless(arr_within_epsilon(3, solution.b, expected2)); } END_TEST From 7b855dc8d3e36703150464db9120effb7db91cd3 Mon Sep 17 00:00:00 2001 From: Scott Kovach Date: Tue, 3 Nov 2015 18:17:10 -0800 Subject: [PATCH 4/6] fix baseline, doxygen --- src/dgnss_management.c | 5 ++--- tests/check_dgnss_management.c | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/dgnss_management.c b/src/dgnss_management.c index f3210968..f7f94a28 100644 --- a/src/dgnss_management.c +++ b/src/dgnss_management.c @@ -413,9 +413,8 @@ void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution) * \param ref_ecef The referece position for the baseline. * (TODO is this the local or remote receiver position?) * \param s Current ambiguity test state. - * \param num_used Output number of sdiffs actually used in the baseline - * estimate. - * \param b Output baseline. + * \param solution struct containing output baseline, num sdiffs used, + * fixed mode, raim availability, whether raim was used. * \param disable_raim Flag to turn off raim checks/repair. * \param raim_threshold raim check threshold * \return 0: solution ok diff --git a/tests/check_dgnss_management.c b/tests/check_dgnss_management.c index 1048912e..f5750881 100644 --- a/tests/check_dgnss_management.c +++ b/tests/check_dgnss_management.c @@ -227,7 +227,7 @@ START_TEST(test_dgnss_baseline_1) fail_unless(valid == 0); fail_unless(solution.fixed_mode == 1); fail_unless(solution.num_used == 5); - double expected2[] = {-0.622609, -0.432371, -0.00461595}; + double expected2[] = {-0.417486, -0.358386, 0.271427}; fail_unless(arr_within_epsilon(3, solution.b, expected2)); /* No solution possible */ From 8567d6297046947eee910c4b8fb0b16237a7f0c1 Mon Sep 17 00:00:00 2001 From: Scott Kovach Date: Wed, 4 Nov 2015 16:06:42 -0800 Subject: [PATCH 5/6] PR comments --- include/libswiftnav/dgnss_management.h | 7 +++---- src/dgnss_management.c | 2 +- src/pvt.c | 26 +++++++++++++++----------- tests/check_pvt.c | 2 +- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/include/libswiftnav/dgnss_management.h b/include/libswiftnav/dgnss_management.h index 880e48f1..dd471f63 100644 --- a/include/libswiftnav/dgnss_management.h +++ b/include/libswiftnav/dgnss_management.h @@ -45,11 +45,11 @@ typedef struct { /* Number of sdiffs used in the soluton. */ u8 num_used; /* bool: fixed or float filter derived */ - u8 fixed_mode; + bool fixed_mode; /* bool: raim available for least squares baseline estimate */ - u8 raim_available; + bool raim_available; /* bool: raim used to repair baseline */ - u8 raim_repair; + bool raim_repair; } dgnss_baseline_t; extern dgnss_settings_t dgnss_settings; @@ -75,7 +75,6 @@ s8 dgnss_iar_get_single_hyp(double *hyp); void dgnss_reset_iar(void); void dgnss_init_known_baseline(u8 num_sats, sdiff_t *sdiffs, double receiver_ecef[3], double b[3]); void dgnss_update_ambiguity_state(ambiguity_state_t *s); -void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution); s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs, const double ref_ecef[3], const ambiguity_state_t *s, dgnss_baseline_t *solution, diff --git a/src/dgnss_management.c b/src/dgnss_management.c index f7f94a28..9016a456 100644 --- a/src/dgnss_management.c +++ b/src/dgnss_management.c @@ -396,7 +396,7 @@ void dgnss_update_ambiguity_state(ambiguity_state_t *s) } /* Interpret raim-related content of baseline function return code. */ -void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution) +static void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution) { solution->raim_repair = ret == 1; solution->raim_available = ret != 2; diff --git a/src/pvt.c b/src/pvt.c index 0bb90f8d..278f61cc 100644 --- a/src/pvt.c +++ b/src/pvt.c @@ -546,17 +546,21 @@ s8 calc_PVT(const u8 n_used, soln->raim_flag = 0; - if (code == 1) { - /* Initial solution failed, but repair was successful. */ - soln->n_used--; - soln->raim_flag = (1 << 1) | 1; /* 11 */ - } else if (code == 2) { - /* raim was unavailable */ - soln->raim_flag = 0; /* 00 */ - } else if (code == 0) { - soln->raim_flag = 1; /* 01 */ - } else { - log_error("Invalid pvt_solve_raim return code: %d\n", code); + switch (code) { + case 1: + /* Initial solution failed, but repair was successful. */ + soln->n_used--; + soln->raim_flag = (1 << 1) | 1; /* 11 */ + break; + case 2: + /* raim was unavailable */ + soln->raim_flag = 0; /* 00 */ + break; + case 0: + soln->raim_flag = 1; /* 01 */ + break; + default: + log_error("Invalid pvt_solve_raim return code: %d\n", code); } /* Compute various dilution of precision metrics. */ diff --git a/tests/check_pvt.c b/tests/check_pvt.c index d3667772..21d8f89e 100644 --- a/tests/check_pvt.c +++ b/tests/check_pvt.c @@ -87,7 +87,7 @@ START_TEST(test_pvt_repair) fail_unless(code == 1, "Return code should be 1 (pvt repair). Saw: %d\n", code); fail_unless(soln.raim_flag == 3, - "raim_flag should be 11, saw: %d\n", soln.raim_flag); + "raim_flag should be 0b11, saw: %d\n", soln.raim_flag); fail_unless(soln.n_used == n_used - 1, "PVT solver failed to repair solution."); } From d15cf6380aabaae79696fcf35c6ec10c4180281b Mon Sep 17 00:00:00 2001 From: Scott Kovach Date: Wed, 4 Nov 2015 17:17:19 -0800 Subject: [PATCH 6/6] not static --- include/libswiftnav/dgnss_management.h | 1 + src/dgnss_management.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/libswiftnav/dgnss_management.h b/include/libswiftnav/dgnss_management.h index dd471f63..4744e607 100644 --- a/include/libswiftnav/dgnss_management.h +++ b/include/libswiftnav/dgnss_management.h @@ -75,6 +75,7 @@ s8 dgnss_iar_get_single_hyp(double *hyp); void dgnss_reset_iar(void); void dgnss_init_known_baseline(u8 num_sats, sdiff_t *sdiffs, double receiver_ecef[3], double b[3]); void dgnss_update_ambiguity_state(ambiguity_state_t *s); +void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution); s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs, const double ref_ecef[3], const ambiguity_state_t *s, dgnss_baseline_t *solution, diff --git a/src/dgnss_management.c b/src/dgnss_management.c index 9016a456..f7f94a28 100644 --- a/src/dgnss_management.c +++ b/src/dgnss_management.c @@ -396,7 +396,7 @@ void dgnss_update_ambiguity_state(ambiguity_state_t *s) } /* Interpret raim-related content of baseline function return code. */ -static void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution) +void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution) { solution->raim_repair = ret == 1; solution->raim_available = ret != 2;