use super::TSC_NUM_GROUPS;
use super::io_pin::*;
#[cfg(any(tsc_v2, tsc_v3))]
use super::pin_groups::G7;
#[cfg(tsc_v3)]
use super::pin_groups::G8;
use super::pin_groups::{G1, G2, G3, G4, G5, G6, pin_roles};
use super::types::{Group, GroupStatus};
#[allow(missing_docs)]
#[derive(Default)]
pub struct AcquisitionBankPins {
pub g1_pin: Option<IOPinWithRole<G1, pin_roles::Channel>>,
pub g2_pin: Option<IOPinWithRole<G2, pin_roles::Channel>>,
pub g3_pin: Option<IOPinWithRole<G3, pin_roles::Channel>>,
pub g4_pin: Option<IOPinWithRole<G4, pin_roles::Channel>>,
pub g5_pin: Option<IOPinWithRole<G5, pin_roles::Channel>>,
pub g6_pin: Option<IOPinWithRole<G6, pin_roles::Channel>>,
#[cfg(any(tsc_v2, tsc_v3))]
pub g7_pin: Option<IOPinWithRole<G7, pin_roles::Channel>>,
#[cfg(tsc_v3)]
pub g8_pin: Option<IOPinWithRole<G8, pin_roles::Channel>>,
}
impl AcquisitionBankPins {
pub fn iter(&self) -> AcquisitionBankPinsIterator<'_> {
AcquisitionBankPinsIterator(AcquisitionBankIterator::new(self))
}
}
pub struct AcquisitionBankIterator<'a> {
pins: &'a AcquisitionBankPins,
current_group: u8,
}
impl<'a> AcquisitionBankIterator<'a> {
fn new(pins: &'a AcquisitionBankPins) -> Self {
Self { pins, current_group: 0 }
}
fn next_pin(&mut self) -> Option<IOPin> {
while self.current_group < TSC_NUM_GROUPS as u8 {
let pin = match self.current_group {
0 => self.pins.g1_pin.map(IOPinWithRole::get_pin),
1 => self.pins.g2_pin.map(IOPinWithRole::get_pin),
2 => self.pins.g3_pin.map(IOPinWithRole::get_pin),
3 => self.pins.g4_pin.map(IOPinWithRole::get_pin),
4 => self.pins.g5_pin.map(IOPinWithRole::get_pin),
5 => self.pins.g6_pin.map(IOPinWithRole::get_pin),
#[cfg(any(tsc_v2, tsc_v3))]
6 => self.pins.g7_pin.map(IOPinWithRole::get_pin),
#[cfg(tsc_v3)]
7 => self.pins.g8_pin.map(IOPinWithRole::get_pin),
_ => None,
};
self.current_group += 1;
if pin.is_some() {
return pin;
}
}
None
}
}
pub struct AcquisitionBankPinsIterator<'a>(AcquisitionBankIterator<'a>);
impl<'a> Iterator for AcquisitionBankPinsIterator<'a> {
type Item = IOPin;
fn next(&mut self) -> Option<Self::Item> {
self.0.next_pin()
}
}
impl AcquisitionBankPins {
pub fn pins_iterator(&self) -> AcquisitionBankPinsIterator<'_> {
AcquisitionBankPinsIterator(AcquisitionBankIterator::new(self))
}
}
pub struct AcquisitionBank {
pub(super) pins: AcquisitionBankPins,
pub(super) mask: u32,
}
impl AcquisitionBank {
pub fn pins_iterator(&self) -> AcquisitionBankPinsIterator<'_> {
self.pins.pins_iterator()
}
pub fn mask(&self) -> u32 {
self.mask
}
pub fn get_pin(&self, group: Group) -> Option<IOPin> {
match group {
Group::One => self.pins.g1_pin.map(|p| p.pin),
Group::Two => self.pins.g2_pin.map(|p| p.pin),
Group::Three => self.pins.g3_pin.map(|p| p.pin),
Group::Four => self.pins.g4_pin.map(|p| p.pin),
Group::Five => self.pins.g5_pin.map(|p| p.pin),
Group::Six => self.pins.g6_pin.map(|p| p.pin),
#[cfg(any(tsc_v2, tsc_v3))]
Group::Seven => self.pins.g7_pin.map(|p| p.pin),
#[cfg(tsc_v3)]
Group::Eight => self.pins.g8_pin.map(|p| p.pin),
}
}
}
#[derive(Default)]
pub struct AcquisitionBankStatus {
pub(super) groups: [Option<GroupStatus>; TSC_NUM_GROUPS],
}
impl AcquisitionBankStatus {
pub fn all_complete(&self) -> bool {
self.groups
.iter()
.all(|&status| status.map_or(true, |s| s == GroupStatus::Complete))
}
pub fn any_ongoing(&self) -> bool {
self.groups.iter().any(|&status| status == Some(GroupStatus::Ongoing))
}
pub fn get_group_status(&self, group: Group) -> Option<GroupStatus> {
let index: usize = group.into();
self.groups[index]
}
pub fn iter(&self) -> impl Iterator<Item = (Group, GroupStatus)> + '_ {
self.groups.iter().enumerate().filter_map(|(group_num, status)| {
status.and_then(|s| Group::try_from(group_num).ok().map(|group| (group, s)))
})
}
}
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[derive(Clone, Copy, Debug)]
pub struct ChannelReading {
pub sensor_value: u16,
pub tsc_pin: IOPin,
}
#[derive(Default)]
pub struct AcquisitionBankReadings {
pub(super) groups: [Option<ChannelReading>; TSC_NUM_GROUPS],
}
impl AcquisitionBankReadings {
pub fn get_group_reading(&self, group: Group) -> Option<ChannelReading> {
let index: usize = group.into();
self.groups[index]
}
pub fn iter(&self) -> impl Iterator<Item = ChannelReading> + '_ {
self.groups.iter().filter_map(|&x| x)
}
}