buttplug/server/device/protocol/
kiiroo_spot.rs

1// Buttplug Rust Source Code File - See https://buttplug.io for more info.
2//
3// Copyright 2016-2025 Nonpolynomial Labs LLC. All rights reserved.
4//
5// Licensed under the BSD 3-Clause license. See LICENSE file in the project root
6// for full license information.
7
8use 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}