use embassy_embedded_hal::shared_bus::blocking::i2c::I2cDevice; use embassy_stm32::{i2c, mode::Blocking}; use embassy_sync::blocking_mutex::NoopMutex; use static_cell::StaticCell; use core::cell::RefCell; use crate::{ad5940, adg2128::{GetX, SetX, SetY, State, ADG2128}}; static I2C_BUS: StaticCell>>> = StaticCell::new(); #[derive(Copy, Clone)] #[allow(dead_code)] pub enum Electrode { E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, } impl Electrode { pub fn from_u8(value: u8) -> Self { const VARIANTS: [Electrode; 24] = [ Electrode::E0, Electrode::E1, Electrode::E2, Electrode::E3, Electrode::E4, Electrode::E5, Electrode::E6, Electrode::E7, Electrode::E8, Electrode::E9, Electrode::E10, Electrode::E11, Electrode::E12, Electrode::E13, Electrode::E14, Electrode::E15, Electrode::E16, Electrode::E17, Electrode::E18, Electrode::E19, Electrode::E20, Electrode::E21, Electrode::E22, Electrode::E23, ]; *VARIANTS.get(value as usize).expect("Invalid value for SetX") } } #[derive(Copy, Clone)] #[allow(dead_code)] pub enum AD5940Pin { CE0, RE0, SE0, DE0, AIN0, AIN1, AIN2, AIN3, } pub struct Electrodes { mux_1: ADG2128, mux_2: ADG2128, } impl Electrodes { pub fn new(i2c: i2c::I2c<'static, Blocking>) -> Self { let i2c_bus = NoopMutex::new(RefCell::new(i2c)); let i2c_bus = I2C_BUS.init(i2c_bus); Electrodes { mux_1: ADG2128::new(I2cDevice::new(i2c_bus), 0b1110_000), mux_2: ADG2128::new(I2cDevice::new(i2c_bus), 0b1110_001), } } pub fn set(&mut self, electrode: Electrode, ad5940_pin: AD5940Pin, state: State) { let electrode = electrode as u8; let ad5940_pin = ad5940_pin as u8; match electrode { 0..=11 => { self.mux_1.set(SetX::from_u8(electrode), SetY::from_u8(ad5940_pin), state); } 12..=23 => { self.mux_2.set(SetX::from_u8(electrode-12), SetY::from_u8(ad5940_pin), state); } _ => panic!("Invalid electrode number"), } } pub fn get(&mut self, io: Electrode) -> u8 { let number = io as u8; match number { 0..=11 => self.mux_1.get(GetX::from_u8(number)), 12..=23 => self.mux_2.get(GetX::from_u8(number-12)), _ => panic!("Invalid electrode number"), } } pub fn get_all(&mut self) -> ([u8; 12], [u8; 12]) { (self.mux_1.get_all(), self.mux_2.get_all()) } pub fn reset_all(&mut self) { self.mux_1.reset_all(); self.mux_2.reset_all(); } }