use std::fmt::Write;
use super::StatusWordValidator;
use crate::words::its::status_words::{ddw::Ddw0, StatusWord};
#[derive(Debug, Copy, Clone)]
pub struct Ddw0Validator;
impl StatusWordValidator<Ddw0> for Ddw0Validator {
fn sanity_check(ddw0: &Ddw0) -> Result<(), String> {
let mut err_str = String::new();
if ddw0.id() != Ddw0::ID {
write!(err_str, "ID is not 0xE4: {:#2X} ", ddw0.id()).unwrap();
return Err(err_str);
}
if !ddw0.is_reserved_0() {
write!(
err_str,
"reserved bits are not 0: {:b} {:b} ",
ddw0.reserved0_1(),
ddw0.reserved2(),
)
.unwrap();
}
if ddw0.index() != 0 {
write!(err_str, "index is not 0: {:#2X} ", ddw0.index()).unwrap();
}
if !err_str.is_empty() {
return Err(err_str);
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ddw0_valid() {
let raw_data_ddw0 = [
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
Ddw0::ID,
];
let ddw0 = Ddw0::load(&mut raw_data_ddw0.as_slice()).unwrap();
assert!(Ddw0Validator::sanity_check(&ddw0).is_ok());
const LANE_0_AND_3_IN_WARNING: u8 = 0b0100_0001;
const LANE_4_TO_7_IN_FATAL: u8 = 0b1111_1111;
const LANE_8_TO_11_IN_WARNING: u8 = 0b0101_0101;
const LANE_12_AND_15_IN_ERROR: u8 = 0b1000_0010;
const LANE_16_AND_19_IN_OK: u8 = 0b0000_0000;
const LANE_22_IN_WARNING: u8 = 0b0001_0000;
const LANE_24_AND_25_IN_ERROR: u8 = 0b0000_1010;
const RESERVED0: u8 = 0x00;
const TRANSMISSION_TO_LANE_STARTS_VIOLATION_SET: u8 = 0x0A;
let raw_data_ddw0_new = [
LANE_0_AND_3_IN_WARNING,
LANE_4_TO_7_IN_FATAL,
LANE_8_TO_11_IN_WARNING,
LANE_12_AND_15_IN_ERROR,
LANE_16_AND_19_IN_OK,
LANE_22_IN_WARNING,
LANE_24_AND_25_IN_ERROR,
RESERVED0,
TRANSMISSION_TO_LANE_STARTS_VIOLATION_SET,
Ddw0::ID,
];
let ddw0_new = Ddw0::load(&mut raw_data_ddw0_new.as_slice()).unwrap();
println!("{ddw0:#?}");
assert!(Ddw0Validator::sanity_check(&ddw0_new).is_ok());
}
}