#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum ChannelType {
VoltageA = 0,
CurrentA = 1,
VoltageB = 2,
CurrentB = 3,
VoltageC = 4,
CurrentC = 5,
VoltageN = 6,
CurrentN = 7,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Phase {
A,
B,
C,
Neutral,
}
#[derive(Debug, Clone, Copy)]
pub struct PhasePair {
pub voltage_channel: usize,
pub current_channel: usize,
pub phase: Phase,
}
pub fn phase_pairs_for_mode(mode: crate::types::SystemMode) -> &'static [PhasePair; 4] {
match mode {
crate::types::SystemMode::SinglePhase
| crate::types::SystemMode::SinglePhaseN
| crate::types::SystemMode::ThreePhase3Wire
| crate::types::SystemMode::ThreePhase4Wire => &DEFAULT_PAIRS,
}
}
static DEFAULT_PAIRS: [PhasePair; 4] = [
PhasePair {
voltage_channel: 0,
current_channel: 1,
phase: Phase::A,
},
PhasePair {
voltage_channel: 2,
current_channel: 3,
phase: Phase::B,
},
PhasePair {
voltage_channel: 4,
current_channel: 5,
phase: Phase::C,
},
PhasePair {
voltage_channel: 7,
current_channel: 6,
phase: Phase::Neutral,
},
];
#[derive(Debug, Clone, Copy)]
pub struct SignalInversion {
pub invert_voltage: bool,
pub invert_current: bool,
}
pub const DEFAULT_CHANNEL_MAP: [ChannelType; 8] = [
ChannelType::VoltageA,
ChannelType::CurrentA,
ChannelType::VoltageB,
ChannelType::CurrentB,
ChannelType::VoltageC,
ChannelType::CurrentC,
ChannelType::VoltageN,
ChannelType::CurrentN,
];
pub fn default_phase_pairs() -> [PhasePair; 4] {
DEFAULT_PAIRS
}
pub fn channel_map_to_pairs(map: &[ChannelType; 8]) -> [PhasePair; 4] {
fn find_ch(map: &[ChannelType; 8], needle: ChannelType) -> Option<usize> {
map.iter().position(|&c| c == needle)
}
[
PhasePair {
voltage_channel: find_ch(map, ChannelType::VoltageA).unwrap_or(0),
current_channel: find_ch(map, ChannelType::CurrentA).unwrap_or(1),
phase: Phase::A,
},
PhasePair {
voltage_channel: find_ch(map, ChannelType::VoltageB).unwrap_or(2),
current_channel: find_ch(map, ChannelType::CurrentB).unwrap_or(3),
phase: Phase::B,
},
PhasePair {
voltage_channel: find_ch(map, ChannelType::VoltageC).unwrap_or(4),
current_channel: find_ch(map, ChannelType::CurrentC).unwrap_or(5),
phase: Phase::C,
},
PhasePair {
voltage_channel: find_ch(map, ChannelType::VoltageN).unwrap_or(6),
current_channel: find_ch(map, ChannelType::CurrentN).unwrap_or(7),
phase: Phase::Neutral,
},
]
}