Skip to content
This repository was archived by the owner on Apr 13, 2021. It is now read-only.

Commit 6800cad

Browse files
committed
add baseline solution struct, move flag logic out to piksi_firmware
1 parent 5fb9e48 commit 6800cad

File tree

3 files changed

+48
-60
lines changed

3 files changed

+48
-60
lines changed

include/libswiftnav/dgnss_management.h

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,19 @@ typedef struct {
3939
ambiguities_t float_ambs;
4040
} ambiguity_state_t;
4141

42+
typedef struct {
43+
/* Baseline estimate */
44+
double b[3];
45+
/* Number of sdiffs used in the soluton. */
46+
u8 num_used;
47+
/* bool: fixed or float filter derived */
48+
u8 fixed_mode;
49+
/* bool: raim available for least squares baseline estimate */
50+
u8 raim_available;
51+
/* bool: raim used to repair baseline */
52+
u8 raim_repair;
53+
} dgnss_baseline_t;
54+
4255
extern dgnss_settings_t dgnss_settings;
4356

4457
void dgnss_set_settings(double phase_var_test, double code_var_test,
@@ -62,13 +75,10 @@ s8 dgnss_iar_get_single_hyp(double *hyp);
6275
void dgnss_reset_iar(void);
6376
void dgnss_init_known_baseline(u8 num_sats, sdiff_t *sdiffs, double receiver_ecef[3], double b[3]);
6477
void dgnss_update_ambiguity_state(ambiguity_state_t *s);
65-
u8 baseline_flag(s8 ret, bool fixed);
66-
u8 flag_raim_repaired(u8 flag);
67-
u8 flag_raim_available(u8 flag);
68-
u8 flag_fixed_mode(u8 flag);
78+
void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution);
6979
s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs,
7080
const double ref_ecef[3], const ambiguity_state_t *s,
71-
u8 *num_used, double b[3],
81+
dgnss_baseline_t *solution,
7282
bool disable_raim, double raim_threshold);
7383
void measure_amb_kf_b(u8 num_sdiffs, sdiff_t *sdiffs,
7484
const double receiver_ecef[3], double *b);

src/dgnss_management.c

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -395,36 +395,12 @@ void dgnss_update_ambiguity_state(ambiguity_state_t *s)
395395
}
396396
}
397397

398-
/** Formats flag bits for sbp.
399-
* bit positions:
400-
* -`0`: fixed mode?
401-
* -`3`: RAIM available?
402-
* -`4`: RAIM repair used?
403-
*
404-
* \param ret return code from baseline()
405-
* \param fixed 1 for fixed, 0 for float
406-
* \return formatted flag value
407-
*/
408-
u8 baseline_flag(s8 ret, bool fixed)
409-
{
410-
return (ret == 1) << 4 /* RAIM repair? */
411-
| (ret != 2) << 3 /* RAIM available? */
412-
| fixed; /* Fixed mode? */
413-
}
414-
415-
u8 flag_raim_repaired(u8 flag)
416-
{
417-
return flag & (1 << 4);
418-
}
419-
420-
u8 flag_raim_available(u8 flag)
421-
{
422-
return flag & (1 << 3);
423-
}
424-
425-
u8 flag_fixed_mode(u8 flag)
398+
/* Interpret raim-related content of baseline function return code. */
399+
void fill_property_flags(s8 ret, bool fixed, dgnss_baseline_t *solution)
426400
{
427-
return flag & 1;
401+
solution->raim_repair = ret == 1;
402+
solution->raim_available = ret != 2;
403+
solution->fixed_mode = fixed;
428404
}
429405

430406
/** Finds the baseline using low latency sdiffs.
@@ -439,37 +415,41 @@ u8 flag_fixed_mode(u8 flag)
439415
* \param num_used Output number of sdiffs actually used in the baseline
440416
* estimate.
441417
* \param b Output baseline.
442-
* \return positive value: SBP baseline msg flags
418+
* \return 0: solution ok
443419
* negative value: baseline error code
444420
*/
445421
s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs,
446422
const double ref_ecef[3], const ambiguity_state_t *s,
447-
u8 *num_used, double b[3],
423+
dgnss_baseline_t *solution,
448424
bool disable_raim, double raim_threshold)
449425
{
450426
s8 ret;
451427

452428
/* Try IAR resolved baseline */
453-
ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->fixed_ambs, num_used, b,
454-
disable_raim, raim_threshold);
429+
ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->fixed_ambs,
430+
&solution->num_used, solution->b,
431+
disable_raim, raim_threshold);
455432
if (ret >= 0) {
456433
if (ret == 1)
457434
log_warn("dgnss_baseline: Fixed baseline RAIM repair");
458435
log_debug("fixed solution");
459436
DEBUG_EXIT();
460-
return baseline_flag(ret, true);
437+
fill_property_flags(ret, true, solution);
438+
return 0;
461439
}
462440

