Buttplug sex toy control library
at dev 2.0 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::{ 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, uuid}; 27 28const LOVEDISTANCE_PROTOCOL_UUID: Uuid = uuid!("a5f50cd5-7985-438c-a5bc-f8ff72bc0117"); 29generic_protocol_initializer_setup!(LoveDistance, "lovedistance"); 30 31#[derive(Default)] 32pub struct LoveDistanceInitializer {} 33 34#[async_trait] 35impl ProtocolInitializer for LoveDistanceInitializer { 36 async fn initialize( 37 &mut self, 38 hardware: Arc<Hardware>, 39 _: &ServerDeviceDefinition, 40 ) -> Result<Arc<dyn ProtocolHandler>, ButtplugDeviceError> { 41 let msg = HardwareWriteCmd::new( 42 &[LOVEDISTANCE_PROTOCOL_UUID], 43 Endpoint::Tx, 44 vec![0xf3, 0, 0], 45 false, 46 ); 47 hardware.write_value(&msg).await?; 48 let msg = HardwareWriteCmd::new( 49 &[LOVEDISTANCE_PROTOCOL_UUID], 50 Endpoint::Tx, 51 vec![0xf4, 1], 52 false, 53 ); 54 hardware.write_value(&msg).await?; 55 Ok(Arc::new(LoveDistance::default())) 56 } 57} 58 59#[derive(Default)] 60pub struct LoveDistance {} 61 62impl ProtocolHandler for LoveDistance { 63 fn handle_output_vibrate_cmd( 64 &self, 65 _feature_index: u32, 66 feature_id: Uuid, 67 speed: u32, 68 ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> { 69 Ok(vec![ 70 HardwareWriteCmd::new( 71 &[feature_id], 72 Endpoint::Tx, 73 vec![0xf3, 0x00, speed as u8], 74 false, 75 ) 76 .into(), 77 ]) 78 } 79}