diff --git a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c index aae2b7a..38f142c 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c +++ b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c @@ -6,19 +6,31 @@ #include "translation.h" #include "firmware_version.h" -static const char *day_options = "01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31"; -static const char *month_options = "01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12"; -static const char *year_options = "22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40"; -static const char *hour_options = "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23"; -static const char *second_minute_options = "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59"; -static const char *date_format = "dd/mm/yyyy\ndd/mm/yy\nyyyy/mm/dd\nyy/mm/dd"; +/** + * @brief Defines the visual spacing between lines of setting members in a category. + */ +#define SETTINGS_SCREEN_CATEGORY_SPACING_INNER (3) -static const char *timeout_options = "Off\n5 seconds\n10 seconds\n15 seconds\n20 seconds\n25 seconds\n30 seconds\n35 seconds\n40 seconds\n45 seconds\n50 seconds\n55 seconds\n60 seconds"; -static const char *orientation_format = "Default\n90°\n180°\n270°"; -static const char* vibration_duration = "None\n100 ms\n150 ms\n200 ms\n250 ms\n300 ms\n350 ms\n400 ms"; -static const char* vibration_strength = "1\n2\n3\n4\n5\n6\n7\n8"; +/** + * @brief Defines the visual spacing between different setting categories. + */ +#define SETTINGS_SCREEN_CATEGORY_SPACING_OUTER (10) -static const char* language_options = "Francais\nDeutsch\nEnglish"; +static const char * const day_options = "01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31"; +static const char * const month_options = "01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12"; +static const char * const year_options = "22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40"; +static const char * const hour_options = "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23"; +static const char * const second_minute_options = "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59"; +static const char * const date_format = "dd/mm/yyyy\ndd/mm/yy\nyyyy/mm/dd\nyy/mm/dd"; + +static const char * const timeout_options = "Off\n5 seconds\n10 seconds\n15 seconds\n20 seconds\n25 seconds\n30 seconds\n35 seconds\n40 seconds\n45 seconds\n50 seconds\n55 seconds\n60 seconds"; +static const char * const orientation_format = "Default\n90°\n180°\n270°"; +static const char * const vibration_duration = "None\n100 ms\n150 ms\n200 ms\n250 ms\n300 ms\n350 ms\n400 ms"; +static const char * const vibration_strength = "1\n2\n3\n4\n5\n6\n7\n8"; + +static const char * const language_options = "Francais\nDeutsch\nEnglish"; + +static const char * const default_version = "NaN"; typedef enum roller_id { @@ -42,12 +54,17 @@ typedef enum switch_id static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data, SettingsScreenCategory_e category); static void update_menu_list_item_text(lv_obj_t *menu_list_item, const char *text); - static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsScreen, lv_obj_t *item); + +/* Helper functions used to update sensor label data */ static void _set_rtc_time_to_label(SettingsScreen_t * const settingsScreen); static void _set_battery_voltage_to_label(SettingsScreen_t * const settingsScreen); -static void _set_magnetometer_data_to_label(SettingsScreen_t * const settingsScreen); -static void _set_bmp280_data_to_label(SettingsScreen_t * const settingsScreen); +static void _set_magnetometer_axes_to_label(SettingsScreen_t * const settingsScreen); +static void _set_magnetometer_temperature_to_label(SettingsScreen_t * const settingsScreen); +static void _set_accelerometer_axes_to_label(SettingsScreen_t * const settingsScreen); +static void _set_accelerometer_steps_and_temperature_to_label(SettingsScreen_t * const settingsScreen); +static void _set_pressure_sensor_to_label(SettingsScreen_t * const settingsScreen); + static void _enable_time_and_date_rollers(bool enabled, SettingsScreen_t * const settingsScreen); static void _show_ble_pairing_key(SettingsScreen_t * const settingsScreen, bool show); @@ -62,6 +79,7 @@ static void _settings_screen_update_labels_language(SettingsScreen_t * const set update_menu_list_item_text(settingsScreen->display_item, translation_get_word(TRANSLATION_DISPLAY)); update_menu_list_item_text(settingsScreen->notifications_item, translation_get_word(TRANSLATION_NOTIFICATIONS)); update_menu_list_item_text(settingsScreen->connectivity_item, translation_get_word(TRANSLATION_CONNECTIVITY)); + update_menu_list_item_text(settingsScreen->sensors_item, translation_get_word(TRANSLATION_SENSORS)); update_menu_list_item_text(settingsScreen->language_item, translation_get_word(TRANSLATION_LANGUAGE)); update_menu_list_item_text(settingsScreen->about_item, translation_get_word(TRANSLATION_ABOUT)); } @@ -79,7 +97,7 @@ static void gesture_event_cb(lv_event_t *e) case LV_DIR_RIGHT: LV_LOG_USER("GESTURE : RIGHT"); // We delete the timer if it was created - if(settingsScreen->about_refresh_timer)lv_timer_del(settingsScreen->about_refresh_timer); + if(settingsScreen->sensors_refresh_timer)lv_timer_del(settingsScreen->sensors_refresh_timer); // We create the menu screen and switch to it extern MenuScreen_t menuScreen; menu_screen_create(&menuScreen); @@ -306,21 +324,26 @@ static void factory_reset_cb(lv_event_t *e) if(settingsScreen->settingsScreenAPIInterface.factoryResetCb) settingsScreen->settingsScreenAPIInterface.factoryResetCb(); } -static void about_refresh_timer_cb(lv_timer_t *timer) +static void sensors_refresh_timer_cb(lv_timer_t *timer) { SettingsScreen_t *settingsScreen = timer->user_data; - if(!settingsScreen->about_refresh_timer) return; - + /* Timer callback is called every 150 ms, + some data don't need that update rate */ static uint8_t timer_divider = 6; + if(timer_divider++ == 6) - { + { _set_rtc_time_to_label(settingsScreen); _set_battery_voltage_to_label(settingsScreen); - _set_bmp280_data_to_label(settingsScreen); + _set_pressure_sensor_to_label(settingsScreen); + _set_magnetometer_temperature_to_label(settingsScreen); + _set_accelerometer_steps_and_temperature_to_label(settingsScreen); timer_divider = 0; } - _set_magnetometer_data_to_label(settingsScreen); + + _set_magnetometer_axes_to_label(settingsScreen); + _set_accelerometer_axes_to_label(settingsScreen); } static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) @@ -334,7 +357,7 @@ static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) lv_obj_t *switch_obj = lv_switch_create(settingsScreen->side_screen); lv_obj_set_user_data(switch_obj, (void *)SWITCH_ID_AUTOMATIC_TIME_ENABLE); - lv_obj_align_to(switch_obj, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(switch_obj, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); bool auto_set_enable = false; if(settingsScreen->settingsScreenAPIInterface.setAutomaticTimeSettingsCb)settingsScreen->settingsScreenAPIInterface.setAutomaticTimeSettingsCb(&auto_set_enable, SETTING_MODE_GET); if(auto_set_enable) @@ -349,7 +372,7 @@ static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Time :"); - lv_obj_align_to(label, switch_obj, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(label, switch_obj, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); settingsScreen->hour_roller = lv_roller_create(settingsScreen->side_screen); settingsScreen->minute_roller = lv_roller_create(settingsScreen->side_screen); @@ -375,14 +398,14 @@ static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Time Format :"); - lv_obj_align_to(label, settingsScreen->hour_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(label, settingsScreen->hour_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); bool is_24H_format = true; if(settingsScreen->settingsScreenAPIInterface.setTimeFormatSettingsCb)settingsScreen->settingsScreenAPIInterface.setTimeFormatSettingsCb(&is_24H_format, SETTING_MODE_GET); settingsScreen->checkbox_time_12H = lv_checkbox_create(settingsScreen->side_screen); lv_checkbox_set_text(settingsScreen->checkbox_time_12H, "12H"); lv_obj_set_style_radius(settingsScreen->checkbox_time_12H, LV_RADIUS_CIRCLE, LV_PART_INDICATOR); - lv_obj_align_to(settingsScreen->checkbox_time_12H, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(settingsScreen->checkbox_time_12H, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_add_event_cb(settingsScreen->checkbox_time_12H, &(time_format_cb), LV_EVENT_CLICKED, settingsScreen); settingsScreen->checkbox_time_24H = lv_checkbox_create(settingsScreen->side_screen); @@ -404,14 +427,14 @@ static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Date :"); - lv_obj_align_to(label, settingsScreen->checkbox_time_12H, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(label, settingsScreen->checkbox_time_12H, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); settingsScreen->day_roller = lv_roller_create(settingsScreen->side_screen); settingsScreen->month_roller = lv_roller_create(settingsScreen->side_screen); settingsScreen->year_roller = lv_roller_create(settingsScreen->side_screen); lv_roller_set_options(settingsScreen->day_roller, day_options, LV_ROLLER_MODE_NORMAL); - lv_obj_align_to(settingsScreen->day_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(settingsScreen->day_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_roller_set_visible_row_count(settingsScreen->day_roller, 2); lv_roller_set_selected(settingsScreen->day_roller, day-1, LV_ANIM_OFF); lv_obj_add_event_cb(settingsScreen->day_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); @@ -432,11 +455,11 @@ static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Date Format :"); - lv_obj_align_to(label, settingsScreen->day_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(label, settingsScreen->day_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_t *date_dropdown = lv_dropdown_create(settingsScreen->side_screen); lv_dropdown_set_options_static(date_dropdown, date_format); - lv_obj_align_to(date_dropdown, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(date_dropdown, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); } static void load_display_side_screen(SettingsScreen_t *settingsScreen) @@ -445,7 +468,7 @@ static void load_display_side_screen(SettingsScreen_t *settingsScreen) lv_label_set_text_static(label, "Brightness :"); lv_obj_t *slider = lv_slider_create(settingsScreen->side_screen); - lv_obj_align_to(slider, label, LV_ALIGN_OUT_BOTTOM_LEFT, 10, 10); + lv_obj_align_to(slider, label, LV_ALIGN_OUT_BOTTOM_LEFT, 10, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_clear_flag(slider, LV_OBJ_FLAG_GESTURE_BUBBLE); lv_obj_set_width(slider, lv_pct(90)); lv_slider_set_range(slider, 1, 255); @@ -456,10 +479,10 @@ static void load_display_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Display Off After :"); - lv_obj_align_to(label, slider, LV_ALIGN_OUT_BOTTOM_LEFT, -10, 10); + lv_obj_align_to(label, slider, LV_ALIGN_OUT_BOTTOM_LEFT, -10, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_t *timeout_roller = lv_roller_create(settingsScreen->side_screen); - lv_obj_align_to(timeout_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 10, 10); + lv_obj_align_to(timeout_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 10, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_roller_set_options(timeout_roller, timeout_options, LV_ROLLER_MODE_NORMAL); lv_roller_set_visible_row_count(timeout_roller, 2); uint8_t timeout = 0; @@ -469,10 +492,10 @@ static void load_display_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Screen Orientation :"); - lv_obj_align_to(label, timeout_roller, LV_ALIGN_OUT_BOTTOM_LEFT, -10, 10); + lv_obj_align_to(label, timeout_roller, LV_ALIGN_OUT_BOTTOM_LEFT, -10, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_t *orientation_dropdown = lv_dropdown_create(settingsScreen->side_screen); - lv_obj_align_to(orientation_dropdown, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(orientation_dropdown, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_dropdown_set_options_static(orientation_dropdown, orientation_format); uint8_t orientation = 0; if(settingsScreen->settingsScreenAPIInterface.setOrientationSettingsCb)settingsScreen->settingsScreenAPIInterface.setOrientationSettingsCb(&orientation, SETTING_MODE_GET); @@ -481,14 +504,14 @@ static void load_display_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Wakeup :"); - lv_obj_align_to(label, orientation_dropdown, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(label, orientation_dropdown, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_t *switch_obj = lv_switch_create(settingsScreen->side_screen); lv_obj_set_user_data(switch_obj, (void *)SWITCH_ID_WRIST_TILT_ENABLE); bool toggled = false; if(settingsScreen->settingsScreenAPIInterface.setWristTiltSettingsCb)settingsScreen->settingsScreenAPIInterface.setWristTiltSettingsCb(&toggled, SETTING_MODE_GET); if(toggled)lv_obj_add_state(switch_obj, LV_STATE_CHECKED); - lv_obj_align_to(switch_obj, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(switch_obj, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_add_event_cb(switch_obj, &(activation_switch_cb), LV_EVENT_VALUE_CHANGED, settingsScreen); label = lv_label_create(settingsScreen->side_screen); @@ -497,10 +520,10 @@ static void load_display_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Vibrate On Touch :"); - lv_obj_align_to(label, switch_obj, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(label, switch_obj, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_t *on_touch_vibration_duration_roller = lv_roller_create(settingsScreen->side_screen); - lv_obj_align_to(on_touch_vibration_duration_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(on_touch_vibration_duration_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_roller_set_options(on_touch_vibration_duration_roller, vibration_duration, LV_ROLLER_MODE_NORMAL); lv_obj_set_user_data(on_touch_vibration_duration_roller, (void *)ROLLER_ID_TOUCH_VIBRATION_DURATION); lv_roller_set_visible_row_count(on_touch_vibration_duration_roller, 2); @@ -514,7 +537,7 @@ static void load_display_side_screen(SettingsScreen_t *settingsScreen) lv_obj_align_to(label, on_touch_vibration_duration_roller, LV_ALIGN_OUT_RIGHT_MID, 5, 0); lv_obj_t *on_touch_vibration_strength_roller = lv_roller_create(settingsScreen->side_screen); - lv_obj_align_to(on_touch_vibration_strength_roller, on_touch_vibration_duration_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(on_touch_vibration_strength_roller, on_touch_vibration_duration_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_roller_set_options(on_touch_vibration_strength_roller, vibration_strength, LV_ROLLER_MODE_NORMAL); lv_obj_set_user_data(on_touch_vibration_strength_roller, (void *)ROLLER_ID_TOUCH_VIBRATION_STRENGTH); lv_roller_set_visible_row_count(on_touch_vibration_strength_roller, 2); @@ -532,7 +555,7 @@ static void load_display_side_screen(SettingsScreen_t *settingsScreen) static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) { // Messages notification header text - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); + lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Messages\nNotifications :"); // Notification enable switch @@ -542,7 +565,7 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) if(settingsScreen->settingsScreenAPIInterface.setNotificationEnabledSettingsCb) settingsScreen->settingsScreenAPIInterface.setNotificationEnabledSettingsCb(&toggled, SETTING_MODE_GET); if(toggled)lv_obj_add_state(notification_enable_switch, LV_STATE_CHECKED); - lv_obj_align_to(notification_enable_switch, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(notification_enable_switch, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_add_event_cb(notification_enable_switch, &(activation_switch_cb), LV_EVENT_VALUE_CHANGED, settingsScreen); label = lv_label_create(settingsScreen->side_screen); @@ -551,7 +574,7 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Vibrate On\nNotifications :"); - lv_obj_align_to(label, notification_enable_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(label, notification_enable_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_t *on_notification_vibration_duration_roller = lv_roller_create(settingsScreen->side_screen); lv_obj_align_to(on_notification_vibration_duration_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); @@ -569,7 +592,7 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) lv_obj_align_to(label, on_notification_vibration_duration_roller, LV_ALIGN_OUT_RIGHT_MID, 5, 0); lv_obj_t *on_notification_vibration_strength_roller = lv_roller_create(settingsScreen->side_screen); - lv_obj_align_to(on_notification_vibration_strength_roller, on_notification_vibration_duration_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(on_notification_vibration_strength_roller, on_notification_vibration_duration_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_roller_set_options(on_notification_vibration_strength_roller, vibration_strength, LV_ROLLER_MODE_NORMAL); lv_obj_set_user_data(on_notification_vibration_strength_roller, (void *)ROLLER_ID_NOTIFICATION_VIBRATION_STRENGTH); lv_roller_set_visible_row_count(on_notification_vibration_strength_roller, 2); @@ -587,7 +610,7 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) //Calls notification header text label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Calls\nNotifications :"); - lv_obj_align_to(label, on_notification_vibration_strength_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(label, on_notification_vibration_strength_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); // Call enable switch lv_obj_t *call_enable_switch = lv_switch_create(settingsScreen->side_screen); @@ -596,7 +619,7 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) if(settingsScreen->settingsScreenAPIInterface.setCallEnabledSettingsCb) settingsScreen->settingsScreenAPIInterface.setCallEnabledSettingsCb(&toggled, SETTING_MODE_GET); if(toggled)lv_obj_add_state(call_enable_switch, LV_STATE_CHECKED); - lv_obj_align_to(call_enable_switch, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(call_enable_switch, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_add_event_cb(call_enable_switch, &(activation_switch_cb), LV_EVENT_VALUE_CHANGED, settingsScreen); label = lv_label_create(settingsScreen->side_screen); @@ -605,10 +628,10 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Vibrate On Calls :"); - lv_obj_align_to(label, call_enable_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(label, call_enable_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_t *on_call_vibration_duration_roller = lv_roller_create(settingsScreen->side_screen); - lv_obj_align_to(on_call_vibration_duration_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(on_call_vibration_duration_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_roller_set_options(on_call_vibration_duration_roller, vibration_duration, LV_ROLLER_MODE_NORMAL); lv_obj_set_user_data(on_call_vibration_duration_roller, (void *)ROLLER_ID_CALL_VIBRATION_DURATION); lv_roller_set_visible_row_count(on_call_vibration_duration_roller, 2); @@ -623,7 +646,7 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) lv_obj_align_to(label, on_call_vibration_duration_roller, LV_ALIGN_OUT_RIGHT_MID, 5, 0); lv_obj_t *on_call_vibration_strength_roller = lv_roller_create(settingsScreen->side_screen); - lv_obj_align_to(on_call_vibration_strength_roller, on_call_vibration_duration_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(on_call_vibration_strength_roller, on_call_vibration_duration_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_roller_set_options(on_call_vibration_strength_roller, vibration_strength, LV_ROLLER_MODE_NORMAL); lv_obj_set_user_data(on_call_vibration_strength_roller, (void *)ROLLER_ID_CALL_VIBRATION_STRENGTH); lv_roller_set_visible_row_count(on_call_vibration_strength_roller, 2); @@ -641,45 +664,41 @@ static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) static void load_connectivity_side_screen(SettingsScreen_t *settingsScreen) { - lv_obj_t *label = lv_label_create(settingsScreen->side_screen); - lv_label_set_text_static(label, "Connectivity :"); - settingsScreen->ble_switch = lv_switch_create(settingsScreen->side_screen); lv_obj_set_user_data(settingsScreen->ble_switch, (void *)SWITCH_ID_BLE_ENABLE); - lv_obj_align_to(settingsScreen->ble_switch, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); bool ble_toggled = false; if(settingsScreen->settingsScreenAPIInterface.setBLEEnabledSettingsCb)settingsScreen->settingsScreenAPIInterface.setBLEEnabledSettingsCb(&ble_toggled, SETTING_MODE_GET); if(ble_toggled) lv_obj_add_state(settingsScreen->ble_switch, LV_STATE_CHECKED); lv_obj_add_event_cb(settingsScreen->ble_switch, &(activation_switch_cb), LV_EVENT_VALUE_CHANGED, settingsScreen); - label = lv_label_create(settingsScreen->side_screen); + lv_obj_t *label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Bluetooth"); lv_obj_align_to(label, settingsScreen->ble_switch, LV_ALIGN_OUT_RIGHT_MID, 10, 0); settingsScreen->ble_pairing_label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(settingsScreen->ble_pairing_label, "Pairing Code :"); - lv_obj_align_to(settingsScreen->ble_pairing_label, settingsScreen->ble_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(settingsScreen->ble_pairing_label, settingsScreen->ble_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_add_flag(settingsScreen->ble_pairing_label, LV_OBJ_FLAG_HIDDEN); settingsScreen->ble_pairing_key.label = lv_label_create(settingsScreen->side_screen); lv_obj_set_style_text_color(settingsScreen->ble_pairing_key.label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->ble_pairing_key.label, settingsScreen->ble_pairing_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(settingsScreen->ble_pairing_key.label, settingsScreen->ble_pairing_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); lv_obj_add_flag(settingsScreen->ble_pairing_key.label, LV_OBJ_FLAG_HIDDEN); settingsScreen->ble_dev_name_label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(settingsScreen->ble_dev_name_label, "Device Name :"); - lv_obj_align_to(settingsScreen->ble_dev_name_label, settingsScreen->ble_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(settingsScreen->ble_dev_name_label, settingsScreen->ble_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); settingsScreen->ble_dev_name_value = lv_label_create(settingsScreen->side_screen); const char * ble_dev_name = NULL; if(settingsScreen->settingsScreenAPIInterface.getBLEDeviceNameCb) settingsScreen->settingsScreenAPIInterface.getBLEDeviceNameCb(&ble_dev_name); lv_label_set_text_static(settingsScreen->ble_dev_name_value, ble_dev_name); lv_obj_set_style_text_color(settingsScreen->ble_dev_name_value, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->ble_dev_name_value, settingsScreen->ble_dev_name_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(settingsScreen->ble_dev_name_value, settingsScreen->ble_dev_name_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); settingsScreen->ble_dev_mac_label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(settingsScreen->ble_dev_mac_label, "Device MAC :"); - lv_obj_align_to(settingsScreen->ble_dev_mac_label, settingsScreen->ble_dev_name_value, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(settingsScreen->ble_dev_mac_label, settingsScreen->ble_dev_name_value, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); settingsScreen->ble_mac_addr.label = lv_label_create(settingsScreen->side_screen); const uint8_t *ble_dev_mac = NULL; @@ -695,11 +714,11 @@ static void load_connectivity_side_screen(SettingsScreen_t *settingsScreen) } lv_label_set_text_static(settingsScreen->ble_mac_addr.label, settingsScreen->ble_mac_addr.text); lv_obj_set_style_text_color(settingsScreen->ble_mac_addr.label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->ble_mac_addr.label, settingsScreen->ble_dev_mac_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(settingsScreen->ble_mac_addr.label, settingsScreen->ble_dev_mac_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); settingsScreen->wifi_switch = lv_switch_create(settingsScreen->side_screen); lv_obj_set_user_data(settingsScreen->wifi_switch, (void *)SWITCH_ID_WIFI_ENABLE); - lv_obj_align_to(settingsScreen->wifi_switch, settingsScreen->ble_mac_addr.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(settingsScreen->wifi_switch, settingsScreen->ble_mac_addr.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); bool wifi_toggled = false; if(settingsScreen->settingsScreenAPIInterface.setWiFiEnabledSettingsCb)settingsScreen->settingsScreenAPIInterface.setWiFiEnabledSettingsCb(&wifi_toggled, SETTING_MODE_GET); if(wifi_toggled) lv_obj_add_state(settingsScreen->wifi_switch, LV_STATE_CHECKED); @@ -714,13 +733,119 @@ static void load_connectivity_side_screen(SettingsScreen_t *settingsScreen) _show_ble_pairing_key(settingsScreen, ble_toggled); } +static void load_sensors_side_screen(SettingsScreen_t *settingsScreen) +{ + /* First, display the RTC time */ + lv_obj_t *rtc_time = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(rtc_time, "System Clock :"); + + settingsScreen->sensors_labels.clock.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.clock.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.clock.label, rtc_time, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + _set_rtc_time_to_label(settingsScreen); + + /* Let's display the magnetometer data */ + lv_obj_t *magnetometer_data = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(magnetometer_data, "Magnetometer :"); + lv_obj_align_to(magnetometer_data, settingsScreen->sensors_labels.clock.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); + + settingsScreen->sensors_labels.magnetometer.x.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.magnetometer.x.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.magnetometer.x.label, magnetometer_data, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 3); + + settingsScreen->sensors_labels.magnetometer.y.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.magnetometer.y.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.magnetometer.y.label, settingsScreen->sensors_labels.magnetometer.x.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + + settingsScreen->sensors_labels.magnetometer.z.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.magnetometer.z.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.magnetometer.z.label, settingsScreen->sensors_labels.magnetometer.y.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + + settingsScreen->sensors_labels.magnetometer.temperature.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.magnetometer.temperature.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.magnetometer.temperature.label, settingsScreen->sensors_labels.magnetometer.z.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + _set_magnetometer_axes_to_label(settingsScreen); + _set_magnetometer_temperature_to_label(settingsScreen); + + lv_obj_update_layout(settingsScreen->sensors_labels.magnetometer.temperature.label); + + lv_obj_t *magnetometer_cal_btn = lv_btn_create(settingsScreen->side_screen); + lv_obj_align(magnetometer_cal_btn, LV_ALIGN_TOP_MID, 0, lv_obj_get_y(settingsScreen->sensors_labels.magnetometer.temperature.label) + lv_obj_get_height(settingsScreen->sensors_labels.magnetometer.temperature.label) + SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + + lv_obj_t *magnetometer_cal_btn_label = lv_label_create(magnetometer_cal_btn); + lv_label_set_text_static(magnetometer_cal_btn_label, "Calibrate"); + lv_obj_center(magnetometer_cal_btn_label); + + lv_obj_update_layout(magnetometer_cal_btn); + + /* Let's display the accelerometer data */ + lv_obj_t *accelerometer_data = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(accelerometer_data, "Accelerometer :"); + lv_obj_align(accelerometer_data, LV_ALIGN_TOP_LEFT, 0, lv_obj_get_y(magnetometer_cal_btn) + lv_obj_get_height(magnetometer_cal_btn) + SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); + + settingsScreen->sensors_labels.accelerometer.x.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.accelerometer.x.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.accelerometer.x.label, accelerometer_data, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + + settingsScreen->sensors_labels.accelerometer.y.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.accelerometer.y.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.accelerometer.y.label, settingsScreen->sensors_labels.accelerometer.x.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + + settingsScreen->sensors_labels.accelerometer.z.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.accelerometer.z.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.accelerometer.z.label, settingsScreen->sensors_labels.accelerometer.y.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + + settingsScreen->sensors_labels.accelerometer.temperature.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.accelerometer.temperature.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.accelerometer.temperature.label, settingsScreen->sensors_labels.accelerometer.z.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + + settingsScreen->sensors_labels.accelerometer.steps.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.accelerometer.steps.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.accelerometer.steps.label, settingsScreen->sensors_labels.accelerometer.temperature.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + _set_accelerometer_axes_to_label(settingsScreen); + _set_accelerometer_steps_and_temperature_to_label(settingsScreen); + + /* Let's display the pressure sensor data */ + lv_obj_t *bmp280_data = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(bmp280_data, "Pressure &\nTemperature :"); + lv_obj_align_to(bmp280_data, settingsScreen->sensors_labels.accelerometer.steps.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); + + settingsScreen->sensors_labels.pressure.pressure.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.pressure.pressure.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.pressure.pressure.label, bmp280_data, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + + settingsScreen->sensors_labels.pressure.temperature.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.pressure.temperature.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.pressure.temperature.label, settingsScreen->sensors_labels.pressure.pressure.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + _set_pressure_sensor_to_label(settingsScreen); + + /* Let's display the battery voltage */ + lv_obj_t *battery_label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(battery_label, "Battery Voltage :"); + lv_obj_align_to(battery_label, settingsScreen->sensors_labels.pressure.temperature.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); + + settingsScreen->sensors_labels.battery_voltage.label = lv_label_create(settingsScreen->side_screen); + lv_obj_set_style_text_color(settingsScreen->sensors_labels.battery_voltage.label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(settingsScreen->sensors_labels.battery_voltage.label, battery_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + _set_battery_voltage_to_label(settingsScreen); + + /* Create and start the refresh timer */ + if(settingsScreen->sensors_refresh_timer) + { + LV_LOG_ERROR("sensors_refresh_timer should be NULL here !"); + lv_timer_del(settingsScreen->sensors_refresh_timer); + settingsScreen->sensors_refresh_timer = NULL; + } + settingsScreen->sensors_refresh_timer = lv_timer_create(&(sensors_refresh_timer_cb), 150, settingsScreen); +} + static void load_language_side_screen(SettingsScreen_t *settingsScreen) { settingsScreen->language_label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(settingsScreen->language_label, translation_get_word(TRANSLATION_LANGUAGE_2)); lv_obj_t *language_dropdown = lv_dropdown_create(settingsScreen->side_screen); - lv_obj_align_to(language_dropdown, settingsScreen->language_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(language_dropdown, settingsScreen->language_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_dropdown_set_options_static(language_dropdown, language_options); uint8_t language = 0; if(settingsScreen->settingsScreenAPIInterface.setLanguageSettingsCb)settingsScreen->settingsScreenAPIInterface.setLanguageSettingsCb(&language, SETTING_MODE_GET); @@ -735,97 +860,64 @@ static void load_about_side_screen(SettingsScreen_t *settingsScreen) lv_obj_t *firmware_label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(firmware_label, "Firmware :"); - lv_obj_align_to(firmware_label, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(firmware_label, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_t *version_label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(version_label, FIRMWARE_VERSION); lv_obj_set_style_text_color(version_label, lv_color_make(130, 130, 130), LV_PART_MAIN); lv_obj_align_to(version_label, firmware_label, LV_ALIGN_OUT_RIGHT_MID, 7, 0); - lv_obj_t* compile_label = lv_label_create(settingsScreen->side_screen); - lv_label_set_text_static(compile_label, "Compile date :"); - lv_obj_align_to(compile_label, firmware_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_t *compile_label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(compile_label, "Compile Date :"); + lv_obj_align_to(compile_label, firmware_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); - lv_obj_t* compile_date_label = lv_label_create(settingsScreen->side_screen); + lv_obj_t *compile_date_label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(compile_date_label, FIRMWARE_COMPILATION_TIME_DATE); lv_obj_set_style_text_color(compile_date_label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(compile_date_label, compile_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(compile_date_label, compile_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); - lv_obj_t* rtc_time = lv_label_create(settingsScreen->side_screen); - lv_label_set_text_static(rtc_time, "RTC :"); - lv_obj_align_to(rtc_time, compile_date_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + /* Display other firmware component's versions */ + lv_obj_t *freertos_label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(freertos_label, "FreeRTOS Version :"); + lv_obj_align_to(freertos_label, compile_date_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); - /* Display current time and date with refresh */ - settingsScreen->currentTime.current_time_label = lv_label_create(settingsScreen->side_screen); - lv_obj_set_style_text_color(settingsScreen->currentTime.current_time_label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->currentTime.current_time_label, rtc_time, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); - _set_rtc_time_to_label(settingsScreen); + lv_obj_t *freertos_version_label = lv_label_create(settingsScreen->side_screen); - lv_obj_t *magnetometer_data = lv_label_create(settingsScreen->side_screen); - lv_label_set_text_static(magnetometer_data, "Magnetometer :"); - lv_obj_align_to(magnetometer_data, settingsScreen->currentTime.current_time_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + const char *freertos_version = default_version; + if(settingsScreen->settingsScreenAPIInterface.getComponentVersionCb) + settingsScreen->settingsScreenAPIInterface.getComponentVersionCb(&freertos_version, COMPONENT_FREERTOS); - /* Display the magnetometer raw data with refresh */ - settingsScreen->magnetometer_x.label = lv_label_create(settingsScreen->side_screen); - lv_obj_set_style_text_color(settingsScreen->magnetometer_x.label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->magnetometer_x.label, magnetometer_data, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_label_set_text_static(freertos_version_label, freertos_version); + + lv_obj_set_style_text_color(freertos_version_label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(freertos_version_label, freertos_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); - settingsScreen->magnetometer_y.label = lv_label_create(settingsScreen->side_screen); - lv_obj_set_style_text_color(settingsScreen->magnetometer_y.label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->magnetometer_y.label, settingsScreen->magnetometer_x.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_t *lvgl_label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(lvgl_label, "LVGL Version :"); + lv_obj_align_to(lvgl_label, freertos_version_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); - settingsScreen->magnetometer_z.label = lv_label_create(settingsScreen->side_screen); - lv_obj_set_style_text_color(settingsScreen->magnetometer_z.label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->magnetometer_z.label, settingsScreen->magnetometer_y.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_t *lvgl_version_label = lv_label_create(settingsScreen->side_screen); - settingsScreen->magnetometer_temperature.label = lv_label_create(settingsScreen->side_screen); - lv_obj_set_style_text_color(settingsScreen->magnetometer_temperature.label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->magnetometer_temperature.label, settingsScreen->magnetometer_z.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); - _set_magnetometer_data_to_label(settingsScreen); - - lv_obj_t *bmp280_data = lv_label_create(settingsScreen->side_screen); - lv_label_set_text_static(bmp280_data, "Pressure & temp :"); - lv_obj_align_to(bmp280_data, settingsScreen->magnetometer_temperature.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); - - /* Display pressure and temperature sensor data with refresh */ - settingsScreen->bmp280_pressure.label = lv_label_create(settingsScreen->side_screen); - lv_obj_set_style_text_color(settingsScreen->bmp280_pressure.label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->bmp280_pressure.label, bmp280_data, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); - - settingsScreen->bmp280_temperature.label = lv_label_create(settingsScreen->side_screen); - lv_obj_set_style_text_color(settingsScreen->bmp280_temperature.label, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->bmp280_temperature.label, settingsScreen->bmp280_pressure.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); - _set_bmp280_data_to_label(settingsScreen); - - lv_obj_t *battery_label = lv_label_create(settingsScreen->side_screen); - lv_label_set_text_static(battery_label, "Battery Voltage :"); - lv_obj_align_to(battery_label, settingsScreen->bmp280_temperature.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); - - settingsScreen->batteryVoltage.batteryVoltageLabel = lv_label_create(settingsScreen->side_screen); - _set_battery_voltage_to_label(settingsScreen); - lv_obj_set_style_text_color(settingsScreen->batteryVoltage.batteryVoltageLabel, lv_color_make(130, 130, 130), LV_PART_MAIN); - lv_obj_align_to(settingsScreen->batteryVoltage.batteryVoltageLabel, battery_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + const char *lvgl_version = default_version; + if(settingsScreen->settingsScreenAPIInterface.getComponentVersionCb) + settingsScreen->settingsScreenAPIInterface.getComponentVersionCb(&lvgl_version, COMPONENT_LVGL); + + lv_label_set_text_static(lvgl_version_label, lvgl_version); + + lv_obj_set_style_text_color(lvgl_version_label, lv_color_make(130, 130, 130), LV_PART_MAIN); + lv_obj_align_to(lvgl_version_label, lvgl_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); label = lv_label_create(settingsScreen->side_screen); lv_label_set_text_static(label, "Factory Reset :"); - lv_obj_align_to(label, settingsScreen->batteryVoltage.batteryVoltageLabel, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(label, lvgl_version_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_t *factory_rst_btn = lv_btn_create(settingsScreen->side_screen); - lv_obj_align_to(factory_rst_btn, label, LV_ALIGN_OUT_BOTTOM_MID, 0, 5); + lv_obj_align_to(factory_rst_btn, label, LV_ALIGN_OUT_BOTTOM_MID, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_add_event_cb(factory_rst_btn, &(factory_reset_cb), LV_EVENT_CLICKED, settingsScreen); label = lv_label_create(factory_rst_btn); lv_label_set_text_static(label, "Reset"); lv_obj_center(label); - - /* Create and start the refresh timer */ - if(settingsScreen->about_refresh_timer) - { - LV_LOG_ERROR("about_refresh_timer should be NULL here !"); - lv_timer_del(settingsScreen->about_refresh_timer); - settingsScreen->about_refresh_timer = NULL; - } - settingsScreen->about_refresh_timer = lv_timer_create(&(about_refresh_timer_cb), 150, settingsScreen); } static void menu_list_item_event_handler(lv_event_t * e) @@ -918,6 +1010,7 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) lv_obj_set_style_radius(settingsScreen->side_screen, 0, LV_PART_MAIN); lv_obj_set_style_border_width(settingsScreen->side_screen, 0, LV_PART_MAIN); lv_obj_set_style_pad_left(settingsScreen->side_screen, 5, LV_PART_MAIN); + // Add some padding to make the settings page scroll longer lv_obj_set_style_pad_bottom(settingsScreen->side_screen, 70, LV_PART_MAIN); lv_obj_set_scroll_dir(settingsScreen->side_screen, LV_DIR_VER); @@ -926,6 +1019,7 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) settingsScreen->display_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_DISPLAY), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_DISPLAY); settingsScreen->notifications_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_NOTIFICATIONS), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_NOTIFICATION); settingsScreen->connectivity_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_CONNECTIVITY), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_CONNECTIVITY); + settingsScreen->sensors_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_SENSORS), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_SENSORS); settingsScreen->language_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_LANGUAGE), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_LANGUAGE); settingsScreen->about_item = add_menu_list_item(menu_list, translation_get_word(TRANSLATION_ABOUT), &(menu_list_item_event_handler), settingsScreen, SETTINGS_SCREEN_CATEGORY_ABOUT); @@ -952,26 +1046,26 @@ void settings_screen_destroy(SettingsScreen_t * const settingsScreen) settingsScreen->settingsScreenOnStateChangeCb(SETTINGS_SCREEN_STATE_CLOSED, (SettingsScreenCategory_e)lv_obj_get_user_data(settingsScreen->last_selected_item)); } - settingsScreen->hour_roller = NULL; - settingsScreen->minute_roller = NULL; - settingsScreen->second_roller = NULL; - settingsScreen->day_roller = NULL; - settingsScreen->month_roller = NULL; - settingsScreen->year_roller = NULL; - settingsScreen->display = NULL; - settingsScreen->about_refresh_timer = NULL; - settingsScreen->last_selected_item = NULL; - settingsScreen->language_label = NULL; + settingsScreen->hour_roller = NULL; + settingsScreen->minute_roller = NULL; + settingsScreen->second_roller = NULL; + settingsScreen->day_roller = NULL; + settingsScreen->month_roller = NULL; + settingsScreen->year_roller = NULL; + settingsScreen->display = NULL; + settingsScreen->sensors_refresh_timer = NULL; + settingsScreen->last_selected_item = NULL; + settingsScreen->language_label = NULL; } static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsScreen, lv_obj_t *item) { if(settingsScreen->last_selected_item == item) return; - if(settingsScreen->last_selected_item == settingsScreen->about_item) + if(settingsScreen->last_selected_item == settingsScreen->sensors_item) { - lv_timer_del(settingsScreen->about_refresh_timer); - settingsScreen->about_refresh_timer = NULL; + lv_timer_del(settingsScreen->sensors_refresh_timer); + settingsScreen->sensors_refresh_timer = NULL; } // Updating the background of the selected category @@ -1017,6 +1111,10 @@ static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsSc { load_connectivity_side_screen(settingsScreen); } + else if(item == settingsScreen->sensors_item) + { + load_sensors_side_screen(settingsScreen); + } else if(item == settingsScreen->language_item) { load_language_side_screen(settingsScreen); @@ -1029,56 +1127,130 @@ static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsSc static void _set_rtc_time_to_label(SettingsScreen_t * const settingsScreen) { - uint8_t hour = 0, minute = 0, second = 0, day = 0, month = 0, year = 0; + uint8_t hour = 0U, minute = 0U, second = 0U, day = 0U, month = 0U, year = 0U; if(settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb) settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&hour, &minute, &second, &day, &month, &year, SETTING_MODE_GET); - sprintf(settingsScreen->currentTime.current_time_text, "%s%u:%s%u:%s%u %s%u/%s%u/%u", + snprintf(settingsScreen->sensors_labels.clock.text, + sizeof(settingsScreen->sensors_labels.clock.text)-1, "%s%u:%s%u:%s%u %s%u/%s%u/%u", hour < 10 ? "0":"", hour, minute < 10 ? "0":"", minute, second < 10 ? "0":"", second, day < 10 ? "0":"", day, month + 1 < 10 ? "0":"", month + 1, year+1900); - lv_label_set_text_static(settingsScreen->currentTime.current_time_label, settingsScreen->currentTime.current_time_text); + + lv_label_set_text_static(settingsScreen->sensors_labels.clock.label, settingsScreen->sensors_labels.clock.text); } static void _set_battery_voltage_to_label(SettingsScreen_t * const settingsScreen) { - uint16_t voltage = 0; + uint16_t voltage = 0U; if(settingsScreen->settingsScreenAPIInterface.getBatteryVoltageCb) settingsScreen->settingsScreenAPIInterface.getBatteryVoltageCb(&voltage); - sprintf(settingsScreen->batteryVoltage.batteryVoltageText, "%u mV", voltage); - lv_label_set_text_static(settingsScreen->batteryVoltage.batteryVoltageLabel, settingsScreen->batteryVoltage.batteryVoltageText); + + snprintf(settingsScreen->sensors_labels.battery_voltage.text, + sizeof(settingsScreen->sensors_labels.battery_voltage.text)-1, "%u mV", voltage); + + lv_label_set_text_static(settingsScreen->sensors_labels.battery_voltage.label, settingsScreen->sensors_labels.battery_voltage.text); } -static void _set_magnetometer_data_to_label(SettingsScreen_t * const settingsScreen) +static void _set_magnetometer_axes_to_label(SettingsScreen_t * const settingsScreen) { int16_t field_x = 0, field_y = 0, field_z = 0; - float temperature = 0.0; - if(settingsScreen->settingsScreenAPIInterface.getMagnetometerRawDataCb) settingsScreen->settingsScreenAPIInterface.getMagnetometerRawDataCb(&field_x, &field_y, &field_z, &temperature); - sprintf(settingsScreen->magnetometer_x.text, "x: %d", field_x); - lv_label_set_text_static(settingsScreen->magnetometer_x.label, settingsScreen->magnetometer_x.text); + if(settingsScreen->settingsScreenAPIInterface.getMagnetometerRawDataCb) + settingsScreen->settingsScreenAPIInterface.getMagnetometerRawDataCb(&field_x, + &field_y, + &field_z, + NULL); + snprintf(settingsScreen->sensors_labels.magnetometer.x.text, + sizeof(settingsScreen->sensors_labels.magnetometer.x.text)-1, + "x: %d", field_x); + snprintf(settingsScreen->sensors_labels.magnetometer.y.text, + sizeof(settingsScreen->sensors_labels.magnetometer.y.text)-1, + "y: %d", field_y); + snprintf(settingsScreen->sensors_labels.magnetometer.z.text, + sizeof(settingsScreen->sensors_labels.magnetometer.z.text)-1, + "z: %d", field_z); - sprintf(settingsScreen->magnetometer_y.text, "y: %d", field_y); - lv_label_set_text_static(settingsScreen->magnetometer_y.label, settingsScreen->magnetometer_y.text); - - sprintf(settingsScreen->magnetometer_z.text, "z: %d", field_z); - lv_label_set_text_static(settingsScreen->magnetometer_z.label, settingsScreen->magnetometer_z.text); - - sprintf(settingsScreen->magnetometer_temperature.text, "%.2f °C", temperature); - lv_label_set_text_static(settingsScreen->magnetometer_temperature.label, settingsScreen->magnetometer_temperature.text); + lv_label_set_text_static(settingsScreen->sensors_labels.magnetometer.x.label, settingsScreen->sensors_labels.magnetometer.x.text); + lv_label_set_text_static(settingsScreen->sensors_labels.magnetometer.y.label, settingsScreen->sensors_labels.magnetometer.y.text); + lv_label_set_text_static(settingsScreen->sensors_labels.magnetometer.z.label, settingsScreen->sensors_labels.magnetometer.z.text); } -static void _set_bmp280_data_to_label(SettingsScreen_t * const settingsScreen) +static void _set_magnetometer_temperature_to_label(SettingsScreen_t * const settingsScreen) { - float pressure = 0.0, temperature = 0.0; + float temperature = 0.0f; + + if(settingsScreen->settingsScreenAPIInterface.getMagnetometerRawDataCb) + settingsScreen->settingsScreenAPIInterface.getMagnetometerRawDataCb(NULL, + NULL, + NULL, + &temperature); + + snprintf(settingsScreen->sensors_labels.magnetometer.temperature.text, + sizeof(settingsScreen->sensors_labels.magnetometer.temperature.text)-1, + "%.2f °C", temperature); + + lv_label_set_text_static(settingsScreen->sensors_labels.magnetometer.temperature.label, settingsScreen->sensors_labels.magnetometer.temperature.text); +} + +static void _set_accelerometer_axes_to_label(SettingsScreen_t * const settingsScreen) +{ + int16_t accel_x = 0, accel_y = 0, accel_z = 0; + + if(settingsScreen->settingsScreenAPIInterface.getAccelerometerRawDataCb) + settingsScreen->settingsScreenAPIInterface.getAccelerometerRawDataCb(&accel_x, + &accel_y, + &accel_z, + NULL, + NULL); + snprintf(settingsScreen->sensors_labels.accelerometer.x.text, + sizeof(settingsScreen->sensors_labels.accelerometer.x.text)-1, + "x: %d", accel_x); + snprintf(settingsScreen->sensors_labels.accelerometer.y.text, + sizeof(settingsScreen->sensors_labels.accelerometer.y.text)-1, + "y: %d", accel_y); + snprintf(settingsScreen->sensors_labels.accelerometer.z.text, + sizeof(settingsScreen->sensors_labels.accelerometer.z.text)-1, + "z: %d", accel_z); + + lv_label_set_text_static(settingsScreen->sensors_labels.accelerometer.x.label, settingsScreen->sensors_labels.accelerometer.x.text); + lv_label_set_text_static(settingsScreen->sensors_labels.accelerometer.y.label, settingsScreen->sensors_labels.accelerometer.y.text); + lv_label_set_text_static(settingsScreen->sensors_labels.accelerometer.z.label, settingsScreen->sensors_labels.accelerometer.z.text); +} + +static void _set_accelerometer_steps_and_temperature_to_label(SettingsScreen_t * const settingsScreen) +{ + float temperature = 0.0F; + uint32_t steps = 0U; + + if(settingsScreen->settingsScreenAPIInterface.getAccelerometerRawDataCb) + settingsScreen->settingsScreenAPIInterface.getAccelerometerRawDataCb(NULL, + NULL, + NULL, + &temperature, + &steps); + snprintf(settingsScreen->sensors_labels.accelerometer.temperature.text, + sizeof(settingsScreen->sensors_labels.accelerometer.temperature.text)-1, + "%.2f °C", temperature); + snprintf(settingsScreen->sensors_labels.accelerometer.steps.text, + sizeof(settingsScreen->sensors_labels.accelerometer.steps.text)-1, + "%s: %u", "steps", steps); + + lv_label_set_text_static(settingsScreen->sensors_labels.accelerometer.temperature.label, settingsScreen->sensors_labels.accelerometer.temperature.text); + lv_label_set_text_static(settingsScreen->sensors_labels.accelerometer.steps.label, settingsScreen->sensors_labels.accelerometer.steps.text); +} + +static void _set_pressure_sensor_to_label(SettingsScreen_t * const settingsScreen) +{ + float pressure = 0.0F, temperature = 0.0F; if(settingsScreen->settingsScreenAPIInterface.getBMP280DataCb) settingsScreen->settingsScreenAPIInterface.getBMP280DataCb(&temperature, &pressure); - sprintf(settingsScreen->bmp280_pressure.text, "%.2f hPa", pressure); - lv_label_set_text_static(settingsScreen->bmp280_pressure.label, settingsScreen->bmp280_pressure.text); + snprintf(settingsScreen->sensors_labels.pressure.pressure.text, sizeof(settingsScreen->sensors_labels.pressure.pressure.text)-1, "%.2f hPa", pressure); + snprintf(settingsScreen->sensors_labels.pressure.temperature.text, sizeof(settingsScreen->sensors_labels.pressure.temperature.text)-1, "%.2f °C", temperature); - sprintf(settingsScreen->bmp280_temperature.text, "%.2f °C", temperature); - lv_label_set_text_static(settingsScreen->bmp280_temperature.label, settingsScreen->bmp280_temperature.text); + lv_label_set_text_static(settingsScreen->sensors_labels.pressure.pressure.label, settingsScreen->sensors_labels.pressure.pressure.text); + lv_label_set_text_static(settingsScreen->sensors_labels.pressure.temperature.label, settingsScreen->sensors_labels.pressure.temperature.text); } static void _enable_time_and_date_rollers(bool enabled, SettingsScreen_t * const settingsScreen) @@ -1144,7 +1316,7 @@ static void update_menu_list_item_text(lv_obj_t *menu_list_item, const char *tex static void _show_ble_pairing_key(SettingsScreen_t * const settingsScreen, bool show) { - lv_obj_align_to(settingsScreen->ble_pairing_label, settingsScreen->ble_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(settingsScreen->ble_pairing_label, settingsScreen->ble_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); if(show) { uint32_t pairing_key = 0; @@ -1152,7 +1324,7 @@ static void _show_ble_pairing_key(SettingsScreen_t * const settingsScreen, bool sprintf(settingsScreen->ble_pairing_key.text, "%u", pairing_key); lv_label_set_text_static(settingsScreen->ble_pairing_key.label, settingsScreen->ble_pairing_key.text); - lv_obj_align_to(settingsScreen->ble_dev_name_label, settingsScreen->ble_pairing_key.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(settingsScreen->ble_dev_name_label, settingsScreen->ble_pairing_key.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_clear_flag(settingsScreen->ble_pairing_label, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(settingsScreen->ble_pairing_key.label, LV_OBJ_FLAG_HIDDEN); } @@ -1160,12 +1332,12 @@ static void _show_ble_pairing_key(SettingsScreen_t * const settingsScreen, bool { lv_obj_add_flag(settingsScreen->ble_pairing_key.label, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(settingsScreen->ble_pairing_label, LV_OBJ_FLAG_HIDDEN); - lv_obj_align_to(settingsScreen->ble_dev_name_label, settingsScreen->ble_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); + lv_obj_align_to(settingsScreen->ble_dev_name_label, settingsScreen->ble_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); } - lv_obj_align_to(settingsScreen->ble_dev_name_value, settingsScreen->ble_dev_name_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); - lv_obj_align_to(settingsScreen->ble_dev_mac_label, settingsScreen->ble_dev_name_value, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); - lv_obj_align_to(settingsScreen->ble_mac_addr.label, settingsScreen->ble_dev_mac_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 5); - lv_obj_align_to(settingsScreen->wifi_switch, settingsScreen->ble_mac_addr.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_obj_align_to(settingsScreen->ble_dev_name_value, settingsScreen->ble_dev_name_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + lv_obj_align_to(settingsScreen->ble_dev_mac_label, settingsScreen->ble_dev_name_value, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); + lv_obj_align_to(settingsScreen->ble_mac_addr.label, settingsScreen->ble_dev_mac_label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_INNER); + lv_obj_align_to(settingsScreen->wifi_switch, settingsScreen->ble_mac_addr.label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, SETTINGS_SCREEN_CATEGORY_SPACING_OUTER); lv_obj_align_to(settingsScreen->wifi_label, settingsScreen->wifi_switch, LV_ALIGN_OUT_RIGHT_MID, 10, 0); } diff --git a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h index 1dcc4bb..71ec3c7 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h +++ b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h @@ -9,6 +9,12 @@ typedef enum SettingMode SETTING_MODE_SET } SettingMode_e; +typedef enum ComponentVersion +{ + COMPONENT_FREERTOS = 0, + COMPONENT_LVGL +} ComponentVersion_e; + typedef struct SettingsScreenAPIInterface { void (*setAutomaticTimeSettingsCb)(bool *enabled, SettingMode_e mode); @@ -34,7 +40,9 @@ typedef struct SettingsScreenAPIInterface void (*getBLEDevicePairingKeyCb)(uint32_t *pairing_key); void (*getBatteryVoltageCb)(uint16_t *battery_voltage); void (*getMagnetometerRawDataCb)(int16_t *field_x, int16_t *field_y, int16_t *field_z, float *temperature); + void (*getAccelerometerRawDataCb)(int16_t *accel_x, int16_t *accel_y, int16_t *accel_z, float *temperature, uint32_t *step_count); void (*getBMP280DataCb)(float *temperature, float *pressure); + void (*getComponentVersionCb)(const char **version, ComponentVersion_e component); void (*saveSettingsCb)(void); void (*factoryResetCb)(void); } SettingsScreenAPIInterface_t; @@ -51,6 +59,7 @@ typedef enum SettingsScreenCategory SETTINGS_SCREEN_CATEGORY_DISPLAY, SETTINGS_SCREEN_CATEGORY_NOTIFICATION, SETTINGS_SCREEN_CATEGORY_CONNECTIVITY, + SETTINGS_SCREEN_CATEGORY_SENSORS, SETTINGS_SCREEN_CATEGORY_LANGUAGE, SETTINGS_SCREEN_CATEGORY_ABOUT, } SettingsScreenCategory_e; @@ -66,6 +75,7 @@ typedef struct SettingsScreen lv_obj_t *display_item; lv_obj_t *notifications_item; lv_obj_t *connectivity_item; + lv_obj_t *sensors_item; lv_obj_t *language_item; lv_obj_t *about_item; /* Remember the last clicked item needed for the background color logic */ @@ -91,30 +101,66 @@ typedef struct SettingsScreen lv_obj_t *ble_dev_mac_label; lv_obj_t *language_label; + struct + { + struct + { + lv_obj_t *label; + char text[20]; + } clock; + + struct + { + struct + { + lv_obj_t *label; + char text[11]; + } x, y, z, temperature; + } magnetometer; + + struct + { + struct + { + lv_obj_t *label; + char text[11]; + } x, y, z, temperature; + + struct + { + lv_obj_t *label; + char text[18]; + } steps; + } accelerometer; + + struct + { + struct + { + lv_obj_t *label; + char text[13]; + } pressure; + + struct + { + lv_obj_t *label; + char text[11]; + } temperature; + } pressure; + + struct + { + lv_obj_t *label; + char text[8]; + } battery_voltage; + } sensors_labels; + struct { lv_obj_t *current_time_label; char current_time_text[20]; } currentTime; - struct - { - lv_obj_t *batteryVoltageLabel; - char batteryVoltageText[8]; - } batteryVoltage; - - struct - { - lv_obj_t *label; - char text[11]; - } magnetometer_x, magnetometer_y, magnetometer_z, magnetometer_temperature, bmp280_temperature; - - struct - { - lv_obj_t *label; - char text[13]; - } bmp280_pressure; - struct { lv_obj_t *label; @@ -126,12 +172,12 @@ typedef struct SettingsScreen lv_obj_t *label; char text[7]; } ble_pairing_key; - + /* Main screen */ lv_obj_t *display; /* Other */ - lv_timer_t *about_refresh_timer; + lv_timer_t *sensors_refresh_timer; SettingsScreenOnStateChangeCb_t settingsScreenOnStateChangeCb; SettingsScreenUserFeedbackCb_t settingsScreenUserFeedbackCb; } SettingsScreen_t; @@ -141,8 +187,8 @@ void settings_screen_init(SettingsScreen_t * const settingsScreen); /** * @brief Registers a callback function which will be called every time the state of the application changes ie : is opened or closed. * This callback should be used to initialize and deinitialize needed devices drivers like the magnetometer or the temperature sensor. - * @note The state of the application is passed as a parameter of the callback function. - * + * @note The state of the application is passed as a parameter of the callback function. + * * @param settingsScreen a pointer to the previously initialized settings screen object structure. * @param SettingsScreenOnStateChangeCb the callback of type @ref SettingsScreenOnStateChangeCb_t to register. */