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    usb: impl UsbReporterDriverBuilder,
18    dongle: impl DongleDriverBuilder,
19    mut hooks: impl DongleHooks,
20    display: Option<impl DisplayDriver>,
21    mut display_config: impl display::DisplayConfig + 'static,
22) {
23    let (usb, usb_task) = usb.build().await.unwrap();
24    let (mut dongle, dongle_task) = dongle.build().await.unwrap();
25
26    sjoin::join!(
27        async move {
28            loop {
29                let data = dongle.recv().await;
30                match data {
31                    Ok(mut data) => {
32                        if !hooks.on_dongle_data(&mut data).await {
33                            continue;
34                        }
35                        match data {
36                            DongleData::Keyboard(report) => {
37                                if let Err(e) = usb.try_send_keyboard_report(report.into()) {
38                                    rktk_log::warn!(
39                                        "Failed to send keyboard report: {:?}",
40                                        Debug2Format(&e)
41                                    );
42                                }
43                            }
44                            DongleData::Mouse(report) => {
45                                if let Err(e) = usb.try_send_mouse_report(report.into()) {
46                                    rktk_log::warn!(
47                                        "Failed to send mouse report: {:?}",
48                                        Debug2Format(&e)
49                                    );
50                                }
51                            }
52                            DongleData::MediaKeyboard(report) => {
53                                if let Err(e) = usb.try_send_media_keyboard_report(report.into()) {
54                                    rktk_log::warn!(
55                                        "Failed to send media keyboard report: {:?}",
56                                        Debug2Format(&e)
57                                    );
58                                }
59                            }
60                        }
61                    }
62                    Err(e) => {
63                        rktk_log::warn!("Dongle recv fail: {:?}", Debug2Format(&e));
64                        embassy_time::Timer::after_millis(100).await;
65                        continue;
66                    }
67                }
68            }
69        },
70        usb_task,
71        dongle_task,
72        async move {
73            if let Some(mut display) = display {
74                display::start(&mut display, &mut display_config).await;
75            }
76        }
77    );
78}