mod battery_level_cmd;
mod battery_level_reading;
mod device_added;
mod device_list;
mod device_message_info;
mod device_removed;
mod error;
mod fleshlight_launch_fw12_cmd;
mod kiiroo_cmd;
mod linear_cmd;
mod log;
mod log_level;
mod lovense_cmd;
mod message_attributes;
mod ok;
mod ping;
mod raw_read_cmd;
mod raw_reading;
mod raw_subscribe_cmd;
mod raw_unsubscribe_cmd;
mod raw_write_cmd;
mod request_device_list;
mod request_log;
mod request_server_info;
mod rotate_cmd;
mod rssi_level_cmd;
mod rssi_level_reading;
mod scanning_finished;
pub mod serializer;
mod server_info;
mod single_motor_vibrate_cmd;
mod start_scanning;
mod stop_all_devices;
mod stop_device_cmd;
mod stop_scanning;
mod test;
mod vibrate_cmd;
mod vorze_a10_cyclone_cmd;
pub use self::log::Log;
pub use battery_level_cmd::BatteryLevelCmd;
pub use battery_level_reading::BatteryLevelReading;
pub use device_added::{DeviceAdded, DeviceAddedV0, DeviceAddedV1};
pub use device_list::{DeviceList, DeviceListV0, DeviceListV1};
pub use device_message_info::{DeviceMessageInfo, MessageAttributesMap};
pub use device_removed::DeviceRemoved;
pub use error::{Error, ErrorCode};
pub use fleshlight_launch_fw12_cmd::FleshlightLaunchFW12Cmd;
pub use kiiroo_cmd::KiirooCmd;
pub use linear_cmd::{LinearCmd, VectorSubcommand};
pub use log_level::LogLevel;
pub use lovense_cmd::LovenseCmd;
pub use message_attributes::MessageAttributes;
pub use ok::Ok;
pub use ping::Ping;
pub use raw_read_cmd::RawReadCmd;
pub use raw_reading::RawReading;
pub use raw_subscribe_cmd::RawSubscribeCmd;
pub use raw_unsubscribe_cmd::RawUnsubscribeCmd;
pub use raw_write_cmd::RawWriteCmd;
pub use request_device_list::RequestDeviceList;
pub use request_log::RequestLog;
pub use request_server_info::RequestServerInfo;
pub use rotate_cmd::{RotateCmd, RotationSubcommand};
pub use rssi_level_cmd::RSSILevelCmd;
pub use rssi_level_reading::RSSILevelReading;
pub use scanning_finished::ScanningFinished;
pub use server_info::{ServerInfo, ServerInfoV0};
pub use single_motor_vibrate_cmd::SingleMotorVibrateCmd;
pub use start_scanning::StartScanning;
pub use stop_all_devices::StopAllDevices;
pub use stop_device_cmd::StopDeviceCmd;
pub use stop_scanning::StopScanning;
pub use test::Test;
pub use vibrate_cmd::{VibrateCmd, VibrateSubcommand};
pub use vorze_a10_cyclone_cmd::VorzeA10CycloneCmd;
use crate::core::errors::ButtplugMessageError;
use serde::{Deserialize, Serialize};
#[cfg(feature = "serialize-json")]
use serde_repr::{Deserialize_repr, Serialize_repr};
use std::cmp::Ordering;
use std::convert::TryFrom;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Display)]
#[repr(u32)]
#[cfg_attr(feature = "serialize-json", derive(Serialize_repr, Deserialize_repr))]
pub enum ButtplugMessageSpecVersion {
Version0 = 0,
Version1 = 1,
Version2 = 2,
}
pub const BUTTPLUG_SERVER_EVENT_ID: u32 = 0;
pub const BUTTPLUG_CURRENT_MESSAGE_SPEC_VERSION: ButtplugMessageSpecVersion =
ButtplugMessageSpecVersion::Version2;
pub trait ButtplugMessage: Send + Sync + Clone {
fn get_id(&self) -> u32;
fn set_id(&mut self, id: u32);
fn is_server_event(&self) -> bool {
self.get_id() == BUTTPLUG_SERVER_EVENT_ID
}
}
pub trait ButtplugClientMessageType: ButtplugMessage {}
pub trait ButtplugServerMessageType: ButtplugMessage {}
pub trait ButtplugDeviceMessage: ButtplugMessage {
fn get_device_index(&self) -> u32;
fn set_device_index(&mut self, id: u32);
}
#[derive(Copy, Debug, Clone, PartialEq, Eq, Hash, Display, Serialize, Deserialize)]
pub enum ButtplugDeviceMessageType {
VibrateCmd,
LinearCmd,
RotateCmd,
RawWriteCmd,
RawReadCmd,
StopDeviceCmd,
RawSubscribeCmd,
RawUnsubscribeCmd,
SingleMotorVibrateCmd,
FleshlightLaunchFW12Cmd,
LovenseCmd,
KiirooCmd,
VorzeA10CycloneCmd,
BatteryLevelCmd,
RSSILevelCmd,
}
impl PartialOrd for ButtplugDeviceMessageType {
fn partial_cmp(&self, other: &ButtplugDeviceMessageType) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for ButtplugDeviceMessageType {
fn cmp(&self, other: &ButtplugDeviceMessageType) -> Ordering {
self.to_string().cmp(&other.to_string())
}
}
#[derive(
Debug, Clone, PartialEq, ButtplugMessage, ButtplugClientMessageType, FromSpecificButtplugMessage,
)]
pub enum ButtplugClientMessage {
Ping(Ping),
RequestLog(RequestLog),
RequestServerInfo(RequestServerInfo),
StartScanning(StartScanning),
StopScanning(StopScanning),
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
VibrateCmd(VibrateCmd),
LinearCmd(LinearCmd),
RotateCmd(RotateCmd),
RawWriteCmd(RawWriteCmd),
RawReadCmd(RawReadCmd),
StopDeviceCmd(StopDeviceCmd),
RawSubscribeCmd(RawSubscribeCmd),
RawUnsubscribeCmd(RawUnsubscribeCmd),
BatteryLevelCmd(BatteryLevelCmd),
RSSILevelCmd(RSSILevelCmd),
SingleMotorVibrateCmd(SingleMotorVibrateCmd),
FleshlightLaunchFW12Cmd(FleshlightLaunchFW12Cmd),
LovenseCmd(LovenseCmd),
KiirooCmd(KiirooCmd),
VorzeA10CycloneCmd(VorzeA10CycloneCmd),
}
#[derive(
Debug, Clone, PartialEq, ButtplugMessage, ButtplugServerMessageType, FromSpecificButtplugMessage,
)]
pub enum ButtplugServerMessage {
Ok(Ok),
Error(Error),
Test(Test),
Log(Log),
ServerInfo(ServerInfo),
DeviceList(DeviceList),
DeviceAdded(DeviceAdded),
DeviceRemoved(DeviceRemoved),
ScanningFinished(ScanningFinished),
RawReading(RawReading),
BatteryLevelReading(BatteryLevelReading),
RSSILevelReading(RSSILevelReading),
}
pub type ButtplugCurrentSpecClientMessage = ButtplugSpecV2ClientMessage;
pub type ButtplugCurrentSpecServerMessage = ButtplugSpecV2ServerMessage;
#[derive(
Debug,
Clone,
PartialEq,
ButtplugMessage,
ButtplugClientMessageType,
FromSpecificButtplugMessage,
TryFromButtplugClientMessage,
)]
#[cfg_attr(feature = "serialize-json", derive(Serialize, Deserialize))]
pub enum ButtplugSpecV2ClientMessage {
RequestServerInfo(RequestServerInfo),
StartScanning(StartScanning),
StopScanning(StopScanning),
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
VibrateCmd(VibrateCmd),
LinearCmd(LinearCmd),
RotateCmd(RotateCmd),
RawWriteCmd(RawWriteCmd),
RawReadCmd(RawReadCmd),
StopDeviceCmd(StopDeviceCmd),
RawSubscribeCmd(RawSubscribeCmd),
RawUnsubscribeCmd(RawUnsubscribeCmd),
BatteryLevelCmd(BatteryLevelCmd),
RSSILevelCmd(RSSILevelCmd),
}
#[derive(
Debug,
Clone,
PartialEq,
ButtplugMessage,
ButtplugServerMessageType,
FromSpecificButtplugMessage,
TryFromButtplugServerMessage,
)]
#[cfg_attr(feature = "serialize-json", derive(Serialize, Deserialize))]
pub enum ButtplugSpecV2ServerMessage {
Ok(Ok),
Error(Error),
ServerInfo(ServerInfo),
DeviceList(DeviceList),
DeviceAdded(DeviceAdded),
DeviceRemoved(DeviceRemoved),
ScanningFinished(ScanningFinished),
RawReading(RawReading),
BatteryLevelReading(BatteryLevelReading),
RSSILevelReading(RSSILevelReading),
}
#[derive(
Debug, Clone, PartialEq, ButtplugMessage, ButtplugClientMessageType, TryFromButtplugClientMessage,
)]
#[cfg_attr(feature = "serialize-json", derive(Serialize, Deserialize))]
pub(crate) enum ButtplugSpecV1ClientMessage {
RequestServerInfo(RequestServerInfo),
StartScanning(StartScanning),
StopScanning(StopScanning),
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
VibrateCmd(VibrateCmd),
LinearCmd(LinearCmd),
RotateCmd(RotateCmd),
StopDeviceCmd(StopDeviceCmd),
SingleMotorVibrateCmd(SingleMotorVibrateCmd),
FleshlightLaunchFW12Cmd(FleshlightLaunchFW12Cmd),
LovenseCmd(LovenseCmd),
KiirooCmd(KiirooCmd),
VorzeA10CycloneCmd(VorzeA10CycloneCmd),
}
#[derive(Debug, Clone, PartialEq, ButtplugMessage, ButtplugServerMessageType)]
#[cfg_attr(feature = "serialize-json", derive(Serialize, Deserialize))]
pub(crate) enum ButtplugSpecV1ServerMessage {
Ok(Ok),
Error(Error),
Log(Log),
ServerInfo(ServerInfoV0),
DeviceList(DeviceListV1),
DeviceAdded(DeviceAddedV1),
DeviceRemoved(DeviceRemoved),
ScanningFinished(ScanningFinished),
}
impl TryFrom<ButtplugServerMessage> for ButtplugSpecV1ServerMessage {
type Error = ButtplugMessageError;
fn try_from(msg: ButtplugServerMessage) -> Result<Self, ButtplugMessageError> {
match msg {
ButtplugServerMessage::Ok(msg) => Ok(ButtplugSpecV1ServerMessage::Ok(msg)),
ButtplugServerMessage::Error(msg) => Ok(ButtplugSpecV1ServerMessage::Error(msg)),
ButtplugServerMessage::Log(msg) => Ok(ButtplugSpecV1ServerMessage::Log(msg)),
ButtplugServerMessage::ServerInfo(msg) => {
Ok(ButtplugSpecV1ServerMessage::ServerInfo(msg.into()))
}
ButtplugServerMessage::DeviceList(msg) => {
Ok(ButtplugSpecV1ServerMessage::DeviceList(msg.into()))
}
ButtplugServerMessage::DeviceAdded(msg) => {
Ok(ButtplugSpecV1ServerMessage::DeviceAdded(msg.into()))
}
ButtplugServerMessage::DeviceRemoved(msg) => {
Ok(ButtplugSpecV1ServerMessage::DeviceRemoved(msg))
}
ButtplugServerMessage::ScanningFinished(msg) => {
Ok(ButtplugSpecV1ServerMessage::ScanningFinished(msg))
}
_ => Err(ButtplugMessageError::VersionError(
"ButtplugServerMessage",
format!("{:?}", msg),
"ButtplugSpecV1ServerMessage",
)),
}
}
}
#[derive(
Debug, Clone, PartialEq, ButtplugMessage, ButtplugClientMessageType, TryFromButtplugClientMessage,
)]
#[cfg_attr(feature = "serialize-json", derive(Serialize, Deserialize))]
pub(crate) enum ButtplugSpecV0ClientMessage {
RequestLog(RequestLog),
RequestServerInfo(RequestServerInfo),
StartScanning(StartScanning),
StopScanning(StopScanning),
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
StopDeviceCmd(StopDeviceCmd),
SingleMotorVibrateCmd(SingleMotorVibrateCmd),
FleshlightLaunchFW12Cmd(FleshlightLaunchFW12Cmd),
LovenseCmd(LovenseCmd),
KiirooCmd(KiirooCmd),
VorzeA10CycloneCmd(VorzeA10CycloneCmd),
}
#[derive(Debug, Clone, PartialEq, ButtplugMessage, ButtplugServerMessageType)]
#[cfg_attr(feature = "serialize-json", derive(Serialize, Deserialize))]
pub(crate) enum ButtplugSpecV0ServerMessage {
Ok(Ok),
Error(Error),
Log(Log),
ServerInfo(ServerInfoV0),
DeviceList(DeviceListV0),
DeviceAdded(DeviceAddedV0),
DeviceRemoved(DeviceRemoved),
ScanningFinished(ScanningFinished),
}
impl TryFrom<ButtplugServerMessage> for ButtplugSpecV0ServerMessage {
type Error = ButtplugMessageError;
fn try_from(msg: ButtplugServerMessage) -> Result<Self, ButtplugMessageError> {
match msg {
ButtplugServerMessage::Ok(msg) => Ok(ButtplugSpecV0ServerMessage::Ok(msg)),
ButtplugServerMessage::Error(msg) => Ok(ButtplugSpecV0ServerMessage::Error(msg)),
ButtplugServerMessage::Log(msg) => Ok(ButtplugSpecV0ServerMessage::Log(msg)),
ButtplugServerMessage::ServerInfo(msg) => {
Ok(ButtplugSpecV0ServerMessage::ServerInfo(msg.into()))
}
ButtplugServerMessage::DeviceList(msg) => {
Ok(ButtplugSpecV0ServerMessage::DeviceList(msg.into()))
}
ButtplugServerMessage::DeviceAdded(msg) => {
Ok(ButtplugSpecV0ServerMessage::DeviceAdded(msg.into()))
}
ButtplugServerMessage::DeviceRemoved(msg) => {
Ok(ButtplugSpecV0ServerMessage::DeviceRemoved(msg))
}
ButtplugServerMessage::ScanningFinished(msg) => {
Ok(ButtplugSpecV0ServerMessage::ScanningFinished(msg))
}
_ => Err(ButtplugMessageError::VersionError(
"ButtplugServerMessage",
format!("{:?}", msg),
"ButtplugSpecV0ServerMessage",
)),
}
}
}
#[derive(
Debug,
Clone,
PartialEq,
ButtplugMessage,
ButtplugClientMessageType,
FromSpecificButtplugMessage,
TryFromButtplugClientMessage,
)]
pub enum ButtplugDeviceManagerMessageUnion {
RequestDeviceList(RequestDeviceList),
StopAllDevices(StopAllDevices),
StartScanning(StartScanning),
StopScanning(StopScanning),
}
#[derive(
Debug,
Clone,
PartialEq,
ButtplugDeviceMessage,
ButtplugClientMessageType,
FromSpecificButtplugMessage,
TryFromButtplugClientMessage,
)]
pub enum ButtplugDeviceCommandMessageUnion {
FleshlightLaunchFW12Cmd(FleshlightLaunchFW12Cmd),
SingleMotorVibrateCmd(SingleMotorVibrateCmd),
VorzeA10CycloneCmd(VorzeA10CycloneCmd),
KiirooCmd(KiirooCmd),
VibrateCmd(VibrateCmd),
LinearCmd(LinearCmd),
RotateCmd(RotateCmd),
RawWriteCmd(RawWriteCmd),
RawReadCmd(RawReadCmd),
StopDeviceCmd(StopDeviceCmd),
RawSubscribeCmd(RawSubscribeCmd),
RawUnsubscribeCmd(RawUnsubscribeCmd),
BatteryLevelCmd(BatteryLevelCmd),
RSSILevelCmd(RSSILevelCmd),
}