File dsss_burst_receiver_core.h¶
File List > dsss_burst_receiver > dsss_burst_receiver_core.h
Go to the documentation of this file
#ifndef DSSS_BURST_RECEIVER_CORE_H
#define DSSS_BURST_RECEIVER_CORE_H
#include "clib_common.h"
#include "jm_perf.h"
#include "buffer/buffer.h"
#include "dp_state.h"
typedef struct
{
uint64_t preamble_start;
double doppler_hz_est;
double doppler_res_hz;
double cn0_dbhz_est;
double est_freq_hz;
double est_rate_hz;
double est_snr_db;
double refine_margin;
uint8_t frame_valid;
} dsss_br_event_t;
#include "burst_capture/burst_capture_core.h"
#include "burst_acq/burst_acq_core.h"
#include "acq/acq_core.h"
#include "burst_demod/burst_demod_core.h"
#include "burst_despreader/burst_despreader_core.h"
#include "ppe/ppe_core.h"
#include "corr/corr_core.h"
#include "corr2d/corr2d_core.h"
#include "fft2d/fft2d_core.h"
#include "spectral/spectral_core.h"
#include "loop_filter/loop_filter_core.h"
#include "detection/detection_core.h"
#include "fft/fft_core.h"
#include "pn/pn_core.h"
#include "conv/conv_core.h"
#include "rs/rs_core.h"
#include "gold/gold_core.h"
#include "mpsk/mpsk_core.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
/* ── Configuration, copied at create() ──────────────────────────────── */
uint8_t *acq_code;
uint8_t *data_code;
uint8_t *sync;
size_t acq_code_len;
size_t data_code_len;
size_t sync_len;
size_t reps;
size_t spc;
double chip_rate;
size_t frame_syms;
/* ── Derived geometry ───────────────────────────────────────────────── */
size_t code_period;
size_t burst_len;
/* ── The composed children (each certified separately) ──────────────── */
burst_capture_state_t *cap;
burst_demod_state_t *demod;
/* ── The DetectionEvent, describing the most recent completed burst ─── */
uint64_t preamble_start;
double doppler_hz_est;
double doppler_res_hz;
double cn0_dbhz_est;
double est_freq_hz;
double est_rate_hz;
double est_snr_db;
int frame_valid;
double refine_margin;
/* ── The completed bursts of the LAST push ───────────────────────────
* Scratch, deliberately NOT serialized: it describes the most recent
* push() only, so keeping it out of the blob is what lets state_bytes()
* stay a pure function of configuration (finding F5). Grows on demand,
* because the count scales with the caller's block size, not with any
* configuration. */
dsss_br_event_t *ev;
size_t ev_cap;
float *llr;
size_t llr_cap;
size_t llr_len;
size_t frame_bits;
size_t ev_len;
/* ── Bookkeeping ────────────────────────────────────────────────────── */
uint64_t n_bursts;
/*<<property_struct_fields>>*/
} dsss_burst_receiver_state_t;
dsss_burst_receiver_state_t *dsss_burst_receiver_create(const uint8_t *acq_code, size_t acq_code_len, const uint8_t *data_code, size_t data_code_len, const uint8_t *sync, size_t sync_len, size_t reps, size_t spc, double chip_rate, size_t frame_syms, double cn0_dbhz, double doppler_uncertainty, double pfa, double pd, double carrier_hz, double max_rate, size_t est_segments);
void dsss_burst_receiver_destroy(dsss_burst_receiver_state_t *state);
void dsss_burst_receiver_reset(dsss_burst_receiver_state_t *state);
size_t dsss_burst_receiver_push_max_out(dsss_burst_receiver_state_t *state, size_t x_len);
size_t dsss_burst_receiver_push(dsss_burst_receiver_state_t *state, const float _Complex *x, size_t x_len, uint8_t *out, size_t max_out);
size_t dsss_burst_receiver_events_max_out(dsss_burst_receiver_state_t *state);
size_t dsss_burst_receiver_llrs(dsss_burst_receiver_state_t *state, size_t n, float *out, size_t max_out);
size_t dsss_burst_receiver_llrs_max_out(dsss_burst_receiver_state_t *state, size_t n);
size_t dsss_burst_receiver_events(dsss_burst_receiver_state_t *state, size_t n, dsss_br_event_t *out, size_t max_out);
int dsss_burst_receiver_configure_search_raw(dsss_burst_receiver_state_t *state, size_t doppler_bins, size_t n_noncoh);
uint64_t dsss_burst_receiver_get_preamble_start(const dsss_burst_receiver_state_t *state);
double dsss_burst_receiver_get_doppler_hz_est(const dsss_burst_receiver_state_t *state);
double dsss_burst_receiver_get_doppler_res_hz(const dsss_burst_receiver_state_t *state);
double dsss_burst_receiver_get_cn0_dbhz_est(const dsss_burst_receiver_state_t *state);
double dsss_burst_receiver_get_est_freq_hz(const dsss_burst_receiver_state_t *state);
double dsss_burst_receiver_get_est_rate_hz(const dsss_burst_receiver_state_t *state);
double dsss_burst_receiver_get_est_snr_db(const dsss_burst_receiver_state_t *state);
double dsss_burst_receiver_get_refine_margin(const dsss_burst_receiver_state_t *state);
size_t dsss_burst_receiver_get_pending(const dsss_burst_receiver_state_t *state);
uint64_t dsss_burst_receiver_get_dropped(const dsss_burst_receiver_state_t *state);
uint64_t dsss_burst_receiver_get_n_bursts(const dsss_burst_receiver_state_t *state);
/* ── Serializable state — the elastic / pure-transducer face ──────────────
*
* The composition's checkpoint boundary is BETWEEN bursts, which is what
* makes burst_demod's deliberate statelessness cost nothing: a burst
* completes inside one demod() call or is lost (its own validation report
* certifies that as correct), so there is no mid-demod position to save.
* What must travel is this object's own stream bookkeeping, the retained
* look-back the next burst may still need, and the acquisition engine's
* own state -- delegated to its triplet, never re-packed here.
*/
#define DSSS_BURST_RECEIVER_STATE_MAGIC DP_FOURCC('D', 'B', 'R', 'X')
#define DSSS_BURST_RECEIVER_STATE_VERSION 5u
size_t dsss_burst_receiver_state_bytes(const dsss_burst_receiver_state_t *state);
void dsss_burst_receiver_get_state(const dsss_burst_receiver_state_t *state, void *blob);
int dsss_burst_receiver_set_state(dsss_burst_receiver_state_t *state, const void *blob);
size_t dsss_burst_receiver_get_min_gap (
const dsss_burst_receiver_state_t *state);
size_t dsss_burst_receiver_get_refine_span(const dsss_burst_receiver_state_t *state);
size_t dsss_burst_receiver_get_retain_span(const dsss_burst_receiver_state_t *state);
bool dsss_burst_receiver_get_frame_valid(const dsss_burst_receiver_state_t *state);
#ifdef __cplusplus
}
#endif
#endif /* DSSS_BURST_RECEIVER_CORE_H */