Updated lvgl simulator files

This commit is contained in:
anschrammh 2024-07-31 16:11:36 +02:00
parent a370f6e3e2
commit f2a770c85f
5 changed files with 266 additions and 58 deletions

View File

@ -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 !");
}
}

View File

@ -3,6 +3,7 @@
#define ALTIMETER_SCREEN_H
#include "lvgl.h"
#include <time.h>
#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

View File

@ -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(&notificationScreen);
notification_screen_register_on_state_change_cb(&notificationScreen, &(notification_screen_on_state_change_cb));
notification_screen_set_displayed_hour_format(&notificationScreen, false);

View File

@ -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);
}
}

View File

@ -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