#![doc = include_str!("../README.md")]
#![no_std]
use core::marker::PhantomData;
use embedded_hal::blocking::delay::DelayMs;
use embedded_hal::blocking::spi;
use embedded_hal::digital::v2::OutputPin;
pub use register::*;
mod ade791x;
pub mod poly;
mod register;
pub struct Ade791x<SPI, CS> {
adc: poly::Ade791x<SPI, CS, 1>,
}
impl<SPI, CS, S, P> Ade791x<SPI, CS>
where
SPI: spi::Transfer<u8, Error = S>,
CS: OutputPin<Error = P>,
{
pub fn new_ade7912(spi: SPI, cs: CS) -> Self {
Self {
adc: poly::Ade791x::new(spi, [(cs, Chip::ADE7912)]),
}
}
pub fn new_ade7913(spi: SPI, cs: CS) -> Self {
Self {
adc: poly::Ade791x::new(spi, [(cs, Chip::ADE7913)]),
}
}
pub fn init(
&mut self,
delay: &mut dyn DelayMs<u32>,
config: Config,
calibration: Calibration,
) -> Result<(), Error<S, P>> {
self.adc
.init(delay, [config], [calibration], [EmiCtrl::default()])
}
pub fn hard_reset(&mut self) -> Result<(), Error<S, P>> {
self.adc.hard_reset()
}
pub fn soft_reset(&mut self) -> Result<(), Error<S, P>> {
self.adc.soft_reset()
}
pub fn powerdown(&mut self) -> Result<(), Error<S, P>> {
self.adc.powerdown()
}
pub fn wakeup(&mut self) -> Result<(), Error<S, P>> {
self.adc.wakeup()
}
pub fn get_raw_measurement(&mut self) -> Result<RawMeasurement, Error<S, P>> {
self.adc.get_raw_measurement().map(|m| m[0])
}
pub fn get_measurement(&mut self) -> Result<Measurement, Error<S, P>> {
self.adc.get_measurement().map(|m| m[0])
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct RawMeasurement {
pub iwv: i32,
pub v1wv: i32,
pub v2wv: i32,
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct Measurement {
pub current: f32,
pub voltage: f32,
pub aux: MeasurementAux,
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum MeasurementAux {
Voltage(f32),
Temperature(f32),
}
#[derive(Default, Debug, Copy, Clone)]
pub struct Calibration {
pub offset: CalibrationOffset,
pub gain: CalibrationGain,
}
#[derive(Default, Debug, Copy, Clone)]
pub struct CalibrationOffset {
pub current: f32,
pub voltage: f32,
pub aux: Option<f32>,
}
#[derive(Debug, Copy, Clone)]
pub struct CalibrationGain {
pub current: f32,
pub voltage: f32,
pub aux: Option<f32>,
}
impl Default for CalibrationGain {
fn default() -> Self {
Self {
current: 1.0,
voltage: 1.0,
aux: None,
}
}
}
#[derive(PartialEq, Eq)]
pub enum Chip {
ADE7912,
ADE7913,
}
#[repr(u8)]
#[derive(Debug, PartialEq, Eq)]
pub enum Error<S, P> {
SpiError(S),
PinError(P),
ResetTimeout,
ReadOnlyRegister,
WriteOnlyRegister,
BurstReadNotPermitted,
RegisterContentMismatch,
}