use crate::{
byte_converter::*, converting_callback_receiver::ConvertingCallbackReceiver, converting_receiver::ConvertingReceiver, device::*,
ip_connection::GetRequestSender,
};
pub enum PtcBrickletFunction {
GetTemperature,
GetResistance,
SetTemperatureCallbackPeriod,
GetTemperatureCallbackPeriod,
SetResistanceCallbackPeriod,
GetResistanceCallbackPeriod,
SetTemperatureCallbackThreshold,
GetTemperatureCallbackThreshold,
SetResistanceCallbackThreshold,
GetResistanceCallbackThreshold,
SetDebouncePeriod,
GetDebouncePeriod,
SetNoiseRejectionFilter,
GetNoiseRejectionFilter,
IsSensorConnected,
SetWireMode,
GetWireMode,
SetSensorConnectedCallbackConfiguration,
GetSensorConnectedCallbackConfiguration,
GetIdentity,
CallbackTemperature,
CallbackTemperatureReached,
CallbackResistance,
CallbackResistanceReached,
CallbackSensorConnected,
}
impl From<PtcBrickletFunction> for u8 {
fn from(fun: PtcBrickletFunction) -> Self {
match fun {
PtcBrickletFunction::GetTemperature => 1,
PtcBrickletFunction::GetResistance => 2,
PtcBrickletFunction::SetTemperatureCallbackPeriod => 3,
PtcBrickletFunction::GetTemperatureCallbackPeriod => 4,
PtcBrickletFunction::SetResistanceCallbackPeriod => 5,
PtcBrickletFunction::GetResistanceCallbackPeriod => 6,
PtcBrickletFunction::SetTemperatureCallbackThreshold => 7,
PtcBrickletFunction::GetTemperatureCallbackThreshold => 8,
PtcBrickletFunction::SetResistanceCallbackThreshold => 9,
PtcBrickletFunction::GetResistanceCallbackThreshold => 10,
PtcBrickletFunction::SetDebouncePeriod => 11,
PtcBrickletFunction::GetDebouncePeriod => 12,
PtcBrickletFunction::SetNoiseRejectionFilter => 17,
PtcBrickletFunction::GetNoiseRejectionFilter => 18,
PtcBrickletFunction::IsSensorConnected => 19,
PtcBrickletFunction::SetWireMode => 20,
PtcBrickletFunction::GetWireMode => 21,
PtcBrickletFunction::SetSensorConnectedCallbackConfiguration => 22,
PtcBrickletFunction::GetSensorConnectedCallbackConfiguration => 23,
PtcBrickletFunction::GetIdentity => 255,
PtcBrickletFunction::CallbackTemperature => 13,
PtcBrickletFunction::CallbackTemperatureReached => 14,
PtcBrickletFunction::CallbackResistance => 15,
PtcBrickletFunction::CallbackResistanceReached => 16,
PtcBrickletFunction::CallbackSensorConnected => 24,
}
}
}
pub const PTC_BRICKLET_THRESHOLD_OPTION_OFF: char = 'x';
pub const PTC_BRICKLET_THRESHOLD_OPTION_OUTSIDE: char = 'o';
pub const PTC_BRICKLET_THRESHOLD_OPTION_INSIDE: char = 'i';
pub const PTC_BRICKLET_THRESHOLD_OPTION_SMALLER: char = '<';
pub const PTC_BRICKLET_THRESHOLD_OPTION_GREATER: char = '>';
pub const PTC_BRICKLET_FILTER_OPTION_50HZ: u8 = 0;
pub const PTC_BRICKLET_FILTER_OPTION_60HZ: u8 = 1;
pub const PTC_BRICKLET_WIRE_MODE_2: u8 = 2;
pub const PTC_BRICKLET_WIRE_MODE_3: u8 = 3;
pub const PTC_BRICKLET_WIRE_MODE_4: u8 = 4;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct TemperatureCallbackThreshold {
pub option: char,
pub min: i32,
pub max: i32,
}
impl FromByteSlice for TemperatureCallbackThreshold {
fn bytes_expected() -> usize { 9 }
fn from_le_byte_slice(bytes: &[u8]) -> TemperatureCallbackThreshold {
TemperatureCallbackThreshold {
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 ResistanceCallbackThreshold {
pub option: char,
pub min: i32,
pub max: i32,
}
impl FromByteSlice for ResistanceCallbackThreshold {
fn bytes_expected() -> usize { 9 }
fn from_le_byte_slice(bytes: &[u8]) -> ResistanceCallbackThreshold {
ResistanceCallbackThreshold {
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, 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 PtcBricklet {
device: Device,
}
impl PtcBricklet {
pub const DEVICE_IDENTIFIER: u16 = 226;
pub const DEVICE_DISPLAY_NAME: &'static str = "PTC Bricklet";
pub fn new<T: GetRequestSender>(uid: &str, req_sender: T) -> PtcBricklet {
let mut result = PtcBricklet { device: Device::new([2, 0, 1], uid, req_sender, 0) };
result.device.response_expected[u8::from(PtcBrickletFunction::GetTemperature) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::GetResistance) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::SetTemperatureCallbackPeriod) as usize] = ResponseExpectedFlag::True;
result.device.response_expected[u8::from(PtcBrickletFunction::GetTemperatureCallbackPeriod) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::SetResistanceCallbackPeriod) as usize] = ResponseExpectedFlag::True;
result.device.response_expected[u8::from(PtcBrickletFunction::GetResistanceCallbackPeriod) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::SetTemperatureCallbackThreshold) as usize] =
ResponseExpectedFlag::True;
result.device.response_expected[u8::from(PtcBrickletFunction::GetTemperatureCallbackThreshold) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::SetResistanceCallbackThreshold) as usize] =
ResponseExpectedFlag::True;
result.device.response_expected[u8::from(PtcBrickletFunction::GetResistanceCallbackThreshold) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::SetDebouncePeriod) as usize] = ResponseExpectedFlag::True;
result.device.response_expected[u8::from(PtcBrickletFunction::GetDebouncePeriod) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::SetNoiseRejectionFilter) as usize] = ResponseExpectedFlag::False;
result.device.response_expected[u8::from(PtcBrickletFunction::GetNoiseRejectionFilter) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::IsSensorConnected) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::SetWireMode) as usize] = ResponseExpectedFlag::False;
result.device.response_expected[u8::from(PtcBrickletFunction::GetWireMode) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::SetSensorConnectedCallbackConfiguration) as usize] =
ResponseExpectedFlag::True;
result.device.response_expected[u8::from(PtcBrickletFunction::GetSensorConnectedCallbackConfiguration) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(PtcBrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
result
}
pub fn get_response_expected(&mut self, fun: PtcBrickletFunction) -> Result<bool, GetResponseExpectedError> {
self.device.get_response_expected(u8::from(fun))
}
pub fn set_response_expected(&mut self, fun: PtcBrickletFunction, 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_temperature_callback_receiver(&self) -> ConvertingCallbackReceiver<i32> {
self.device.get_callback_receiver(u8::from(PtcBrickletFunction::CallbackTemperature))
}
pub fn get_temperature_reached_callback_receiver(&self) -> ConvertingCallbackReceiver<i32> {
self.device.get_callback_receiver(u8::from(PtcBrickletFunction::CallbackTemperatureReached))
}
pub fn get_resistance_callback_receiver(&self) -> ConvertingCallbackReceiver<i32> {
self.device.get_callback_receiver(u8::from(PtcBrickletFunction::CallbackResistance))
}
pub fn get_resistance_reached_callback_receiver(&self) -> ConvertingCallbackReceiver<i32> {
self.device.get_callback_receiver(u8::from(PtcBrickletFunction::CallbackResistanceReached))
}
pub fn get_sensor_connected_callback_receiver(&self) -> ConvertingCallbackReceiver<bool> {
self.device.get_callback_receiver(u8::from(PtcBrickletFunction::CallbackSensorConnected))
}
pub fn get_temperature(&self) -> ConvertingReceiver<i32> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetTemperature), payload)
}
pub fn get_resistance(&self) -> ConvertingReceiver<i32> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetResistance), payload)
}
pub fn set_temperature_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(PtcBrickletFunction::SetTemperatureCallbackPeriod), payload)
}
pub fn get_temperature_callback_period(&self) -> ConvertingReceiver<u32> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetTemperatureCallbackPeriod), payload)
}
pub fn set_resistance_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(PtcBrickletFunction::SetResistanceCallbackPeriod), payload)
}
pub fn get_resistance_callback_period(&self) -> ConvertingReceiver<u32> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetResistanceCallbackPeriod), payload)
}
pub fn set_temperature_callback_threshold(&self, option: char, min: i32, max: i32) -> ConvertingReceiver<()> {
let mut payload = vec![0; 9];
payload[0..1].copy_from_slice(&<char>::to_le_byte_vec(option));
payload[1..5].copy_from_slice(&<i32>::to_le_byte_vec(min));
payload[5..9].copy_from_slice(&<i32>::to_le_byte_vec(max));
self.device.set(u8::from(PtcBrickletFunction::SetTemperatureCallbackThreshold), payload)
}
pub fn get_temperature_callback_threshold(&self) -> ConvertingReceiver<TemperatureCallbackThreshold> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetTemperatureCallbackThreshold), payload)
}
pub fn set_resistance_callback_threshold(&self, option: char, min: i32, max: i32) -> ConvertingReceiver<()> {
let mut payload = vec![0; 9];
payload[0..1].copy_from_slice(&<char>::to_le_byte_vec(option));
payload[1..5].copy_from_slice(&<i32>::to_le_byte_vec(min));
payload[5..9].copy_from_slice(&<i32>::to_le_byte_vec(max));
self.device.set(u8::from(PtcBrickletFunction::SetResistanceCallbackThreshold), payload)
}
pub fn get_resistance_callback_threshold(&self) -> ConvertingReceiver<ResistanceCallbackThreshold> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetResistanceCallbackThreshold), 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(PtcBrickletFunction::SetDebouncePeriod), payload)
}
pub fn get_debounce_period(&self) -> ConvertingReceiver<u32> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetDebouncePeriod), payload)
}
pub fn set_noise_rejection_filter(&self, filter: u8) -> ConvertingReceiver<()> {
let mut payload = vec![0; 1];
payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(filter));
self.device.set(u8::from(PtcBrickletFunction::SetNoiseRejectionFilter), payload)
}
pub fn get_noise_rejection_filter(&self) -> ConvertingReceiver<u8> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetNoiseRejectionFilter), payload)
}
pub fn is_sensor_connected(&self) -> ConvertingReceiver<bool> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::IsSensorConnected), payload)
}
pub fn set_wire_mode(&self, mode: u8) -> ConvertingReceiver<()> {
let mut payload = vec![0; 1];
payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(mode));
self.device.set(u8::from(PtcBrickletFunction::SetWireMode), payload)
}
pub fn get_wire_mode(&self) -> ConvertingReceiver<u8> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetWireMode), payload)
}
pub fn set_sensor_connected_callback_configuration(&self, enabled: bool) -> ConvertingReceiver<()> {
let mut payload = vec![0; 1];
payload[0..1].copy_from_slice(&<bool>::to_le_byte_vec(enabled));
self.device.set(u8::from(PtcBrickletFunction::SetSensorConnectedCallbackConfiguration), payload)
}
pub fn get_sensor_connected_callback_configuration(&self) -> ConvertingReceiver<bool> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetSensorConnectedCallbackConfiguration), payload)
}
pub fn get_identity(&self) -> ConvertingReceiver<Identity> {
let payload = vec![0; 0];
self.device.get(u8::from(PtcBrickletFunction::GetIdentity), payload)
}
}