use crate::{
byte_converter::*, converting_callback_receiver::ConvertingCallbackReceiver, converting_receiver::ConvertingReceiver, device::*,
ip_connection::GetRequestSender,
};
pub enum HallEffectBrickletFunction {
GetValue,
GetEdgeCount,
SetEdgeCountConfig,
GetEdgeCountConfig,
SetEdgeInterrupt,
GetEdgeInterrupt,
SetEdgeCountCallbackPeriod,
GetEdgeCountCallbackPeriod,
EdgeInterrupt,
GetIdentity,
CallbackEdgeCount,
}
impl From<HallEffectBrickletFunction> for u8 {
fn from(fun: HallEffectBrickletFunction) -> Self {
match fun {
HallEffectBrickletFunction::GetValue => 1,
HallEffectBrickletFunction::GetEdgeCount => 2,
HallEffectBrickletFunction::SetEdgeCountConfig => 3,
HallEffectBrickletFunction::GetEdgeCountConfig => 4,
HallEffectBrickletFunction::SetEdgeInterrupt => 5,
HallEffectBrickletFunction::GetEdgeInterrupt => 6,
HallEffectBrickletFunction::SetEdgeCountCallbackPeriod => 7,
HallEffectBrickletFunction::GetEdgeCountCallbackPeriod => 8,
HallEffectBrickletFunction::EdgeInterrupt => 9,
HallEffectBrickletFunction::GetIdentity => 255,
HallEffectBrickletFunction::CallbackEdgeCount => 10,
}
}
}
pub const HALL_EFFECT_BRICKLET_EDGE_TYPE_RISING: u8 = 0;
pub const HALL_EFFECT_BRICKLET_EDGE_TYPE_FALLING: u8 = 1;
pub const HALL_EFFECT_BRICKLET_EDGE_TYPE_BOTH: u8 = 2;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct EdgeCountConfig {
pub edge_type: u8,
pub debounce: u8,
}
impl FromByteSlice for EdgeCountConfig {
fn bytes_expected() -> usize { 2 }
fn from_le_byte_slice(bytes: &[u8]) -> EdgeCountConfig {
EdgeCountConfig { edge_type: <u8>::from_le_byte_slice(&bytes[0..1]), debounce: <u8>::from_le_byte_slice(&bytes[1..2]) }
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct EdgeInterrupt {
pub count: u32,
pub value: bool,
}
impl FromByteSlice for EdgeInterrupt {
fn bytes_expected() -> usize { 5 }
fn from_le_byte_slice(bytes: &[u8]) -> EdgeInterrupt {
EdgeInterrupt { count: <u32>::from_le_byte_slice(&bytes[0..4]), value: <bool>::from_le_byte_slice(&bytes[4..5]) }
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct EdgeCountEvent {
pub count: u32,
pub value: bool,
}
impl FromByteSlice for EdgeCountEvent {
fn bytes_expected() -> usize { 5 }
fn from_le_byte_slice(bytes: &[u8]) -> EdgeCountEvent {
EdgeCountEvent { count: <u32>::from_le_byte_slice(&bytes[0..4]), value: <bool>::from_le_byte_slice(&bytes[4..5]) }
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct Identity {
pub uid: String,
pub connected_uid: String,
pub position: char,
pub hardware_version: [u8; 3],
pub firmware_version: [u8; 3],
pub device_identifier: u16,
}
impl FromByteSlice for Identity {
fn bytes_expected() -> usize { 25 }
fn from_le_byte_slice(bytes: &[u8]) -> Identity {
Identity {
uid: <String>::from_le_byte_slice(&bytes[0..8]),
connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
position: <char>::from_le_byte_slice(&bytes[16..17]),
hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
}
}
}
#[derive(Clone)]
pub struct HallEffectBricklet {
device: Device,
}
impl HallEffectBricklet {
pub const DEVICE_IDENTIFIER: u16 = 240;
pub const DEVICE_DISPLAY_NAME: &'static str = "Hall Effect Bricklet";
pub fn new<T: GetRequestSender>(uid: &str, req_sender: T) -> HallEffectBricklet {
let mut result = HallEffectBricklet { device: Device::new([2, 0, 0], uid, req_sender, 0) };
result.device.response_expected[u8::from(HallEffectBrickletFunction::GetValue) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(HallEffectBrickletFunction::GetEdgeCount) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(HallEffectBrickletFunction::SetEdgeCountConfig) as usize] = ResponseExpectedFlag::False;
result.device.response_expected[u8::from(HallEffectBrickletFunction::GetEdgeCountConfig) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(HallEffectBrickletFunction::SetEdgeInterrupt) as usize] = ResponseExpectedFlag::True;
result.device.response_expected[u8::from(HallEffectBrickletFunction::GetEdgeInterrupt) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(HallEffectBrickletFunction::SetEdgeCountCallbackPeriod) as usize] =
ResponseExpectedFlag::True;
result.device.response_expected[u8::from(HallEffectBrickletFunction::GetEdgeCountCallbackPeriod) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(HallEffectBrickletFunction::EdgeInterrupt) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(HallEffectBrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
result
}
pub fn get_response_expected(&mut self, fun: HallEffectBrickletFunction) -> Result<bool, GetResponseExpectedError> {
self.device.get_response_expected(u8::from(fun))
}
pub fn set_response_expected(
&mut self,
fun: HallEffectBrickletFunction,
response_expected: bool,
) -> Result<(), SetResponseExpectedError> {
self.device.set_response_expected(u8::from(fun), response_expected)
}
pub fn set_response_expected_all(&mut self, response_expected: bool) { self.device.set_response_expected_all(response_expected) }
pub fn get_api_version(&self) -> [u8; 3] { self.device.api_version }
pub fn get_edge_count_callback_receiver(&self) -> ConvertingCallbackReceiver<EdgeCountEvent> {
self.device.get_callback_receiver(u8::from(HallEffectBrickletFunction::CallbackEdgeCount))
}
pub fn get_value(&self) -> ConvertingReceiver<bool> {
let payload = vec![0; 0];
self.device.get(u8::from(HallEffectBrickletFunction::GetValue), payload)
}
pub fn get_edge_count(&self, reset_counter: bool) -> ConvertingReceiver<u32> {
let mut payload = vec![0; 1];
payload[0..1].copy_from_slice(&<bool>::to_le_byte_vec(reset_counter));
self.device.get(u8::from(HallEffectBrickletFunction::GetEdgeCount), payload)
}
pub fn set_edge_count_config(&self, edge_type: u8, debounce: u8) -> ConvertingReceiver<()> {
let mut payload = vec![0; 2];
payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(edge_type));
payload[1..2].copy_from_slice(&<u8>::to_le_byte_vec(debounce));
self.device.set(u8::from(HallEffectBrickletFunction::SetEdgeCountConfig), payload)
}
pub fn get_edge_count_config(&self) -> ConvertingReceiver<EdgeCountConfig> {
let payload = vec![0; 0];
self.device.get(u8::from(HallEffectBrickletFunction::GetEdgeCountConfig), payload)
}
pub fn set_edge_interrupt(&self, edges: u32) -> ConvertingReceiver<()> {
let mut payload = vec![0; 4];
payload[0..4].copy_from_slice(&<u32>::to_le_byte_vec(edges));
self.device.set(u8::from(HallEffectBrickletFunction::SetEdgeInterrupt), payload)
}
pub fn get_edge_interrupt(&self) -> ConvertingReceiver<u32> {
let payload = vec![0; 0];
self.device.get(u8::from(HallEffectBrickletFunction::GetEdgeInterrupt), payload)
}
pub fn set_edge_count_callback_period(&self, period: u32) -> ConvertingReceiver<()> {
let mut payload = vec![0; 4];
payload[0..4].copy_from_slice(&<u32>::to_le_byte_vec(period));
self.device.set(u8::from(HallEffectBrickletFunction::SetEdgeCountCallbackPeriod), payload)
}
pub fn get_edge_count_callback_period(&self) -> ConvertingReceiver<u32> {
let payload = vec![0; 0];
self.device.get(u8::from(HallEffectBrickletFunction::GetEdgeCountCallbackPeriod), payload)
}
pub fn edge_interrupt(&self) -> ConvertingReceiver<EdgeInterrupt> {
let payload = vec![0; 0];
self.device.get(u8::from(HallEffectBrickletFunction::EdgeInterrupt), payload)
}
pub fn get_identity(&self) -> ConvertingReceiver<Identity> {
let payload = vec![0; 0];
self.device.get(u8::from(HallEffectBrickletFunction::GetIdentity), payload)
}
}