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> {
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 AsMut<Self> for Display {
74        fn as_mut(&mut self) -> &mut Self {
75            self
76        }
77    }
78    impl AsRef<Self> for Display {
79        fn as_ref(&self) -> &Self {
80            self
81        }
82    }
83    impl DisplayDriver for Display {
84        type Display = Self;
85    }
86
87    Option::<Display>::None
88}
89
90// encoder
91pub fn encoder() -> Option<impl EncoderDriver> {
92    pub enum Encoder {}
93    impl EncoderDriver for Encoder {
94        async fn read_wait(&mut self) -> (u8, EncoderDirection) {
95            unreachable!()
96        }
97    }
98
99    Option::<Encoder>::None
100}
101
102// mouse
103pub fn mouse() -> Option<impl MouseDriver> {
104    pub enum Mouse {}
105    impl MouseDriver for Mouse {
106        type Error = Infallible;
107
108        async fn read(&mut self) -> Result<(i8, i8), Self::Error> {
109            unreachable!()
110        }
111
112        async fn set_cpi(&mut self, _cpi: u16) -> Result<(), Self::Error> {
113            unreachable!()
114        }
115
116        async fn get_cpi(&mut self) -> Result<u16, Self::Error> {
117            unreachable!()
118        }
119    }
120    Option::<Mouse>::None
121}
122
123// split
124pub fn split() -> Option<impl SplitDriver> {
125    pub enum Split {}
126    impl SplitDriver for Split {
127        type Error = Infallible;
128
129        async fn recv(&mut self, _buf: &mut [u8], _is_master: bool) -> Result<usize, Self::Error> {
130            unreachable!()
131        }
132        async fn send_all(&mut self, _buf: &[u8], _is_master: bool) -> Result<(), Self::Error> {
133            unreachable!()
134        }
135    }
136    Option::<Split>::None
137}
138
139// storage
140pub fn storage() -> Option<impl StorageDriver> {
141    pub enum Storage {}
142    impl StorageDriver for Storage {
143        type Error = Infallible;
144        async fn format(&self) -> Result<(), Self::Error> {
145            unreachable!()
146        }
147        async fn read<const N: usize>(
148            &self,
149            _key: u64,
150            _buf: &mut [u8],
151        ) -> Result<(), Self::Error> {
152            unreachable!()
153        }
154        async fn write<const N: usize>(&self, _key: u64, _buf: &[u8]) -> Result<(), Self::Error> {
155            unreachable!()
156        }
157    }
158
159    Option::<Storage>::None
160}
161
162// Reporter
163
164use usbd_hid::descriptor::*;
165pub enum DummyReporter {}
166impl ReporterDriver for DummyReporter {
167    type Error = core::convert::Infallible;
168
169    fn try_send_keyboard_report(&self, _report: KeyboardReport) -> Result<(), Self::Error> {
170        unreachable!()
171    }
172    fn try_send_media_keyboard_report(
173        &self,
174        _report: MediaKeyboardReport,
175    ) -> Result<(), Self::Error> {
176        unreachable!()
177    }
178    fn try_send_mouse_report(&self, _report: MouseReport) -> Result<(), Self::Error> {
179        unreachable!()
180    }
181    async fn send_rrp_data(&self, _data: &[u8]) -> Result<(), Self::Error> {
182        unreachable!()
183    }
184    fn wakeup(&self) -> Result<bool, Self::Error> {
185        unreachable!()
186    }
187}
188impl WirelessReporterDriver for DummyReporter {
189    type Error = Infallible;
190    async fn clear_bond_data(&self) -> Result<(), <Self as WirelessReporterDriver>::Error> {
191        unreachable!()
192    }
193}
194impl UsbReporterDriver for DummyReporter {
195    type Error = Infallible;
196
197    async fn vbus_detect(&self) -> Result<bool, <Self as UsbReporterDriver>::Error> {
198        unreachable!()
199    }
200}
201
202// BLE
203pub fn ble_builder() -> Option<impl WirelessReporterDriverBuilder> {
204    pub enum BleBuilder {}
205    impl WirelessReporterDriverBuilder for BleBuilder {
206        type Output = DummyReporter;
207        type Error = Infallible;
208        #[allow(refining_impl_trait)]
209        async fn build(self) -> Result<(Self::Output, futures::future::Pending<()>), Self::Error> {
210            unreachable!()
211        }
212    }
213
214    Option::<BleBuilder>::None
215}
216
217// usb
218pub fn usb_builder() -> Option<impl UsbReporterDriverBuilder> {
219    pub enum UsbBuilder {}
220    impl UsbReporterDriverBuilder for UsbBuilder {
221        type Output = DummyReporter;
222        type Error = ();
223
224        #[allow(refining_impl_trait)]
225        async fn build(self) -> Result<(Self::Output, futures::future::Pending<()>), Self::Error> {
226            unreachable!()
227        }
228    }
229
230    Option::<UsbBuilder>::None
231}