macro_rules! impl_pin {
($($pin:expr),+ $(,)?) => {
$(
paste::paste!{
#[doc = concat!("GPIO pin ", stringify!($pin), ", driven through the host's GPIO imports.")]
#[derive(Default)]
pub struct [<Gpio $pin>];
impl [<Gpio $pin>] {
const PIN_ID: i32 = $pin;
pub fn try_get() -> Option<Self> {
if unsafe { is_pin_supported(Self::PIN_ID) == 1 } {
Some(Self)
} else {
None
}
}
}
impl $crate::__reexports::embedded_hal::digital::ErrorType for [<Gpio $pin>] {
type Error = $crate::__reexports::embedded_hal::digital::ErrorKind;
}
impl $crate::__reexports::embedded_hal::digital::InputPin for [<Gpio $pin>] {
fn is_high(&mut self) -> Result<bool, Self::Error> {
unsafe {
match read_pin(Self::PIN_ID) {
0 => Ok(false),
1 => Ok(true),
_ => Err($crate::__reexports::embedded_hal::digital::ErrorKind::Other),
}
}
}
fn is_low(&mut self) -> Result<bool, Self::Error> {
unsafe {
match read_pin(Self::PIN_ID) {
0 => Ok(true),
1 => Ok(false),
_ => Err($crate::__reexports::embedded_hal::digital::ErrorKind::Other),
}
}
}
}
impl $crate::host_functions::gpio::Wait for [<Gpio $pin>] {
fn wait_for_high(&mut self) -> Result<(), Self::Error>{
unsafe {
if wait_for_level(Self::PIN_ID, 1) == 0 {
Ok(())
} else {
Err($crate::__reexports::embedded_hal::digital::ErrorKind::Other)
}
}
}
fn wait_for_low(&mut self) -> Result<(), Self::Error>{
unsafe {
if wait_for_level(Self::PIN_ID, 0) == 0 {
Ok(())
} else {
Err($crate::__reexports::embedded_hal::digital::ErrorKind::Other)
}
}
}
fn wait_for_rising_edge(&mut self) -> Result<(), Self::Error>{
unsafe {
if wait_for_edge(Self::PIN_ID, 0) == 0 {
Ok(())
} else {
Err($crate::__reexports::embedded_hal::digital::ErrorKind::Other)
}
}
}
fn wait_for_falling_edge(&mut self) -> Result<(), Self::Error>{
unsafe {
if wait_for_edge(Self::PIN_ID, 1) == 0 {
Ok(())
} else {
Err($crate::__reexports::embedded_hal::digital::ErrorKind::Other)
}
}
}
fn wait_for_any_edge(&mut self) -> Result<(), Self::Error>{
unsafe {
if wait_for_edge(Self::PIN_ID, 2) == 0 {
Ok(())
} else {
Err($crate::__reexports::embedded_hal::digital::ErrorKind::Other)
}
}
}
}
impl $crate::__reexports::embedded_hal::digital::OutputPin for [<Gpio $pin>] {
fn set_low(&mut self) -> Result<(), Self::Error> {
unsafe {
if set(Self::PIN_ID, 0) == 0 {
Ok(())
} else {
Err($crate::__reexports::embedded_hal::digital::ErrorKind::Other)
}
}
}
fn set_high(&mut self) -> Result<(), Self::Error> {
unsafe {
if set(Self::PIN_ID, 1) == 0 {
Ok(())
} else {
Err($crate::__reexports::embedded_hal::digital::ErrorKind::Other)
}
}
}
}
})+
};
}
impl_pin! {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
}
pub trait Wait: embedded_hal::digital::ErrorType {
fn wait_for_high(&mut self) -> Result<(), Self::Error>;
fn wait_for_low(&mut self) -> Result<(), Self::Error>;
fn wait_for_rising_edge(&mut self) -> Result<(), Self::Error>;
fn wait_for_falling_edge(&mut self) -> Result<(), Self::Error>;
fn wait_for_any_edge(&mut self) -> Result<(), Self::Error>;
}
#[link(wasm_import_module = "gpio")]
unsafe extern "C" {
fn is_pin_supported(pin: i32) -> i32;
fn set(pin: i32, level: i32) -> i32;
#[cfg_attr(target_arch = "wasm32", link_name = "read")]
fn read_pin(pin: i32) -> i32;
fn wait_for_level(pin: i32, level: i32) -> i32;
fn wait_for_edge(pin: i32, edge: i32) -> i32;
}