Buttplug sex toy control library
1// Buttplug Rust Source Code File - See https://buttplug.io for more info.
2//
3// Copyright 2016-2023 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;
27
28generic_protocol_initializer_setup!(Foreo, "foreo");
29
30#[derive(Default)]
31pub struct ForeoInitializer {}
32
33#[async_trait]
34impl ProtocolInitializer for ForeoInitializer {
35 async fn initialize(
36 &mut self,
37 hardware: Arc<Hardware>,
38 _: &ServerDeviceDefinition,
39 ) -> Result<Arc<dyn ProtocolHandler>, ButtplugDeviceError> {
40 let lname = hardware.name().to_lowercase();
41 let mut ph = Foreo::default();
42 ph.mode = 0;
43
44 if lname.contains("smart") && lname.contains("2") {
45 ph.mode = 3;
46 } else if lname.contains("fofo") || lname.contains("ufo") {
47 ph.mode = 1;
48 }
49
50 Ok(Arc::new(ph))
51 }
52}
53
54#[derive(Default)]
55pub struct Foreo {
56 mode: u8,
57}
58
59impl ProtocolHandler for Foreo {
60 fn handle_output_vibrate_cmd(
61 &self,
62 _feature_index: u32,
63 feature_id: Uuid,
64 speed: u32,
65 ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
66 Ok(vec![
67 HardwareWriteCmd::new(
68 &[feature_id],
69 Endpoint::Tx,
70 vec![0x01, self.mode, speed as u8],
71 true,
72 )
73 .into(),
74 ])
75 }
76}