RKTK API Docs RKTK Home Repo

rktk/
dongle_task.rs

1use rktk_log::helper::Debug2Format;
2
3use crate::{
4    drivers::interface::{
5        display::DisplayDriver,
6        dongle::{DongleData, DongleDriver as _, DongleDriverBuilder},
7        reporter::ReporterDriver as _,
8        usb::UsbReporterDriverBuilder,
9    },
10    hooks::interface::dongle::DongleHooks,
11    task::display,
12    utils::sjoin,
13};
14
15/// Runs dongle with the given drivers.
16pub async fn start_dongle<D: display::DisplayConfig + 'static>(
17    #[allow(
18        unused_variables,
19        reason = "`spawner` is unused when `alloc` is disabled"
20    )]
21    spawner: embassy_executor::Spawner,
22    usb: impl UsbReporterDriverBuilder,
23    dongle: impl DongleDriverBuilder,
24    mut hooks: impl DongleHooks,
25    display: Option<impl DisplayDriver>,
26    mut display_config: impl display::DisplayConfig + 'static,
27) {
28    let (usb, usb_task) = usb.build().await.unwrap();
29    let (mut dongle, dongle_task) = dongle.build().await.unwrap();
30
31    sjoin::join!(
32        spawner,
33        async move {
34            loop {
35                let data = dongle.recv().await;
36                match data {
37                    Ok(mut data) => {
38                        if !hooks.on_dongle_data(&mut data).await {
39                            continue;
40                        }
41                        match data {
42                            DongleData::Keyboard(report) => {
43                                if let Err(e) = usb.try_send_keyboard_report(report.into()) {
44                                    rktk_log::warn!(
45                                        "Failed to send keyboard report: {:?}",
46                                        Debug2Format(&e)
47                                    );
48                                }
49                            }
50                            DongleData::Mouse(report) => {
51                                if let Err(e) = usb.try_send_mouse_report(report.into()) {
52                                    rktk_log::warn!(
53                                        "Failed to send mouse report: {:?}",
54                                        Debug2Format(&e)
55                                    );
56                                }
57                            }
58                            DongleData::MediaKeyboard(report) => {
59                                if let Err(e) = usb.try_send_media_keyboard_report(report.into()) {
60                                    rktk_log::warn!(
61                                        "Failed to send media keyboard report: {:?}",
62                                        Debug2Format(&e)
63                                    );
64                                }
65                            }
66                        }
67                    }
68                    Err(e) => {
69                        rktk_log::warn!("Dongle recv fail: {:?}", Debug2Format(&e));
70                        embassy_time::Timer::after_millis(100).await;
71                        continue;
72                    }
73                }
74            }
75        },
76        usb_task,
77        dongle_task,
78        async move {
79            if let Some(mut display) = display {
80                display::start(&mut display, &mut display_config).await;
81            }
82        }
83    );
84}