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> {
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
90pub 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
102pub 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
123pub 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
139pub 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
162use 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
202pub 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
217pub 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}