buttplug/server/device/protocol/
wetoy.rs1use 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}