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 buttplug_core::errors::ButtplugDeviceError;
9use buttplug_server_device_config::Endpoint;
10use buttplug_server_device_config::{ServerDeviceDefinition, UserDeviceIdentifier};
11
12use crate::device::{
13 hardware::{Hardware, HardwareCommand, HardwareWriteCmd},
14 protocol::{
15 ProtocolHandler,
16 ProtocolIdentifier,
17 ProtocolInitializer,
18 generic_protocol_initializer_setup,
19 },
20};
21use async_trait::async_trait;
22use buttplug_server_device_config::ProtocolCommunicationSpecifier;
23use std::sync::Arc;
24use uuid::{Uuid, uuid};
25
26const AMORELIE_JOY_PROTOCOL_UUID: Uuid = uuid!("0968017b-96f8-44ae-b113-39080dd7ed5f");
27
28generic_protocol_initializer_setup!(AmorelieJoy, "amorelie-joy");
29
30#[derive(Default)]
31pub struct AmorelieJoyInitializer {}
32
33#[async_trait]
34impl ProtocolInitializer for AmorelieJoyInitializer {
35 async fn initialize(
36 &mut self,
37 hardware: Arc<Hardware>,
38 _: &ServerDeviceDefinition,
39 ) -> Result<Arc<dyn ProtocolHandler>, ButtplugDeviceError> {
40 hardware
41 .write_value(&HardwareWriteCmd::new(
42 &[AMORELIE_JOY_PROTOCOL_UUID],
43 Endpoint::Tx,
44 vec![0x03],
45 false,
46 ))
47 .await?;
48 Ok(Arc::new(AmorelieJoy::default()))
49 }
50}
51
52#[derive(Default)]
53pub struct AmorelieJoy {}
54
55impl ProtocolHandler for AmorelieJoy {
56 fn handle_output_vibrate_cmd(
57 &self,
58 _feature_index: u32,
59 feature_id: Uuid,
60 speed: u32,
61 ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
62 Ok(vec![
63 HardwareWriteCmd::new(
64 &[feature_id],
65 Endpoint::Tx,
66 [
67 0x01, // static header
68 0x01, // pattern (1 = steady),
69 speed as u8, // speed 0-100
70 ]
71 .to_vec(),
72 false,
73 )
74 .into(),
75 ])
76 }
77}