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 2208a8c..7270b08 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 @@ -3,6 +3,21 @@ #include "menu_screen.h" #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) +const char * const MONTH[] = +{ + "JAN", + "FÉV", + "MAR", + "AVR", + "MAI", + "JUI", + "JUL", + "AOÛ", + "SEP", + "OCT", + "NOV", + "DÉC", +}; static lv_obj_t *_create_altimeter_display(AltimeterScreen_t * const altimeterScreen); static void _create_pressure_display(AltimeterScreen_t * const altimeterScreen); @@ -10,8 +25,10 @@ static void _create_altitude_display(AltimeterScreen_t * const altimeterScreen); static void _create_altitude_setting_display(AltimeterScreen_t * const altimeterScreen); static void _update_min_and_max_pressure_data(AltimeterScreen_t * const altimeterScreen, float minPressure, float maxPressure); static void _update_pressure_chart(AltimeterScreen_t * const altimeterScreen); +static void _update_pressure_info(AltimeterScreen_t * const altimeterScreen); static void _update_altitude_info(AltimeterScreen_t * const altimeterScreen); static void _update_temperature_info(AltimeterScreen_t * const altimeterScreen, float temperature); +static void _update_date_time_info(AltimeterScreen_t * const altimeterScreen); static void gesture_event_cb(lv_event_t *e) { @@ -105,10 +122,19 @@ static void altitude_display_cleanup_event_cb(lv_event_t *e) altimeterScreen->altitudeUpdateTimer = NULL; } + if(altimeterScreen->dateTimeUpdateTimer) + { + lv_timer_del(altimeterScreen->dateTimeUpdateTimer); + altimeterScreen->dateTimeUpdateTimer = NULL; + } + altimeterScreen->altitudeValue.value = NULL; altimeterScreen->altitudeValue.unit = NULL; altimeterScreen->vsiValue.value_unit = NULL; altimeterScreen->temperatureValue.value = NULL; + altimeterScreen->dateTimeValue.timeLabel = NULL; + altimeterScreen->dateTimeValue.monthLabel = NULL; + altimeterScreen->dateTimeValue.dayLabel = NULL; LV_LOG_USER("Altitude display cleanup"); } @@ -126,27 +152,7 @@ static void altitude_setting_display_cleanup_event_cb(lv_event_t *e) static void pressure_update_timer_cb(lv_timer_t *timer) { AltimeterScreen_t *altimeterScreen = timer->user_data; - - if(altimeterScreen->altimeterScreenMeasurementCb) - { - LV_LOG_USER("Updating pressure measurements"); - float pressure; - - /* We don't need to retrieve the temperature nor the altitude in this view */ - altimeterScreen->altimeterScreenMeasurementCb(NULL, &pressure, NULL); - sprintf(altimeterScreen->pressureValue.value_text, "%.2f", pressure); - if(altimeterScreen->pressureValue.value) - { - lv_label_set_text_static(altimeterScreen->pressureValue.value, altimeterScreen->pressureValue.value_text); - } - - //Mock up part needs to be changed on embedded target - altimeter_screen_shift_chart_pressure_measurement(altimeterScreen, pressure); - } - else - { - LV_LOG_USER("altimeterScreenMeasurementCb is NULL, be sure to register a callback !"); - } + _update_pressure_info(altimeterScreen); } static void altitude_update_timer_cb(lv_timer_t *timer) @@ -176,6 +182,12 @@ static void altitude_update_timer_cb(lv_timer_t *timer) } } +static void date_time_update_timer_cb(lv_timer_t *timer) +{ + AltimeterScreen_t *altimeterScreen = timer->user_data; + _update_date_time_info(altimeterScreen); +} + static void reset_pressure_event_cb(lv_event_t *e) { AltimeterScreen_t *altimeterScreen = lv_event_get_user_data(e); @@ -331,6 +343,28 @@ void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimete altimeterScreen->altimeterScreenMeasurementCb = altimeterScreenMeasurementCb; } +void altimeter_screen_register_date_time_cb(AltimeterScreen_t * const altimeterScreen, AltimeterScreenDateTimeCb_t altimeterScreenDateTimeCb) +{ + if(!altimeterScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + altimeterScreen->altimeterScreenDateTimeCb = altimeterScreenDateTimeCb; +} + +void altimeter_screen_set_displayed_hour_format(AltimeterScreen_t * const altimeterScreen, bool hour_24H_format) +{ + if(!altimeterScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + altimeterScreen->hour_24H_format = hour_24H_format; +} + void altimeter_screen_shift_chart_pressure_measurement(AltimeterScreen_t * const altimeterScreen, float pressure) { if(!altimeterScreen) @@ -428,7 +462,8 @@ static void _create_pressure_display(AltimeterScreen_t * const altimeterScreen) altimeterScreen->pressureValue.value = lv_label_create(inner_circle); lv_obj_set_style_text_font(altimeterScreen->pressureValue.value, &lv_font_montserrat_30, LV_PART_MAIN); lv_obj_align(altimeterScreen->pressureValue.value, LV_ALIGN_TOP_MID, 0, 15); - lv_label_set_text_static(altimeterScreen->pressureValue.value, altimeterScreen->pressureValue.value_text); + + _update_pressure_info(altimeterScreen); if(altimeterScreen->pressureValue.unit) { @@ -542,6 +577,47 @@ static void _create_altitude_display(AltimeterScreen_t * const altimeterScreen) lv_obj_set_style_border_color(inner_circle, lv_color_make(238, 82, 83), LV_PART_MAIN); lv_obj_set_scroll_dir(inner_circle, LV_DIR_NONE); + /* Let's create the month label */ + if(altimeterScreen->dateTimeValue.monthLabel) + { + LV_LOG_ERROR("monthLabel should be NULL here !"); + lv_obj_del(altimeterScreen->dateTimeValue.monthLabel); + altimeterScreen->dateTimeValue.monthLabel = NULL; + } + altimeterScreen->dateTimeValue.monthLabel = lv_label_create(inner_circle); + lv_obj_set_style_text_font(altimeterScreen->dateTimeValue.monthLabel, &lv_font_montserrat_16, LV_PART_MAIN); + lv_obj_align_to(altimeterScreen->dateTimeValue.monthLabel, inner_circle, LV_ALIGN_TOP_LEFT, 30, 5); + lv_obj_set_style_text_color(altimeterScreen->dateTimeValue.monthLabel, lv_color_make(158, 157, 36), LV_PART_MAIN); + + /* Let's create the day label */ + if(altimeterScreen->dateTimeValue.dayLabel) + { + LV_LOG_ERROR("dayLabel should be NULL here !"); + lv_obj_del(altimeterScreen->dateTimeValue.dayLabel); + altimeterScreen->dateTimeValue.dayLabel = NULL; + } + altimeterScreen->dateTimeValue.dayLabel = lv_label_create(inner_circle); + lv_obj_set_style_text_font(altimeterScreen->dateTimeValue.dayLabel, &lv_font_montserrat_16, LV_PART_MAIN); + lv_obj_align_to(altimeterScreen->dateTimeValue.dayLabel, inner_circle, LV_ALIGN_TOP_RIGHT, -15, 5); + lv_obj_set_style_text_color(altimeterScreen->dateTimeValue.dayLabel, lv_color_make(142, 36, 170), LV_PART_MAIN); + lv_obj_set_style_text_align(altimeterScreen->dateTimeValue.dayLabel, LV_TEXT_ALIGN_RIGHT, LV_PART_MAIN); + + /* Let's create the time label */ + if(altimeterScreen->dateTimeValue.timeLabel) + { + LV_LOG_ERROR("timeLabel should be NULL here !"); + lv_obj_del(altimeterScreen->dateTimeValue.timeLabel); + altimeterScreen->dateTimeValue.timeLabel = NULL; + } + altimeterScreen->dateTimeValue.timeLabel = lv_label_create(inner_circle); + lv_obj_set_width(altimeterScreen->dateTimeValue.timeLabel, lv_pct(100)); + lv_obj_set_style_text_font(altimeterScreen->dateTimeValue.timeLabel, &lv_font_montserrat_24, LV_PART_MAIN); + lv_obj_set_style_text_align(altimeterScreen->dateTimeValue.timeLabel, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); + lv_obj_align_to(altimeterScreen->dateTimeValue.timeLabel, inner_circle, LV_ALIGN_TOP_MID, 0, 20); + lv_obj_set_style_text_color(altimeterScreen->dateTimeValue.timeLabel, lv_color_make(251, 140, 0), LV_PART_MAIN); + + _update_date_time_info(altimeterScreen); + /* Let's create the altitude main and unit label */ if(altimeterScreen->altitudeValue.value) { @@ -551,7 +627,8 @@ static void _create_altitude_display(AltimeterScreen_t * const altimeterScreen) } altimeterScreen->altitudeValue.value = lv_label_create(inner_circle); lv_obj_set_style_text_font(altimeterScreen->altitudeValue.value, &lv_font_montserrat_30, LV_PART_MAIN); - lv_obj_align(altimeterScreen->altitudeValue.value, LV_ALIGN_TOP_MID, 0, 15); + lv_obj_align(altimeterScreen->altitudeValue.value, LV_ALIGN_TOP_MID, 0, 45); + lv_obj_set_style_text_color(altimeterScreen->altitudeValue.value, lv_color_make(0, 105, 92), LV_PART_MAIN); lv_label_set_text_static(altimeterScreen->altitudeValue.value, altimeterScreen->altitudeValue.value_text); if(altimeterScreen->altitudeValue.unit) @@ -562,23 +639,9 @@ static void _create_altitude_display(AltimeterScreen_t * const altimeterScreen) } altimeterScreen->altitudeValue.unit = lv_label_create(inner_circle); lv_obj_set_style_text_font(altimeterScreen->altitudeValue.unit, &lv_font_montserrat_30, LV_PART_MAIN); + lv_obj_set_style_text_color(altimeterScreen->altitudeValue.unit, lv_color_make(0, 105, 92), LV_PART_MAIN); lv_label_set_text_static(altimeterScreen->altitudeValue.unit, "m"); - lv_obj_align_to(altimeterScreen->altitudeValue.unit, altimeterScreen->altitudeValue.value, LV_ALIGN_CENTER, 0, 25); - - /* Let's create the zeroing button */ - lv_obj_t *zeroing_btn = lv_img_create(inner_circle); - lv_img_set_src(zeroing_btn, &altimeter_asset_calibration_icon); - lv_obj_align(zeroing_btn, LV_ALIGN_CENTER, 75 ,5); - lv_obj_add_flag(zeroing_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE); - /* Using a long pressed event so that no missclicks trigger a reset */ - lv_obj_add_event_cb(zeroing_btn, &(zeroing_altitude_event_cb), LV_EVENT_LONG_PRESSED, altimeterScreen); - - /* Let's create the settings button */ - lv_obj_t *setting_btn = lv_img_create(inner_circle); - lv_img_set_src(setting_btn, &watch_menu_settings_icon); - lv_obj_align(setting_btn, LV_ALIGN_CENTER, -75 ,5); - lv_obj_add_flag(setting_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE); - lv_obj_add_event_cb(setting_btn, &(set_altitude_settings_event_cb), LV_EVENT_CLICKED, altimeterScreen); + lv_obj_align_to(altimeterScreen->altitudeValue.unit, altimeterScreen->altitudeValue.value, LV_ALIGN_OUT_BOTTOM_MID, 0, -13); /* Let's create the temperature label */ if(altimeterScreen->temperatureValue.value) @@ -592,7 +655,24 @@ static void _create_altitude_display(AltimeterScreen_t * const altimeterScreen) lv_obj_set_style_text_font(altimeterScreen->temperatureValue.value, &lv_font_montserrat_24, LV_PART_MAIN); strcpy(altimeterScreen->temperatureValue.value_text, "°C"); lv_label_set_text_static(altimeterScreen->temperatureValue.value, altimeterScreen->temperatureValue.value_text); - lv_obj_align(altimeterScreen->temperatureValue.value, LV_ALIGN_CENTER, 0, 5); + lv_obj_align(altimeterScreen->temperatureValue.value, LV_ALIGN_CENTER, 0, 20); + lv_obj_set_style_text_color(altimeterScreen->temperatureValue.value, lv_color_make(93, 64, 55), LV_PART_MAIN); + + /* Let's create the zeroing button */ + lv_obj_t *zeroing_btn = lv_img_create(inner_circle); + lv_img_set_src(zeroing_btn, &altimeter_asset_calibration_icon); + lv_obj_align_to(zeroing_btn, altimeterScreen->temperatureValue.value, LV_ALIGN_OUT_RIGHT_MID, 45, 0); + lv_obj_add_flag(zeroing_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE); + /* Using a long pressed event so that no missclicks trigger a reset */ + lv_obj_add_event_cb(zeroing_btn, &(zeroing_altitude_event_cb), LV_EVENT_LONG_PRESSED, altimeterScreen); + + /* Let's create the settings button */ + lv_obj_t *setting_btn = lv_img_create(inner_circle); + lv_img_set_src(setting_btn, &watch_menu_settings_icon); + lv_obj_align_to(setting_btn, altimeterScreen->temperatureValue.value, LV_ALIGN_OUT_LEFT_MID, -45, 0); + lv_obj_add_flag(setting_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE); + /* Using a long pressed event so that no missclicks trigger a reset */ + lv_obj_add_event_cb(setting_btn, &(set_altitude_settings_event_cb), LV_EVENT_LONG_PRESSED, altimeterScreen); /* Let's create the VSI label */ if(altimeterScreen->vsiValue.value_unit) @@ -617,10 +697,19 @@ static void _create_altitude_display(AltimeterScreen_t * const altimeterScreen) lv_timer_del(altimeterScreen->altitudeUpdateTimer); altimeterScreen->altitudeUpdateTimer = NULL; } - - /* Update the pressure value on the screen every second */ + /* Update the pressure value on the screen at the defined refresh rate in Hz */ altimeterScreen->altitudeUpdateTimer = lv_timer_create(&(altitude_update_timer_cb), 1000 / ALTITUDE_TIMER_UPDATE_RATE_HZ, altimeterScreen); + /* Let's create the time update timer */ + if(altimeterScreen->dateTimeUpdateTimer) + { + LV_LOG_ERROR("dateTimeUpdateTimer should be NULL here !"); + lv_timer_del(altimeterScreen->dateTimeUpdateTimer); + altimeterScreen->dateTimeUpdateTimer = NULL; + } + /* Update the displayed time every 200 ms */ + altimeterScreen->dateTimeUpdateTimer = lv_timer_create(&(date_time_update_timer_cb), 500, altimeterScreen); + /* We register the event callback to handle gestures */ lv_obj_add_event_cb(altimeterScreen->displays[ALTIMETER_SCREEN_ALTITUDE_VIEW], &(gesture_event_cb), LV_EVENT_GESTURE, altimeterScreen); /* We register the event callback to handle the cleanup */ @@ -664,7 +753,7 @@ static void _create_altitude_setting_display(AltimeterScreen_t * const altimeter } altimeterScreen->altitudeOffset_spinbox.spinbox = lv_spinbox_create(inner_circle); - lv_obj_set_align(altimeterScreen->altitudeOffset_spinbox.spinbox, LV_ALIGN_CENTER); + lv_obj_align(altimeterScreen->altitudeOffset_spinbox.spinbox, LV_ALIGN_CENTER, 0, -10); lv_obj_set_width(altimeterScreen->altitudeOffset_spinbox.spinbox, lv_pct(50)); lv_obj_set_style_text_font(altimeterScreen->altitudeOffset_spinbox.spinbox, &lv_font_montserrat_16, LV_PART_MAIN); lv_spinbox_set_digit_format(altimeterScreen->altitudeOffset_spinbox.spinbox, 5, 4); @@ -694,8 +783,7 @@ static void _create_altitude_setting_display(AltimeterScreen_t * const altimeter lv_label_set_text_static(apply_btn_lbl, "Apply"); lv_obj_center(apply_btn_lbl); lv_obj_add_event_cb(apply_btn, &(apply_altitude_setting_event_cb), LV_EVENT_CLICKED, altimeterScreen); - - lv_obj_align(apply_btn, LV_ALIGN_CENTER, -45, 45); + lv_obj_align_to(apply_btn, dec_btn, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); lv_obj_t *cancel_btn = lv_btn_create(inner_circle); @@ -706,8 +794,7 @@ static void _create_altitude_setting_display(AltimeterScreen_t * const altimeter lv_label_set_text_static(cancel_btn_lbl, "Cancel"); lv_obj_center(cancel_btn_lbl); lv_obj_add_event_cb(cancel_btn, &(apply_altitude_setting_event_cb), LV_EVENT_CLICKED, altimeterScreen); - - lv_obj_align(cancel_btn, LV_ALIGN_CENTER, 45, 45); + lv_obj_align_to(cancel_btn, inc_btn, LV_ALIGN_OUT_BOTTOM_RIGHT, 0, 10); /* We register the event callback to handle the cleanup */ lv_obj_add_event_cb(altimeterScreen->displays[ALTIMETER_SCREEN_ALTITUDE_SETTING_VIEW], &(altitude_setting_display_cleanup_event_cb), LV_EVENT_DELETE, altimeterScreen); @@ -761,6 +848,30 @@ static void _update_pressure_chart(AltimeterScreen_t * const altimeterScreen) _update_min_and_max_pressure_data(altimeterScreen, min, max); } +static void _update_pressure_info(AltimeterScreen_t * const altimeterScreen) +{ + if(altimeterScreen->altimeterScreenMeasurementCb) + { + LV_LOG_USER("Updating pressure measurements"); + float pressure; + + /* We don't need to retrieve the temperature nor the altitude in this view */ + altimeterScreen->altimeterScreenMeasurementCb(NULL, &pressure, NULL); + sprintf(altimeterScreen->pressureValue.value_text, "%.2f", pressure); + if(altimeterScreen->pressureValue.value) + { + lv_label_set_text_static(altimeterScreen->pressureValue.value, altimeterScreen->pressureValue.value_text); + } + + //Mock up part needs to be changed on embedded target + altimeter_screen_shift_chart_pressure_measurement(altimeterScreen, pressure); + } + else + { + LV_LOG_USER("altimeterScreenMeasurementCb is NULL, be sure to register a callback !"); + } +} + static void _update_altitude_info(AltimeterScreen_t * const altimeterScreen) { sprintf(altimeterScreen->altitudeValue.value_text, "%.2f", altimeterScreen->lastReadAltitude - altimeterScreen->altitudeOffset); @@ -774,3 +885,44 @@ static void _update_temperature_info(AltimeterScreen_t * const altimeterScreen, sprintf(altimeterScreen->temperatureValue.value_text, "%.2f°C", temperature); lv_label_set_text_static(altimeterScreen->temperatureValue.value, altimeterScreen->temperatureValue.value_text); } + +static void _update_date_time_info(AltimeterScreen_t * const altimeterScreen) +{ + if(altimeterScreen->altimeterScreenDateTimeCb) + { + struct tm date_time = {0}; + altimeterScreen->altimeterScreenDateTimeCb(&date_time); + date_time.tm_hour = 23; + if(altimeterScreen->hour_24H_format) + { + sprintf(altimeterScreen->dateTimeValue.time_text, "%s%d:%s%d:%s%d", + date_time.tm_hour < 10 ? "0" : "", date_time.tm_hour, + date_time.tm_min < 10 ? "0" : "", date_time.tm_min, + date_time.tm_sec < 10 ? "0" : "", date_time.tm_sec); + } + else + { + // Intermediate hour var to set it on a 12H format + uint8_t hour = date_time.tm_hour; + if(hour > 12)hour -= 12; + + sprintf(altimeterScreen->dateTimeValue.time_text, "%d:%s%d:%s%d%s", hour, + date_time.tm_min < 10 ? "0" : "", date_time.tm_min, + date_time.tm_sec < 10 ? "0" : "", date_time.tm_sec, + date_time.tm_hour < 13 ? "AM" : "PM"); + } + + static uint8_t cnt = 0; + strncpy(altimeterScreen->dateTimeValue.month_text, MONTH[cnt++ % 12], sizeof(altimeterScreen->dateTimeValue.month_text)-1); + date_time.tm_mday = (cnt % 32)+1; + sprintf(altimeterScreen->dateTimeValue.day_text, "%s%d", date_time.tm_mday < 10 ? "0":"", date_time.tm_mday); + + lv_label_set_text_static(altimeterScreen->dateTimeValue.timeLabel, altimeterScreen->dateTimeValue.time_text); + lv_label_set_text_static(altimeterScreen->dateTimeValue.monthLabel, altimeterScreen->dateTimeValue.month_text); + lv_label_set_text_static(altimeterScreen->dateTimeValue.dayLabel, altimeterScreen->dateTimeValue.day_text); + } + else + { + LV_LOG_USER("altimeterScreenDateTimeCb is NULL, be sure to register a callback !"); + } +} 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 17c281a..db51323 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 @@ -3,6 +3,7 @@ #define ALTIMETER_SCREEN_H #include "lvgl.h" +#include #define ALTITUDE_TIMER_UPDATE_RATE_HZ (10) @@ -36,6 +37,7 @@ typedef struct MinMaxVSIValue typedef void (*AltimeterScreenOnStateChangeCb_t)(AltimeterScreenState_e altimeterScreenState); typedef void(*AltimeterScreenMeasurementCb_t)(float * const temperature, float * const pressure, float * const altitude); typedef void (*AltimeterScreenUserFeedbackCb_t)(void); +typedef void (*AltimeterScreenDateTimeCb_t)(struct tm * const dateTime); typedef struct PressureChart { @@ -48,6 +50,12 @@ typedef struct TemperatureValue char value_text[9]; } TemperatureValue_t; +typedef struct DateTimeValue +{ + lv_obj_t *timeLabel, *monthLabel, *dayLabel; + char time_text[11], month_text[5], day_text[3]; +} DateTimeValue_t; + typedef struct SpinBox { lv_obj_t *spinbox; @@ -63,12 +71,14 @@ typedef struct AltimeterScreen PressureChart_t pressureChart; lv_timer_t *pressureUpdateTimer; lv_timer_t *altitudeUpdateTimer; + lv_timer_t *dateTimeUpdateTimer; MainValue_t pressureValue; MainValue_t altitudeValue; MinMaxVSIValue_t minValue; MinMaxVSIValue_t maxValue; MinMaxVSIValue_t vsiValue; TemperatureValue_t temperatureValue; + DateTimeValue_t dateTimeValue; float vsiFloat; float lastReadAltitude; //Should not be erased attributes @@ -76,13 +86,21 @@ typedef struct AltimeterScreen AltimeterScreenMeasurementCb_t altimeterScreenMeasurementCb; AltimeterScreenUserFeedbackCb_t altimeterScreenUserFeedbackCb; AltimeterScreenOnStateChangeCb_t altimeterScreenOnStateChangeCb; + AltimeterScreenDateTimeCb_t altimeterScreenDateTimeCb; float minValueFloat; float maxValueFloat; float altitudeOffset; lv_coord_t pressure_data_points[10]; float pressure_data_points_float[10]; + bool hour_24H_format : 1; } AltimeterScreen_t; +/** + * @brief Initializes the altimeter screen context object + * @note This function has to be called first before any others + * + * @param altimeterScreen a pointer to the altimeter screen context structure to initialize. + */ void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen); /** @@ -90,27 +108,62 @@ void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen); * This callback should be used to initialize and deinitialize needed devices drivers like the pressure/temperature sensor. * @note The state of the application is passed as a parameter of the callback function. * - * @param altimeterScreen a pointer to the altimeter screen object structure. + * @param altimeterScreen a pointer to the previously initialized altimeter screen object structure using @ref altimeter_screen_init. * @param altimeterScreenOnStateChangeCb the callback of type @ref AltimeterScreenOnStateChangeCb_t to register. */ void altimeter_screen_register_on_state_change_cb(AltimeterScreen_t * const altimeterScreen, AltimeterScreenOnStateChangeCb_t altimeterScreenOnStateChangeCb); /** - * @brief Registers a callback functions which will be called every time a user feedback should + * @brief Registers a callback function which will be called every time a user feedback should * be made. In this case, every time a button is clicked, the callback will be called. * This enables the app to react to this user event. * - * @param menuScreen a pointer to the previously initialized menu screen's context structure. - * @param menuScreenUserFeedbackCb a pointer to a function having the following signature : void(void). + * @param altimeterScreen a pointer to the previously initialized altimeter screen object structure using @ref altimeter_screen_init. + * @param altimeterScreenUserFeedbackCb a pointer to a function having the following signature : void(void) @ref AltimeterScreenUserFeedbackCb_t. */ void altimeter_screen_register_user_feedback_cb(AltimeterScreen_t * const altimeterScreen, AltimeterScreenUserFeedbackCb_t altimeterScreenUserFeedbackCb); +/** + * @brief Registers the callback function used to retrieve the data displayed in the altimeter app. + * The various data are : the temperature in °C, the pressure in hPa and the altitude in meters. + * + * @param altimeterScreen a pointer to the previously initialized altimeter screen object structure using @ref altimeter_screen_init. + * @param altimeterScreenMeasurementCb the callback of type @ref AltimeterScreenMeasurementCb_t to register. + * The function's signature is : void(float * const, float * const, float * const). + */ void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimeterScreen, AltimeterScreenMeasurementCb_t altimeterScreenMeasurementCb); +/** + * @brief Registers the callback function used to retrieve the system time to be displayed on the altitude view. + * + * @param altimeterScreen a pointer to the previously initialized altimeter screen object structure using @ref altimeter_screen_init. + * @param altimeterScreenDateTimeCb the callback of type @ref AltimeterScreenDateTimeCb_t to register. + * The function's signature is : void(struct tm * const). + */ +void altimeter_screen_register_date_time_cb(AltimeterScreen_t * const altimeterScreen, AltimeterScreenDateTimeCb_t altimeterScreenDateTimeCb); + +/** + * @brief Sets the format used to display the time on the altitude screen, ie 12H or 24H hour format. + * + * @param altimeterScreen altimeterScreen a pointer to the previously initialized altimeter screen object structure using @ref altimeter_screen_init. + * @param hour_24H_format a boolean value indicating if the hour format is 24H (true) or 12H (false). + */ +void altimeter_screen_set_displayed_hour_format(AltimeterScreen_t * const altimeterScreen, bool hour_24H_format); + void altimeter_screen_shift_chart_pressure_measurement(AltimeterScreen_t * const altimeterScreen, float pressure); +/** + * @brief Graphically builds the altimeter screen. + * + * @param altimeterScreen a pointer to the previously initialized altimeter screen object structure using @ref altimeter_screen_init. + */ void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen); +/** + * @brief Frees all resources used by the AltimeterScreen object. + * + * @param altimeterScreen a pointer to the previously initialized altimeter screen object structure using @ref altimeter_screen_init. + */ 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 68b0a80..866b50d 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/main.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/main.c @@ -120,7 +120,7 @@ static void alti_on_state_change_cb(AltimeterScreenState_e state) static void alti_meas_cb(float * const temperature, float * const pressure, float * const altitude) { static float a = 425.5; - if(temperature) *temperature = (rand() % 20) + 10; + if(temperature) *temperature = (rand() % 30) + -10; if(pressure) *pressure = (float)rand()/(float)(RAND_MAX) * 50 + 980; a += 0.2; @@ -187,6 +187,8 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi altimeter_screen_register_on_state_change_cb(&altimeterScreen, &(alti_on_state_change_cb)); altimeter_screen_register_measurement_cb(&altimeterScreen, &(alti_meas_cb)); altimeter_screen_register_user_feedback_cb(&altimeterScreen, &(user_feedback)); + altimeter_screen_register_date_time_cb(&altimeterScreen, &(date_time_cb)); + altimeter_screen_set_displayed_hour_format(&altimeterScreen, false); notification_screen_init(¬ificationScreen); notification_screen_register_on_state_change_cb(¬ificationScreen, &(notification_screen_on_state_change_cb)); notification_screen_set_displayed_hour_format(¬ificationScreen, false); diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.c b/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.c index bd16cbb..2d6cca2 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/settings_screen.c @@ -802,7 +802,7 @@ static void update_menu_list_item_text(lv_obj_t *menu_list_item, const char *tex lv_obj_t *label = lv_obj_get_child(menu_list_item, 0); if(label) { - lv_label_set_text(label, text); + lv_label_set_text_static(label, text); } } 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 b7a9750..bebdafd 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 @@ -245,7 +245,8 @@ static void hide_hour_and_minutes_hand_cb(lv_event_t *e) { WatchFace_t *watchFace = lv_event_get_user_data(e); - if(255 == lv_obj_get_style_opa(watchFace->hourHand.handImg, LV_PART_MAIN)) + // Consumes too much ram on embedded target :-( + /*if(255 == lv_obj_get_style_opa(watchFace->hourHand.handImg, LV_PART_MAIN)) { lv_obj_set_style_opa(watchFace->hourHand.handImg, 120, LV_PART_MAIN); lv_obj_set_style_opa(watchFace->minuteHand.handImg, 120, LV_PART_MAIN); @@ -254,9 +255,9 @@ static void hide_hour_and_minutes_hand_cb(lv_event_t *e) { lv_obj_set_style_opa(watchFace->hourHand.handImg, 255, LV_PART_MAIN); lv_obj_set_style_opa(watchFace->minuteHand.handImg, 255, LV_PART_MAIN); - } + }*/ - /*if(lv_obj_has_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN)) + if(lv_obj_has_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN)) { lv_obj_clear_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(watchFace->minuteHand.handImg, LV_OBJ_FLAG_HIDDEN); @@ -265,7 +266,7 @@ static void hide_hour_and_minutes_hand_cb(lv_event_t *e) { lv_obj_add_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(watchFace->minuteHand.handImg, LV_OBJ_FLAG_HIDDEN); - }*/ + } //Just for testing purposes, create a new notification char *title = malloc(strlen("JoeJohny John")+1); @@ -326,7 +327,7 @@ void watch_face_create(WatchFace_t * const watchFace) //Our display is the watch face image : watchFace->display = lv_img_create(NULL); lv_img_set_src(watchFace->display, watch_face_img); - lv_obj_set_style_bg_color(watchFace->display, lv_color_black(), LV_PART_MAIN); + lv_obj_set_style_bg_color(watchFace->display, lv_color_white(), LV_PART_MAIN); lv_obj_add_event_cb(watchFace->display, &(hide_hour_and_minutes_hand_cb), LV_EVENT_LONG_PRESSED, watchFace); //Battery arc is created here