use arinc429::{Label, decode, encode};
fn main() {
let label_gs = Label::from_octal_str("012").unwrap();
let gs_raw = 2000u32;
let encoded_gs = encode(label_gs.raw(), 0, gs_raw, 3).unwrap();
println!("Encoded GS word (hex): {encoded_gs:08X}");
let decoded_gs = decode(encoded_gs).unwrap();
println!(
"Decoded: label {:?} ({}) [{}] — SSM: {}",
decoded_gs.label,
decoded_gs.label.name(),
decoded_gs.label.octal(),
decoded_gs.ssm.name()
);
if let Some(value) = decoded_gs.to_physical() {
let unit = decoded_gs.label.units();
let unit_str = if unit.is_empty() { "" } else { unit };
println!("Physical value: {:.1} {}", value, unit_str);
}
let label_mach = Label::from_octal_str("205").unwrap();
let mach_raw = 2500u32;
let encoded_mach = encode(label_mach.raw(), 0, mach_raw, 3).unwrap();
let decoded_mach = decode(encoded_mach).unwrap();
if let Some(mach) = decoded_mach.to_physical() {
println!("Mach: {:.3}", mach);
}
let tat_celsius = -50.0_f64;
let tat_raw_signed = (tat_celsius / 0.25) as i32;
let tat_raw = if tat_raw_signed < 0 {
((tat_raw_signed + 0x80000) as u32) & 0x7FFFF
} else {
tat_raw_signed as u32
};
let label_tat = Label::from_octal_str("211").unwrap();
let encoded_tat = encode(label_tat.raw(), 0, tat_raw, 3).unwrap();
let decoded_tat = decode(encoded_tat).unwrap();
if let Some(tat) = decoded_tat.to_physical() {
println!("TAT: {:.2} °C", tat);
}
let roll_degrees = 45.0_f64;
let roll_raw = (roll_degrees / 0.01) as u32;
let label_roll = Label::from_octal_str("324").unwrap();
let encoded_roll = encode(label_roll.raw(), 0, roll_raw, 3).unwrap();
let decoded_roll = decode(encoded_roll).unwrap();
if let Some(roll) = decoded_roll.to_physical() {
println!("Roll Angle: {:.2} °", roll);
}
let date_data = (0b00 << 17) | (0b0110 << 13) | (0b0 << 12) | (0b0001 << 8) | (0b0010 << 4) | 0b0110;
let label_date = Label::from_octal_str("260").unwrap();
let encoded_date = encode(label_date.raw(), 0, date_data, 3).unwrap();
let decoded_date = decode(encoded_date).unwrap();
if let Some(date) = decoded_date.to_bcd_date() {
println!("Date: {}", date);
}
let time_data = (0b01 << 18) | (0b0010 << 14) | (0b011 << 11) | (0b0100 << 7) | (0b101 << 4) | 0b0110;
let label_time = Label::from_octal_str("150").unwrap();
let encoded_time = encode(label_time.raw(), 0, time_data, 3).unwrap();
let decoded_time = decode(encoded_time).unwrap();
if let Some(time) = decoded_time.to_bcd_time() {
println!("UTC Time: {}", time);
}
let encoded_fail = encode(label_gs.raw(), 0, gs_raw, 0).unwrap(); let decoded_fail = decode(encoded_fail).unwrap();
println!("SSM (Failure case): {}", decoded_fail.ssm.name());
println!("Physical value: {:?}", decoded_fail.to_physical());
}