Buttplug sex toy control library
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::device::{
9 hardware::{Hardware, HardwareCommand, HardwareWriteCmd},
10 protocol::{
11 ProtocolHandler,
12 ProtocolIdentifier,
13 ProtocolInitializer,
14 generic_protocol_initializer_setup,
15 },
16};
17use async_trait::async_trait;
18use buttplug_core::errors::ButtplugDeviceError;
19use buttplug_server_device_config::Endpoint;
20use buttplug_server_device_config::{
21 ProtocolCommunicationSpecifier,
22 ServerDeviceDefinition,
23 UserDeviceIdentifier,
24};
25use std::sync::Arc;
26use uuid::{Uuid, uuid};
27
28const WETOY_PROTOCOL_ID: Uuid = uuid!("9868762e-4203-4876-abf5-83c992e024b4");
29generic_protocol_initializer_setup!(WeToy, "wetoy");
30
31#[derive(Default)]
32pub struct WeToyInitializer {}
33
34#[async_trait]
35impl ProtocolInitializer for WeToyInitializer {
36 async fn initialize(
37 &mut self,
38 hardware: Arc<Hardware>,
39 _: &ServerDeviceDefinition,
40 ) -> Result<Arc<dyn ProtocolHandler>, ButtplugDeviceError> {
41 hardware
42 .write_value(&HardwareWriteCmd::new(
43 &[WETOY_PROTOCOL_ID],
44 Endpoint::Tx,
45 vec![0x80, 0x03],
46 true,
47 ))
48 .await?;
49 Ok(Arc::new(WeToy::default()))
50 }
51}
52
53#[derive(Default)]
54pub struct WeToy {}
55
56impl ProtocolHandler for WeToy {
57 fn handle_output_vibrate_cmd(
58 &self,
59 _feature_index: u32,
60 feature_id: Uuid,
61 speed: u32,
62 ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
63 Ok(vec![
64 HardwareWriteCmd::new(
65 &[feature_id],
66 Endpoint::Tx,
67 if speed == 0 {
68 vec![0x80, 0x03]
69 } else {
70 vec![0xb2, speed as u8 - 1]
71 },
72 true,
73 )
74 .into(),
75 ])
76 }
77}