use crate::error::{Error, Result};
use super::bits::{BitReader, BitWriter};
use super::DecodeResult;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct AntennaDescriptor {
pub message_number: u16,
pub reference_station_id: u16,
pub antenna_descriptor: String,
pub antenna_setup_id: u8,
pub antenna_serial_number: Option<String>,
pub receiver_type: Option<String>,
pub receiver_firmware_version: Option<String>,
pub receiver_serial_number: Option<String>,
}
impl AntennaDescriptor {
pub fn decode(body: &[u8]) -> Result<Self> {
Self::decode_inner(body).map_err(Into::into)
}
pub(crate) fn decode_inner(body: &[u8]) -> DecodeResult<Self> {
let mut r = BitReader::new(body);
let message_number = r.u(12)? as u16;
if !matches!(message_number, 1007 | 1008 | 1033) {
return Err(Error::Parse(format!(
"message {message_number} is not an antenna descriptor 1007/1008/1033"
))
.into());
}
let reference_station_id = r.u(12)? as u16;
let antenna_descriptor = read_string(&mut r)?;
let antenna_setup_id = r.u(8)? as u8;
let mut descriptor = Self {
message_number,
reference_station_id,
antenna_descriptor,
antenna_setup_id,
antenna_serial_number: None,
receiver_type: None,
receiver_firmware_version: None,
receiver_serial_number: None,
};
if matches!(message_number, 1008 | 1033) {
descriptor.antenna_serial_number = Some(read_string(&mut r)?);
}
if message_number == 1033 {
descriptor.receiver_type = Some(read_string(&mut r)?);
descriptor.receiver_firmware_version = Some(read_string(&mut r)?);
descriptor.receiver_serial_number = Some(read_string(&mut r)?);
}
Ok(descriptor)
}
pub fn encode(&self) -> Vec<u8> {
let mut w = BitWriter::new();
w.push_u(u64::from(self.message_number), 12);
w.push_u(u64::from(self.reference_station_id), 12);
write_string(&mut w, &self.antenna_descriptor);
w.push_u(u64::from(self.antenna_setup_id), 8);
if matches!(self.message_number, 1008 | 1033) {
write_string(&mut w, self.antenna_serial_number.as_deref().unwrap_or(""));
}
if self.message_number == 1033 {
write_string(&mut w, self.receiver_type.as_deref().unwrap_or(""));
write_string(
&mut w,
self.receiver_firmware_version.as_deref().unwrap_or(""),
);
write_string(&mut w, self.receiver_serial_number.as_deref().unwrap_or(""));
}
w.into_bytes()
}
}
fn read_string(r: &mut BitReader<'_>) -> DecodeResult<String> {
let count = r.u(8)? as usize;
let mut s = String::with_capacity(count);
for _ in 0..count {
s.push(r.u(8)? as u8 as char);
}
Ok(s)
}
fn write_string(w: &mut BitWriter, s: &str) {
let bytes = s.as_bytes();
w.push_u(bytes.len() as u64, 8);
for &b in bytes {
w.push_u(u64::from(b), 8);
}
}