graphics: display: clean up some of the display hardware status locking code
This commit is contained in:
@@ -23,7 +23,7 @@ impl<T:SmartLedsWriteAsync> GammaCorrected for BikeOutput<T> where T::Color: Pix
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: SmartLedsWriteAsync> BikeOutput<T> where T::Color: PixelBlend<Rgb<u8>> + PixelFormat + WithGamma + 'static + Default + Clone + Copy, T::Error: core::fmt::Debug {
|
impl<T: SmartLedsWriteAsync<Color = Rgb<u8>>> BikeOutput<T> where T::Error: core::fmt::Debug {
|
||||||
pub fn new(target: T, max_mw: u32, controls: DisplayControls) -> Self {
|
pub fn new(target: T, max_mw: u32, controls: DisplayControls) -> Self {
|
||||||
Self {
|
Self {
|
||||||
pixbuf: [Default::default(); NUM_PIXELS],
|
pixbuf: [Default::default(); NUM_PIXELS],
|
||||||
@@ -164,7 +164,7 @@ static RENDER_IS_RUNNING: Watch<CriticalSectionRawMutex, bool, 7> = Watch::new()
|
|||||||
// TODO: Implement something similar for a system-wide sleep mechanism
|
// TODO: Implement something similar for a system-wide sleep mechanism
|
||||||
pub struct DisplayControls {
|
pub struct DisplayControls {
|
||||||
data: Arc<ControlData>,
|
data: Arc<ControlData>,
|
||||||
render_pause: Arc<Signal<CriticalSectionRawMutex, bool>>,
|
display_is_on: Arc<Signal<CriticalSectionRawMutex, bool>>,
|
||||||
render_run_receiver: Receiver<'static, CriticalSectionRawMutex, bool, 7>
|
render_run_receiver: Receiver<'static, CriticalSectionRawMutex, bool, 7>
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,7 +172,7 @@ impl Clone for DisplayControls {
|
|||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
Self {
|
Self {
|
||||||
data: Arc::clone(&self.data),
|
data: Arc::clone(&self.data),
|
||||||
render_pause: Arc::clone(&self.render_pause),
|
display_is_on: Arc::clone(&self.display_is_on),
|
||||||
render_run_receiver: RENDER_IS_RUNNING.receiver().expect("Could not create enough render running receivers")
|
render_run_receiver: RENDER_IS_RUNNING.receiver().expect("Could not create enough render running receivers")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -187,19 +187,19 @@ impl DisplayControls {
|
|||||||
self.data.brightness.load(core::sync::atomic::Ordering::Relaxed)
|
self.data.brightness.load(core::sync::atomic::Ordering::Relaxed)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: its a bit weird we have a pub function for the renderer's privates to wait while hiding render_pause, but directly expose render_is_running for any task to wait on
|
|
||||||
pub async fn wait_until_display_is_on(&self) {
|
pub async fn wait_until_display_is_on(&self) {
|
||||||
if let Some(true) = self.render_pause.try_take() {
|
while !self.display_is_on.wait().await { log::info!("wait for display") }
|
||||||
while self.render_pause.wait().await {}
|
log::trace!("display says on!");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn notify_render_is_running(&mut self, value: bool) {
|
pub fn notify_render_is_running(&mut self, value: bool) {
|
||||||
|
log::trace!("render is running!");
|
||||||
RENDER_IS_RUNNING.sender().send(value);
|
RENDER_IS_RUNNING.sender().send(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn wait_until_render_is_running(&mut self) {
|
pub async fn wait_until_render_is_running(&mut self) {
|
||||||
while !self.render_run_receiver.get().await {}
|
while !self.render_run_receiver.changed().await { log::info!("wait for render run") }
|
||||||
|
log::trace!("render says run!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +216,8 @@ impl Brightness for DisplayControls {
|
|||||||
|
|
||||||
fn set_on(&mut self, is_on: bool) {
|
fn set_on(&mut self, is_on: bool) {
|
||||||
self.data.on.store(is_on, core::sync::atomic::Ordering::Relaxed);
|
self.data.on.store(is_on, core::sync::atomic::Ordering::Relaxed);
|
||||||
self.render_pause.signal(!is_on);
|
log::trace!("display is on {is_on}");
|
||||||
|
self.display_is_on.signal(is_on);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,7 +226,7 @@ impl core::fmt::Debug for DisplayControls {
|
|||||||
f.debug_struct("DisplayControls")
|
f.debug_struct("DisplayControls")
|
||||||
.field("on", &self.data.on)
|
.field("on", &self.data.on)
|
||||||
.field("brightness", &self.data.brightness)
|
.field("brightness", &self.data.brightness)
|
||||||
.field("render_pause", &self.render_pause.signaled())
|
.field("render_pause_signaled", &self.display_is_on.signaled())
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -234,7 +235,7 @@ impl Default for DisplayControls {
|
|||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
data: Default::default(),
|
data: Default::default(),
|
||||||
render_pause: Default::default(),
|
display_is_on: Default::default(),
|
||||||
render_run_receiver: RENDER_IS_RUNNING.receiver().unwrap()
|
render_run_receiver: RENDER_IS_RUNNING.receiver().unwrap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user