From 185b7a7efabbaaef2a585e480ac5b5f7db5b5e40 Mon Sep 17 00:00:00 2001 From: anschrammh Date: Fri, 24 Mar 2023 14:58:39 +0100 Subject: [PATCH] Major rework of the settings screen : - reduced RAM footprint by 10K :-) - Added the new about category displaying infos about the watch's firmware - Now widgets are reloaded with current parameters's values - Almost all settings are taken into account --- .../app/gfx/settings_screen.c | 974 +++++++++--------- .../app/gfx/settings_screen.h | 45 +- 2 files changed, 532 insertions(+), 487 deletions(-) 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 bdbd9d5..794dbb3 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 @@ -2,6 +2,8 @@ #include "common_screen_components.h" #include "settings_screen.h" #include "menu_screen.h" +#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"; @@ -10,10 +12,24 @@ static const char *hour_options = "00\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n1 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"; -static const char *timeout_options = "0\n5\n10\n15\n20\n25\n30\n35\n40\n45\n50\n55\n60"; +static const char *timeout_options = "Never\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\n50 ms\n100 ms\n150 ms\n200 ms\n250 ms\n300 ms\n350 ms"; +static const char* vibration_force = "1\n2\n3\n4\n5\n6\n7\n8"; -static void gesture_event_cb(lv_event_t * e) +static const char* language_options = "Francais\nDeutsch\nEnglish"; + +static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsScreen, lv_obj_t *item); +static void _set_rtc_time_to_label(SettingsScreen_t * const settingsScreen); + +static void _settings_screen_update_labels_language(SettingsScreen_t * const settingsScreen) +{ + //Update the header's title + common_screen_header_update_title(translation_get_word(TRANSLATION_SETTINGS)); + // And all other labels +} + +static void gesture_event_cb(lv_event_t *e) { SettingsScreen_t *settingsScreen = e->user_data; @@ -25,6 +41,8 @@ static void gesture_event_cb(lv_event_t * e) break; 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); // We create the menu screen and switch to it extern MenuScreen_t menuScreen; menu_screen_create(&menuScreen); @@ -41,71 +59,110 @@ static void gesture_event_cb(lv_event_t * e) } } -static void cleanup_event_cb(lv_event_t * e) +static void cleanup_event_cb(lv_event_t *e) { SettingsScreen_t *settingsScreen = e->user_data; settings_screen_destroy(settingsScreen); LV_LOG_USER("cleanup"); } -static void time_roller_cb(lv_event_t * e) +static void time_roller_cb(lv_event_t *e) { SettingsScreen_t *settingsScreen = e->user_data; if(!settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb) return; lv_obj_t *roller = lv_event_get_target(e); uint8_t index = lv_roller_get_selected(roller); + uint8_t NOT_SELECTED = 0xFF; if(roller == settingsScreen->hour_roller) { - settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(index, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); + settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&index, &NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, SETTING_MODE_SET); } else if(roller == settingsScreen->minute_roller) { - settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(0xFF, index, 0xFF, 0xFF, 0xFF, 0xFF); + settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&NOT_SELECTED, &index, &NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, SETTING_MODE_SET); } else if(roller == settingsScreen->second_roller) { - settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(0xFF, 0xFF, index, 0xFF, 0xFF, 0xFF); + settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&NOT_SELECTED, &NOT_SELECTED, &index, &NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, SETTING_MODE_SET); } else if(roller == settingsScreen->day_roller) { - settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(0xFF, 0xFF, 0xFF, index + 1, 0xFF, 0xFF); + index+=1; + settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, &index, &NOT_SELECTED, &NOT_SELECTED, SETTING_MODE_SET); } else if(roller == settingsScreen->month_roller) { - settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(0xFF, 0xFF, 0xFF, 0xFF, index + 1, 0xFF); + index+=1; + settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, &index, &NOT_SELECTED, SETTING_MODE_SET); } else { - settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, index + 22); + index+=22; + settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, &NOT_SELECTED, &index, SETTING_MODE_SET); } } -static void brightness_slider_cb(lv_event_t * e) +static void time_format_cb(lv_event_t *e) +{ + SettingsScreen_t *settingsScreen = e->user_data; + + if(e->target == settingsScreen->checkbox_time_12H) + { + lv_obj_clear_state(settingsScreen->checkbox_time_24H, LV_STATE_CHECKED); + } + else if(e->target == settingsScreen->checkbox_time_24H) + { + lv_obj_clear_state(settingsScreen->checkbox_time_12H, LV_STATE_CHECKED); + } +} + +static void brightness_slider_cb(lv_event_t *e) { SettingsScreen_t *settingsScreen = e->user_data; if(!settingsScreen->settingsScreenAPIInterface.setBrightnessSettingsCb) return; - + lv_obj_t *slider = lv_event_get_target(e); - uint8_t brightness = (float)lv_slider_get_value(slider) * 2.55; - - if(brightness > 0) - settingsScreen->settingsScreenAPIInterface.setBrightnessSettingsCb(brightness); + uint8_t brightness = lv_slider_get_value(slider); + + settingsScreen->settingsScreenAPIInterface.setBrightnessSettingsCb(&brightness, SETTING_MODE_SET); +} + +static void vibration_duration_roller_cb(lv_event_t *e) +{ + SettingsScreen_t *settingsScreen = e->user_data; + if(!settingsScreen->settingsScreenAPIInterface.setDisplayVibrationDurationSettingsCb) return; + + lv_obj_t *roller = lv_event_get_target(e); + uint8_t index = lv_roller_get_selected(roller); + + settingsScreen->settingsScreenAPIInterface.setDisplayVibrationDurationSettingsCb(&index, SETTING_MODE_SET); +} + +static void vibration_strength_roller_cb(lv_event_t *e) +{ + SettingsScreen_t *settingsScreen = e->user_data; + if(!settingsScreen->settingsScreenAPIInterface.setDisplayVibrationStrengthSettingsCb) return; + + lv_obj_t *roller = lv_event_get_target(e); + uint8_t index = lv_roller_get_selected(roller); + + settingsScreen->settingsScreenAPIInterface.setDisplayVibrationStrengthSettingsCb(&index, SETTING_MODE_SET); } static void timeout_roller_cb(lv_event_t * e) { SettingsScreen_t *settingsScreen = e->user_data; if(!settingsScreen->settingsScreenAPIInterface.setTimeoutSettingsCb) return; - + lv_obj_t *roller = lv_event_get_target(e); - uint8_t timeout = lv_roller_get_selected(roller) * 5; - settingsScreen->settingsScreenAPIInterface.setTimeoutSettingsCb(timeout); + uint8_t timeout = lv_roller_get_selected(roller); + settingsScreen->settingsScreenAPIInterface.setTimeoutSettingsCb(&timeout, SETTING_MODE_SET); } -static void orientation_dropdown_cb(lv_event_t * e) +static void orientation_dropdown_cb(lv_event_t *e) { SettingsScreen_t *settingsScreen = e->user_data; @@ -114,43 +171,360 @@ static void orientation_dropdown_cb(lv_event_t * e) lv_obj_t *dropdown = lv_event_get_target(e); uint8_t orientation = lv_dropdown_get_selected(dropdown); - settingsScreen->settingsScreenAPIInterface.setOrientationSettingsCb(orientation); + settingsScreen->settingsScreenAPIInterface.setOrientationSettingsCb(&orientation, SETTING_MODE_SET); } -static lv_obj_t* add_sidebar_entry_to_menu(lv_obj_t *parent, const char *title, lv_obj_t *menu, lv_obj_t *pageToShow) +static void activation_switch_cb(lv_event_t *e) { - lv_obj_t *container = lv_menu_cont_create(parent); - lv_obj_t *label = lv_label_create(container); - lv_label_set_text_static(label, title); - lv_obj_set_style_text_color(label, lv_color_make(145, 145, 145), LV_PART_MAIN); - lv_obj_set_flex_grow(label, 1); + SettingsScreen_t *settingsScreen = e->user_data; - lv_menu_set_load_page_event(menu, label, pageToShow); + bool toggled = lv_obj_has_state(e->target, LV_STATE_CHECKED); - return label; + if(e->target == settingsScreen->ble_switch) + { + if(settingsScreen->settingsScreenAPIInterface.setBLEEnabledSettingsCb)settingsScreen->settingsScreenAPIInterface.setBLEEnabledSettingsCb(&toggled, SETTING_MODE_SET); + } + else if(e->target == settingsScreen->wifi_switch) + { + if(settingsScreen->settingsScreenAPIInterface.setWiFiEnabledSettingsCb)settingsScreen->settingsScreenAPIInterface.setWiFiEnabledSettingsCb(&toggled, SETTING_MODE_SET); + } } -static lv_obj_t* create_menu_page_section(lv_obj_t *menu_page) +static void language_dropdown_cb(lv_event_t *e) { - lv_obj_t *section = lv_menu_section_create(menu_page); - lv_obj_set_style_pad_bottom(section, 50, LV_PART_MAIN); - lv_obj_set_style_pad_top(section, 5, LV_PART_MAIN); - lv_obj_set_style_pad_left(section, 5, LV_PART_MAIN); + SettingsScreen_t *settingsScreen = e->user_data; - return section; + if(!settingsScreen->settingsScreenAPIInterface.setLanguageSettingsCb) return; + + lv_obj_t *dropdown = lv_event_get_target(e); + uint8_t language = lv_dropdown_get_selected(dropdown); + + settingsScreen->settingsScreenAPIInterface.setLanguageSettingsCb(&language, SETTING_MODE_SET); + + // Do not forget to change the texts on the current UI... + _settings_screen_update_labels_language(settingsScreen); } -static lv_obj_t* create_section_container(lv_obj_t *section) +static void about_refresh_timer_cb(lv_timer_t *timer) { - lv_obj_t *container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - lv_obj_clear_flag(container, LV_OBJ_FLAG_SCROLLABLE); + SettingsScreen_t *settingsScreen = timer->user_data; + _set_rtc_time_to_label(settingsScreen); +} - return container; +static lv_obj_t *add_menu_list_item(lv_obj_t *list, const char *text, lv_event_cb_t event_cb, void *user_data) +{ + lv_obj_t *btn = lv_list_add_btn(list, NULL, text); + lv_obj_t *label = lv_obj_get_child(btn, 0); + if(label) + { + lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); + lv_obj_set_style_pad_right(btn, 0, LV_PART_MAIN); + } + + lv_obj_add_event_cb(btn, event_cb, LV_EVENT_CLICKED, user_data); + return btn; +} + +static void load_time_and_date_side_screen(SettingsScreen_t *settingsScreen) +{ + lv_obj_clean(settingsScreen->side_screen); + + uint8_t hour = 0, minute = 0, second = 0, day = 0, month = 0, year = 0; + if(settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb) + settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&hour, &minute, &second, &day, &month, &year, SETTING_MODE_GET); + + lv_obj_t *label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Set Time & Date :"); + + lv_obj_t *toggle = lv_switch_create(settingsScreen->side_screen); + lv_obj_align_to(toggle, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + label = lv_label_create(settingsScreen->side_screen); + + lv_label_set_text_static(label, "Automatic"); + lv_obj_align_to(label, toggle, LV_ALIGN_OUT_RIGHT_MID, 10, 0); + + label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Time :"); + lv_obj_align_to(label, toggle, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + + settingsScreen->hour_roller = lv_roller_create(settingsScreen->side_screen); + settingsScreen->minute_roller = lv_roller_create(settingsScreen->side_screen); + settingsScreen->second_roller = lv_roller_create(settingsScreen->side_screen); + + lv_roller_set_options(settingsScreen->hour_roller, hour_options, LV_ROLLER_MODE_NORMAL); + lv_obj_align_to(settingsScreen->hour_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_roller_set_visible_row_count(settingsScreen->hour_roller, 2); + lv_roller_set_selected(settingsScreen->hour_roller, hour, LV_ANIM_OFF); + lv_obj_add_event_cb(settingsScreen->hour_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); + + lv_roller_set_options(settingsScreen->minute_roller, second_minute_options, LV_ROLLER_MODE_NORMAL); + lv_obj_align_to(settingsScreen->minute_roller, settingsScreen->hour_roller, LV_ALIGN_OUT_RIGHT_TOP, 5, 0); + lv_roller_set_visible_row_count(settingsScreen->minute_roller, 2); + lv_roller_set_selected(settingsScreen->minute_roller, minute, LV_ANIM_OFF); + lv_obj_add_event_cb(settingsScreen->minute_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); + + lv_roller_set_options(settingsScreen->second_roller, second_minute_options, LV_ROLLER_MODE_NORMAL); + lv_obj_align_to(settingsScreen->second_roller, settingsScreen->minute_roller, LV_ALIGN_OUT_RIGHT_TOP, 5, 0); + lv_roller_set_visible_row_count(settingsScreen->second_roller, 2); + lv_roller_set_selected(settingsScreen->second_roller, second, LV_ANIM_OFF); + lv_obj_add_event_cb(settingsScreen->second_roller, &(time_roller_cb), LV_EVENT_RELEASED, 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); + + 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_add_event_cb(settingsScreen->checkbox_time_12H, &(time_format_cb), LV_EVENT_CLICKED, settingsScreen); + + settingsScreen->checkbox_time_24H = lv_checkbox_create(settingsScreen->side_screen); + lv_checkbox_set_text(settingsScreen->checkbox_time_24H, "24H"); + lv_obj_add_state(settingsScreen->checkbox_time_24H, LV_STATE_CHECKED); + lv_obj_set_style_radius(settingsScreen->checkbox_time_24H, LV_RADIUS_CIRCLE, LV_PART_INDICATOR); + lv_obj_align_to(settingsScreen->checkbox_time_24H, settingsScreen->checkbox_time_12H, LV_ALIGN_OUT_RIGHT_TOP, 10, 0); + lv_obj_add_event_cb(settingsScreen->checkbox_time_24H, &(time_format_cb), LV_EVENT_CLICKED, 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); + + 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_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); + + lv_roller_set_options(settingsScreen->month_roller, month_options, LV_ROLLER_MODE_NORMAL); + lv_obj_align_to(settingsScreen->month_roller, settingsScreen->day_roller, LV_ALIGN_OUT_RIGHT_TOP, 5, 0); + lv_roller_set_visible_row_count(settingsScreen->month_roller, 2); + lv_roller_set_selected(settingsScreen->month_roller, month-1, LV_ANIM_OFF); + lv_obj_add_event_cb(settingsScreen->month_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); + + lv_roller_set_options(settingsScreen->year_roller, year_options, LV_ROLLER_MODE_NORMAL); + lv_obj_align_to(settingsScreen->year_roller, settingsScreen->month_roller, LV_ALIGN_OUT_RIGHT_TOP, 5, 0); + lv_roller_set_visible_row_count(settingsScreen->year_roller, 2); + lv_roller_set_selected(settingsScreen->year_roller, year-22, LV_ANIM_OFF); + lv_obj_add_event_cb(settingsScreen->year_roller, &(time_roller_cb), LV_EVENT_RELEASED, 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_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); +} + +static void load_display_side_screen(SettingsScreen_t *settingsScreen) +{ + lv_obj_clean(settingsScreen->side_screen); + + lv_obj_t *label = lv_label_create(settingsScreen->side_screen); + 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_clear_flag(slider, LV_OBJ_FLAG_GESTURE_BUBBLE); + lv_obj_set_width(slider, lv_pct(90)); + lv_slider_set_range(slider, 1, 255); + uint8_t current_brightness = 255; + if(settingsScreen->settingsScreenAPIInterface.setBrightnessSettingsCb)settingsScreen->settingsScreenAPIInterface.setBrightnessSettingsCb(¤t_brightness, SETTING_MODE_GET); + lv_slider_set_value(slider, current_brightness, LV_ANIM_OFF); + lv_obj_add_event_cb(slider, &(brightness_slider_cb), LV_EVENT_VALUE_CHANGED, 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_t *timeout_roller = lv_roller_create(settingsScreen->side_screen); + lv_obj_align_to(timeout_roller, label, LV_ALIGN_OUT_BOTTOM_LEFT, 10, 10); + 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; + if(settingsScreen->settingsScreenAPIInterface.setTimeoutSettingsCb)settingsScreen->settingsScreenAPIInterface.setTimeoutSettingsCb(&timeout, SETTING_MODE_GET); + lv_roller_set_selected(timeout_roller, timeout, LV_ANIM_OFF); + lv_obj_add_event_cb(timeout_roller, &(timeout_roller_cb), LV_EVENT_RELEASED, 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_t *orientation_dropdown = lv_dropdown_create(settingsScreen->side_screen); + lv_obj_align_to(orientation_dropdown, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_dropdown_set_options_static(orientation_dropdown, orientation_format); + uint8_t orientation = 0; + if(settingsScreen->settingsScreenAPIInterface.setOrientationSettingsCb)settingsScreen->settingsScreenAPIInterface.setOrientationSettingsCb(&orientation, SETTING_MODE_GET); + lv_dropdown_set_selected(orientation_dropdown, orientation); + lv_obj_add_event_cb(orientation_dropdown, &(orientation_dropdown_cb), LV_EVENT_VALUE_CHANGED, 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_t *wrist_tilt_toggle = lv_switch_create(settingsScreen->side_screen); + lv_obj_align_to(wrist_tilt_toggle, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + + label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Wrist Tilt"); + lv_obj_align_to(label, wrist_tilt_toggle, LV_ALIGN_OUT_RIGHT_MID, 10, 0); + + label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Vibrate On Touch :"); + lv_obj_align_to(label, wrist_tilt_toggle, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + + 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_roller_set_options(on_touch_vibration_duration_roller, vibration_duration, LV_ROLLER_MODE_NORMAL); + lv_roller_set_visible_row_count(on_touch_vibration_duration_roller, 2); + uint8_t duration = 0; + if(settingsScreen->settingsScreenAPIInterface.setDisplayVibrationDurationSettingsCb)settingsScreen->settingsScreenAPIInterface.setDisplayVibrationDurationSettingsCb(&duration, SETTING_MODE_GET); + lv_roller_set_selected(on_touch_vibration_duration_roller, duration, LV_ANIM_OFF); + lv_obj_add_event_cb(on_touch_vibration_duration_roller, &(vibration_duration_roller_cb), LV_EVENT_RELEASED, settingsScreen); + + label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Duration"); + lv_obj_align_to(label, on_touch_vibration_duration_roller, LV_ALIGN_OUT_RIGHT_MID, 10, 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_roller_set_options(on_touch_vibration_strength_roller, vibration_force, LV_ROLLER_MODE_NORMAL); + lv_roller_set_visible_row_count(on_touch_vibration_strength_roller, 2); + lv_obj_set_width(on_touch_vibration_strength_roller, lv_obj_get_width(on_touch_vibration_duration_roller)); + lv_obj_add_event_cb(on_touch_vibration_strength_roller, &(vibration_strength_roller_cb), LV_EVENT_RELEASED, settingsScreen); + + label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Strength"); + lv_obj_align_to(label, on_touch_vibration_strength_roller, LV_ALIGN_OUT_RIGHT_MID, 10, 0); +} + +static void load_notifications_side_screen(SettingsScreen_t *settingsScreen) +{ + lv_obj_clean(settingsScreen->side_screen); + + lv_obj_t *label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Vibrate on\nnotifications :"); + + 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_roller_set_options(on_touch_vibration_duration_roller, vibration_duration, LV_ROLLER_MODE_NORMAL); + lv_roller_set_visible_row_count(on_touch_vibration_duration_roller, 2); + //lv_obj_add_event_cb(vibration_duration_roller, &(vibration_duration_roller_cb), LV_EVENT_RELEASED, settingsScreen); + + label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Duration"); + lv_obj_align_to(label, on_touch_vibration_duration_roller, LV_ALIGN_OUT_RIGHT_MID, 10, 0); + + lv_obj_t *on_touch_vibration_force_roller = lv_roller_create(settingsScreen->side_screen); + lv_obj_align_to(on_touch_vibration_force_roller, on_touch_vibration_duration_roller, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_roller_set_options(on_touch_vibration_force_roller, vibration_force, LV_ROLLER_MODE_NORMAL); + lv_roller_set_visible_row_count(on_touch_vibration_force_roller, 2); + lv_obj_set_width(on_touch_vibration_force_roller, lv_obj_get_width(on_touch_vibration_duration_roller)); + + label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Force"); + lv_obj_align_to(label, on_touch_vibration_force_roller, LV_ALIGN_OUT_RIGHT_MID, 10, 0); +} + +static void load_connectivity_side_screen(SettingsScreen_t *settingsScreen) +{ + lv_obj_clean(settingsScreen->side_screen); + + 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_align_to(settingsScreen->ble_switch, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + bool toggled = false; + if(settingsScreen->settingsScreenAPIInterface.setBLEEnabledSettingsCb)settingsScreen->settingsScreenAPIInterface.setBLEEnabledSettingsCb(&toggled, SETTING_MODE_GET); + if(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_label_set_text_static(label, "Bluetooth"); + lv_obj_align_to(label, settingsScreen->ble_switch, LV_ALIGN_OUT_RIGHT_MID, 10, 0); + + settingsScreen->wifi_switch = lv_switch_create(settingsScreen->side_screen); + lv_obj_align_to(settingsScreen->wifi_switch, settingsScreen->ble_switch, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + if(settingsScreen->settingsScreenAPIInterface.setWiFiEnabledSettingsCb)settingsScreen->settingsScreenAPIInterface.setWiFiEnabledSettingsCb(&toggled, SETTING_MODE_GET); + if(toggled) lv_obj_add_state(settingsScreen->wifi_switch, LV_STATE_CHECKED); + lv_obj_add_event_cb(settingsScreen->wifi_switch, &(activation_switch_cb), LV_EVENT_VALUE_CHANGED, settingsScreen); + + label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "WiFi"); + lv_obj_align_to(label, settingsScreen->wifi_switch, LV_ALIGN_OUT_RIGHT_MID, 10, 0); +} + +static void load_language_side_screen(SettingsScreen_t *settingsScreen) +{ + lv_obj_clean(settingsScreen->side_screen); + + lv_obj_t *label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "Language :"); + + lv_obj_t *language_dropdown = lv_dropdown_create(settingsScreen->side_screen); + lv_obj_align_to(language_dropdown, label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + lv_dropdown_set_options_static(language_dropdown, language_options); + uint8_t language = 0; + if(settingsScreen->settingsScreenAPIInterface.setLanguageSettingsCb)settingsScreen->settingsScreenAPIInterface.setLanguageSettingsCb(&language, SETTING_MODE_GET); + lv_dropdown_set_selected(language_dropdown, language); + lv_obj_add_event_cb(language_dropdown, &(language_dropdown_cb), LV_EVENT_VALUE_CHANGED, settingsScreen); +} + +static void load_about_side_screen(SettingsScreen_t *settingsScreen) +{ + lv_obj_clean(settingsScreen->side_screen); + + lv_obj_t *label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(label, "System Info :"); + + 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_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_date_label = lv_label_create(settingsScreen->side_screen); + lv_label_set_text_static(compile_date_label, FIRMWARE_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_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 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); + + /* 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), 1000, settingsScreen); +} + +static void menu_list_item_event_handler(lv_event_t * e) +{ + SettingsScreen_t *settingsScreen = e->user_data; + _simulate_side_screen_item_click(settingsScreen, e->target); } void settings_screen_init(SettingsScreen_t * const settingsScreen) @@ -196,171 +570,43 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen) settingsScreen->display = lv_obj_create(NULL); //We add the screen header - common_screen_header_component(settingsScreen->display, "Settings", 65); + common_screen_header_component(settingsScreen->display, translation_get_word(TRANSLATION_SETTINGS), 50); - //We create the menu - lv_obj_t *menu = lv_menu_create(settingsScreen->display); - lv_obj_set_size(menu, lv_pct(100), 240 - 65); - lv_obj_set_pos(menu, 0, 65); + //We create the menu list on the left hand side + lv_obj_t *menu_list = lv_list_create(settingsScreen->display); + lv_obj_set_size(menu_list, 75,190); + lv_obj_set_pos(menu_list, 0, 50); + lv_obj_set_style_radius(menu_list, 0, LV_PART_MAIN); + lv_obj_set_style_border_width(menu_list, 0, LV_PART_MAIN); + lv_obj_set_style_pad_right(menu_list, 0, LV_PART_MAIN); + lv_obj_set_style_pad_left(menu_list, 7, LV_PART_MAIN); + lv_obj_set_style_pad_bottom(menu_list, 50, LV_PART_MAIN); - //We create the menu page for the time and date settings - lv_obj_t *menu_page_1 = lv_menu_page_create(menu, NULL); + //We add the side screen containing the settings + settingsScreen->side_screen = lv_obj_create(settingsScreen->display); + lv_obj_set_size(settingsScreen->side_screen, 165,190); + lv_obj_set_pos(settingsScreen->side_screen, 75, 50); + 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); + lv_obj_set_style_pad_bottom(settingsScreen->side_screen, 70, LV_PART_MAIN); + lv_obj_set_scroll_dir(settingsScreen->side_screen, LV_DIR_VER); - lv_obj_t *section = create_menu_page_section(menu_page_1); - - lv_obj_t *menu_page_label = lv_label_create(section); - lv_label_set_text_static(menu_page_label, "Set Time & Date :"); - - lv_obj_t *container = create_section_container(section); - lv_obj_t *toggle = lv_switch_create(container); - lv_obj_t *toggle_label = lv_label_create(container); - lv_label_set_text_static(toggle_label, "Automatic"); - lv_obj_set_style_pad_top(toggle_label, 5, LV_PART_MAIN); - - menu_page_label = lv_label_create(section); - lv_label_set_text_static(menu_page_label, "Time :"); - container = create_section_container(section); - - /*container = lv_obj_create(section); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - lv_obj_clear_flag(container, LV_OBJ_FLAG_SCROLLABLE); - - lv_obj_t *arc = lv_arc_create(container); - lv_obj_center(arc); - lv_obj_set_style_arc_width(arc, 1, LV_PART_INDICATOR); - lv_obj_set_style_arc_width(arc, 1, LV_PART_MAIN); - - arc = lv_arc_create(container); - lv_obj_set_size(arc, 100, 100); - lv_obj_center(arc); - lv_obj_set_style_arc_width(arc, 1, LV_PART_INDICATOR); - lv_obj_set_style_arc_width(arc, 1, LV_PART_MAIN); - - arc = lv_arc_create(container); - lv_obj_set_size(arc, 70, 70); - lv_obj_center(arc); - lv_obj_set_style_arc_width(arc, 1, LV_PART_INDICATOR); - lv_obj_set_style_arc_width(arc, 1, LV_PART_MAIN);*/ - - settingsScreen->hour_roller = lv_roller_create(container); - settingsScreen->minute_roller = lv_roller_create(container); - settingsScreen->second_roller = lv_roller_create(container); - - lv_roller_set_options(settingsScreen->hour_roller, hour_options, LV_ROLLER_MODE_NORMAL); - lv_roller_set_visible_row_count(settingsScreen->hour_roller, 2); - lv_obj_add_event_cb(settingsScreen->hour_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); - - lv_roller_set_options(settingsScreen->minute_roller, second_minute_options, LV_ROLLER_MODE_NORMAL); - lv_roller_set_visible_row_count(settingsScreen->minute_roller, 2); - lv_obj_add_event_cb(settingsScreen->minute_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); - - lv_roller_set_options(settingsScreen->second_roller, second_minute_options, LV_ROLLER_MODE_NORMAL); - lv_roller_set_visible_row_count(settingsScreen->second_roller, 2); - lv_obj_add_event_cb(settingsScreen->second_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); - - menu_page_label = lv_label_create(section); - lv_label_set_text_static(menu_page_label, "Time Format :"); - container = create_section_container(section); - - lv_obj_t *checkbox_12 = lv_checkbox_create(container), *checkbox_24 = lv_checkbox_create(container); - lv_checkbox_set_text(checkbox_12, "12H"); - lv_obj_set_style_radius(checkbox_12, LV_RADIUS_CIRCLE, LV_PART_INDICATOR); - lv_checkbox_set_text(checkbox_24, "24H"); - lv_obj_add_state(checkbox_24, LV_STATE_CHECKED); - lv_obj_set_style_radius(checkbox_24, LV_RADIUS_CIRCLE, LV_PART_INDICATOR); - - menu_page_label = lv_label_create(section); - lv_label_set_text_static(menu_page_label, "Date :"); - container = create_section_container(section); - - settingsScreen->day_roller = lv_roller_create(container); - settingsScreen->month_roller = lv_roller_create(container); - settingsScreen->year_roller = lv_roller_create(container); - - lv_roller_set_options(settingsScreen->day_roller, day_options, LV_ROLLER_MODE_NORMAL); - lv_roller_set_visible_row_count(settingsScreen->day_roller, 2); - lv_obj_add_event_cb(settingsScreen->day_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); - - lv_roller_set_options(settingsScreen->month_roller, month_options, LV_ROLLER_MODE_NORMAL); - lv_roller_set_visible_row_count(settingsScreen->month_roller, 2); - lv_obj_add_event_cb(settingsScreen->month_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); - - lv_roller_set_options(settingsScreen->year_roller, year_options, LV_ROLLER_MODE_NORMAL); - lv_roller_set_visible_row_count(settingsScreen->year_roller, 2); - lv_obj_add_event_cb(settingsScreen->year_roller, &(time_roller_cb), LV_EVENT_RELEASED, settingsScreen); - - menu_page_label = lv_label_create(section); - lv_label_set_text_static(menu_page_label, "Date Format :"); - container = create_section_container(section); - - lv_obj_t *date_dropdown = lv_dropdown_create(container); - lv_dropdown_set_options_static(date_dropdown, date_format); - - //We create the menu page for the display settings - lv_obj_t *menu_page_2 = lv_menu_page_create(menu, NULL); - - section = create_menu_page_section(menu_page_2); - - menu_page_label = lv_label_create(section); - lv_label_set_text_static(menu_page_label, "Brightness :"); - container = create_section_container(section); - - lv_obj_t *slider = lv_slider_create(container); - lv_obj_clear_flag(slider, LV_OBJ_FLAG_GESTURE_BUBBLE); - lv_obj_set_width(slider, lv_pct(90)); - lv_obj_set_align(slider, LV_ALIGN_CENTER); - lv_obj_add_event_cb(slider, &(brightness_slider_cb), LV_EVENT_VALUE_CHANGED, settingsScreen); - - menu_page_label = lv_label_create(section); - lv_label_set_text_static(menu_page_label, "Sleep Timeout :"); - container = create_section_container(section); - - lv_obj_t *timeout = lv_roller_create(container); - lv_roller_set_options(timeout, timeout_options, LV_ROLLER_MODE_NORMAL); - lv_roller_set_visible_row_count(timeout, 2); - lv_obj_add_event_cb(timeout, &(timeout_roller_cb), LV_EVENT_RELEASED, settingsScreen); - - lv_obj_t *timeout_label = lv_label_create(container); - lv_label_set_text_static(timeout_label, "Second(s)"); - lv_obj_set_style_pad_top(timeout_label, 25, LV_PART_MAIN); - - menu_page_label = lv_label_create(section); - lv_label_set_text_static(menu_page_label, "Orientation :"); - container = create_section_container(section); - - lv_obj_t *orientation_dropdown = lv_dropdown_create(container); - lv_dropdown_set_options_static(orientation_dropdown, orientation_format); - lv_obj_add_event_cb(orientation_dropdown, &(orientation_dropdown_cb), LV_EVENT_VALUE_CHANGED, settingsScreen); - - //We create the side bar page - lv_obj_t *sidebar_page = lv_menu_page_create(menu, NULL); - lv_obj_t *settings_section_1 = lv_menu_section_create(sidebar_page); - lv_obj_set_style_pad_all(settings_section_1, 0, LV_PART_MAIN); - lv_obj_set_style_pad_bottom(settings_section_1, 50 , LV_PART_MAIN); - lv_obj_set_style_pad_hor(settings_section_1, -10 ,LV_PART_MAIN); - - lv_obj_t *selected = add_sidebar_entry_to_menu(settings_section_1, "Time & Date", menu, menu_page_1); - - add_sidebar_entry_to_menu(settings_section_1, "Display", menu, menu_page_2); - - add_sidebar_entry_to_menu(settings_section_1, "Notifications", menu, NULL); - - add_sidebar_entry_to_menu(settings_section_1, "Connectivity", menu, NULL); - - add_sidebar_entry_to_menu(settings_section_1, "Language", menu, NULL); - - //We set the side bar page - lv_menu_set_sidebar_page(menu, sidebar_page); - - lv_event_send(selected, LV_EVENT_CLICKED, NULL); + //We add all the menu list items + settingsScreen->time_and_date_item = add_menu_list_item(menu_list, "Time & Date", &(menu_list_item_event_handler), settingsScreen); + settingsScreen->display_item = add_menu_list_item(menu_list, "Display", &(menu_list_item_event_handler), settingsScreen); + settingsScreen->notifications_item = add_menu_list_item(menu_list, "Notifications", &(menu_list_item_event_handler), settingsScreen); + settingsScreen->connectivity_item = add_menu_list_item(menu_list, "Connectivity", &(menu_list_item_event_handler), settingsScreen); + settingsScreen->language_item = add_menu_list_item(menu_list, "Language", &(menu_list_item_event_handler), settingsScreen); + settingsScreen->about_item = add_menu_list_item(menu_list, "About", &(menu_list_item_event_handler), settingsScreen); //We register the event callback to handle gesture lv_obj_add_event_cb(settingsScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, settingsScreen); //We register the event callback to handle the cleanup lv_obj_add_event_cb(settingsScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, settingsScreen); + + //We load the default side screen content (time and date) + _simulate_side_screen_item_click(settingsScreen, settingsScreen->time_and_date_item); } void settings_screen_destroy(SettingsScreen_t * const settingsScreen) @@ -378,291 +624,57 @@ void settings_screen_destroy(SettingsScreen_t * const settingsScreen) settingsScreen->month_roller = NULL; settingsScreen->year_roller = NULL; settingsScreen->display = NULL; + settingsScreen->about_refresh_timer = NULL; } -/* - -const char *lang_options = "English\nFrench\nGerman\nItalian"; - -void settings_screen(void) +static void _simulate_side_screen_item_click(SettingsScreen_t * const settingsScreen, lv_obj_t *item) { - conf_screen = lv_obj_create(NULL); + static lv_obj_t *last_target = NULL; - LV_LOG_USER("Adding event to screen"); - lv_obj_add_event_cb(conf_screen, &(event_cb), LV_EVENT_GESTURE, NULL); + if(last_target == item) return; - lv_obj_t *config_bar = lv_obj_create(conf_screen); - lv_obj_set_style_bg_color(config_bar, lv_color_make(129, 141,181), LV_PART_MAIN); - lv_obj_set_size(config_bar, 240, 65); - lv_obj_set_style_radius(config_bar, 0, LV_PART_MAIN); - lv_obj_set_style_border_width(config_bar, 0, LV_PART_MAIN); + if(last_target == settingsScreen->about_item) + { + lv_timer_del(settingsScreen->about_refresh_timer); + settingsScreen->about_refresh_timer = NULL; + } - lv_obj_t *config_label = lv_label_create(config_bar); - lv_label_set_text_static(config_label, "Settings"); - lv_obj_set_style_text_color(config_label, lv_color_white(), LV_PART_MAIN); - lv_obj_set_style_text_font(config_label, &lv_font_montserrat_30, LV_PART_MAIN); - lv_obj_set_align(config_label, LV_ALIGN_CENTER); + last_target = item; - lv_obj_t *menu = lv_menu_create(conf_screen); - lv_obj_set_size(menu, lv_pct(100), 240 - 65); - lv_obj_set_pos(menu, 0, 65); - //lv_obj_set_style_text_color(menu, lv_color_make(145, 145, 145), LV_PART_MAIN); - //lv_obj_set_style_text_font(menu, &lv_font_montserrat_16, LV_PART_MAIN); - //lv_obj_set_style_pad_hor(menu,-10,LV_PART_MAIN); + if(item == settingsScreen->time_and_date_item) + { + load_time_and_date_side_screen(settingsScreen); + } + else if(item == settingsScreen->display_item) + { + load_display_side_screen(settingsScreen); + } + else if(item == settingsScreen->notifications_item) + { + load_notifications_side_screen(settingsScreen); + } + else if(item == settingsScreen->connectivity_item) + { + load_connectivity_side_screen(settingsScreen); + } + else if(item == settingsScreen->language_item) + { + load_language_side_screen(settingsScreen); + } + else if(item == settingsScreen->about_item) + { + load_about_side_screen(settingsScreen); + } +} - //create sub page - - lv_obj_t *time_sub_page = lv_menu_page_create(menu, NULL); - lv_menu_separator_create(time_sub_page); - lv_obj_t *section = lv_menu_section_create(time_sub_page); - lv_obj_set_style_pad_bottom(section, 50, LV_PART_MAIN); - - lv_obj_set_style_pad_left(section, 5, LV_PART_MAIN); - - lv_obj_t *sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Time Setting :"); - - lv_obj_t *container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - - lv_obj_t *toggle = lv_switch_create(container); - lv_obj_add_state(toggle, LV_STATE_CHECKED); - lv_obj_t *toggle_label = lv_label_create(container); - lv_label_set_text_static(toggle_label, "Automatic"); - lv_obj_set_style_pad_top(toggle_label, 5, LV_PART_MAIN); - - sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Date :"); - - container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - - lv_obj_t *day_roller = lv_roller_create(container), *month_roller = lv_roller_create(container), *year_roller = lv_roller_create(container); - lv_roller_set_options(day_roller, day_options, LV_ROLLER_MODE_INFINITE); - lv_roller_set_visible_row_count(day_roller, 2); - - - lv_roller_set_options(month_roller, month_options, LV_ROLLER_MODE_INFINITE); - lv_roller_set_visible_row_count(month_roller, 2); - - lv_roller_set_options(year_roller, year_options, LV_ROLLER_MODE_INFINITE); - lv_roller_set_visible_row_count(year_roller, 2); - - - sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Time :"); - - container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - lv_obj_clear_flag(container, LV_OBJ_FLAG_SCROLLABLE); - - lv_obj_t *hour_roller = lv_roller_create(container), *minute_roller = lv_roller_create(container), *second_roller = lv_roller_create(container); - lv_roller_set_options(hour_roller, hour_options, LV_ROLLER_MODE_INFINITE); - lv_roller_set_visible_row_count(hour_roller, 2); - - - lv_roller_set_options(minute_roller, sec_min_options, LV_ROLLER_MODE_INFINITE); - lv_roller_set_visible_row_count(minute_roller, 2); - - lv_roller_set_options(second_roller, sec_min_options, LV_ROLLER_MODE_INFINITE); - lv_roller_set_visible_row_count(second_roller, 2); - - sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Time Format :"); - - container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - - lv_obj_t *btn_12 = lv_checkbox_create(container), *btn_24 = lv_checkbox_create(container); - lv_checkbox_set_text(btn_12, "12H"); - lv_obj_set_style_radius(btn_12, LV_RADIUS_CIRCLE, LV_PART_INDICATOR); - lv_obj_add_state(btn_12, LV_STATE_CHECKED); - lv_checkbox_set_text(btn_24, "24H"); - lv_obj_set_style_radius(btn_24, LV_RADIUS_CIRCLE, LV_PART_INDICATOR); - - sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Date Format :"); - - container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - - lv_obj_t *date_drop = lv_dropdown_create(container); - lv_dropdown_set_options_static(date_drop, date_format); - - - lv_obj_t *screen_sub_page = lv_menu_page_create(menu, NULL); - lv_menu_separator_create(screen_sub_page); - section = lv_menu_section_create(screen_sub_page); - lv_obj_set_style_pad_left(section, 5, LV_PART_MAIN); - - sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Brightness :"); - - container = lv_obj_create(section); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - - lv_obj_t *slider = lv_slider_create(container); - lv_obj_clear_flag(slider, LV_OBJ_FLAG_GESTURE_BUBBLE); - lv_obj_set_width(slider, lv_pct(80)); - lv_obj_set_align(slider, LV_ALIGN_CENTER); - - sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Sleep Timeout :"); - - container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - - lv_obj_t *timeout = lv_roller_create(container); - lv_roller_set_options(timeout, day_options, LV_ROLLER_MODE_INFINITE); - lv_roller_set_visible_row_count(timeout, 2); - lv_obj_t *timeout_lab = lv_label_create(container); - lv_label_set_text_static(timeout_lab, "Second(s)"); - lv_obj_set_style_pad_top(timeout_lab, 25, LV_PART_MAIN); - - - lv_obj_t *notify_sub_page = lv_menu_page_create(menu, NULL); - lv_menu_separator_create(notify_sub_page); - section = lv_menu_section_create(notify_sub_page); - lv_obj_set_style_pad_left(section, 5, LV_PART_MAIN); - - sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Vibrator :"); - - container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - - lv_obj_t *vib_toggle = lv_switch_create(container); - lv_obj_add_state(vib_toggle, LV_STATE_CHECKED); - lv_obj_t *vib_toggle_label = lv_label_create(container); - lv_label_set_text_static(vib_toggle_label, "Enabled"); - lv_obj_set_style_pad_top(vib_toggle_label, 5, LV_PART_MAIN); - - sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Vibration duration :"); - - container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - - timeout = lv_roller_create(container); - lv_roller_set_options(timeout, day_options, LV_ROLLER_MODE_INFINITE); - lv_roller_set_visible_row_count(timeout, 2); - timeout_lab = lv_label_create(container); - lv_label_set_text_static(timeout_lab, "Second(s)"); - lv_obj_set_style_pad_top(timeout_lab, 25, LV_PART_MAIN); - - lv_obj_t *lan_sub_page = lv_menu_page_create(menu, NULL); - lv_menu_separator_create(lan_sub_page); - section = lv_menu_section_create(lan_sub_page); - lv_obj_set_style_pad_left(section, 5, LV_PART_MAIN); - - sub_page_label = lv_label_create(section); - lv_label_set_text_static(sub_page_label, "Languages :"); - - container = lv_obj_create(section); - lv_obj_set_flex_flow(container, LV_FLEX_FLOW_ROW); - lv_obj_set_style_pad_right(container,0, LV_PART_MAIN); - lv_obj_set_style_pad_left(container,0, LV_PART_MAIN); - lv_obj_set_style_border_width(container,0, LV_PART_MAIN); - lv_obj_set_size(container, lv_pct(100), LV_SIZE_CONTENT); - - lv_obj_t *lang_drop = lv_dropdown_create(container); - lv_dropdown_set_options(lang_drop, lang_options); - - //Create root page - lv_obj_t *main_page = lv_menu_page_create(menu, NULL); - - lv_obj_t *settings_section = lv_menu_section_create(main_page); - lv_obj_set_style_pad_all(settings_section, 0, LV_PART_MAIN); - lv_obj_set_style_pad_bottom(settings_section, 50, LV_PART_MAIN); - lv_obj_set_style_pad_hor(settings_section,-10,LV_PART_MAIN); - - lv_obj_t *date_categ = lv_menu_cont_create(settings_section); - lv_obj_t *date_categ_text_1 = lv_label_create(date_categ); - lv_label_set_text_static(date_categ_text_1, "Time & Date"); - lv_obj_set_style_text_color(date_categ_text_1, lv_color_make(145, 145, 145), LV_PART_MAIN); - //lv_label_set_long_mode(date_categ_text_1, LV_LABEL_LONG_SCROLL_CIRCULAR); - lv_obj_set_flex_grow(date_categ_text_1, 1); - lv_obj_set_style_anim_speed(date_categ_text_1, 15, LV_PART_MAIN); - - lv_menu_set_load_page_event(menu, date_categ_text_1, time_sub_page); - - lv_obj_t *categ = lv_menu_cont_create(settings_section); - lv_obj_t *categ_text_1 = lv_label_create(categ); - lv_label_set_text_static(categ_text_1, "Screen"); - lv_obj_set_style_text_color(categ_text_1, lv_color_make(145, 145, 145), LV_PART_MAIN); - //lv_label_set_long_mode(categ_text_1, LV_LABEL_LONG_SCROLL_CIRCULAR); - lv_obj_set_flex_grow(categ_text_1, 1); - lv_obj_set_style_anim_speed(categ_text_1, 15, LV_PART_MAIN); - - lv_menu_set_load_page_event(menu, categ_text_1, screen_sub_page); - - - lv_obj_t *vib_categ = lv_menu_cont_create(settings_section); - lv_obj_t *vib_categ_text_1 = lv_label_create(vib_categ); - lv_label_set_text_static(vib_categ_text_1, "Notifications"); - lv_obj_set_style_text_color(vib_categ_text_1, lv_color_make(145, 145, 145), LV_PART_MAIN); - //lv_label_set_long_mode(vib_categ_text_1, LV_LABEL_LONG_SCROLL_CIRCULAR); - lv_obj_set_flex_grow(vib_categ_text_1, 1); - lv_obj_set_style_anim_speed(vib_categ_text_1, 15, LV_PART_MAIN); - - lv_menu_set_load_page_event(menu, vib_categ_text_1, notify_sub_page); - - lv_obj_t *con_categ = lv_menu_cont_create(settings_section); - lv_obj_t *con_categ_text_1 = lv_label_create(con_categ); - lv_label_set_text_static(con_categ_text_1, "Connectivity"); - lv_obj_set_style_text_color(con_categ_text_1, lv_color_make(145, 145, 145), LV_PART_MAIN); - //lv_label_set_long_mode(con_categ_text_1, LV_LABEL_LONG_SCROLL_CIRCULAR); - lv_obj_set_flex_grow(con_categ_text_1, 1); - lv_obj_set_style_anim_speed(con_categ_text_1, 15, LV_PART_MAIN); - - //lv_menu_set_load_page_event(menu, con_categ_text_1, notify_sub_page); - - lv_obj_t *lan_categ = lv_menu_cont_create(settings_section); - lv_obj_t *lan_categ_text_1 = lv_label_create(lan_categ); - lv_label_set_text_static(lan_categ_text_1, "Language"); - lv_obj_set_style_text_color(lan_categ_text_1, lv_color_make(145, 145, 145), LV_PART_MAIN); - //lv_label_set_long_mode(lan_categ_text_1, LV_LABEL_LONG_SCROLL_CIRCULAR); - lv_obj_set_flex_grow(lan_categ_text_1, 1); - lv_obj_set_style_anim_speed(lan_categ_text_1, 15, LV_PART_MAIN); - - lv_menu_set_load_page_event(menu, lan_categ_text_1, lan_sub_page); - - lv_menu_set_sidebar_page(menu, main_page); - - lv_event_send(date_categ_text_1, LV_EVENT_CLICKED, NULL); -}*/ +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; + if(settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb) + settingsScreen->settingsScreenAPIInterface.setTimeSettingsCb(&hour, &minute, &second, &day, &month, &year, SETTING_MODE_GET); + sprintf(settingsScreen->currentTime.current_time_text, "%u:%u:%u %s%u/%s%u/%u", hour, minute, second, + day < 10 ? "0":"", day, + month < 10 ? "0":"", month, + year+1900); + lv_label_set_text_static(settingsScreen->currentTime.current_time_label, settingsScreen->currentTime.current_time_text); +} 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 428df08..6c8d1c1 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 @@ -3,24 +3,59 @@ #include "lvgl.h" +typedef enum SettingMode +{ + SETTING_MODE_GET = 0, + SETTING_MODE_SET +} SettingMode_e; + typedef struct SettingsScreenAPIInterface { - void (*setBrightnessSettingsCb)(uint8_t brightness); - void (*setTimeSettingsCb)(uint8_t hour, uint8_t minute, uint8_t second, uint8_t day, uint8_t month, uint8_t year); - void (*setTimeoutSettingsCb)(uint8_t timeout); - void (*setOrientationSettingsCb)(uint8_t orientation); + void (*setTimeSettingsCb)(uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *day, uint8_t *month, uint8_t *year, SettingMode_e mode); + void (*setBrightnessSettingsCb)(uint8_t *brightness, SettingMode_e mode); + void (*setTimeoutSettingsCb)(uint8_t *timeout, SettingMode_e mode); + void (*setDisplayVibrationDurationSettingsCb)(uint8_t *duration, SettingMode_e mode); + void (*setDisplayVibrationStrengthSettingsCb)(uint8_t *strength, SettingMode_e mode); + void (*setOrientationSettingsCb)(uint8_t *orientation, SettingMode_e mode); + void (*setBLEEnabledSettingsCb)(bool *enabled, SettingMode_e mode); + void (*setWiFiEnabledSettingsCb)(bool *enabled, SettingMode_e mode); + void (*setLanguageSettingsCb)(uint8_t *language, SettingMode_e mode); } SettingsScreenAPIInterface_t; typedef struct SettingsScreen { SettingsScreenAPIInterface_t settingsScreenAPIInterface; + /* Menu list items */ + lv_obj_t *time_and_date_item; + lv_obj_t *display_item; + lv_obj_t *notifications_item; + lv_obj_t *connectivity_item; + lv_obj_t *language_item; + lv_obj_t *about_item; + + lv_obj_t *side_screen; + lv_obj_t *hour_roller; lv_obj_t *minute_roller; lv_obj_t *second_roller; + lv_obj_t *checkbox_time_12H; + lv_obj_t *checkbox_time_24H; lv_obj_t *day_roller; lv_obj_t *month_roller; lv_obj_t *year_roller; + lv_obj_t *ble_switch; + lv_obj_t *wifi_switch; + struct + { + lv_obj_t *current_time_label; + char current_time_text[20]; + } currentTime; + + /* Main screen */ lv_obj_t *display; + + /* Other */ + lv_timer_t *about_refresh_timer; } SettingsScreen_t; void settings_screen_init(SettingsScreen_t * const settingsScreen); @@ -31,6 +66,4 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen); void settings_screen_destroy(SettingsScreen_t * const settingsScreen); -void settings_screen(void); - #endif //SETTINGS_SCREEN_H