use embedded_interfaces::codegen::interface_objects;
use uom::si::f64::Frequency as QuantFrequency;
use uom::si::frequency::hertz;
pub type BL0942I2cCodec = embedded_interfaces::registers::i2c::codecs::unsupported_codec::UnsupportedCodec<
crate::devices::belling::ChecksumError,
>;
pub type BL0942SpiCodec = crate::devices::belling::BellingSpiCodec<0x58, 0xa8>;
interface_objects! {
register_defaults {
codec_error = crate::devices::belling::ChecksumError,
i2c_codec = BL0942I2cCodec,
spi_codec = BL0942SpiCodec,
}
register_devices [ super::BL0942 ]
#[allow(non_camel_case_types)]
enum CurrentGain: u8{2} {
0b00 X_1,
0b01 X_4,
0b10 X_16,
0b11 X_24,
}
enum UartBaudRate: u8{2} {
0b00 ExternalPin,
0b01 Reserved,
0b10 Baud19200,
0b11 Baud38400,
}
enum OutputFunction: u8{2} {
0b00 ActiveEnergyPulse,
0b01 OverCurrent,
0b10 ZeroCrossVoltage,
0b11 ZeroCrossCurrent,
}
enum FastRmsCycles: u8{3} {
0b000 HalfCycle,
0b001 OneCycle,
0b010 TwoCycles,
0b011 FourCycles,
0b100 EightCycles,
0b101 EightCyclesAlt1,
0b110 EightCyclesAlt2,
0b111 EightCyclesAlt3,
}
#[allow(non_camel_case_types)]
enum FrequencyUpdateCycles: u8{2} {
0b00 N_2,
0b01 N_4,
0b10 N_8,
0b11 N_16,
}
enum PowerDirection: u8{1} {
0 Forward,
1 Reverse,
}
enum CreepStatus: u8{1} {
0 Inactive,
1 Active,
}
#[allow(non_camel_case_types)]
enum RmsUpdateRate: u8{1} {
0 T_400ms,
1 T_800ms,
}
enum FastRmsMode: u8{1} {
0 FullWave,
1 AcWave,
}
#[allow(non_camel_case_types)]
enum AcFrequency: u8{1} {
0 F_50Hz,
1 F_60Hz,
}
enum AccumulationMode: u8{1} {
0 Signed,
1 Absolute,
}
enum ResetMagic: u32{24} {
0x5a5a5a Reset,
_ Ignored,
}
enum ProtectionKey: u8 {
0x55 Unlocked,
_ Locked,
}
register CurrentWaveform(addr = 0x01, mode = r, size = 3) {
_: u8{4},
value: i32{20} = 0x00000,
}
register VoltageWaveform(addr = 0x02, mode = r, size = 3) {
_: u8{4},
value: i32{20} = 0x00000,
}
register CurrentRms(addr = 0x03, mode = r, size = 3) {
value: u32{24} = 0,
}
register VoltageRms(addr = 0x04, mode = r, size = 3) {
value: u32{24} = 0,
}
register CurrentFastRms(addr = 0x05, mode = r, size = 3) {
value: u32{24} = 0,
}
register ActivePower(addr = 0x06, mode = r, size = 3) {
value: i32{24} = 0,
}
register EnergyCounter(addr = 0x07, mode = r, size = 3) {
value: u32{24} = 0,
}
register Frequency(addr = 0x08, mode = r, size = 3) {
_: u8{8},
raw_frequency: u16{16} = 0x4e20 => {
quantity: QuantFrequency,
unit: hertz,
from_raw: |x| 1_000_000f64 / (x as f64),
into_raw: |x| 1_000_000f64 / x,
},
}
register Status(addr = 0x09, mode = r, size = 3) {
_: u16{14},
voltage_zx_invalid: bool = false,
current_zx_invalid: bool = false,
_: u8{6},
creep_status: CreepStatus = CreepStatus::Inactive,
power_direction: PowerDirection = PowerDirection::Forward,
}
register CurrentRmsOffset(addr = 0x12, mode = rw, size = 3) {
_: u16{16},
value: u8 = 0x00,
}
register NoLoadThreshold(addr = 0x14, mode = rw, size = 3) {
_: u16{16},
threshold: u8 = 0x0b,
}
register OverCurrentThreshold(addr = 0x15, mode = rw, size = 3) {
_: u8{8},
threshold: u16 = 0xffff,
}
register FastRmsCycleConfig(addr = 0x16, mode = rw, size = 3) {
_: u32{21},
cycles: FastRmsCycles = FastRmsCycles::OneCycle,
}
register FreqMeasurementConfig(addr = 0x17, mode = rw, size = 3) {
_: u32{22},
update_cycles: FrequencyUpdateCycles = FrequencyUpdateCycles::N_16,
}
register OutputConfig(addr = 0x18, mode = rw, size = 3) {
_: u32{18},
zx_function: OutputFunction = OutputFunction::ZeroCrossVoltage,
cf2_function: OutputFunction = OutputFunction::OverCurrent,
cf1_function: OutputFunction = OutputFunction::ActiveEnergyPulse,
}
register UserMode(addr = 0x19, mode = rw, size = 3) {
_: u16{14},
uart_baud_rate: UartBaudRate = UartBaudRate::ExternalPin,
accumulation_mode: AccumulationMode = AccumulationMode::Absolute,
cf_cnt_auto_clear: bool = false,
ac_frequency: AcFrequency = AcFrequency::F_50Hz,
fast_rms_mode: FastRmsMode = FastRmsMode::FullWave,
rms_update_rate: RmsUpdateRate = RmsUpdateRate::T_400ms,
cf_enable: bool = true,
_: u8{2} = 0b11,
}
register CurrentGainConfig(addr = 0x1A, mode = rw, size = 3) {
_: u32{22},
gain: CurrentGain = CurrentGain::X_16,
}
register SoftReset(addr = 0x1C, mode = rw, size = 3) {
magic: ResetMagic = ResetMagic::Ignored,
}
register WriteProtection(addr = 0x1D, mode = rw, size = 3) {
_: u16{16} = 0,
key: ProtectionKey = ProtectionKey::Locked,
}
}
impl RmsUpdateRate {
pub fn as_us(&self) -> u32 {
match self {
RmsUpdateRate::T_400ms => 400_000,
RmsUpdateRate::T_800ms => 800_000,
}
}
}
impl CurrentGain {
pub fn factor(&self) -> u8 {
match self {
CurrentGain::X_1 => 1,
CurrentGain::X_4 => 4,
CurrentGain::X_16 => 16,
CurrentGain::X_24 => 24,
}
}
}