mod button_counts;
pub use button_counts::ButtonCounts;
use std::sync::atomic::AtomicPtr;
use crate::{LanguageTag, Lights};
pub(super) static LIGHTS: std::sync::OnceLock<crate::lights_setter::LightsSetter> =
std::sync::OnceLock::new();
pub type SetAndFlushLights = fn(&[crate::color::RGB; Lights::COUNT]);
pub fn set_lights(lights: SetAndFlushLights) {
LIGHTS
.set(crate::lights_setter::LightsSetter::new(lights))
.unwrap();
}
pub(super) static BUTTON_EVENTS: std::sync::OnceLock<
tokio::sync::broadcast::Sender<crate::ButtonEvent>,
> = std::sync::OnceLock::new();
pub fn set_button_events(events_sender: tokio::sync::broadcast::Sender<crate::ButtonEvent>) {
BUTTON_EVENTS.set(events_sender).unwrap();
}
pub(super) static BUTTON_COUNTS: std::sync::OnceLock<tokio::sync::watch::Receiver<ButtonCounts>> =
std::sync::OnceLock::new();
pub fn set_button_counts(rx: tokio::sync::watch::Receiver<ButtonCounts>) {
BUTTON_COUNTS.set(rx).unwrap();
}
pub(super) static EXECUTOR: AtomicPtr<crate::executor::Executor> =
AtomicPtr::new(std::ptr::null_mut());
pub fn set_executor(executor: &crate::executor::Executor) {
EXECUTOR.store(
std::ptr::from_ref(executor) as *mut _,
std::sync::atomic::Ordering::SeqCst,
);
}
pub fn set_active_language(language: LanguageTag) {
let mut lock = crate::active_language::ACTIVE_LANGUAGE.lock().unwrap();
*lock = language;
drop(lock);
}