Files
gps/soc/software/gps_system/header/gps/gps_acq_manager.h
T

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