use std::sync::Arc;
use num_enum::{FromPrimitive, IntoPrimitive};
use crate::{
channel::HidppChannel,
feature::{CreatableFeature, DecodeEvent, EmittingFeature, EventSource, Feature},
};
pub struct WirelessDeviceStatusFeature {
events: EventSource<WirelessDeviceStatusEvent>,
}
impl CreatableFeature for WirelessDeviceStatusFeature {
const ID: u16 = 0x1d4b;
const STARTING_VERSION: u8 = 0;
fn new(chan: Arc<HidppChannel>, device_index: u8, feature_index: u8) -> Self {
Self {
events: EventSource::attach(&chan, device_index, feature_index),
}
}
}
impl Feature for WirelessDeviceStatusFeature {}
impl EmittingFeature<WirelessDeviceStatusEvent> for WirelessDeviceStatusFeature {
fn listen(&self) -> async_channel::Receiver<WirelessDeviceStatusEvent> {
self.events.listen()
}
}
impl DecodeEvent for WirelessDeviceStatusEvent {
fn decode(sub_id: u8, payload: &[u8; 16]) -> Option<Self> {
if sub_id != 0 {
return None;
}
Some(WirelessDeviceStatusEvent::StatusBroadcast(
WirelessDeviceStatusBroadcast {
status: WirelessDeviceStatus::from(payload[0]),
request: WirelessDeviceStatusRequest::from(payload[1]),
reason: WirelessDeviceStatusReason::from(payload[2]),
},
))
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[non_exhaustive]
pub enum WirelessDeviceStatusEvent {
StatusBroadcast(WirelessDeviceStatusBroadcast),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[non_exhaustive]
pub struct WirelessDeviceStatusBroadcast {
pub status: WirelessDeviceStatus,
pub request: WirelessDeviceStatusRequest,
pub reason: WirelessDeviceStatusReason,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IntoPrimitive, FromPrimitive)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[non_exhaustive]
#[repr(u8)]
pub enum WirelessDeviceStatus {
Unknown = 0x00,
Reconnection = 0x01,
#[num_enum(catch_all)]
Other(u8),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IntoPrimitive, FromPrimitive)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[non_exhaustive]
#[repr(u8)]
pub enum WirelessDeviceStatusRequest {
NoRequest = 0x00,
SoftwareReconfigurationNeeded = 0x01,
#[num_enum(catch_all)]
Other(u8),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IntoPrimitive, FromPrimitive)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
#[non_exhaustive]
#[repr(u8)]
pub enum WirelessDeviceStatusReason {
Unknown = 0x00,
PowerSwitchActivated = 0x01,
#[num_enum(catch_all)]
Other(u8),
}