/** Write to a NAP track channel's INIT register. * Sets PRN (deprecated), initial carrier phase, and initial code phase of a * NAP track channel. The tracking channel will start correlating with these * parameters at the falling edge of the next NAP internal timing strobe. * Also write CA code to track channel's code ram. * * \note The track channel's UPDATE register, which sets the carrier and * code phase rates, must also be written to before the internal timing * strobe goes low. * * \param channel NAP track channel whose INIT register to write. * \param prn CA code PRN (0-31) to track. (deprecated) * \param carrier_phase Initial code phase. * \param code_phase Initial carrier phase. */ void nap_track_init(u8 channel, gnss_signal_t sid, u32 ref_timing_count, float carrier_freq, float code_phase) { struct nap_ch_state *s = &nap_ch_state[channel]; memset(s, 0, sizeof(*s)); u32 track_count = nap_timing_count() + 20000; float cp = propagate_code_phase(code_phase, carrier_freq, track_count - ref_timing_count); /* Contrive for the timing strobe to occur at or close to a * PRN edge (code phase = 0) */ track_count += (NAP_FRONTEND_SAMPLE_RATE_Hz / GPS_CA_CHIPPING_RATE) * (1023.0-cp) * (1.0 + carrier_freq / GPS_L1_HZ); nap_track_code_wr_blocking(channel, sid); nap_track_init_wr_blocking(channel, 0, 0, 0); double cp_rate = (1.0 + carrier_freq / GPS_L1_HZ) * GPS_CA_CHIPPING_RATE; nap_track_update(channel, carrier_freq, cp_rate, 0, 0); /* Schedule the timing strobe for start_sample_count. */ track_count -= NAP_FRONTEND_SAMPLE_RATE_Hz / (2 * GPS_CA_CHIPPING_RATE); s->count_snapshot = track_count; s->carrier_phase = -s->carr_pinc; s->carr_pinc_prev = s->carr_pinc; s->code_pinc_prev = s->code_pinc; COMPILER_BARRIER(); nap_timing_strobe(track_count); nap_timing_strobe_wait(100); }
/** 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); }