463441
/* We weren't able to get an IAR resolved baseline, check if we can get a
464442
* float baseline. */
465-
ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->float_ambs, num_used, b,
443+
ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->float_ambs,
444+
&solution->num_used, solution->b,
466445
disable_raim, raim_threshold);
467446
if (ret >= 0) {
468447
if (ret == 1)
469448
log_warn("dgnss_baseline: Float baseline RAIM repair");
470449
log_debug("float solution");
471450
DEBUG_EXIT();
472-
return baseline_flag(ret, false);
451+
fill_property_flags(ret, false, solution);
452+
return 0;
473453
}
474454
log_debug("no baseline solution");
475455
DEBUG_EXIT();

tests/check_dgnss_management.c

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "check_utils.h"
66
#include "dgnss_management.h"
77
#include "ambiguity_test.h"
8+
#include "printing_utils.h"
89
#include "amb_kf.h"
910

1011
extern sats_management_t sats_management;
@@ -199,41 +200,38 @@ START_TEST(test_dgnss_baseline_1)
199200
}
200201
};
201202

202-
double b[3];
203-
u8 num_used;
203+
dgnss_baseline_t solution;
204204

205205
/* Float only */
206206
s.fixed_ambs.n = 0;
207-
s8 valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b,
207+
s8 valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &solution,
208208
false, DEFAULT_RAIM_THRESHOLD);
209209
/* baseline_flag(initial solution ok, float mode) */
210-
fail_unless(valid == baseline_flag(0, false));
211-
fail_unless(num_used == 5);
212-
fail_unless(within_epsilon(b[0], -0.742242));
213-
fail_unless(within_epsilon(b[1], -0.492905));
214-
fail_unless(within_epsilon(b[2], -0.0533294));
210+
fail_unless(valid == 0);
211+
fail_unless(solution.fixed_mode == 0);
212+
fail_unless(solution.num_used == 5);
213+
double expected1[] = {-0.742242, -0.492905, -0.0533294};
214+
fail_unless(arr_within_epsilon(3, solution.b, expected1));
215215

216216
/* Fixed and float */
217217
s.fixed_ambs.n = 4;
218-
valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b,
218+
valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &solution,
219219
false, DEFAULT_RAIM_THRESHOLD);
220220
/* baseline_flag(initial solution ok, fixed mode) */
221-
fail_unless(valid == baseline_flag(0, true));
222-
fail_unless(num_used == 5);
223-
fail_unless(within_epsilon(b[0], -0.622609));
224-
fail_unless(within_epsilon(b[1], -0.432371));
225-
fail_unless(within_epsilon(b[2], -0.00461595));
221+
fail_unless(valid == 0);
222+
fail_unless(solution.fixed_mode == 1);
223+
fail_unless(solution.num_used == 5);
224+
double expected2[] = {-0.622609, -0.432371, -0.00461595};
225+
fail_unless(arr_within_epsilon(3, solution.b, expected2));
226226

227227
/* No solution possible */
228228
s.fixed_ambs.n = 0;
229229
s.float_ambs.n = 0;
230-
valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b,
230+
valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &solution,
231231
false, DEFAULT_RAIM_THRESHOLD);
232232
fail_unless(valid == -1);
233-
fail_unless(num_used == 5);
234-
fail_unless(within_epsilon(b[0], -0.622609));
235-
fail_unless(within_epsilon(b[1], -0.432371));
236-
fail_unless(within_epsilon(b[2], -0.00461595));
233+
fail_unless(solution.num_used == 5);
234+
fail_unless(arr_within_epsilon(3, solution.b, expected2));
237235
}
238236
END_TEST
239237

0 commit comments

Comments
 (0)