use core::ffi::c_double;
use pros_core::{bail_on, error::PortError};
use pros_sys::PROS_ERR;
use super::{SmartDevice, SmartDeviceType, SmartPort};
#[derive(Debug, Eq, PartialEq)]
pub struct DistanceSensor {
port: SmartPort,
}
impl DistanceSensor {
pub const fn new(port: SmartPort) -> Self {
Self { port }
}
pub fn distance(&self) -> Result<u32, PortError> {
Ok(bail_on!(PROS_ERR, unsafe {
pros_sys::distance_get(self.port.index())
}) as u32)
}
pub fn velocity(&self) -> Result<f64, PortError> {
Ok(bail_on!(PROS_ERR as c_double, unsafe {
pros_sys::distance_get_object_velocity(self.port.index())
}))
}
pub fn relative_size(&self) -> Result<u32, PortError> {
Ok(bail_on!(PROS_ERR, unsafe {
pros_sys::distance_get_object_size(self.port.index())
}) as u32)
}
pub fn distance_confidence(&self) -> Result<f64, PortError> {
let confidence = bail_on!(PROS_ERR, unsafe {
pros_sys::distance_get_confidence(self.port.index())
}) as f64;
Ok(confidence / 63.0)
}
}
impl SmartDevice for DistanceSensor {
fn port_index(&self) -> u8 {
self.port.index()
}
fn device_type(&self) -> SmartDeviceType {
SmartDeviceType::Distance
}
}