RKTK API Docs RKTK Home Repo

rktk_drivers_nrf/softdevice/ble/
mod.rs

1use 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
27// Channel for input (device to host) report
28static INPUT_REPORT_CHAN: Channel<InputReport, 8> = Channel::new();
29// Channel for keyboard output report (only leds field)
30static 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}