buttplug/server/device/protocol/
wetoy.rs

1// Buttplug Rust Source Code File - See https://buttplug.io for more info.
2//
3// Copyright 2016-2024 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::server::device::configuration::ProtocolCommunicationSpecifier;
9use crate::{
10  core::{errors::ButtplugDeviceError, message::Endpoint},
11  server::device::{
12    configuration::{UserDeviceDefinition, UserDeviceIdentifier},
13    hardware::{Hardware, HardwareCommand, HardwareWriteCmd},
14    protocol::{
15      generic_protocol_initializer_setup,
16      ProtocolHandler,
17      ProtocolIdentifier,
18      ProtocolInitializer,
19    },
20  },
21};
22use async_trait::async_trait;
23use std::sync::Arc;
24
25generic_protocol_initializer_setup!(WeToy, "wetoy");
26
27#[derive(Default)]
28pub struct WeToyInitializer {}
29
30#[async_trait]
31impl ProtocolInitializer for WeToyInitializer {
32  async fn initialize(
33    &mut self,
34    hardware: Arc<Hardware>,
35    _: &UserDeviceDefinition,
36  ) -> Result<Arc<dyn ProtocolHandler>, ButtplugDeviceError> {
37    hardware
38      .write_value(&HardwareWriteCmd::new(Endpoint::Tx, vec![0x80, 0x03], true))
39      .await?;
40    Ok(Arc::new(WeToy::default()))
41  }
42}
43
44#[derive(Default)]
45pub struct WeToy {}
46
47impl ProtocolHandler for WeToy {
48  fn keepalive_strategy(&self) -> super::ProtocolKeepaliveStrategy {
49    super::ProtocolKeepaliveStrategy::RepeatLastPacketStrategy
50  }
51
52  fn handle_scalar_vibrate_cmd(
53    &self,
54    _index: u32,
55    scalar: u32,
56  ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
57    Ok(vec![HardwareWriteCmd::new(
58      Endpoint::Tx,
59      if scalar == 0 {
60        vec![0x80, 0x03]
61      } else {
62        vec![0xb2, scalar as u8 - 1]
63      },
64      true,
65    )
66    .into()])
67  }
68}