buttplug/server/device/protocol/
lioness.rs

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::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}