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 LOVEDISTANCE_PROTOCOL_UUID: Uuid = uuid!("a5f50cd5-7985-438c-a5bc-f8ff72bc0117");
29generic_protocol_initializer_setup!(LoveDistance, "lovedistance");
30
31#[derive(Default)]
32pub struct LoveDistanceInitializer {}
33
34#[async_trait]
35impl ProtocolInitializer for LoveDistanceInitializer {
36 async fn initialize(
37 &mut self,
38 hardware: Arc<Hardware>,
39 _: &ServerDeviceDefinition,
40 ) -> Result<Arc<dyn ProtocolHandler>, ButtplugDeviceError> {
41 let msg = HardwareWriteCmd::new(
42 &[LOVEDISTANCE_PROTOCOL_UUID],
43 Endpoint::Tx,
44 vec![0xf3, 0, 0],
45 false,
46 );
47 hardware.write_value(&msg).await?;
48 let msg = HardwareWriteCmd::new(
49 &[LOVEDISTANCE_PROTOCOL_UUID],
50 Endpoint::Tx,
51 vec![0xf4, 1],
52 false,
53 );
54 hardware.write_value(&msg).await?;
55 Ok(Arc::new(LoveDistance::default()))
56 }
57}
58
59#[derive(Default)]
60pub struct LoveDistance {}
61
62impl ProtocolHandler for LoveDistance {
63 fn handle_output_vibrate_cmd(
64 &self,
65 _feature_index: u32,
66 feature_id: Uuid,
67 speed: u32,
68 ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
69 Ok(vec![
70 HardwareWriteCmd::new(
71 &[feature_id],
72 Endpoint::Tx,
73 vec![0xf3, 0x00, speed as u8],
74 false,
75 )
76 .into(),
77 ])
78 }
79}