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}
46
47impl SoftdeviceBleReporterBuilder {
48 pub fn new(
49 sd: &'static Softdevice,
50 server: Server,
51 name: &'static str,
52 flash: &'static SharedFlash,
53 ) -> Self {
54 Self {
55 sd,
56 server,
57 name,
58 flash,
59 }
60 }
61}
62
63impl WirelessReporterDriverBuilder for SoftdeviceBleReporterBuilder {
64 type Output = driver::SoftdeviceBleReporterDriver;
65
66 type Error = ();
67
68 async fn build(self) -> Result<(Self::Output, impl Future<Output = ()>), Self::Error> {
69 Ok((
70 driver::SoftdeviceBleReporterDriver {},
71 task::softdevice_task(self.sd, self.server, self.name, self.flash),
72 ))
73 }
74}