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}