From 7e7b93c6945be9282ff0b375da3a8b895a223ee3 Mon Sep 17 00:00:00 2001 From: anschrammh Date: Thu, 23 Feb 2023 06:22:50 +0100 Subject: [PATCH] Altimeter screen continued but not finished --- .../lv_port_win_codeblocks/LittlevGL.layout | 698 +++++++++--------- .../lv_port_win_codeblocks/altimeter_screen.c | 133 ++++ .../lv_port_win_codeblocks/altimeter_screen.h | 10 +- .../lv_port_win_codeblocks/main.c | 1 + .../lv_port_win_codeblocks/menu_screen.c | 7 +- .../lv_port_win_codeblocks/watch_face.c | 11 +- 6 files changed, 496 insertions(+), 364 deletions(-) diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/LittlevGL.layout b/src/lvgl_win_sim/lv_port_win_codeblocks/LittlevGL.layout index 217f762..ffaeeaa 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/LittlevGL.layout +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/LittlevGL.layout @@ -2,24 +2,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -27,9 +187,29 @@ - + - + + + + + + + + + + + + + + + + + + + + + @@ -42,32 +222,82 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + + - + - + - + + + + + + @@ -83,54 +313,9 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -138,20 +323,69 @@ - + - + - + - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -159,6 +393,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -168,289 +442,9 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.c b/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.c index 49a0596..ccc9de3 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.c @@ -1 +1,134 @@ #include "altimeter_screen.h" +#include "menu_screen.h" + +static void gesture_event_cb(lv_event_t * e) +{ + AltimeterScreen_t *altimeterScreen = e->user_data; + + lv_dir_t gesture; + switch(gesture = lv_indev_get_gesture_dir(lv_indev_get_act())) + { + case LV_DIR_LEFT: + LV_LOG_USER("GESTURE : LEFT"); + break; + case LV_DIR_RIGHT: + LV_LOG_USER("GESTURE : RIGHT"); + // We delete the timer + lv_timer_del(altimeterScreen->measurementUpdateTimer); + // We create the menu screen and switch to it + extern MenuScreen_t menuScreen; + menu_screen_create(&menuScreen); + lv_scr_load_anim(menuScreen.display, LV_SCR_LOAD_ANIM_MOVE_RIGHT, 400, 0, true); + break; + case LV_DIR_TOP: + LV_LOG_USER("GESTURE : TOP"); + break; + case LV_DIR_BOTTOM: + LV_LOG_USER("GESTURE : BOTTOM"); + break; + default: + LV_LOG_USER("GESTURE : %u", gesture); + } +} + +static void cleanup_event_cb(lv_event_t * e) +{ + AltimeterScreen_t *altimeterScreen = e->user_data; + altimeter_screen_destroy(altimeterScreen); + LV_LOG_USER("cleanup"); +} + +static void measurements_update_timer_cb(lv_timer_t *timer) +{ + AltimeterScreen_t *altimeterScreen = timer->user_data; + if(altimeterScreen->measurementCb) + { + float temperature, pressure, altitude; + LV_LOG_USER("Updating measurements"); + + altimeterScreen->measurementCb(&temperature, &pressure, &altitude); + + } + else + { + LV_LOG_USER("measurementCb is NULL, be sure to register a callback !"); + } + +} + +void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen) +{ + if(!altimeterScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + memset(altimeterScreen, 0, sizeof(AltimeterScreen_t)); +} + +void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimeterScreen, MeasurementCb_t MeasurementCb) +{ + if(!altimeterScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + altimeterScreen->measurementCb = MeasurementCb; +} + +void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen) +{ + if(!altimeterScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + //We declare all the needed assets by the altimeter screen + + //We create our parent screen + if(altimeterScreen->display) + { + LV_LOG_ERROR("display should be NULL here !"); + lv_obj_del(altimeterScreen->display); + altimeterScreen->display = NULL; + } + + altimeterScreen->display = lv_obj_create(NULL); + lv_obj_set_style_bg_color(altimeterScreen->display, lv_color_make(85, 88, 90), LV_PART_MAIN); + + lv_obj_t *inner_circle = lv_obj_create(altimeterScreen->display); + lv_obj_center(inner_circle); + lv_obj_set_size(inner_circle, 210, 210); + lv_obj_set_style_radius(inner_circle, LV_RADIUS_CIRCLE, LV_PART_MAIN); + + + //We register the event callback to handle gestures + lv_obj_add_event_cb(altimeterScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, altimeterScreen); + //We register the event callback to handle the cleanup + lv_obj_add_event_cb(altimeterScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, altimeterScreen); + + //We create the timer to update the measurements displayed on the screen + if(altimeterScreen->measurementUpdateTimer) + { + LV_LOG_ERROR("measurementUpdateTimer should be NULL here !"); + lv_timer_del(altimeterScreen->measurementUpdateTimer); + altimeterScreen->measurementUpdateTimer = NULL; + } + + //Update the values on the screen twice a second + altimeterScreen->measurementUpdateTimer = lv_timer_create(&(measurements_update_timer_cb), 500, altimeterScreen); +} + +void altimeter_screen_destroy(AltimeterScreen_t * const altimeterScreen) +{ + if(!altimeterScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + memset(altimeterScreen, 0, offsetof(AltimeterScreen_t, displayedView)); +} diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.h b/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.h index ce6e373..317f669 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.h +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.h @@ -27,23 +27,23 @@ typedef void(*MeasurementCb_t)(float * const temperature, float * const pressure typedef struct AltimeterScreen { - MeasurementCb_t measurementCb; - + //Can be erased attributes lv_obj_t *display; lv_timer_t *measurementUpdateTimer; MainValue_t mainValue; MinMaxValue_t minValue; MinMaxValue_t maxValue; - + //Should not be erased attributes DisplayedView_e displayedView; + MeasurementCb_t measurementCb; } AltimeterScreen_t; void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen); -void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen); - void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimeterScreen, MeasurementCb_t MeasurementCb); +void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen); + void altimeter_screen_destroy(AltimeterScreen_t * const altimeterScreen); #endif //ALTIMETER_SCREEN_H diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/main.c b/src/lvgl_win_sim/lv_port_win_codeblocks/main.c index 17826ea..4eae0ba 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/main.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/main.c @@ -87,6 +87,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi menu_screen_init(&menuScreen); compass_screen_init(&compassScreen); settings_screen_init(&settingsScreen); + altimeter_screen_init(&altimeterScreen); watch_face_register_date_time_cb(&watchFace, &(date_time_cb)); watch_face_create(&watchFace); diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/menu_screen.c b/src/lvgl_win_sim/lv_port_win_codeblocks/menu_screen.c index 5c30a2f..0fb3f13 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/menu_screen.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/menu_screen.c @@ -4,6 +4,7 @@ #include "settings_screen.h" #include "watch_face.h" #include "compass_screen.h" +#include "altimeter_screen.h" #define array_size(array) (sizeof(array)/sizeof(array[0])) @@ -32,10 +33,10 @@ static void menu_item_cb(lv_event_t *e) break; case 3: { - //extern CompassScreen_t compassScreen; - //compass_screen_create(&compassScreen); + extern AltimeterScreen_t altimeterScreen; + altimeter_screen_create(&altimeterScreen); //lv_scr_load_anim(compassScreen.display, LV_SCR_LOAD_ANIM_FADE_ON, 400, 0, true); - //lv_scr_load_anim(compassScreen.display, LV_SCR_LOAD_ANIM_MOVE_LEFT, 400, 0, true); + lv_scr_load_anim(altimeterScreen.display, LV_SCR_LOAD_ANIM_MOVE_LEFT, 400, 0, true); } break; case 4: diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.c b/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.c index 99ccb08..d8af634 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.c @@ -140,11 +140,11 @@ void watch_face_create(WatchFace_t * const watchFace) lv_obj_del(watchFace->display); watchFace->display = NULL; } - watchFace->display = lv_obj_create(NULL); - //We load our assets : - lv_obj_t *watchFaceImg = lv_img_create(watchFace->display); - lv_img_set_src(watchFaceImg, &watch_casio_face_asset); + //Our display is the watch face image : + watchFace->display = lv_img_create(NULL); + lv_img_set_src(watchFace->display, &watch_casio_face_asset); + //We load our other assets : lv_obj_t *smallHandImg = lv_img_create(watchFace->display); lv_img_set_src(smallHandImg, &watch_casio_small_hand_asset); lv_obj_set_pos(smallHandImg, 69, 98); @@ -250,6 +250,9 @@ void watch_face_create(WatchFace_t * const watchFace) //We set the appropriate angles to each of the hands update_watch_hands_angles(watchFace, 0); + //Don't forget to make the background image clickable to be able to use gestures on it. + lv_obj_add_flag(watchFace->display, LV_OBJ_FLAG_CLICKABLE); + //We register the event callback to handle gestures lv_obj_add_event_cb(watchFace->display, &(gesture_event_cb), LV_EVENT_GESTURE, watchFace); //We register the event callback to handle the cleanup