use wpilib_sys::usage::resource_types;
use wpilib_sys::*;
use crate::dio::DigitalInput;
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[repr(i32)]
pub enum IndexingType {
ResetWhileHigh = HAL_EncoderIndexingType::HAL_kResetWhileHigh,
ResetWhileLow = HAL_EncoderIndexingType::HAL_kResetWhileLow,
ResetOnFallingEdge = HAL_EncoderIndexingType::HAL_kResetOnFallingEdge,
ResetOnRisingEdge = HAL_EncoderIndexingType::HAL_kResetOnRisingEdge,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[repr(i32)]
pub enum EncodingType {
K1X = HAL_EncoderEncodingType::HAL_Encoder_k1X,
K2X = HAL_EncoderEncodingType::HAL_Encoder_k2X,
K4X = HAL_EncoderEncodingType::HAL_Encoder_k4X,
}
#[derive(Debug)]
pub struct Encoder {
_source_a: DigitalInput,
_source_b: DigitalInput,
_source_index: Option<DigitalInput>,
encoder: HAL_EncoderHandle,
}
impl Encoder {
#[allow(clippy::new_ret_no_self)]
pub fn new(channel_a: i32, channel_b: i32, encoding: EncodingType) -> HalResult<Encoder> {
let source_a = DigitalInput::new(channel_a)?;
let source_b = DigitalInput::new(channel_b)?;
let handle = hal_call!(HAL_InitializeEncoder(
source_a.handle(),
0i32,
source_b.handle(),
0i32,
false as i32,
encoding as HAL_EncoderEncodingType::Type
))?;
let encoder = Encoder {
_source_a: source_a,
_source_b: source_b,
_source_index: None,
encoder: handle,
};
report_usage_context(
resource_types::Encoder,
encoder.fpga_index()? as u32,
encoding as HAL_EncoderEncodingType::Type,
);
Ok(encoder)
}
pub fn fpga_index(&self) -> HalResult<i32> {
hal_call!(HAL_GetEncoderFPGAIndex(self.encoder))
}
pub fn get(&self) -> HalResult<i32> {
hal_call!(HAL_GetEncoder(self.encoder))
}
pub fn get_raw(&self) -> HalResult<i32> {
hal_call!(HAL_GetEncoderRaw(self.encoder))
}
pub fn encoding_scale(&self) -> HalResult<i32> {
hal_call!(HAL_GetEncoderEncodingScale(self.encoder))
}
pub fn rate(&self) -> HalResult<f64> {
hal_call!(HAL_GetEncoderRate(self.encoder))
}
pub fn set_min_rate(&mut self, min_rate: f64) -> HalResult<()> {
hal_call!(HAL_SetEncoderMinRate(self.encoder, min_rate))
}
pub fn reset(&mut self) -> HalResult<()> {
hal_call!(HAL_ResetEncoder(self.encoder))
}
}
impl Drop for Encoder {
fn drop(&mut self) {
hal_call!(HAL_FreeEncoder(self.encoder)).ok();
}
}