initial safety biased leased control architecture
This commit is contained in:
@@ -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 }),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user