RKTK API Docs RKTK Home Repo

rktk/task/
channels.rs

1// WARN: Do not make a receiver public unless there is a special reason (only one receiver can receive a value)
2
3use crate::utils::{Channel, Receiver, Sender};
4use embassy_sync::channel::DynamicSender;
5
6pub mod rgb {
7    use crate::{config::CONST_CONFIG, drivers::interface::rgb::RgbCommand};
8
9    use super::*;
10
11    pub(crate) static RGB_CHANNEL: Channel<RgbCommand, { CONST_CONFIG.buffer.rgb_channel }> =
12        Channel::new();
13
14    /// Get [`DynamicSender`] that can be used to control RGB.
15    pub fn rgb_sender() -> DynamicSender<'static, RgbCommand> {
16        RGB_CHANNEL.dyn_sender()
17    }
18}
19
20pub mod split {
21    use crate::{
22        config::CONST_CONFIG,
23        drivers::interface::split::{MasterToSlave, SlaveToMaster},
24    };
25
26    use super::*;
27
28    type S2mChannel = Channel<SlaveToMaster, { CONST_CONFIG.buffer.split_channel }>;
29    pub type S2mRx<'a> = Receiver<'a, SlaveToMaster, { CONST_CONFIG.buffer.split_channel }>;
30    pub type S2mTx<'a> = Sender<'a, SlaveToMaster, { CONST_CONFIG.buffer.split_channel }>;
31
32    type M2sChannel = Channel<MasterToSlave, { CONST_CONFIG.buffer.split_channel }>;
33    pub type M2sRx<'a> = Receiver<'a, MasterToSlave, { CONST_CONFIG.buffer.split_channel }>;
34    pub type M2sTx<'a> = Sender<'a, MasterToSlave, { CONST_CONFIG.buffer.split_channel }>;
35
36    pub(crate) static M2S_CHANNEL: M2sChannel = Channel::new();
37    pub(crate) static S2M_CHANNEL: S2mChannel = Channel::new();
38}
39
40pub mod report {
41    use core::sync::atomic::Ordering;
42
43    use portable_atomic::AtomicI8;
44    use rktk_keymanager::interface::state::input_event::{EncoderDirection, KeyChangeEvent};
45
46    use crate::{config::CONST_CONFIG, utils::Signal};
47
48    use super::*;
49
50    pub(crate) static MOUSE_CHANGE_X: AtomicI8 = AtomicI8::new(0);
51    pub(crate) static MOUSE_CHANGE_Y: AtomicI8 = AtomicI8::new(0);
52    pub(crate) static MOUSE_CHANGE_SIGNAL: Signal<()> = Signal::new();
53
54    pub fn update_mouse(x: i8, y: i8) {
55        MOUSE_CHANGE_X.fetch_add(x, Ordering::Release);
56        MOUSE_CHANGE_Y.fetch_add(y, Ordering::Release);
57        MOUSE_CHANGE_SIGNAL.signal(());
58    }
59
60    pub(crate) static KEYBOARD_EVENT_REPORT_CHANNEL: Channel<
61        KeyChangeEvent,
62        { CONST_CONFIG.buffer.keyboard_event },
63    > = Channel::new();
64
65    /// Get [`DynamicSender`] that can be used to report keyboard events.
66    pub fn keyboard_event_sender() -> DynamicSender<'static, KeyChangeEvent> {
67        KEYBOARD_EVENT_REPORT_CHANNEL.dyn_sender()
68    }
69
70    pub(crate) static ENCODER_EVENT_REPORT_CHANNEL: Channel<
71        (u8, EncoderDirection),
72        { CONST_CONFIG.buffer.encoder_event },
73    > = Channel::new();
74
75    /// Get [`DynamicSender`] that can be used to report encoder events.
76    pub fn encoder_event_sender() -> DynamicSender<'static, (u8, EncoderDirection)> {
77        ENCODER_EVENT_REPORT_CHANNEL.dyn_sender()
78    }
79}