Skip to main content
RKTK API Docs RKTK Home Repo

rktk/drivers/
dummy.rs

1//! Utilities to geenrate type annotated `None` value of driver.
2
3use core::convert::Infallible;
4
5use embedded_graphics::{
6    Pixel,
7    pixelcolor::BinaryColor,
8    prelude::{Dimensions, DrawTarget},
9};
10use kmsm::interface::state::input_event::{EncoderDirection, KeyChangeEvent};
11
12use crate::drivers::interface::{
13    debounce::DebounceDriver,
14    display::DisplayDriver,
15    encoder::EncoderDriver,
16    mouse::MouseDriver,
17    reporter::ReporterDriver,
18    rgb::RgbDriver,
19    split::SplitDriver,
20    storage::StorageDriver,
21    usb::{UsbReporterDriver, UsbReporterDriverBuilder},
22    wireless::{WirelessReporterDriver, WirelessReporterDriverBuilder},
23};
24
25pub fn rgb() -> Option<impl RgbDriver> {
26    pub enum Rgb {}
27    impl RgbDriver for Rgb {
28        type Error = Infallible;
29
30        async fn write<I: IntoIterator<Item = blinksy::color::LedRgb<u8>>>(
31            &mut self,
32            _pixels: I,
33        ) -> Result<(), Self::Error> {
34            unreachable!()
35        }
36    }
37
38    Option::<Rgb>::None
39}
40
41// Debounce
42pub fn debounce() -> Option<impl DebounceDriver> {
43    pub enum Debounce {}
44    impl DebounceDriver for Debounce {
45        fn should_ignore_event(&mut self, _: &KeyChangeEvent, _: embassy_time::Instant) -> bool {
46            unreachable!()
47        }
48    }
49
50    Option::<Debounce>::None
51}
52
53// Display
54pub fn display() -> Option<impl DisplayDriver<Color = BinaryColor>> {
55    pub enum Display {}
56    impl Dimensions for Display {
57        fn bounding_box(&self) -> embedded_graphics::primitives::Rectangle {
58            unreachable!()
59        }
60    }
61    impl DrawTarget for Display {
62        type Color = BinaryColor;
63
64        type Error = ();
65
66        fn draw_iter<I>(&mut self, _pixels: I) -> Result<(), Self::Error>
67        where
68            I: IntoIterator<Item = Pixel<Self::Color>>,
69        {
70            unreachable!()
71        }
72    }
73    impl DisplayDriver for Display {
74        type Color = BinaryColor;
75        type Display = Self;
76
77        fn draw_target(&mut self) -> &mut Self::Display {
78            self
79        }
80
81        async fn clear(&mut self) -> Result<(), display_interface::DisplayError> {
82            Ok(())
83        }
84    }
85
86    Option::<Display>::None
87}
88
89// encoder
90pub fn encoder() -> Option<impl EncoderDriver> {
91    pub enum Encoder {}
92    impl EncoderDriver for Encoder {
93        async fn read_wait(&mut self) -> (u8, EncoderDirection) {
94            unreachable!()
95        }
96    }
97
98    Option::<Encoder>::None
99}
100
101// mouse
102pub fn mouse() -> Option<impl MouseDriver> {
103    pub enum Mouse {}
104    impl MouseDriver for Mouse {
105        type Error = Infallible;
106
107        async fn read(&mut self) -> Result<(i8, i8), Self::Error> {
108            unreachable!()
109        }
110
111        async fn set_cpi(&mut self, _cpi: u16) -> Result<(), Self::Error> {
112            unreachable!()
113        }
114
115        async fn get_cpi(&mut self) -> Result<u16, Self::Error> {
116            unreachable!()
117        }
118    }
119    Option::<Mouse>::None
120}
121
122// split
123pub fn split() -> Option<impl SplitDriver> {
124    pub enum Split {}
125    impl SplitDriver for Split {
126        type Error = Infallible;
127
128        async fn recv(&mut self, _buf: &mut [u8], _is_master: bool) -> Result<usize, Self::Error> {
129            unreachable!()
130        }
131        async fn send_all(&mut self, _buf: &[u8], _is_master: bool) -> Result<(), Self::Error> {
132            unreachable!()
133        }
134    }
135    Option::<Split>::None
136}
137
138// storage
139pub fn storage() -> Option<impl StorageDriver> {
140    pub enum Storage {}
141    impl StorageDriver for Storage {
142        type Error = Infallible;
143        async fn format(&self) -> Result<(), Self::Error> {
144            unreachable!()
145        }
146        async fn read<const N: usize>(
147            &self,
148            _key: u64,
149            _buf: &mut [u8],
150        ) -> Result<(), Self::Error> {
151            unreachable!()
152        }
153        async fn write<const N: usize>(&self, _key: u64, _buf: &[u8]) -> Result<(), Self::Error> {
154            unreachable!()
155        }
156    }
157
158    Option::<Storage>::None
159}
160
161// Reporter
162
163use usbd_hid::descriptor::*;
164pub enum DummyReporter {}
165impl ReporterDriver for DummyReporter {
166    type Error = core::convert::Infallible;
167
168    fn try_send_keyboard_report(&self, _report: KeyboardReport) -> Result<(), Self::Error> {
169        unreachable!()
170    }
171    fn try_send_media_keyboard_report(
172        &self,
173        _report: MediaKeyboardReport,
174    ) -> Result<(), Self::Error> {
175        unreachable!()
176    }
177    fn try_send_mouse_report(&self, _report: MouseReport) -> Result<(), Self::Error> {
178        unreachable!()
179    }
180    async fn send_rrp_data(&self, _data: &[u8]) -> Result<(), Self::Error> {
181        unreachable!()
182    }
183    fn wakeup(&self) -> Result<bool, Self::Error> {
184        unreachable!()
185    }
186}
187impl WirelessReporterDriver for DummyReporter {
188    type Error = Infallible;
189    async fn clear_bond_data(&self) -> Result<(), <Self as WirelessReporterDriver>::Error> {
190        unreachable!()
191    }
192}
193impl UsbReporterDriver for DummyReporter {
194    type Error = Infallible;
195
196    async fn vbus_detect(&self) {
197        unreachable!()
198    }
199}
200
201// BLE
202pub fn ble_builder() -> Option<impl WirelessReporterDriverBuilder> {
203    pub enum BleBuilder {}
204    impl WirelessReporterDriverBuilder for BleBuilder {
205        type Output = DummyReporter;
206        type Error = Infallible;
207        #[allow(refining_impl_trait)]
208        async fn build(self) -> Result<(Self::Output, futures::future::Pending<()>), Self::Error> {
209            unreachable!()
210        }
211    }
212
213    Option::<BleBuilder>::None
214}
215
216// usb
217pub fn usb_builder() -> Option<impl UsbReporterDriverBuilder> {
218    pub enum UsbBuilder {}
219    impl UsbReporterDriverBuilder for UsbBuilder {
220        type Output = DummyReporter;
221        type Error = ();
222
223        #[allow(refining_impl_trait)]
224        async fn build(self) -> Result<(Self::Output, futures::future::Pending<()>), Self::Error> {
225            unreachable!()
226        }
227    }
228
229    Option::<UsbBuilder>::None
230}