#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct PhaseStatus {
pub overcurrent: [bool; 3],
pub overvoltage: [bool; 3],
pub voltage_sag: [bool; 3],
pub phase_loss: [bool; 3],
pub freq_high: bool,
pub freq_low: bool,
pub voltage_seq_error: bool,
pub current_seq_error: bool,
}
const S0_OI_A: u16 = 1 << 15;
const S0_OI_B: u16 = 1 << 14;
const S0_OI_C: u16 = 1 << 13;
const S0_OV_A: u16 = 1 << 12;
const S0_OV_B: u16 = 1 << 11;
const S0_OV_C: u16 = 1 << 10;
const S0_UREV: u16 = 1 << 9;
const S0_IREV: u16 = 1 << 8;
const S1_FREQ_HI: u16 = 1 << 15;
const S1_SAG_A: u16 = 1 << 14;
const S1_SAG_B: u16 = 1 << 13;
const S1_SAG_C: u16 = 1 << 12;
const S1_FREQ_LO: u16 = 1 << 11;
const S1_LOSS_A: u16 = 1 << 10;
const S1_LOSS_B: u16 = 1 << 9;
const S1_LOSS_C: u16 = 1 << 8;
impl PhaseStatus {
pub fn from_emm(state0: u16, state1: u16) -> Self {
Self {
overcurrent: [
state0 & S0_OI_A != 0,
state0 & S0_OI_B != 0,
state0 & S0_OI_C != 0,
],
overvoltage: [
state0 & S0_OV_A != 0,
state0 & S0_OV_B != 0,
state0 & S0_OV_C != 0,
],
voltage_sag: [
state1 & S1_SAG_A != 0,
state1 & S1_SAG_B != 0,
state1 & S1_SAG_C != 0,
],
phase_loss: [
state1 & S1_LOSS_A != 0,
state1 & S1_LOSS_B != 0,
state1 & S1_LOSS_C != 0,
],
freq_high: state1 & S1_FREQ_HI != 0,
freq_low: state1 & S1_FREQ_LO != 0,
voltage_seq_error: state0 & S0_UREV != 0,
current_seq_error: state0 & S0_IREV != 0,
}
}
pub fn is_ok(&self) -> bool {
*self == Self::default()
}
}