1515#include <libswiftnav/ephemeris.h>
1616#include <libswiftnav/logging.h>
1717#include <ch.h>
18+ #include <assert.h>
1819
1920#include "sbp.h"
2021#include "sbp_utils.h"
2324#include "ephemeris.h"
2425
2526MUTEX_DECL (es_mutex );
26- ephemeris_t es [MAX_SATS ] _CCM ;
27- static ephemeris_t es_candidate [MAX_SATS ] _CCM ;
27+ static ephemeris_t es [NUM_SATS ] _CCM ;
28+ static ephemeris_t es_candidate [NUM_SATS ] _CCM ;
2829
2930static void ephemeris_new (ephemeris_t * e )
3031{
32+ assert (sid_valid (e -> sid ));
33+
3134 gps_time_t t = get_current_time ();
32- if (!ephemeris_good (& es [e -> sid .sat ], t )) {
35+ u32 index = sid_to_index (e -> sid );
36+ if (!ephemeris_good (& es [index ], t )) {
3337 /* Our currently used ephemeris is bad, so we assume this is better. */
3438 log_info ("New untrusted ephemeris for PRN %02d" , e -> sid .sat + 1 );
35- chMtxLock ( & es_mutex );
36- es [e -> sid . sat ] = es_candidate [e -> sid . sat ] = * e ;
37- chMtxUnlock ();
39+ ephemeris_lock ( );
40+ es [index ] = es_candidate [index ] = * e ;
41+ ephemeris_unlock ();
3842
39- } else if (ephemeris_equal (& es_candidate [e -> sid . sat ], e )) {
43+ } else if (ephemeris_equal (& es_candidate [index ], e )) {
4044 /* The received ephemeris matches our candidate, so we trust it. */
4145 log_info ("New trusted ephemeris for PRN %02d" , e -> sid .sat + 1 );
42- chMtxLock ( & es_mutex );
43- es [e -> sid . sat ] = * e ;
44- chMtxUnlock ();
46+ ephemeris_lock ( );
47+ es [index ] = * e ;
48+ ephemeris_unlock ();
4549 } else {
4650 /* This is our first reception of this new ephemeris, so treat it with
4751 * suspicion and call it the new candidate. */
4852 log_info ("New ephemeris candidate for PRN %02d" , e -> sid .sat + 1 );
49- chMtxLock ( & es_mutex );
50- es_candidate [e -> sid . sat ] = * e ;
51- chMtxUnlock ();
53+ ephemeris_lock ( );
54+ es_candidate [index ] = * e ;
55+ ephemeris_unlock ();
5256 }
5357}
5458
@@ -86,11 +90,12 @@ static msg_t nav_msg_thread(void *arg)
8690 /* Decoded a new ephemeris. */
8791 ephemeris_new (& e );
8892
89- if (!es [ch -> sid .sat ].healthy ) {
93+ ephemeris_t * eph = ephemeris_get (ch -> sid );
94+ if (!eph -> healthy ) {
9095 log_info ("PRN %02d unhealthy" , ch -> sid .sat + 1 );
9196 } else {
9297 msg_ephemeris_t msg ;
93- pack_ephemeris (& es [ ch -> sid . sat ] , & msg );
98+ pack_ephemeris (eph , & msg );
9499 sbp_send_msg (SBP_MSG_EPHEMERIS , sizeof (msg_ephemeris_t ), (u8 * )& msg );
95100 }
96101 }
@@ -110,7 +115,7 @@ static void ephemeris_msg_callback(u16 sender_id, u8 len, u8 msg[], void* contex
110115
111116 ephemeris_t e ;
112117 unpack_ephemeris ((msg_ephemeris_t * )msg , & e );
113- if (e .sid . sat >= MAX_SATS ) {
118+ if (! sid_valid ( e .sid ) ) {
114119 log_warn ("Ignoring ephemeris for invalid sat" );
115120 return ;
116121 }
@@ -122,8 +127,8 @@ void ephemeris_setup(void)
122127{
123128 memset (es_candidate , 0 , sizeof (es_candidate ));
124129 memset (es , 0 , sizeof (es ));
125- for (u8 i = 0 ; i < 32 ; i ++ ) {
126- es [i ].sid . sat = i ;
130+ for (u32 i = 0 ; i < NUM_SATS ; i ++ ) {
131+ es [i ].sid = sid_from_index ( i ) ;
127132 }
128133
129134 static sbp_msg_callbacks_node_t ephemeris_msg_node ;
@@ -137,3 +142,19 @@ void ephemeris_setup(void)
137142 NORMALPRIO - 1 , nav_msg_thread , NULL );
138143}
139144
145+ void ephemeris_lock (void )
146+ {
147+ chMtxLock (& es_mutex );
148+ }
149+
150+ void ephemeris_unlock (void )
151+ {
152+ Mutex * m = chMtxUnlock ();
153+ assert (m == & es_mutex );
154+ }
155+
156+ ephemeris_t * ephemeris_get (gnss_signal_t sid )
157+ {
158+ assert (sid_valid (sid ));
159+ return & es [sid_to_index (sid )];
160+ }
0 commit comments