#[allow(unused_imports)]
use crate::{
byte_converter::*, device::*, error::TinkerforgeError, ip_connection::async_io::AsyncIpConnection, low_level_traits::LowLevelRead,
};
#[allow(unused_imports)]
use futures_core::Stream;
#[allow(unused_imports)]
use tokio_stream::StreamExt;
pub enum AccelerometerBrickletFunction {
GetAcceleration,
SetAccelerationCallbackPeriod,
GetAccelerationCallbackPeriod,
SetAccelerationCallbackThreshold,
GetAccelerationCallbackThreshold,
SetDebouncePeriod,
GetDebouncePeriod,
GetTemperature,
SetConfiguration,
GetConfiguration,
LedOn,
LedOff,
IsLedOn,
GetIdentity,
CallbackAcceleration,
CallbackAccelerationReached,
}
impl From<AccelerometerBrickletFunction> for u8 {
fn from(fun: AccelerometerBrickletFunction) -> Self {
match fun {
AccelerometerBrickletFunction::GetAcceleration => 1,
AccelerometerBrickletFunction::SetAccelerationCallbackPeriod => 2,
AccelerometerBrickletFunction::GetAccelerationCallbackPeriod => 3,
AccelerometerBrickletFunction::SetAccelerationCallbackThreshold => 4,
AccelerometerBrickletFunction::GetAccelerationCallbackThreshold => 5,
AccelerometerBrickletFunction::SetDebouncePeriod => 6,
AccelerometerBrickletFunction::GetDebouncePeriod => 7,
AccelerometerBrickletFunction::GetTemperature => 8,
AccelerometerBrickletFunction::SetConfiguration => 9,
AccelerometerBrickletFunction::GetConfiguration => 10,
AccelerometerBrickletFunction::LedOn => 11,
AccelerometerBrickletFunction::LedOff => 12,
AccelerometerBrickletFunction::IsLedOn => 13,
AccelerometerBrickletFunction::GetIdentity => 255,
AccelerometerBrickletFunction::CallbackAcceleration => 14,
AccelerometerBrickletFunction::CallbackAccelerationReached => 15,
}
}
}
pub const ACCELEROMETER_BRICKLET_THRESHOLD_OPTION_OFF: char = 'x';
pub const ACCELEROMETER_BRICKLET_THRESHOLD_OPTION_OUTSIDE: char = 'o';
pub const ACCELEROMETER_BRICKLET_THRESHOLD_OPTION_INSIDE: char = 'i';
pub const ACCELEROMETER_BRICKLET_THRESHOLD_OPTION_SMALLER: char = '<';
pub const ACCELEROMETER_BRICKLET_THRESHOLD_OPTION_GREATER: char = '>';
pub const ACCELEROMETER_BRICKLET_DATA_RATE_OFF: u8 = 0;
pub const ACCELEROMETER_BRICKLET_DATA_RATE_3HZ: u8 = 1;
pub const ACCELEROMETER_BRICKLET_DATA_RATE_6HZ: u8 = 2;
pub const ACCELEROMETER_BRICKLET_DATA_RATE_12HZ: u8 = 3;
pub const ACCELEROMETER_BRICKLET_DATA_RATE_25HZ: u8 = 4;
pub const ACCELEROMETER_BRICKLET_DATA_RATE_50HZ: u8 = 5;
pub const ACCELEROMETER_BRICKLET_DATA_RATE_100HZ: u8 = 6;
pub const ACCELEROMETER_BRICKLET_DATA_RATE_400HZ: u8 = 7;
pub const ACCELEROMETER_BRICKLET_DATA_RATE_800HZ: u8 = 8;
pub const ACCELEROMETER_BRICKLET_DATA_RATE_1600HZ: u8 = 9;
pub const ACCELEROMETER_BRICKLET_FULL_SCALE_2G: u8 = 0;
pub const ACCELEROMETER_BRICKLET_FULL_SCALE_4G: u8 = 1;
pub const ACCELEROMETER_BRICKLET_FULL_SCALE_6G: u8 = 2;
pub const ACCELEROMETER_BRICKLET_FULL_SCALE_8G: u8 = 3;
pub const ACCELEROMETER_BRICKLET_FULL_SCALE_16G: u8 = 4;
pub const ACCELEROMETER_BRICKLET_FILTER_BANDWIDTH_800HZ: u8 = 0;
pub const ACCELEROMETER_BRICKLET_FILTER_BANDWIDTH_400HZ: u8 = 1;
pub const ACCELEROMETER_BRICKLET_FILTER_BANDWIDTH_200HZ: u8 = 2;
pub const ACCELEROMETER_BRICKLET_FILTER_BANDWIDTH_50HZ: u8 = 3;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct Acceleration {
pub x: i16,
pub y: i16,
pub z: i16,
}
impl FromByteSlice for Acceleration {
fn bytes_expected() -> usize {
6
}
fn from_le_byte_slice(bytes: &[u8]) -> Acceleration {
Acceleration {
x: <i16>::from_le_byte_slice(&bytes[0..2]),
y: <i16>::from_le_byte_slice(&bytes[2..4]),
z: <i16>::from_le_byte_slice(&bytes[4..6]),
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct AccelerationCallbackThreshold {
pub option: char,
pub min_x: i16,
pub max_x: i16,
pub min_y: i16,
pub max_y: i16,
pub min_z: i16,
pub max_z: i16,
}
impl FromByteSlice for AccelerationCallbackThreshold {
fn bytes_expected() -> usize {
13
}
fn from_le_byte_slice(bytes: &[u8]) -> AccelerationCallbackThreshold {
AccelerationCallbackThreshold {
option: <char>::from_le_byte_slice(&bytes[0..1]),
min_x: <i16>::from_le_byte_slice(&bytes[1..3]),
max_x: <i16>::from_le_byte_slice(&bytes[3..5]),
min_y: <i16>::from_le_byte_slice(&bytes[5..7]),
max_y: <i16>::from_le_byte_slice(&bytes[7..9]),
min_z: <i16>::from_le_byte_slice(&bytes[9..11]),
max_z: <i16>::from_le_byte_slice(&bytes[11..13]),
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct Configuration {
pub data_rate: u8,
pub full_scale: u8,
pub filter_bandwidth: u8,
}
impl FromByteSlice for Configuration {
fn bytes_expected() -> usize {
3
}
fn from_le_byte_slice(bytes: &[u8]) -> Configuration {
Configuration {
data_rate: <u8>::from_le_byte_slice(&bytes[0..1]),
full_scale: <u8>::from_le_byte_slice(&bytes[1..2]),
filter_bandwidth: <u8>::from_le_byte_slice(&bytes[2..3]),
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct AccelerationEvent {
pub x: i16,
pub y: i16,
pub z: i16,
}
impl FromByteSlice for AccelerationEvent {
fn bytes_expected() -> usize {
6
}
fn from_le_byte_slice(bytes: &[u8]) -> AccelerationEvent {
AccelerationEvent {
x: <i16>::from_le_byte_slice(&bytes[0..2]),
y: <i16>::from_le_byte_slice(&bytes[2..4]),
z: <i16>::from_le_byte_slice(&bytes[4..6]),
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct AccelerationReachedEvent {
pub x: i16,
pub y: i16,
pub z: i16,
}
impl FromByteSlice for AccelerationReachedEvent {
fn bytes_expected() -> usize {
6
}
fn from_le_byte_slice(bytes: &[u8]) -> AccelerationReachedEvent {
AccelerationReachedEvent {
x: <i16>::from_le_byte_slice(&bytes[0..2]),
y: <i16>::from_le_byte_slice(&bytes[2..4]),
z: <i16>::from_le_byte_slice(&bytes[4..6]),
}
}
}
#[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 AccelerometerBricklet {
device: Device,
}
impl AccelerometerBricklet {
pub const DEVICE_IDENTIFIER: u16 = 250;
pub const DEVICE_DISPLAY_NAME: &'static str = "Accelerometer Bricklet";
pub fn new(uid: &str, connection: AsyncIpConnection) -> AccelerometerBricklet {
let mut result = AccelerometerBricklet { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
result.device.response_expected[u8::from(AccelerometerBrickletFunction::GetAcceleration) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::SetAccelerationCallbackPeriod) as usize] =
ResponseExpectedFlag::True;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::GetAccelerationCallbackPeriod) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::SetAccelerationCallbackThreshold) as usize] =
ResponseExpectedFlag::True;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::GetAccelerationCallbackThreshold) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::SetDebouncePeriod) as usize] = ResponseExpectedFlag::True;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::GetDebouncePeriod) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::GetTemperature) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::SetConfiguration) as usize] = ResponseExpectedFlag::False;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::GetConfiguration) as usize] =
ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::LedOn) as usize] = ResponseExpectedFlag::False;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::LedOff) as usize] = ResponseExpectedFlag::False;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::IsLedOn) as usize] = ResponseExpectedFlag::AlwaysTrue;
result.device.response_expected[u8::from(AccelerometerBrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
result
}
pub fn get_response_expected(&mut self, fun: AccelerometerBrickletFunction) -> Result<bool, GetResponseExpectedError> {
self.device.get_response_expected(u8::from(fun))
}
pub fn set_response_expected(
&mut self,
fun: AccelerometerBrickletFunction,
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 async fn get_acceleration_callback_receiver(&mut self) -> impl Stream<Item = AccelerationEvent> {
self.device
.get_callback_receiver(u8::from(AccelerometerBrickletFunction::CallbackAcceleration))
.await
.map(|p| AccelerationEvent::from_le_byte_slice(p.body()))
}
pub async fn get_acceleration_reached_callback_receiver(&mut self) -> impl Stream<Item = AccelerationReachedEvent> {
self.device
.get_callback_receiver(u8::from(AccelerometerBrickletFunction::CallbackAccelerationReached))
.await
.map(|p| AccelerationReachedEvent::from_le_byte_slice(p.body()))
}
pub async fn get_acceleration(&mut self) -> Result<Acceleration, TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.get(u8::from(AccelerometerBrickletFunction::GetAcceleration), &payload).await?;
Ok(Acceleration::from_le_byte_slice(result.body()))
}
pub async fn set_acceleration_callback_period(&mut self, period: u32) -> Result<(), TinkerforgeError> {
let mut payload = [0; 4];
period.write_to_slice(&mut payload[0..4]);
#[allow(unused_variables)]
let result = self.device.set(u8::from(AccelerometerBrickletFunction::SetAccelerationCallbackPeriod), &payload).await?;
Ok(())
}
pub async fn get_acceleration_callback_period(&mut self) -> Result<u32, TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.get(u8::from(AccelerometerBrickletFunction::GetAccelerationCallbackPeriod), &payload).await?;
Ok(u32::from_le_byte_slice(result.body()))
}
pub async fn set_acceleration_callback_threshold(
&mut self,
option: char,
min_x: i16,
max_x: i16,
min_y: i16,
max_y: i16,
min_z: i16,
max_z: i16,
) -> Result<(), TinkerforgeError> {
let mut payload = [0; 13];
option.write_to_slice(&mut payload[0..1]);
min_x.write_to_slice(&mut payload[1..3]);
max_x.write_to_slice(&mut payload[3..5]);
min_y.write_to_slice(&mut payload[5..7]);
max_y.write_to_slice(&mut payload[7..9]);
min_z.write_to_slice(&mut payload[9..11]);
max_z.write_to_slice(&mut payload[11..13]);
#[allow(unused_variables)]
let result = self.device.set(u8::from(AccelerometerBrickletFunction::SetAccelerationCallbackThreshold), &payload).await?;
Ok(())
}
pub async fn get_acceleration_callback_threshold(&mut self) -> Result<AccelerationCallbackThreshold, TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.get(u8::from(AccelerometerBrickletFunction::GetAccelerationCallbackThreshold), &payload).await?;
Ok(AccelerationCallbackThreshold::from_le_byte_slice(result.body()))
}
pub async fn set_debounce_period(&mut self, debounce: u32) -> Result<(), TinkerforgeError> {
let mut payload = [0; 4];
debounce.write_to_slice(&mut payload[0..4]);
#[allow(unused_variables)]
let result = self.device.set(u8::from(AccelerometerBrickletFunction::SetDebouncePeriod), &payload).await?;
Ok(())
}
pub async fn get_debounce_period(&mut self) -> Result<u32, TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.get(u8::from(AccelerometerBrickletFunction::GetDebouncePeriod), &payload).await?;
Ok(u32::from_le_byte_slice(result.body()))
}
pub async fn get_temperature(&mut self) -> Result<i16, TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.get(u8::from(AccelerometerBrickletFunction::GetTemperature), &payload).await?;
Ok(i16::from_le_byte_slice(result.body()))
}
pub async fn set_configuration(&mut self, data_rate: u8, full_scale: u8, filter_bandwidth: u8) -> Result<(), TinkerforgeError> {
let mut payload = [0; 3];
data_rate.write_to_slice(&mut payload[0..1]);
full_scale.write_to_slice(&mut payload[1..2]);
filter_bandwidth.write_to_slice(&mut payload[2..3]);
#[allow(unused_variables)]
let result = self.device.set(u8::from(AccelerometerBrickletFunction::SetConfiguration), &payload).await?;
Ok(())
}
pub async fn get_configuration(&mut self) -> Result<Configuration, TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.get(u8::from(AccelerometerBrickletFunction::GetConfiguration), &payload).await?;
Ok(Configuration::from_le_byte_slice(result.body()))
}
pub async fn led_on(&mut self) -> Result<(), TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.set(u8::from(AccelerometerBrickletFunction::LedOn), &payload).await?;
Ok(())
}
pub async fn led_off(&mut self) -> Result<(), TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.set(u8::from(AccelerometerBrickletFunction::LedOff), &payload).await?;
Ok(())
}
pub async fn is_led_on(&mut self) -> Result<bool, TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.get(u8::from(AccelerometerBrickletFunction::IsLedOn), &payload).await?;
Ok(bool::from_le_byte_slice(result.body()))
}
pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
let payload = [0; 0];
#[allow(unused_variables)]
let result = self.device.get(u8::from(AccelerometerBrickletFunction::GetIdentity), &payload).await?;
Ok(Identity::from_le_byte_slice(result.body()))
}
}