buttplug/server/device/protocol/
kiiroo_spot.rs1use crate::{
9 core::{
10 errors::ButtplugDeviceError,
11 message::{self, ButtplugDeviceMessage, Endpoint, SensorReadingV4},
12 },
13 server::device::{
14 hardware::{Hardware, HardwareCommand, HardwareReadCmd, HardwareWriteCmd},
15 protocol::{generic_protocol_setup, ProtocolHandler},
16 },
17};
18use futures::{future::BoxFuture, FutureExt};
19use std::{default::Default, sync::Arc};
20
21generic_protocol_setup!(KiirooSpot, "kiiroo-spot");
22
23#[derive(Default)]
24pub struct KiirooSpot {}
25
26impl ProtocolHandler for KiirooSpot {
27 fn handle_scalar_vibrate_cmd(
28 &self,
29 _: u32,
30 scalar: u32,
31 ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
32 Ok(vec![HardwareWriteCmd::new(
33 Endpoint::Tx,
34 vec![0x00, 0xff, 0x00, 0x00, 0x00, scalar as u8],
35 false,
36 )
37 .into()])
38 }
39
40 fn handle_battery_level_cmd(
41 &self,
42 device: Arc<Hardware>,
43 message: message::SensorReadCmdV4,
44 ) -> BoxFuture<Result<SensorReadingV4, ButtplugDeviceError>> {
45 debug!("Trying to get battery reading.");
46 let message = message.clone();
47 let msg = HardwareReadCmd::new(Endpoint::RxBLEBattery, 20, 0);
48 let fut = device.read_value(&msg);
49 async move {
50 let hw_msg = fut.await?;
51 let data = hw_msg.data();
52 let battery_level = data[0] as i32;
53 let battery_reading = message::SensorReadingV4::new(
54 message.device_index(),
55 *message.feature_index(),
56 *message.sensor_type(),
57 vec![battery_level],
58 );
59 debug!("Got battery reading: {}", battery_level);
60 Ok(battery_reading)
61 }
62 .boxed()
63 }
64}