hidpp/receiver/
unifying.rs1use std::sync::Arc;
7
8use num_enum::{IntoPrimitive, TryFromPrimitive};
9
10use crate::{
11 channel::HidppChannel,
12 receiver::{RECEIVER_DEVICE_INDEX, ReceiverError},
13};
14
15pub const VPID_PAIRS: &[(u16, u16)] = &[(0x046d, 0xc52b), (0x046d, 0xc532)];
18
19#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IntoPrimitive, TryFromPrimitive)]
24#[cfg_attr(feature = "serde", derive(serde::Serialize))]
25#[non_exhaustive]
26#[repr(u8)]
27pub enum Register {
28 ReceiverInfo = 0xb5,
32}
33
34#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IntoPrimitive, TryFromPrimitive)]
37#[cfg_attr(feature = "serde", derive(serde::Serialize))]
38#[non_exhaustive]
39#[repr(u8)]
40pub enum InfoSubRegister {
41 ReceiverInfo = 0x03,
43}
44
45#[derive(Clone)]
47pub struct Receiver {
48 chan: Arc<HidppChannel>,
50}
51
52impl Receiver {
53 pub fn new(chan: Arc<HidppChannel>) -> Result<Self, ReceiverError> {
59 if !VPID_PAIRS.contains(&(chan.vendor_id, chan.product_id)) {
60 return Err(ReceiverError::UnknownReceiver);
61 }
62
63 Ok(Receiver { chan })
64 }
65
66 pub async fn get_receiver_info(&self) -> Result<ReceiverInfo, ReceiverError> {
68 let response = self
69 .chan
70 .read_long_register(
71 RECEIVER_DEVICE_INDEX,
72 Register::ReceiverInfo.into(),
73 [InfoSubRegister::ReceiverInfo.into(), 0, 0],
74 )
75 .await?;
76
77 Ok(ReceiverInfo {
78 serial_number: hex::encode_upper(&response[1..=4]),
79 pairing_slots: response[6],
80 })
81 }
82}
83
84#[derive(Clone, PartialEq, Eq, Hash, Debug)]
86#[cfg_attr(feature = "serde", derive(serde::Serialize))]
87#[non_exhaustive]
88pub struct ReceiverInfo {
89 pub serial_number: String,
90 pub pairing_slots: u8,
91}