rktk_drivers_common/trouble/reporter/
mod.rs1use driver::TroubleReporter;
2use rktk::{drivers::interface::wireless::WirelessReporterDriverBuilder, utils::Channel};
3use trouble_host::{Controller, gap::PeripheralConfig};
4
5mod driver;
6mod server;
7mod task;
8
9enum Report {
10 Keyboard(usbd_hid::descriptor::KeyboardReport),
11 MediaKeyboard(usbd_hid::descriptor::MediaKeyboardReport),
12 Mouse(usbd_hid::descriptor::MouseReport),
13}
14
15static OUTPUT_CHANNEL: Channel<Report, 4> = Channel::new();
16
17pub struct TroubleReporterConfig {
18 pub advertise_name: &'static str,
19 pub peripheral_config: Option<PeripheralConfig<'static>>,
20}
21
22pub struct TroubleReporterBuilder<
23 C: Controller + 'static,
24 const CONNECTIONS_MAX: usize,
25 const L2CAP_CHANNELS_MAX: usize,
26 const L2CAP_MTU: usize,
27> {
28 controller: C,
29 config: TroubleReporterConfig,
30}
31
32impl<
33 C: Controller + 'static,
34 const CONNECTIONS_MAX: usize,
35 const L2CAP_CHANNELS_MAX: usize,
36 const L2CAP_MTU: usize,
37> TroubleReporterBuilder<C, CONNECTIONS_MAX, L2CAP_CHANNELS_MAX, L2CAP_MTU>
38{
39 pub fn new(controller: C, config: TroubleReporterConfig) -> Self {
40 Self { controller, config }
41 }
42}
43
44impl<
45 C: Controller + 'static,
46 const CONNECTIONS_MAX: usize,
47 const L2CAP_CHANNELS_MAX: usize,
48 const L2CAP_MTU: usize,
49> WirelessReporterDriverBuilder
50 for TroubleReporterBuilder<C, CONNECTIONS_MAX, L2CAP_CHANNELS_MAX, L2CAP_MTU>
51{
52 type Output = TroubleReporter;
53
54 type Error = ();
55
56 async fn build(
57 self,
58 ) -> Result<(Self::Output, impl Future<Output = ()> + 'static), Self::Error> {
59 Ok((
60 TroubleReporter { output_tx: OUTPUT_CHANNEL.sender() },
61 task::run::<_, CONNECTIONS_MAX, L2CAP_CHANNELS_MAX, L2CAP_MTU>(
62 self.controller,
63 OUTPUT_CHANNEL.receiver(),
64 self.config,
65 ),
66 ))
67 }
68}