Buttplug sex toy control library
at dev 88 lines 2.3 kB view raw
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}