1use 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
41pub 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
53pub 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
89pub 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
101pub 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
122pub 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
138pub 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
161use 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
201pub 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
216pub 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}