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