use crate::{
byte_converter::*, converting_callback_receiver::ConvertingCallbackReceiver, converting_receiver::ConvertingReceiver, device::*,
ip_connection::GetRequestSender,
};
pub enum IndustrialDual020maBrickletFunction {
GetCurrent,
SetCurrentCallbackPeriod,
GetCurrentCallbackPeriod,
SetCurrentCallbackThreshold,
GetCurrentCallbackThreshold,
SetDebouncePeriod,
GetDebouncePeriod,
SetSampleRate,
GetSampleRate,
GetIdentity,
CallbackCurrent,
CallbackCurrentReached,
}
impl From<IndustrialDual020maBrickletFunction> for u8 {
fn from(fun: IndustrialDual020maBrickletFunction) -> Self {
match fun {
IndustrialDual020maBrickletFunction::GetCurrent => 1,
IndustrialDual020maBrickletFunction::SetCurrentCallbackPeriod => 2,
IndustrialDual020maBrickletFunction::GetCurrentCallbackPeriod => 3,
IndustrialDual020maBrickletFunction::SetCurrentCallbackThreshold => 4,
IndustrialDual020maBrickletFunction::GetCurrentCallbackThreshold => 5,
IndustrialDual020maBrickletFunction::SetDebouncePeriod => 6,
IndustrialDual020maBrickletFunction::GetDebouncePeriod => 7,
IndustrialDual020maBrickletFunction::SetSampleRate => 8,
IndustrialDual020maBrickletFunction::GetSampleRate => 9,
IndustrialDual020maBrickletFunction::GetIdentity => 255,
IndustrialDual020maBrickletFunction::CallbackCurrent => 10,
IndustrialDual020maBrickletFunction::CallbackCurrentReached => 11,
}
}
}
pub const INDUSTRIAL_DUAL_0_20MA_BRICKLET_THRESHOLD_OPTION_OFF: char = 'x';
pub const INDUSTRIAL_DUAL_0_20MA_BRICKLET_THRESHOLD_OPTION_OUTSIDE: char = 'o';
pub const INDUSTRIAL_DUAL_0_20MA_BRICKLET_THRESHOLD_OPTION_INSIDE: char = 'i';
pub const INDUSTRIAL_DUAL_0_20MA_BRICKLET_THRESHOLD_OPTION_SMALLER: char = '<';
pub const INDUSTRIAL_DUAL_0_20MA_BRICKLET_THRESHOLD_OPTION_GREATER: char = '>';
pub const INDUSTRIAL_DUAL_0_20MA_BRICKLET_SAMPLE_RATE_240_SPS: u8 = 0;
pub const INDUSTRIAL_DUAL_0_20MA_BRICKLET_SAMPLE_RATE_60_SPS: u8 = 1;
pub const INDUSTRIAL_DUAL_0_20MA_BRICKLET_SAMPLE_RATE_15_SPS: u8 = 2;
pub const INDUSTRIAL_DUAL_0_20MA_BRICKLET_SAMPLE_RATE_4_SPS: u8 = 3;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct CurrentCallbackThreshold {
pub option: char,
pub min: i32,
pub max: i32,
}
impl FromByteSlice for CurrentCallbackThreshold {
fn bytes_expected() -> usize { 9 }
fn from_le_byte_slice(bytes: &[u8]) -> CurrentCallbackThreshold {
CurrentCallbackThreshold {
option: <char>::from_le_byte_slice(&bytes[0..1]),
min: <i32>::from_le_byte_slice(&bytes[1..5]),
max: <i32>::from_le_byte_slice(&bytes[5..9]),
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct CurrentEvent {
pub sensor: u8,
pub current: i32,
}
impl FromByteSlice for CurrentEvent {
fn bytes_expected() -> usize { 5 }
fn from_le_byte_slice(bytes: &[u8]) -> CurrentEvent {
CurrentEvent { sensor: <u8>::from_le_byte_slice(&bytes[0..1]), current: <i32>::from_le_byte_slice(&bytes[1..5]) }
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct CurrentReachedEvent {
pub sensor: u8,
pub current: i32,
}
impl FromByteSlice for CurrentReachedEvent {
fn bytes_expected() -> usize { 5 }
fn from_le_byte_slice(bytes: &[u8]) -> CurrentReachedEvent {
CurrentReachedEvent { sensor: <u8>::from_le_byte_slice(&bytes[0..1]), current: <i32>::from_le_byte_slice(&bytes[1..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 IndustrialDual020maBricklet {
device: Device,
}
impl IndustrialDual020maBricklet {
pub const DEVICE_IDENTIFIER: u16 = 228;
pub const DEVICE_DISPLAY_NAME: &'static str = "Industrial Dual 0-20mA Bricklet";
pub fn new<T: GetRequestSender>(uid: &str, req_sender: T) -> IndustrialDual020maBricklet {
let mut result = IndustrialDual020maBricklet { device: Device::new([2, 0, 0], uid, req_sender, 0) };
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::GetCurrent) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::SetCurrentCallbackPeriod) as usize] =
ResponseExpectedFlag::True;
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::GetCurrentCallbackPeriod) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::SetCurrentCallbackThreshold) as usize] =
ResponseExpectedFlag::True;
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::GetCurrentCallbackThreshold) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::SetDebouncePeriod) as usize] =
ResponseExpectedFlag::True;
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::GetDebouncePeriod) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::SetSampleRate) as usize] =
ResponseExpectedFlag::False;
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::GetSampleRate) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(IndustrialDual020maBrickletFunction::GetIdentity) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result
}
pub fn get_response_expected(&mut self, fun: IndustrialDual020maBrickletFunction) -> Result<bool, GetResponseExpectedError> {
self.device.get_response_expected(u8::from(fun))
}
pub fn set_response_expected(
&mut self,
fun: IndustrialDual020maBrickletFunction,
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_current_callback_receiver(&self) -> ConvertingCallbackReceiver<CurrentEvent> {
self.device.get_callback_receiver(u8::from(IndustrialDual020maBrickletFunction::CallbackCurrent))
}
pub fn get_current_reached_callback_receiver(&self) -> ConvertingCallbackReceiver<CurrentReachedEvent> {
self.device.get_callback_receiver(u8::from(IndustrialDual020maBrickletFunction::CallbackCurrentReached))
}
pub fn get_current(&self, sensor: u8) -> ConvertingReceiver<i32> {
let mut payload = vec![0; 1];
payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(sensor));
self.device.get(u8::from(IndustrialDual020maBrickletFunction::GetCurrent), payload)
}
pub fn set_current_callback_period(&self, sensor: u8, period: u32) -> ConvertingReceiver<()> {
let mut payload = vec![0; 5];
payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(sensor));
payload[1..5].copy_from_slice(&<u32>::to_le_byte_vec(period));
self.device.set(u8::from(IndustrialDual020maBrickletFunction::SetCurrentCallbackPeriod), payload)
}
pub fn get_current_callback_period(&self, sensor: u8) -> ConvertingReceiver<u32> {
let mut payload = vec![0; 1];
payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(sensor));
self.device.get(u8::from(IndustrialDual020maBrickletFunction::GetCurrentCallbackPeriod), payload)
}
pub fn set_current_callback_threshold(&self, sensor: u8, option: char, min: i32, max: i32) -> ConvertingReceiver<()> {
let mut payload = vec![0; 10];
payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(sensor));
payload[1..2].copy_from_slice(&<char>::to_le_byte_vec(option));
payload[2..6].copy_from_slice(&<i32>::to_le_byte_vec(min));
payload[6..10].copy_from_slice(&<i32>::to_le_byte_vec(max));
self.device.set(u8::from(IndustrialDual020maBrickletFunction::SetCurrentCallbackThreshold), payload)
}
pub fn get_current_callback_threshold(&self, sensor: u8) -> ConvertingReceiver<CurrentCallbackThreshold> {
let mut payload = vec![0; 1];
payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(sensor));
self.device.get(u8::from(IndustrialDual020maBrickletFunction::GetCurrentCallbackThreshold), payload)
}
pub fn set_debounce_period(&self, debounce: u32) -> ConvertingReceiver<()> {
let mut payload = vec![0; 4];
payload[0..4].copy_from_slice(&<u32>::to_le_byte_vec(debounce));
self.device.set(u8::from(IndustrialDual020maBrickletFunction::SetDebouncePeriod), payload)
}
pub fn get_debounce_period(&self) -> ConvertingReceiver<u32> {
let payload = vec![0; 0];
self.device.get(u8::from(IndustrialDual020maBrickletFunction::GetDebouncePeriod), payload)
}
pub fn set_sample_rate(&self, rate: u8) -> ConvertingReceiver<()> {
let mut payload = vec![0; 1];
payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(rate));
self.device.set(u8::from(IndustrialDual020maBrickletFunction::SetSampleRate), payload)
}
pub fn get_sample_rate(&self) -> ConvertingReceiver<u8> {
let payload = vec![0; 0];
self.device.get(u8::from(IndustrialDual020maBrickletFunction::GetSampleRate), payload)
}
pub fn get_identity(&self) -> ConvertingReceiver<Identity> {
let payload = vec![0; 0];
self.device.get(u8::from(IndustrialDual020maBrickletFunction::GetIdentity), payload)
}
}