#![no_std] #![feature(trace_macros)] #![feature(concat_idents)] #![feature(proc_macro_hygiene)] #![feature(exclusive_range_pattern)]
pub use watchface;
use core::{
ffi::c_void,
ptr,
};
use watchface::lvgl::mynewt::{
result::*,
};
use watchface::lvgl::{
self,
core::obj,
widgets::img,
};
use watchface::{
WatchFace,
WatchFaceState,
};
pub struct HandDrawnWatchFace {
top_left_image: lvgl::Ptr,
top_right_image: lvgl::Ptr,
bottom_left_image: lvgl::Ptr,
bottom_right_image: lvgl::Ptr,
bitmaps: [img::lv_img_dsc_t; 10],
}
const IMAGE_WIDTH: u32 = 80;
const IMAGE_HEIGHT: u32 = 100;
const BYTES_PER_PIXEL: u32 = 2;
impl WatchFace for HandDrawnWatchFace {
fn new() -> MynewtResult<Self> {
let screen = watchface::get_active_screen();
let mut header = img::lv_img_header_t::default();
header.set_cf(img::LV_IMG_CF_TRUE_COLOR); header.set_w(IMAGE_WIDTH); header.set_h(IMAGE_HEIGHT);
let data_size = IMAGE_WIDTH * IMAGE_HEIGHT * BYTES_PER_PIXEL;
let watch_face = Self {
top_left_image: {
let image = img::create(screen, ptr::null()) ? ; obj::set_pos(image, 40, 20) ? ; image },
top_right_image: {
let image = img::create(screen, ptr::null()) ? ;
obj::set_pos(image, 120, 20) ? ; image },
bottom_left_image: {
let image = img::create(screen, ptr::null()) ? ;
obj::set_pos(image, 40, 120) ? ; image },
bottom_right_image: {
let image = img::create(screen, ptr::null()) ? ;
obj::set_pos(image, 120, 120) ? ; image },
bitmaps: [
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/0.bin") as *const u8, header, data_size },
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/1.bin") as *const u8, header, data_size },
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/2.bin") as *const u8, header, data_size },
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/3.bin") as *const u8, header, data_size },
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/4.bin") as *const u8, header, data_size },
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/5.bin") as *const u8, header, data_size },
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/6.bin") as *const u8, header, data_size },
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/7.bin") as *const u8, header, data_size },
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/8.bin") as *const u8, header, data_size },
img::lv_img_dsc_t { data: include_bytes!("../bitmaps/9.bin") as *const u8, header, data_size },
]
};
Ok(watch_face)
}
fn update(&mut self, state: &WatchFaceState) -> MynewtResult<()> {
let digit = state.time.hour / 10; let bitmap: *mut img::lv_img_dsc_t = &mut self.bitmaps[digit as usize]; img::set_src( self.top_left_image, bitmap as *const c_void ) ? ;
let digit = state.time.hour % 10; let bitmap: *mut img::lv_img_dsc_t = &mut self.bitmaps[digit as usize]; img::set_src( self.top_right_image, bitmap as *const c_void ) ? ;
let digit = state.time.minute / 10; let bitmap: *mut img::lv_img_dsc_t = &mut self.bitmaps[digit as usize]; img::set_src( self.bottom_left_image, bitmap as *const c_void ) ? ;
let digit = state.time.minute % 10; let bitmap: *mut img::lv_img_dsc_t = &mut self.bitmaps[digit as usize]; img::set_src( self.bottom_right_image, bitmap as *const c_void ) ? ;
Ok(())
}
}