use super::{bipolar, Modulation, SignalCode, SignalError};
use crate::iq::DataModulation;
pub const L1_BASE_HZ: f64 = 1_602_000_000.0;
pub const L1_SPACING_HZ: f64 = 562_500.0;
pub const CHIP_RATE_HZ: f64 = 511_000.0;
pub const CODE_LEN: usize = 511;
pub const MIN_CHANNEL: i8 = -7;
pub const MAX_CHANNEL: i8 = 6;
pub fn l1_carrier_hz(k: i8) -> Result<f64, SignalError> {
if !(MIN_CHANNEL..=MAX_CHANNEL).contains(&k) {
return Err(SignalError::FrequencyChannel(k));
}
Ok(L1_BASE_HZ + f64::from(k) * L1_SPACING_HZ)
}
pub fn ranging_code_bits() -> Vec<u8> {
let mut r = [1u8; 9];
let mut out = Vec::with_capacity(CODE_LEN);
for _ in 0..CODE_LEN {
out.push(r[6]);
let fb = r[4] ^ r[8];
r.copy_within(0..8, 1);
r[0] = fb;
}
out
}
pub fn l1of(k: i8) -> Result<SignalCode, SignalError> {
let f = l1_carrier_hz(k)?;
Ok(SignalCode::new(
format!("GLONASS L1OF k={k:+}"),
CHIP_RATE_HZ,
f,
bipolar(&ranging_code_bits()),
vec![],
Modulation::Bpsk,
)
.with_data_modulation(DataModulation::Meander { bit_s: 0.02 }))
}