use super::Gpio;
use crate::error::Error;
pub trait PinConfig {
fn update_pin_map(&self, pin: u8, gpio: &Gpio) -> Result<(u16, u16), Error>;
}
#[derive(Debug, Copy, Clone)]
pub enum Mode {
Input = 0,
Output = 1,
}
impl PinConfig for Mode {
fn update_pin_map(&self, pin: u8, gpio: &Gpio) -> Result<(u16, u16), Error> {
let mode = *self as u16;
let mask = 1 << pin;
let mut pin_map = gpio.mode_pin_map.lock()?;
*pin_map = mode << pin | (*pin_map & !mask);
Ok((*pin_map, 0))
}
}
#[derive(Debug, Copy, Clone)]
pub enum State {
Off = 0,
On = 1,
}
impl PinConfig for State {
fn update_pin_map(&self, pin: u8, gpio: &Gpio) -> Result<(u16, u16), Error> {
let state = *self as u16;
let mask = 1 << pin;
let mut pin_map = gpio.state_pin_map.lock()?;
*pin_map = state << pin | (*pin_map & !mask);
Ok((*pin_map, 1))
}
}
#[derive(Debug, Copy, Clone)]
pub enum Function {
Digital = 0,
Pwm = 1,
}
impl PinConfig for Function {
fn update_pin_map(&self, pin: u8, gpio: &Gpio) -> Result<(u16, u16), Error> {
let function = *self as u16;
let mask = 1 << pin;
let mut pin_map = gpio.function_pin_map.lock()?;
*pin_map = function << pin | (*pin_map & !mask);
Ok((*pin_map, 2))
}
}