mirror of
https://github.com/hubaldv/bioz-firmware-rs.git
synced 2025-12-06 05:01:18 +00:00
Included lib for adg2128.
This commit is contained in:
88
src/electrodes.rs
Normal file
88
src/electrodes.rs
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user