buttplug/server/device/protocol/
lioness.rs1use crate::server::device::configuration::ProtocolCommunicationSpecifier;
9use crate::{
10 core::{errors::ButtplugDeviceError, message::Endpoint},
11 server::device::{
12 configuration::{UserDeviceDefinition, UserDeviceIdentifier},
13 hardware::{Hardware, HardwareCommand, HardwareSubscribeCmd, HardwareWriteCmd},
14 protocol::{
15 generic_protocol_initializer_setup,
16 ProtocolHandler,
17 ProtocolIdentifier,
18 ProtocolInitializer,
19 },
20 },
21};
22use async_trait::async_trait;
23use std::sync::Arc;
24
25generic_protocol_initializer_setup!(Lioness, "lioness");
26
27#[derive(Default)]
28pub struct LionessInitializer {}
29
30#[async_trait]
31impl ProtocolInitializer for LionessInitializer {
32 async fn initialize(
33 &mut self,
34 hardware: Arc<Hardware>,
35 _: &UserDeviceDefinition,
36 ) -> Result<Arc<dyn ProtocolHandler>, ButtplugDeviceError> {
37 hardware
38 .subscribe(&HardwareSubscribeCmd::new(Endpoint::Rx))
39 .await?;
40
41 let res = hardware
42 .write_value(&HardwareWriteCmd::new(
43 Endpoint::Tx,
44 vec![0x01, 0xAA, 0xAA, 0xBB, 0xCC, 0x10],
45 true,
46 ))
47 .await;
48
49 if res.is_err() {
50 return Err(ButtplugDeviceError::DeviceCommunicationError(
51 "Lioness may need pairing with OS. Use PIN 6496 or 006496 when pairing.".to_string(),
52 ));
53 }
54 Ok(Arc::new(Lioness::default()))
55 }
56}
57
58#[derive(Default)]
59pub struct Lioness {}
60
61impl ProtocolHandler for Lioness {
62 fn keepalive_strategy(&self) -> super::ProtocolKeepaliveStrategy {
63 super::ProtocolKeepaliveStrategy::RepeatLastPacketStrategy
64 }
65
66 fn handle_scalar_vibrate_cmd(
67 &self,
68 _index: u32,
69 scalar: u32,
70 ) -> Result<Vec<HardwareCommand>, ButtplugDeviceError> {
71 Ok(vec![HardwareWriteCmd::new(
72 Endpoint::Tx,
73 vec![0x02, 0xAA, 0xBB, 0xCC, 0xCC, scalar as u8],
74 false,
75 )
76 .into()])
77 }
78}