Included lib for adg2128.

This commit is contained in:
2025-07-21 17:33:48 +02:00
parent ed49071ffa
commit 0c18664e48
5 changed files with 331 additions and 11 deletions

88
src/electrodes.rs Normal file
View File

@@ -0,0 +1,88 @@
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<NoopMutex<RefCell<i2c::I2c<'static, Blocking>>>> = 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();
}
}