84 lines
2.0 KiB
C
84 lines
2.0 KiB
C
#ifndef GPS_ACQ_MANAGER_H
|
|
#define GPS_ACQ_MANAGER_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#define GPS_ACQ_MANAGER_PRN_COUNT 32u
|
|
#define GPS_ACQ_MANAGER_INVALID_PRN 0xffu
|
|
|
|
typedef enum {
|
|
GPS_ACQ_PRN_DISABLED = 0,
|
|
GPS_ACQ_PRN_COLD,
|
|
GPS_ACQ_PRN_HOT,
|
|
GPS_ACQ_PRN_ACQUIRING,
|
|
GPS_ACQ_PRN_ACQUIRED,
|
|
GPS_ACQ_PRN_TRACKING,
|
|
GPS_ACQ_PRN_STALE
|
|
} gps_acq_prn_state_t;
|
|
|
|
typedef struct {
|
|
uint64_t retry_delay_ticks;
|
|
uint64_t hot_retry_delay_ticks;
|
|
uint64_t hot_window_ticks;
|
|
unsigned int max_hot_streak;
|
|
} gps_acq_manager_config_t;
|
|
|
|
typedef struct {
|
|
gps_acq_prn_state_t state;
|
|
uint64_t last_attempt_tick;
|
|
uint64_t hot_until_tick;
|
|
bool has_attempted;
|
|
bool attempt_was_hot;
|
|
} gps_acq_prn_entry_t;
|
|
|
|
typedef struct {
|
|
gps_acq_manager_config_t config;
|
|
gps_acq_prn_entry_t prn[GPS_ACQ_MANAGER_PRN_COUNT];
|
|
unsigned int cold_cursor;
|
|
unsigned int hot_cursor;
|
|
unsigned int hot_streak;
|
|
} gps_acq_manager_t;
|
|
|
|
void gps_acq_manager_init(
|
|
gps_acq_manager_t* manager,
|
|
const gps_acq_manager_config_t* config);
|
|
bool gps_acq_manager_enable_cold(
|
|
gps_acq_manager_t* manager,
|
|
unsigned int prn);
|
|
gps_acq_prn_state_t gps_acq_manager_state(
|
|
const gps_acq_manager_t* manager,
|
|
unsigned int prn);
|
|
const char* gps_acq_manager_state_name(gps_acq_prn_state_t state);
|
|
|
|
void gps_acq_manager_mark_acquired(
|
|
gps_acq_manager_t* manager,
|
|
unsigned int prn);
|
|
void gps_acq_manager_mark_tracking(
|
|
gps_acq_manager_t* manager,
|
|
unsigned int prn);
|
|
void gps_acq_manager_mark_stale(
|
|
gps_acq_manager_t* manager,
|
|
unsigned int prn);
|
|
void gps_acq_manager_mark_lost(
|
|
gps_acq_manager_t* manager,
|
|
unsigned int prn,
|
|
uint64_t now);
|
|
void gps_acq_manager_mark_failed(
|
|
gps_acq_manager_t* manager,
|
|
unsigned int prn,
|
|
uint64_t now);
|
|
|
|
bool gps_acq_manager_start_next(
|
|
gps_acq_manager_t* manager,
|
|
uint64_t now,
|
|
unsigned int* prn_out,
|
|
bool* hot_out);
|
|
unsigned int gps_acq_manager_count_state(
|
|
const gps_acq_manager_t* manager,
|
|
gps_acq_prn_state_t state);
|
|
unsigned int gps_acq_manager_count_searchable(
|
|
const gps_acq_manager_t* manager);
|
|
|
|
#endif
|