diff --git a/examples/gauge.rs b/examples/gauge.rs index ccb50ef..2be8bda 100644 --- a/examples/gauge.rs +++ b/examples/gauge.rs @@ -74,6 +74,8 @@ fn main() -> Result<(), LvError> { let mut i = 0; 'running: loop { + gauge.set_value(0, i)?; + let mut ui = threaded_ui.lock().unwrap(); ui.task_handler(); if let Some(disp) = ui.get_display_ref() { @@ -93,8 +95,7 @@ fn main() -> Result<(), LvError> { } } - sleep(Duration::from_millis(25)); - gauge.set_value(0, i)?; + sleep(Duration::from_millis(50)); if i > 99 { i = 0; diff --git a/lvgl/src/mem.rs b/lvgl/src/mem.rs index efd992e..9167858 100644 --- a/lvgl/src/mem.rs +++ b/lvgl/src/mem.rs @@ -1,5 +1,6 @@ use crate::{LvError, LvResult}; use core::mem; +use core::ops::{Deref, DerefMut}; use core::ptr::NonNull; /// Places `T` into LVGL memory. @@ -45,6 +46,20 @@ impl Drop for Box { } } +impl DerefMut for Box { + fn deref_mut(&mut self) -> &mut Self::Target { + self.as_mut() + } +} + +impl Deref for Box { + type Target = T; + + fn deref(&self) -> &Self::Target { + unsafe { self.0.as_ref() } + } +} + impl AsMut for Box { fn as_mut(&mut self) -> &mut T { unsafe { self.0.as_mut() } diff --git a/lvgl/src/ui.rs b/lvgl/src/ui.rs index 1309723..6efda9e 100644 --- a/lvgl/src/ui.rs +++ b/lvgl/src/ui.rs @@ -1,7 +1,7 @@ use crate::mem::Box; use crate::{Color, Event, LvError, LvResult, Obj, Widget}; use core::marker::PhantomData; -use core::mem::{ManuallyDrop, MaybeUninit}; +use core::mem::MaybeUninit; use core::ptr; use core::ptr::NonNull; use core::sync::atomic::{AtomicBool, Ordering}; @@ -81,15 +81,13 @@ where let mut disp_drv = MaybeUninit::::uninit(); lvgl_sys::lv_disp_drv_init(disp_drv.as_mut_ptr()); // Since this is C managed memory, we don't want to drop it using Rust, thus `ManuallyDrop` wrapping. - let mut disp_drv = ManuallyDrop::new(disp_drv.assume_init()); + let mut disp_drv = Box::new(disp_drv.assume_init())?; // Assign the buffer to the display disp_drv.buffer = Box::into_raw(disp_buf); // Set your driver function disp_drv.flush_cb = Some(display_callback_wrapper::); disp_drv.user_data = &mut self.display_data as *mut _ as *mut cty::c_void; - lvgl_sys::lv_disp_drv_register( - &mut ManuallyDrop::take(&mut disp_drv) as *mut lvgl_sys::lv_disp_drv_t - ); + lvgl_sys::lv_disp_drv_register(Box::into_raw(disp_drv)); }; Ok(())