components/
screen_adapters.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2025.
4
5//! Components for screen adapters.
6//!
7//! Capsule: capsules/extra/src/screen/screen_adapters.rs
8//!
9//! Various converters for screens.
10
11use core::mem::MaybeUninit;
12use kernel::component::Component;
13use kernel::hil;
14
15#[macro_export]
16macro_rules! screen_adapter_argb8888_to_mono8bitpage_component_static {
17    ($S:ty, $SCREEN_WIDTH:expr, $SCREEN_HEIGHT:expr, $PIXEL_STRIDE:expr $(,)?) => {{
18        let adapter = kernel::static_buf!(
19            capsules_extra::screen::screen_adapters::ScreenARGB8888ToMono8BitPage<'static, $S>
20        );
21        let frame_buffer =
22            kernel::static_buf!([u8; $SCREEN_WIDTH * $SCREEN_HEIGHT * $PIXEL_STRIDE]);
23
24        (adapter, frame_buffer)
25    };};
26}
27
28pub type ScreenAdapterARGB8888ToMono8BitPageComponentType<S> =
29    capsules_extra::screen::screen_adapters::ScreenARGB8888ToMono8BitPage<'static, S>;
30
31pub struct ScreenAdapterARGB8888ToMono8BitPageComponent<
32    S: hil::screen::Screen<'static> + 'static,
33    const FRAME_BUFFER_LEN: usize,
34> {
35    screen: &'static S,
36}
37
38impl<S: hil::screen::Screen<'static>, const FRAME_BUFFER_LEN: usize>
39    ScreenAdapterARGB8888ToMono8BitPageComponent<S, FRAME_BUFFER_LEN>
40{
41    pub fn new(screen: &'static S) -> Self {
42        Self { screen }
43    }
44}
45
46impl<S: hil::screen::Screen<'static> + 'static, const FRAME_BUFFER_LEN: usize> Component
47    for ScreenAdapterARGB8888ToMono8BitPageComponent<S, FRAME_BUFFER_LEN>
48{
49    type StaticInput = (
50        &'static mut MaybeUninit<
51            capsules_extra::screen::screen_adapters::ScreenARGB8888ToMono8BitPage<'static, S>,
52        >,
53        &'static mut MaybeUninit<[u8; FRAME_BUFFER_LEN]>,
54    );
55    type Output =
56        &'static capsules_extra::screen::screen_adapters::ScreenARGB8888ToMono8BitPage<'static, S>;
57
58    fn finalize(self, static_input: Self::StaticInput) -> Self::Output {
59        let frame_buffer = static_input.1.write([0; FRAME_BUFFER_LEN]);
60        let adapter = static_input.0.write(
61            capsules_extra::screen::screen_adapters::ScreenARGB8888ToMono8BitPage::new(
62                self.screen,
63                frame_buffer,
64            ),
65        );
66
67        kernel::hil::screen::Screen::set_client(self.screen, adapter);
68
69        adapter
70    }
71}