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 crate::softdevice::flash::SoftdeviceFlashPartition;
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: SoftdeviceFlashPartition,
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: SoftdeviceFlashPartition,
55 ) -> Self {
56 Self { sd, server, name, flash, spawner }
57 }
58}
59
60impl WirelessReporterDriverBuilder for SoftdeviceBleReporterBuilder {
61 type Output = driver::SoftdeviceBleReporterDriver;
62
63 type Error = ();
64
65 async fn build(self) -> Result<(Self::Output, impl Future<Output = ()>), Self::Error> {
66 Ok((
67 driver::SoftdeviceBleReporterDriver {},
68 task::softdevice_task(self.spawner, self.sd, self.server, self.name, self.flash),
69 ))
70 }
71}