initial safety biased leased control architecture

This commit is contained in:
2025-10-22 22:20:28 -07:00
parent 26271fcb17
commit fd63bdc0c9
9 changed files with 276 additions and 153 deletions

View File

@@ -1,7 +1,11 @@
#![allow(dead_code)]
use crate::hardware::mcp23017::{Mcp23017, Mcp23017OutputPin};
use crate::hardware::pin::{Pin, PinDevice};
use anyhow::Result;
use embedded_hal::digital::PinState;
use log::trace;
use std::fmt::Debug;
use std::time::Instant;
pub const RCS5: PinoutChannel = PinoutChannel::ExtA(0);
pub const RCS6: PinoutChannel = PinoutChannel::ExtA(1);
@@ -42,11 +46,37 @@ pub enum PinoutChannel {
ExtB(u8),
}
impl PinoutChannel {
pub fn new_output_pin<'a, MCP: Mcp23017>(self, ext_a: &'a MCP, ext_b: &'a MCP) -> Result<impl Mcp23017OutputPin + 'a> {
pub struct DevicePin<'a, Device: PinDevice> {
pin: u8,
device: &'a Device,
}
impl<'a, Device: PinDevice> Pin for DevicePin<'a, Device> {
fn set(&mut self, value: PinState, valid_until: Instant, priority: u8) {
self.device.set_pin(self.pin, value, valid_until, priority);
}
}
pub enum ChannelPin<'a, A: PinDevice, B: PinDevice> {
ExtA(DevicePin<'a, A>),
ExtB(DevicePin<'a, B>),
}
impl<'a, A: PinDevice, B: PinDevice> Pin for ChannelPin<'a, A, B> {
fn set(&mut self, value: PinState, valid_until: Instant, priority: u8) {
match self {
PinoutChannel::ExtA(pin) => ext_a.new_output_pin(pin),
PinoutChannel::ExtB(pin) => ext_b.new_output_pin(pin),
ChannelPin::ExtA(pin) => pin.set(value, valid_until, priority),
ChannelPin::ExtB(pin) => pin.set(value, valid_until, priority),
}
}
}
impl PinoutChannel {
pub fn new<'a>(self, ext_a: &'a (impl PinDevice + Debug), ext_b: &'a (impl PinDevice + Debug)) -> Result<impl Pin> {
trace!("PinoutChannel::new(self: {self:?}, ext_a: {ext_a:?}, ext_b: {ext_b:?}");
Ok(match self {
PinoutChannel::ExtA(pin) => ChannelPin::ExtA(DevicePin { pin, device: ext_a }),
PinoutChannel::ExtB(pin) => ChannelPin::ExtB(DevicePin { pin, device: ext_b }),
})
}
}