static void decoder_gps_l1ca_init(const decoder_channel_info_t *channel_info, decoder_data_t *decoder_data) { (void)channel_info; gps_l1ca_decoder_data_t *data = decoder_data; nav_msg_init(&data->nav_msg); }
/** Initialises a tracking channel. * Initialises a tracking channel on the Swift NAP. The start_sample_count * must be contrived to be at or close to a PRN edge (PROMPT code phase = 0). * * \param prn PRN number - 1 (0-31). * \param channel Tracking channel number on the Swift NAP. * \param carrier_freq Carrier frequency (Doppler) at start of tracking in Hz. * \param start_sample_count Sample count on which to start tracking. */ void tracking_channel_init(u8 channel, u8 prn, float carrier_freq, u32 start_sample_count) { /* Calculate code phase rate with carrier aiding. */ float code_phase_rate = (1 + carrier_freq/L1_HZ) * NOMINAL_CODE_PHASE_RATE_HZ; /* Adjust the channel start time as the start_sample_count passed * in corresponds to a PROMPT code phase rollover but we want to * start the channel on an EARLY code phase rollover. */ /* TODO : change hardcoded sample rate */ start_sample_count -= 0.5*16; /* Setup tracking_channel struct. */ tracking_channel[channel].state = TRACKING_RUNNING; tracking_channel[channel].prn = prn; tracking_channel[channel].update_count = 0; /* Use -1 to indicate an uninitialised value. */ tracking_channel[channel].TOW_ms = -1; tracking_channel[channel].snr_threshold_count = 0; comp_tl_init(&(tracking_channel[channel].tl_state), 1e3, code_phase_rate-1.023e6, 1, 0.7, 1, carrier_freq, 15, 0.7, 1, 0.005, 1540, 5000); tracking_channel[channel].I_filter = 0; tracking_channel[channel].Q_filter = 0; tracking_channel[channel].code_phase_early = 0; tracking_channel[channel].code_phase_rate_fp = code_phase_rate*NAP_TRACK_CODE_PHASE_RATE_UNITS_PER_HZ; tracking_channel[channel].code_phase_rate_fp_prev = tracking_channel[channel].code_phase_rate_fp; tracking_channel[channel].code_phase_rate = code_phase_rate; tracking_channel[channel].carrier_phase = 0; tracking_channel[channel].carrier_freq = carrier_freq; tracking_channel[channel].carrier_freq_fp = (s32)(carrier_freq * NAP_TRACK_CARRIER_FREQ_UNITS_PER_HZ); tracking_channel[channel].carrier_freq_fp_prev = tracking_channel[channel].carrier_freq_fp; tracking_channel[channel].sample_count = start_sample_count; nav_msg_init(&tracking_channel[channel].nav_msg); /* Starting carrier phase is set to zero as we don't * know the carrier freq well enough to calculate it. */ /* Start with code phase of zero as we have conspired for the * channel to be initialised on an EARLY code phase rollover. */ nap_track_code_wr_blocking(channel, prn); nap_track_init_wr_blocking(channel, prn, 0, 0); nap_track_update_wr_blocking(channel, \ carrier_freq*NAP_TRACK_CARRIER_FREQ_UNITS_PER_HZ, \ tracking_channel[channel].code_phase_rate_fp); /* Schedule the timing strobe for start_sample_count. */ nap_timing_strobe(start_sample_count); }