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::{ProtocolHandler, ProtocolIdentifier, ProtocolInitializer},
11};
12use async_trait::async_trait;
13use buttplug_core::errors::ButtplugDeviceError;
14use buttplug_server_device_config::Endpoint;
15use buttplug_server_device_config::{
16 ProtocolCommunicationSpecifier,
17 ServerDeviceDefinition,
18 UserDeviceIdentifier,
19};
20use std::sync::Arc;
21use uuid::Uuid;
22
23pub mod setup {
24 use crate::device::protocol::{ProtocolIdentifier, ProtocolIdentifierFactory};
25 #[derive(Default)]
26 pub struct PrettyLoveIdentifierFactory {}
27
28 impl ProtocolIdentifierFactory for PrettyLoveIdentifierFactory {
29 fn identifier(&self) -> &str {
30 "prettylove"
31 }
32
33 fn create(&self) -> Box<dyn ProtocolIdentifier> {
34 Box::new(super::PrettyLoveIdentifier::default())
35 }
36 }
37}
38
39#[derive(Default)]
40pub struct PrettyLoveIdentifier {}
41
42#[async_trait]
43impl ProtocolIdentifier for PrettyLoveIdentifier {
44 async fn identify(
45 &mut self,
46 hardware: Arc<Hardware>,
47 _: ProtocolCommunicationSpecifier,
48 ) -> Result<(UserDeviceIdentifier, Box<dyn ProtocolInitializer>), ButtplugDeviceError> {
49 Ok((
50 UserDeviceIdentifier::new(
51 hardware.address(),
52 "prettylove",
53 &Some("Aogu BLE".to_owned()),
54 ),
55 Box::new(PrettyLoveInitializer::default()),
56 ))
57 }
58}
59
60#[derive(Default)]
61pub struct PrettyLoveInitializer {}
62
63#[async_trait]
64impl ProtocolInitializer for PrettyLoveInitializer {
65 async fn initialize(
66 &mut self,
67 _: Arc<Hardware>,
68 _: &ServerDeviceDefinition,
69 ) -> Result<Arc<dyn ProtocolHandler>, ButtplugDeviceError> {
70 Ok(Arc::new(PrettyLove::default()))
71 }
72}
73
74#[derive(Default)]
75pub struct PrettyLove {}
76
77impl ProtocolHandler for PrettyLove {
78 fn handle_output_vibrate_cmd(
79 &self,
80 _feature_index: u32,
81 feature_id: Uuid,
82 speed: u32,
83 ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
84 Ok(vec![
85 HardwareWriteCmd::new(&[feature_id], Endpoint::Tx, vec![0x00u8, speed as u8], true).into(),
86 ])
87 }
88}