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, util::sleep};
19use buttplug_server_device_config::{
20 Endpoint,
21 ProtocolCommunicationSpecifier,
22 ServerDeviceDefinition,
23 UserDeviceIdentifier,
24};
25use std::{sync::Arc, time::Duration};
26use uuid::{Uuid, uuid};
27
28generic_protocol_initializer_setup!(CowgirlCone, "cowgirl-cone");
29
30const COWGIRL_CONE_PROTOCOL_UUID: Uuid = uuid!("3054b443-eca7-41a6-8ba1-b93a646636a4");
31
32#[derive(Default)]
33pub struct CowgirlConeInitializer {}
34
35#[async_trait]
36impl ProtocolInitializer for CowgirlConeInitializer {
37 async fn initialize(
38 &mut self,
39 hardware: Arc<Hardware>,
40 _: &ServerDeviceDefinition,
41 ) -> Result<Arc<dyn ProtocolHandler>, ButtplugDeviceError> {
42 hardware
43 .write_value(&HardwareWriteCmd::new(
44 &[COWGIRL_CONE_PROTOCOL_UUID],
45 Endpoint::Tx,
46 vec![0xaa, 0x56, 0x00, 0x00],
47 false,
48 ))
49 .await?;
50 sleep(Duration::from_millis(3000)).await;
51 Ok(Arc::new(CowgirlCone::default()))
52 }
53}
54
55#[derive(Default)]
56pub struct CowgirlCone {}
57
58impl ProtocolHandler for CowgirlCone {
59 fn handle_output_vibrate_cmd(
60 &self,
61 _feature_index: u32,
62 feature_id: Uuid,
63 speed: u32,
64 ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
65 Ok(vec![
66 HardwareWriteCmd::new(
67 &[feature_id],
68 Endpoint::Tx,
69 vec![0xf1, 0x01, speed as u8, 0x00],
70 false,
71 )
72 .into(),
73 ])
74 }
75}