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
15pub 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}