use jetgpio_sys::{gpioRead, gpioSetMode, gpioWrite, JET_INPUT, JET_OUTPUT};
use super::{jetgpio_code_to_result, valid_pins::ValidPin, Gpio};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct InputPin {
pin: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct OutputPin {
pin: u32,
state: bool,
}
impl Gpio {
pub fn get_input<PIN: ValidPin>(&self, pin: PIN) -> super::Result<InputPin> {
let pin = pin.pin();
let res = unsafe { gpioSetMode(pin, JET_INPUT) };
jetgpio_code_to_result(res)?;
Ok(InputPin { pin })
}
pub fn get_output<PIN: ValidPin>(&self, pin: PIN) -> super::Result<OutputPin> {
let pin = pin.pin();
let res = unsafe { gpioSetMode(pin, JET_OUTPUT) };
jetgpio_code_to_result(res)?;
Ok(OutputPin { pin, state: false })
}
}
impl InputPin {
pub fn read(&self) -> super::Result<bool> {
let level = unsafe { gpioRead(self.pin) };
jetgpio_code_to_result(level)?;
Ok(level == 1)
}
}
impl OutputPin {
pub fn toggle(&mut self) -> super::Result<()> {
let result = unsafe { gpioWrite(self.pin, !self.state as u32) };
jetgpio_code_to_result(result)?;
self.state = !self.state;
Ok(())
}
pub fn set_high(&mut self) -> super::Result<()> {
let result = unsafe { gpioWrite(self.pin, 1) };
jetgpio_code_to_result(result)?;
self.state = true;
Ok(())
}
pub fn set_low(&mut self) -> super::Result<()> {
let result = unsafe { gpioWrite(self.pin, 0) };
jetgpio_code_to_result(result)?;
self.state = false;
Ok(())
}
}