rktk_drivers_nrf/softdevice/ble/
mod.rs1use nrf_softdevice::{Softdevice, raw};
2
3use rktk::{
4 drivers::interface::wireless::WirelessReporterDriverBuilder,
5 utils::{Channel, Signal},
6};
7pub use server::Server;
8pub use services::device_information::DeviceInformation;
9use usbd_hid::descriptor::{KeyboardReport, MediaKeyboardReport, MouseReport};
10
11use super::flash::SharedFlash;
12
13mod bonder;
14mod constant;
15mod driver;
16mod server;
17mod services;
18mod task;
19
20#[derive(Debug)]
21pub enum InputReport {
22 Keyboard(KeyboardReport),
23 MediaKeyboard(MediaKeyboardReport),
24 Mouse(MouseReport),
25}
26
27static INPUT_REPORT_CHAN: Channel<InputReport, 8> = Channel::new();
29static KB_OUTPUT_LED_SIGNAL: Signal<u8> = Signal::new();
31
32pub fn init_ble_server(sd: &mut Softdevice, device_info: DeviceInformation) -> Server {
33 unsafe {
34 raw::sd_ble_gap_appearance_set(raw::BLE_APPEARANCE_HID_KEYBOARD as u16);
35 }
36
37 server::Server::new(sd, device_info).unwrap()
38}
39
40pub struct SoftdeviceBleReporterBuilder {
41 sd: &'static Softdevice,
42 server: Server,
43 name: &'static str,
44 flash: &'static SharedFlash,
45 spawner: embassy_executor::Spawner,
46}
47
48impl SoftdeviceBleReporterBuilder {
49 pub fn new(
50 spawner: embassy_executor::Spawner,
51 sd: &'static Softdevice,
52 server: Server,
53 name: &'static str,
54 flash: &'static SharedFlash,
55 ) -> Self {
56 Self {
57 sd,
58 server,
59 name,
60 flash,
61 spawner,
62 }
63 }
64}
65
66impl WirelessReporterDriverBuilder for SoftdeviceBleReporterBuilder {
67 type Output = driver::SoftdeviceBleReporterDriver;
68
69 type Error = ();
70
71 async fn build(self) -> Result<(Self::Output, impl Future<Output = ()>), Self::Error> {
72 Ok((
73 driver::SoftdeviceBleReporterDriver {},
74 task::softdevice_task(self.spawner, self.sd, self.server, self.name, self.flash),
75 ))
76 }
77}