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

Commit 8d2298e

Browse files
committed
add baseline solution struct, move flag logic out to piksi_firmware
1 parent ca46098 commit 8d2298e

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.
@@ -442,37 +418,41 @@ u8 flag_fixed_mode(u8 flag)
442418
* \param b Output baseline.
443419
* \param disable_raim Flag to turn off raim checks/repair.
444420
* \param raim_threshold raim check threshold
445-
* \return positive value: SBP baseline msg flags
421+
* \return 0: solution ok
446422
* negative value: baseline error code
447423
*/
448424
s8 dgnss_baseline(u8 num_sdiffs, const sdiff_t *sdiffs,
449425
const double ref_ecef[3], const ambiguity_state_t *s,
450-
u8 *num_used, double b[3],
426+
dgnss_baseline_t *solution,
451427
bool disable_raim, double raim_threshold)
452428
{
453429
s8 ret;
454430

455431
/* Try IAR resolved baseline */
456-
ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->fixed_ambs, num_used, b,
457-
disable_raim, raim_threshold);
432+
ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->fixed_ambs,
433+
&solution->num_used, solution->b,
434+
disable_raim, raim_threshold);
458435
if (ret >= 0) {
459436
if (ret == 1)
460437
log_warn("dgnss_baseline: Fixed baseline RAIM repair");
461438
log_debug("fixed solution");
462439
DEBUG_EXIT();
463-
return baseline_flag(ret, true);
440+
fill_property_flags(ret, true, solution);
441+
return 0;
464442
}
465443

466444
/* We weren't able to get an IAR resolved baseline, check if we can get a
467445
* float baseline. */
468-
ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->float_ambs, num_used, b,
446+
ret = baseline(num_sdiffs, sdiffs, ref_ecef, &s->float_ambs,
447+
&solution->num_used, solution->b,
469448
disable_raim, raim_threshold);
470449
if (ret >= 0) {
471450
if (ret == 1)
472451
log_warn("dgnss_baseline: Float baseline RAIM repair");
473452
log_debug("float solution");
474453
DEBUG_EXIT();
475-
return baseline_flag(ret, false);
454+
fill_property_flags(ret, false, solution);
455+
return 0;
476456
}
477457
log_debug("no baseline solution");
478458
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
#include "printing_utils.h"
1011

@@ -205,41 +206,38 @@ START_TEST(test_dgnss_baseline_1)
205206
}
206207
};
207208

208-
double b[3];
209-
u8 num_used;
209+
dgnss_baseline_t solution;
210210

211211
/* Float only */
212212
s.fixed_ambs.n = 0;
213-
s8 valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b,
213+
s8 valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &solution,
214214
false, DEFAULT_RAIM_THRESHOLD);
215215
/* baseline_flag(initial solution ok, float mode) */
216-
fail_unless(valid == baseline_flag(0, false));
217-
fail_unless(num_used == 5);
218-
fail_unless(within_epsilon(b[0], -0.742242));
219-
fail_unless(within_epsilon(b[1], -0.492905));
220-
fail_unless(within_epsilon(b[2], -0.0533294));
216+
fail_unless(valid == 0);
217+
fail_unless(solution.fixed_mode == 0);
218+
fail_unless(solution.num_used == 5);
219+
double expected1[] = {-0.742242, -0.492905, -0.0533294};
220+
fail_unless(arr_within_epsilon(3, solution.b, expected1));
221221

222222
/* Fixed and float */
223223
s.fixed_ambs.n = 4;
224-
valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b,
224+
valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &solution,
225225
false, DEFAULT_RAIM_THRESHOLD);
226226
/* baseline_flag(initial solution ok, fixed mode) */
227-
fail_unless(valid == baseline_flag(0, true));
228-
fail_unless(num_used == 5);
229-
fail_unless(within_epsilon(b[0], -0.417486));
230-
fail_unless(within_epsilon(b[1], -0.358386));
231-
fail_unless(within_epsilon(b[2], 0.271427));
227+
fail_unless(valid == 0);
228+
fail_unless(solution.fixed_mode == 1);
229+
fail_unless(solution.num_used == 5);
230+
double expected2[] = {-0.622609, -0.432371, -0.00461595};
231+
fail_unless(arr_within_epsilon(3, solution.b, expected2));
232232

233233
/* No solution possible */
234234
s.fixed_ambs.n = 0;
235235
s.float_ambs.n = 0;
236-
valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &num_used, b,
236+
valid = dgnss_baseline(num_sdiffs, sdiffs, ref_ecef, &s, &solution,
237237
false, DEFAULT_RAIM_THRESHOLD);
238238
fail_unless(valid == -1);
239-
fail_unless(num_used == 5);
240-
fail_unless(within_epsilon(b[0], -0.417486));
241-
fail_unless(within_epsilon(b[1], -0.358386));
242-
fail_unless(within_epsilon(b[2], 0.271427));
239+
fail_unless(solution.num_used == 5);
240+
fail_unless(arr_within_epsilon(3, solution.b, expected2));
243241
}
244242
END_TEST
245243

0 commit comments

Comments
 (0)