use crate::errors::Error;
use crate::utils::Range;
use dyn_clone::DynClone;
use parking_lot::RwLock;
use std::any::type_name;
use std::fmt::{Debug, Display};
use std::sync::Arc;
mod constants;
mod data;
mod protocols;
mod transports;
pub use data::*;
pub use protocols::*;
pub use transports::*;
pub trait IO {
fn get_io(&self) -> &Arc<RwLock<IoData>>;
fn is_connected(&self) -> bool;
fn set_pin_mode(&mut self, pin: u8, mode: PinModeId) -> Result<(), Error>;
fn digital_write(&mut self, pin: u8, level: bool) -> Result<(), Error>;
fn analog_write(&mut self, pin: u8, level: u16) -> Result<(), Error>;
fn digital_read(&mut self, pin: u8) -> Result<bool, Error>;
fn analog_read(&mut self, pin: u8) -> Result<u16, Error>;
fn servo_config(&mut self, pin: u8, pwm_range: Range<u16>) -> Result<(), Error>;
fn i2c_config(&mut self, delay: u16) -> Result<(), Error>;
fn i2c_read(&mut self, address: u8, size: u16) -> Result<(), Error>;
fn i2c_write(&mut self, address: u8, data: &[u16]) -> Result<(), Error>;
}
dyn_clone::clone_trait_object!(IoProtocol);
#[cfg_attr(feature = "serde", typetag::serde(tag = "type"))]
pub trait IoProtocol: IO + DynClone + Send + Sync + Debug + Display {
fn get_name(&self) -> &'static str {
type_name::<Self>().split("::").last().unwrap()
}
fn open(&mut self) -> Result<(), Error>;
fn close(&mut self) -> Result<(), Error>;
fn report_analog(&mut self, channel: u8, state: bool) -> Result<(), Error>;
fn report_digital(&mut self, pin: u8, state: bool) -> Result<(), Error>;
fn sampling_interval(&mut self, interval: u16) -> Result<(), Error>;
}
#[cfg(not(tarpaulin_include))]
impl Default for Box<dyn IoProtocol> {
fn default() -> Self {
Box::new(RemoteIo::default())
}
}