use ::error::*;
use ::raw::*;
use halio::RobotIoPort;
lazy_static! {
static ref INITIALIZED_I2C_PORTS: Vec<i32> = Vec::new();
}
#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub enum I2cPort {
OnBoard,
MXP,
}
impl I2cPort {
pub fn get_port(&self) -> i32 {
match *self {
I2cPort::OnBoard => 0,
I2cPort::MXP => 1,
}
}
}
pub fn initialize_i2c(port: i32) -> HalResult<()> {
unsafe { hal_call![ ptr HAL_InitializeI2C(port) ] }
}
pub fn write_i2c(io_port: RobotIoPort, data_to_send: &[u8], send_size: i32) -> HalResult<i32> {
if let RobotIoPort::I2c(port, address) = io_port {
unsafe { Ok(HAL_WriteI2C(port, address, data_to_send.as_ptr() as *mut u8, send_size)) }
} else {
Err(HalError::WrongIoInterface)
}
}
pub fn read_i2c(io_port: RobotIoPort, buffer: &mut [u8], count: i32) -> HalResult<i32> {
if let RobotIoPort::I2c(port, address) = io_port {
unsafe { Ok(HAL_ReadI2C(port, address, buffer.as_mut_ptr(), count)) }
} else {
Err(HalError::WrongIoInterface)
}
}
pub fn close_i2c(io_port: RobotIoPort) -> HalResult<()> {
if let RobotIoPort::I2c(port, _) = io_port {
unsafe { Ok(HAL_CloseI2C(port)) }
} else {
Err(HalError::WrongIoInterface)
}
}