From 9f4a562c22426808f738ada967829ef38abf86f5 Mon Sep 17 00:00:00 2001 From: 956MB Date: Wed, 1 Jan 2025 03:31:32 -0600 Subject: [PATCH 1/4] Clock: 12 hour midnight format - References #317 and adds the options `12:XX` and `00:XX` in `Settings > System > Midnight Format` to display the preferred clock format past midnight on all clocks (Desktop, Main Menu MNTM style, Lock screen and Nightstand clock app). "12:30 AM" -> "00:30" OR "12:30". --- applications/services/desktop/desktop.c | 7 +++-- applications/services/desktop/desktop_i.h | 2 ++ .../desktop/views/desktop_view_locked.c | 5 ++++ applications/services/gui/modules/menu.c | 6 +++- applications/services/locale/locale.c | 8 +++++ applications/services/locale/locale.h | 17 +++++++++++ .../settings/system/system_settings.c | 27 +++++++++++++++++ targets/f7/api_symbols.csv | 4 +++ targets/f7/furi_hal/furi_hal_rtc.c | 29 ++++++++++++++----- targets/f7/furi_hal/furi_hal_rtc.h | 17 +++++++++++ 10 files changed, 111 insertions(+), 11 deletions(-) diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index d618f14df0..aa58ae2245 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -58,10 +58,13 @@ static void desktop_clock_update(Desktop* desktop) { DateTime curr_dt; furi_hal_rtc_get_datetime(&curr_dt); bool time_format_12 = locale_get_time_format() == LocaleTimeFormat12h; + LocaleMidnightFormat midnight_format = locale_get_midnight_format(); if(desktop->clock.hour != curr_dt.hour || desktop->clock.minute != curr_dt.minute || - desktop->clock.format_12 != time_format_12) { + desktop->clock.format_12 != time_format_12 || + desktop->clock.midnight_format != midnight_format) { desktop->clock.format_12 = time_format_12; + desktop->clock.midnight_format = midnight_format; desktop->clock.hour = curr_dt.hour; desktop->clock.minute = curr_dt.minute; view_port_update(desktop->clock_viewport); @@ -96,7 +99,7 @@ static void desktop_clock_draw_callback(Canvas* canvas, void* context) { hour -= 12; } if(hour == 0) { - hour = 12; + hour = (desktop->clock.midnight_format == LocaleMidnightFormatZero) ? 0 : 12; } } diff --git a/applications/services/desktop/desktop_i.h b/applications/services/desktop/desktop_i.h index 10badcc071..12586a5e5d 100644 --- a/applications/services/desktop/desktop_i.h +++ b/applications/services/desktop/desktop_i.h @@ -5,6 +5,7 @@ #include "desktop_keybinds.h" #include "animations/animation_manager.h" +#include "locale/locale.h" #include "views/desktop_view_pin_timeout.h" #include "views/desktop_view_pin_input.h" #include "views/desktop_view_locked.h" @@ -40,6 +41,7 @@ typedef struct { uint8_t hour; uint8_t minute; bool format_12; // 1 - 12 hour, 0 - 24H + LocaleMidnightFormat midnight_format; } DesktopClock; struct Desktop { diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index 2959e2a7b7..93c7ccfde8 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -44,6 +44,7 @@ typedef struct { bool pin_locked; int8_t cover_offset; DesktopViewLockedState view_state; + LocaleMidnightFormat midnight_format; } DesktopViewLockedModel; void desktop_view_locked_set_callback( @@ -79,6 +80,9 @@ void desktop_view_locked_draw_lockscreen(Canvas* canvas, void* m) { } else { pm = datetime.hour > 12; snprintf(meridian_str, 3, datetime.hour >= 12 ? "PM" : "AM"); + if(datetime.hour == 0) { + datetime.hour = (model->midnight_format == LocaleMidnightFormatZero) ? 0 : 12; + } } snprintf(time_str, 9, "%.2d:%.2d", pm ? datetime.hour - 12 : datetime.hour, datetime.minute); snprintf(second_str, 5, ":%.2d", datetime.second); @@ -297,6 +301,7 @@ void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked) { furi_assert(model->view_state == DesktopViewLockedStateUnlocked); model->view_state = DesktopViewLockedStateLocked; model->pin_locked = pin_locked; + model->midnight_format = locale_get_midnight_format(); view_commit_model(locked_view->view, true); } diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index c3b7bcd67e..c9f71effab 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -1,5 +1,6 @@ #include "menu.h" +#include "locale/locale.h" #include #include #include @@ -384,7 +385,10 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { hour -= 12; } if(hour == 0) { - hour = 12; + hour = (locale_get_midnight_format() == LocaleMidnightFormatTwelve && + locale_get_time_format() == LocaleTimeFormat12h) ? + 12 : + 0; } canvas_set_font(canvas, FontSecondary); char clk[20]; diff --git a/applications/services/locale/locale.c b/applications/services/locale/locale.c index 6acf2eea97..b268642436 100644 --- a/applications/services/locale/locale.c +++ b/applications/services/locale/locale.c @@ -18,6 +18,14 @@ void locale_set_time_format(LocaleTimeFormat format) { furi_hal_rtc_set_locale_timeformat((FuriHalRtcLocaleTimeFormat)format); } +LocaleMidnightFormat locale_get_midnight_format(void) { + return (LocaleMidnightFormat)furi_hal_rtc_get_locale_midnightformat(); +} + +void locale_set_midnight_format(LocaleMidnightFormat format) { + furi_hal_rtc_set_locale_midnightformat((FuriHalRtcLocaleMidnightFormat)format); +} + LocaleDateFormat locale_get_date_format(void) { return (LocaleDateFormat)furi_hal_rtc_get_locale_dateformat(); } diff --git a/applications/services/locale/locale.h b/applications/services/locale/locale.h index 0046302df3..e9c8dc06a1 100644 --- a/applications/services/locale/locale.h +++ b/applications/services/locale/locale.h @@ -18,6 +18,11 @@ typedef enum { LocaleTimeFormat12h = 1, /**< 12-hour format */ } LocaleTimeFormat; +typedef enum { + LocaleMidnightFormatTwelve = 0, /**< 12:XX format */ + LocaleMidnightFormatZero = 1, /**< 00:XX format */ +} LocaleMidnightFormat; + typedef enum { LocaleDateFormatDMY = 0, /**< Day/Month/Year */ LocaleDateFormatMDY = 1, /**< Month/Day/Year */ @@ -64,6 +69,18 @@ LocaleTimeFormat locale_get_time_format(void); */ void locale_set_time_format(LocaleTimeFormat format); +/** Get Locale midnight format + * + * @return The locale midnight format. + */ +LocaleMidnightFormat locale_get_midnight_format(void); + +/** Set Locale midnight format + * + * @param[in] format The locale midnight format + */ +void locale_set_midnight_format(LocaleMidnightFormat format); + /** Format time to furi string * * @param[out] out_str The FuriString to store formatted time diff --git a/applications/settings/system/system_settings.c b/applications/settings/system/system_settings.c index 43163dc170..7055d90a90 100644 --- a/applications/settings/system/system_settings.c +++ b/applications/settings/system/system_settings.c @@ -165,6 +165,22 @@ static void time_format_changed(VariableItem* item) { locale_set_time_format(time_format_value[index]); } +const char* const midnight_format_text[] = { + "12:XX", + "00:XX", +}; + +const uint32_t midnight_format_value[] = { + LocaleMidnightFormatTwelve, + LocaleMidnightFormatZero, +}; + +static void midnight_format_changed(VariableItem* item) { + uint8_t index = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, midnight_format_text[index]); + locale_set_midnight_format(midnight_format_value[index]); +} + const char* const date_format_text[] = { "D/M/Y", "M/D/Y", @@ -350,6 +366,17 @@ SystemSettings* system_settings_alloc(void) { variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, time_format_text[value_index]); + item = variable_item_list_add( + app->var_item_list, + "Midnight Format", + COUNT_OF(midnight_format_text), + midnight_format_changed, + app); + value_index = value_index_uint32( + locale_get_midnight_format(), midnight_format_value, COUNT_OF(midnight_format_value)); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, midnight_format_text[value_index]); + item = variable_item_list_add( app->var_item_list, "Date Format", COUNT_OF(date_format_text), date_format_changed, app); value_index = value_index_uint32( diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index f5e79d7eec..136d85d938 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1628,6 +1628,7 @@ Function,+,furi_hal_rtc_get_datetime,void,DateTime* Function,+,furi_hal_rtc_get_fault_data,uint32_t, Function,+,furi_hal_rtc_get_heap_track_mode,FuriHalRtcHeapTrackMode, Function,+,furi_hal_rtc_get_locale_dateformat,FuriHalRtcLocaleDateFormat, +Function,+,furi_hal_rtc_get_locale_midnightformat,FuriHalRtcLocaleMidnightFormat, Function,+,furi_hal_rtc_get_locale_timeformat,FuriHalRtcLocaleTimeFormat, Function,+,furi_hal_rtc_get_locale_units,FuriHalRtcLocaleUnits, Function,+,furi_hal_rtc_get_log_baud_rate,FuriHalRtcLogBaudRate, @@ -1651,6 +1652,7 @@ Function,+,furi_hal_rtc_set_fault_data,void,uint32_t Function,+,furi_hal_rtc_set_flag,void,FuriHalRtcFlag Function,+,furi_hal_rtc_set_heap_track_mode,void,FuriHalRtcHeapTrackMode Function,+,furi_hal_rtc_set_locale_dateformat,void,FuriHalRtcLocaleDateFormat +Function,+,furi_hal_rtc_set_locale_midnightformat,void,FuriHalRtcLocaleMidnightFormat Function,+,furi_hal_rtc_set_locale_timeformat,void,FuriHalRtcLocaleTimeFormat Function,+,furi_hal_rtc_set_locale_units,void,FuriHalRtcLocaleUnits Function,+,furi_hal_rtc_set_log_baud_rate,void,FuriHalRtcLogBaudRate @@ -2347,9 +2349,11 @@ Function,+,locale_format_date,void,"FuriString*, const DateTime*, const LocaleDa Function,+,locale_format_time,void,"FuriString*, const DateTime*, const LocaleTimeFormat, const _Bool" Function,+,locale_get_date_format,LocaleDateFormat, Function,+,locale_get_measurement_unit,LocaleMeasurementUnits, +Function,+,locale_get_midnight_format,LocaleMidnightFormat, Function,+,locale_get_time_format,LocaleTimeFormat, Function,+,locale_set_date_format,void,LocaleDateFormat Function,+,locale_set_measurement_unit,void,LocaleMeasurementUnits +Function,+,locale_set_midnight_format,void,LocaleMidnightFormat Function,+,locale_set_time_format,void,LocaleTimeFormat Function,-,log,double,double Function,-,log10,double,double diff --git a/targets/f7/furi_hal/furi_hal_rtc.c b/targets/f7/furi_hal/furi_hal_rtc.c index ab592fb787..74b978f6ea 100644 --- a/targets/f7/furi_hal/furi_hal_rtc.c +++ b/targets/f7/furi_hal/furi_hal_rtc.c @@ -31,14 +31,14 @@ typedef struct { uint8_t log_level : 4; uint8_t log_reserved : 4; uint8_t flags; - FuriHalRtcBootMode boot_mode : 4; - FuriHalRtcHeapTrackMode heap_track_mode : 2; - FuriHalRtcLocaleUnits locale_units : 1; - FuriHalRtcLocaleTimeFormat locale_timeformat : 1; - FuriHalRtcLocaleDateFormat locale_dateformat : 2; - FuriHalRtcLogDevice log_device : 2; - FuriHalRtcLogBaudRate log_baud_rate : 3; - uint8_t reserved : 1; + FuriHalRtcBootMode boot_mode : 4; + FuriHalRtcHeapTrackMode heap_track_mode : 2; + FuriHalRtcLocaleUnits locale_units : 1; + FuriHalRtcLocaleTimeFormat locale_timeformat : 1; + FuriHalRtcLocaleMidnightFormat locale_midnightformat : 1; + FuriHalRtcLocaleDateFormat locale_dateformat : 2; + FuriHalRtcLogDevice log_device : 2; + FuriHalRtcLogBaudRate log_baud_rate : 3; } SystemReg; _Static_assert(sizeof(SystemReg) == 4, "SystemReg size mismatch"); @@ -379,6 +379,19 @@ FuriHalRtcLocaleTimeFormat furi_hal_rtc_get_locale_timeformat(void) { return data->locale_timeformat; } +void furi_hal_rtc_set_locale_midnightformat(FuriHalRtcLocaleMidnightFormat value) { + uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); + SystemReg* data = (SystemReg*)&data_reg; + data->locale_midnightformat = value; + furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); +} + +FuriHalRtcLocaleMidnightFormat furi_hal_rtc_get_locale_midnightformat(void) { + uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); + SystemReg* data = (SystemReg*)&data_reg; + return data->locale_midnightformat; +} + void furi_hal_rtc_set_locale_dateformat(FuriHalRtcLocaleDateFormat value) { uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); SystemReg* data = (SystemReg*)&data_reg; diff --git a/targets/f7/furi_hal/furi_hal_rtc.h b/targets/f7/furi_hal/furi_hal_rtc.h index 49d35eeb9b..8f212bf186 100644 --- a/targets/f7/furi_hal/furi_hal_rtc.h +++ b/targets/f7/furi_hal/furi_hal_rtc.h @@ -65,6 +65,11 @@ typedef enum { FuriHalRtcLocaleTimeFormat12h = 0x1, /**< 12-hour format */ } FuriHalRtcLocaleTimeFormat; +typedef enum { + FuriHalRtcLocaleMidnightFormatTwelve = 0x0, /**< 12:XX format */ + FuriHalRtcLocaleMidnightFormatZero = 0x1, /**< 00:XX format */ +} FuriHalRtcLocaleMidnightFormat; + typedef enum { FuriHalRtcLocaleDateFormatDMY = 0x0, /**< Day/Month/Year */ FuriHalRtcLocaleDateFormatMDY = 0x1, /**< Month/Day/Year */ @@ -231,6 +236,18 @@ void furi_hal_rtc_set_locale_timeformat(FuriHalRtcLocaleTimeFormat value); */ FuriHalRtcLocaleTimeFormat furi_hal_rtc_get_locale_timeformat(void); +/** Set RTC Locale Midnight Format + * + * @param[in] value The RTC Locale Midnight Format + */ +void furi_hal_rtc_set_locale_midnightformat(FuriHalRtcLocaleMidnightFormat value); + +/** Get RTC Locale Midnight Format + * + * @return The RTC Locale Midnight Format. + */ +FuriHalRtcLocaleMidnightFormat furi_hal_rtc_get_locale_midnightformat(void); + /** Set RTC Locale Date Format * * @param[in] value The RTC Locale Date Format From 81d647f3a96b9605cc2ab10f63cbe7cfdaf94218 Mon Sep 17 00:00:00 2001 From: 956MB Date: Tue, 14 Jan 2025 21:51:11 -0600 Subject: [PATCH 2/4] Main Menu: Adds info toggles to PS4/Vertical/MNTM - Adds more info to a few of the menu styles that can fit it, as well as the option to toggle any/all of it on or off. - Also fixes a potential overlap in the MTNM style in the rare case a device name is max length. --- .../momentum_app_scene_interface_mainmenu.c | 88 +++++++ applications/services/desktop/desktop.c | 2 +- .../desktop/views/desktop_view_locked.c | 2 +- applications/services/gui/modules/menu.c | 214 +++++++++++++----- applications/services/locale/locale.h | 4 +- .../settings/system/system_settings.c | 4 +- lib/momentum/settings.c | 10 + lib/momentum/settings.h | 5 + 8 files changed, 270 insertions(+), 59 deletions(-) diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c index 17f17f7295..614ad34e0b 100644 --- a/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c @@ -1,5 +1,8 @@ #include "../momentum_app.h" +#define ONLY_MSG "Only in PS4,\nVertical and\nMNTM styles!" +#define CANT_MSG "Can't show in\nthe selected\nstyle!" + enum VarItemListIndex { VarItemListIndexMenuStyle, VarItemListIndexResetMenu, @@ -30,6 +33,51 @@ static void momentum_app_scene_interface_mainmenu_menu_style_changed(VariableIte variable_item_set_current_value_text(item, menu_style_names[index]); momentum_settings.menu_style = index; app->save_settings = true; + + // Quick and dirty work around to refresh the list to update the locked items, + // and isn't noticeable at all. + scene_manager_previous_scene(app->scene_manager); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceMainmenu); +} + +static void momentum_app_scene_interface_mainmenu_name_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.menu_name = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_mainmenu_level_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.menu_level = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_mainmenu_time_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.menu_time = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_mainmenu_battery_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.menu_battery = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_mainmenu_otg_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.menu_otg = value; + app->save_settings = true; } static void momentum_app_scene_interface_mainmenu_app_changed(VariableItem* item) { @@ -69,6 +117,7 @@ void momentum_app_scene_interface_mainmenu_on_enter(void* context) { MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; + MenuStyle style = momentum_settings.menu_style; item = variable_item_list_add( var_item_list, @@ -107,6 +156,45 @@ void momentum_app_scene_interface_mainmenu_on_enter(void* context) { variable_item_list_add(var_item_list, "Remove App", 0, NULL, app); + bool lock_all = style != MenuStylePs4 && style != MenuStyleVertical && style != MenuStyleMNTM; + bool lock_vertical = style == MenuStyleVertical; + bool lock_ps4_vertical = style == MenuStylePs4 || style == MenuStyleVertical; + + item = variable_item_list_add( + var_item_list, "Show Name", 2, momentum_app_scene_interface_mainmenu_name_changed, app); + variable_item_set_current_value_index(item, momentum_settings.menu_name); + variable_item_set_current_value_text(item, momentum_settings.menu_name ? "ON" : "OFF"); + variable_item_set_locked(item, lock_all || lock_vertical, lock_vertical ? CANT_MSG : ONLY_MSG); + + item = variable_item_list_add( + var_item_list, "Show Level", 2, momentum_app_scene_interface_mainmenu_level_changed, app); + variable_item_set_current_value_index(item, momentum_settings.menu_level); + variable_item_set_current_value_text(item, momentum_settings.menu_level ? "ON" : "OFF"); + variable_item_set_locked(item, lock_all || lock_vertical, lock_vertical ? CANT_MSG : ONLY_MSG); + + item = variable_item_list_add( + var_item_list, "Show Time", 2, momentum_app_scene_interface_mainmenu_time_changed, app); + variable_item_set_current_value_index(item, momentum_settings.menu_time); + variable_item_set_current_value_text(item, momentum_settings.menu_time ? "ON" : "OFF"); + variable_item_set_locked(item, lock_all, ONLY_MSG); + + item = variable_item_list_add( + var_item_list, + "Show Battery", + 2, + momentum_app_scene_interface_mainmenu_battery_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.menu_battery); + variable_item_set_current_value_text(item, momentum_settings.menu_battery ? "ON" : "OFF"); + variable_item_set_locked(item, lock_all, ONLY_MSG); + + item = variable_item_list_add( + var_item_list, "Show OTG (5v)", 2, momentum_app_scene_interface_mainmenu_otg_changed, app); + variable_item_set_current_value_index(item, momentum_settings.menu_otg); + variable_item_set_current_value_text(item, momentum_settings.menu_otg ? "ON" : "OFF"); + variable_item_set_locked( + item, lock_all || lock_ps4_vertical, lock_ps4_vertical ? CANT_MSG : ONLY_MSG); + variable_item_list_set_enter_callback( var_item_list, momentum_app_scene_interface_mainmenu_var_item_list_callback, app); diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index aa58ae2245..da482134d1 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -99,7 +99,7 @@ static void desktop_clock_draw_callback(Canvas* canvas, void* context) { hour -= 12; } if(hour == 0) { - hour = (desktop->clock.midnight_format == LocaleMidnightFormatZero) ? 0 : 12; + hour = (desktop->clock.midnight_format == LocaleMidnightFormat00) ? 0 : 12; } } diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index 93c7ccfde8..488ce7ba44 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -81,7 +81,7 @@ void desktop_view_locked_draw_lockscreen(Canvas* canvas, void* m) { pm = datetime.hour > 12; snprintf(meridian_str, 3, datetime.hour >= 12 ? "PM" : "AM"); if(datetime.hour == 0) { - datetime.hour = (model->midnight_format == LocaleMidnightFormatZero) ? 0 : 12; + datetime.hour = (model->midnight_format == LocaleMidnightFormat00) ? 0 : 12; } } snprintf(time_str, 9, "%.2d:%.2d", pm ? datetime.hour - 12 : datetime.hour, datetime.minute); diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index c9f71effab..6b7f530140 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -16,8 +16,8 @@ struct Menu { View* view; - FuriTimer* scroll_timer; + FuriTimer* info_timer; }; typedef struct { @@ -35,9 +35,10 @@ ARRAY_DEF(MenuItemArray, MenuItem, M_POD_OPLIST); typedef struct { MenuItemArray_t items; size_t position; - size_t scroll_counter; size_t vertical_offset; + uint8_t battery_pct; + DateTime current_time; } MenuModel; static void menu_process_up(Menu* menu); @@ -46,6 +47,21 @@ static void menu_process_left(Menu* menu); static void menu_process_right(Menu* menu); static void menu_process_ok(Menu* menu); +static void menu_get_time_str(DateTime* dt, char* clk, size_t size) { + uint8_t hour = dt->hour; + uint8_t min = dt->minute; + bool format_12 = locale_get_time_format() == LocaleTimeFormat12h; + if(format_12) { + if(hour > 12) { + hour -= 12; + } + if(hour == 0) { + hour = (locale_get_midnight_format() == LocaleMidnightFormat12 && format_12) ? 12 : 0; + } + } + snprintf(clk, size, "%02u:%02u", hour, min); +} + static void menu_get_name(MenuItem* item, FuriString* name, bool shorter) { furi_string_set(name, item->label); if(shorter) { @@ -210,13 +226,52 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { } case MenuStylePs4: { canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned( - canvas, 1, 1, AlignLeft, AlignTop, furi_hal_version_get_name_ptr()); - char str[10]; + uint8_t name_w = 1; + if(momentum_settings.menu_name) { + const char* dev_name = furi_hal_version_get_name_ptr(); + name_w = canvas_string_width(canvas, dev_name); + canvas_draw_str_aligned(canvas, 1, 1, AlignLeft, AlignTop, dev_name); + name_w += 6; + } + Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); - snprintf(str, 10, "Level %i", dolphin_get_level(dolphin->state->data.icounter)); + uint8_t lvl = dolphin_get_level(dolphin->state->data.icounter); furi_record_close(RECORD_DOLPHIN); - canvas_draw_str_aligned(canvas, 127, 1, AlignRight, AlignTop, str); + size_t lvl_x = 127; + bool show_time = momentum_settings.menu_time; + bool show_battery = momentum_settings.menu_battery; + + if(show_battery || show_time) { + size_t time_x = 127; + lvl_x = name_w; + if(show_battery) { + uint8_t battery_percent = model->battery_pct; + char bat_display[9]; + snprintf(bat_display, sizeof(bat_display), "%d%%", battery_percent); + uint8_t bat_w = canvas_string_width(canvas, bat_display); + canvas_draw_str_aligned(canvas, 127, 1, AlignRight, AlignTop, bat_display); + time_x = 127 - bat_w - 5; + } + + if(show_time) { + char clk[9]; + menu_get_time_str(&model->current_time, clk, sizeof(clk)); + canvas_draw_str_aligned(canvas, time_x, 1, AlignRight, AlignTop, clk); + } + } + + if(momentum_settings.menu_level) { + char lvl_str[10]; + snprintf(lvl_str, 10, "%s%i", show_time && show_battery ? "Lv" : "Level ", lvl); + canvas_draw_str_aligned( + canvas, + lvl_x, + 1, + show_time || show_battery ? AlignLeft : AlignRight, + AlignTop, + lvl_str); + } + for(int8_t i = -1; i <= 4; i++) { shift_position = position + i; if(shift_position >= items_count) continue; @@ -258,22 +313,39 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { } case MenuStyleVertical: { canvas_set_orientation(canvas, CanvasOrientationVertical); + bool time_or_battery = momentum_settings.menu_time || momentum_settings.menu_battery; + uint8_t cells = time_or_battery ? 7 : 8; shift_position = model->vertical_offset; - if(shift_position >= position || shift_position + 7 <= position) { + if(shift_position >= position || shift_position + cells <= position) { // In case vertical_offset is out of sync due to changing menu styles shift_position = CLAMP( - MAX((int32_t)position - 4, 0), - MAX((int32_t)MenuItemArray_size(model->items) - 8, 0), + MAX((uint8_t)position - 4, 0), + MAX((uint8_t)MenuItemArray_size(model->items) - cells, 0), 0); model->vertical_offset = shift_position; } canvas_set_font(canvas, FontSecondary); size_t item_i; size_t y_off; - for(size_t i = 0; i < 8; i++) { + size_t ext_off = 0; + if(time_or_battery) { + ext_off = 16; + if(momentum_settings.menu_battery) { + uint8_t battery_percent = model->battery_pct; + char bat_display[9]; + snprintf(bat_display, sizeof(bat_display), "%d%%", battery_percent); + canvas_draw_str_aligned(canvas, 63, 1, AlignRight, AlignTop, bat_display); + } + if(momentum_settings.menu_time) { + char clk[9]; + menu_get_time_str(&model->current_time, clk, sizeof(clk)); + canvas_draw_str_aligned(canvas, 1, 1, AlignLeft, AlignTop, clk); + } + } + for(size_t i = 0; i < cells; i++) { item_i = shift_position + i; if(item_i >= items_count) continue; - y_off = 16 * i; + y_off = 16 * i + ext_off; bool selected = item_i == position; if(selected) { elements_slightly_rounded_box(canvas, 0, y_off, 64, 16); @@ -374,54 +446,63 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { canvas_draw_line(canvas, 5, 15, 59, 15); canvas_draw_line(canvas, 7, 17, 61, 17); canvas_draw_line(canvas, 10, 19, 63, 19); - char title[20]; - snprintf(title, sizeof(title), "%s", furi_hal_version_get_name_ptr()); - canvas_draw_str(canvas, 5, 12, title); - DateTime curr_dt; - furi_hal_rtc_get_datetime(&curr_dt); - uint8_t hour = curr_dt.hour; - uint8_t min = curr_dt.minute; - if(hour > 12) { - hour -= 12; - } - if(hour == 0) { - hour = (locale_get_midnight_format() == LocaleMidnightFormatTwelve && - locale_get_time_format() == LocaleTimeFormat12h) ? - 12 : - 0; + + if(momentum_settings.menu_name) { + char title[9]; + snprintf(title, sizeof(title), "%s", furi_hal_version_get_name_ptr()); + FuriString* title_str = furi_string_alloc(); + furi_string_set(title_str, title); + size_t scroll_counter = menu_scroll_counter(model, true); + elements_scrollable_text_line(canvas, 5, 12, 60, title_str, scroll_counter, false); + furi_string_free(title_str); } + canvas_set_font(canvas, FontSecondary); - char clk[20]; - snprintf(clk, sizeof(clk), "%02u:%02u", hour, min); - canvas_draw_str(canvas, 5, 34, clk); - - uint32_t battery_capacity = furi_hal_power_get_battery_full_capacity(); - uint32_t battery_remaining = furi_hal_power_get_battery_remaining_capacity(); - bool ext5v = furi_hal_power_is_otg_enabled(); - uint16_t battery_percent = (battery_remaining * 100) / battery_capacity; - bool charge_state = false; - - // Determine charge state - if(furi_hal_power_is_charging()) { - if(battery_percent < 100 && !furi_hal_power_is_charging_done()) { - charge_state = true; - } + uint8_t info_y = 56; + + if(momentum_settings.menu_otg) { + // Display OTG state + char ext5v_display[9]; + bool ext5v = furi_hal_power_is_otg_enabled(); + snprintf(ext5v_display, sizeof(ext5v_display), "5v: %s", ext5v ? "On" : "Off"); + canvas_draw_str(canvas, 5, info_y, ext5v_display); + info_y -= 11; } - // Display battery percentage - char bat_display[20]; - snprintf(bat_display, sizeof(bat_display), "%d%%", battery_percent); - canvas_draw_str(canvas, 5, 45, bat_display); + if(momentum_settings.menu_battery) { + uint8_t battery_percent = model->battery_pct; + bool charge_state = false; + + if(furi_hal_power_is_charging()) { + if(battery_percent < 100 && !furi_hal_power_is_charging_done()) { + charge_state = true; + } + } + char bat_display[9]; + snprintf(bat_display, sizeof(bat_display), "%d%%", battery_percent); + canvas_draw_str(canvas, 5, info_y, bat_display); + info_y -= 11; + + if(charge_state) { + canvas_draw_icon(canvas, 28, 33, &I_Voltage_16x16); + } + } - // Display charge state icon - if(charge_state) { - canvas_draw_icon(canvas, 28, 33, &I_Voltage_16x16); + if(momentum_settings.menu_time) { + char clk[9]; + menu_get_time_str(&model->current_time, clk, sizeof(clk)); + canvas_draw_str(canvas, 5, info_y, clk); + info_y -= 11; } - // Display OTG state - char ext5v_display[20]; - snprintf(ext5v_display, sizeof(ext5v_display), "5v: %s", ext5v ? "On" : "Off"); - canvas_draw_str(canvas, 5, 56, ext5v_display); + if(!momentum_settings.menu_otg && momentum_settings.menu_level) { + Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); + uint8_t lvl = dolphin_get_level(dolphin->state->data.icounter); + furi_record_close(RECORD_DOLPHIN); + char lvl_str[10]; + snprintf(lvl_str, 10, "%s%i", lvl >= 10 ? "Lvl " : "Level ", lvl); + canvas_draw_str(canvas, 5, info_y, lvl_str); + } MenuItem* item = MenuItemArray_get(model->items, position); menu_get_name(item, name, true); @@ -504,6 +585,18 @@ static void menu_scroll_timer_callback(void* context) { with_view_model(menu->view, MenuModel * model, { model->scroll_counter++; }, true); } +static void menu_status_timer_callback(void* context) { + Menu* menu = context; + with_view_model( + menu->view, + MenuModel * model, + { + if(momentum_settings.menu_battery) model->battery_pct = furi_hal_power_get_pct(); + if(momentum_settings.menu_time) furi_hal_rtc_get_datetime(&model->current_time); + }, + true); +} + static void menu_enter(void* context) { Menu* menu = context; with_view_model( @@ -518,6 +611,7 @@ static void menu_enter(void* context) { }, true); furi_timer_start(menu->scroll_timer, 333); + if(menu->info_timer) furi_timer_start(menu->info_timer, furi_kernel_get_tick_frequency()); } static void menu_exit(void* context) { @@ -533,6 +627,7 @@ static void menu_exit(void* context) { }, false); furi_timer_stop(menu->scroll_timer); + if(menu->info_timer) furi_timer_stop(menu->info_timer); } Menu* menu_alloc(void) { @@ -546,6 +641,16 @@ Menu* menu_alloc(void) { view_set_exit_callback(menu->view, menu_exit); menu->scroll_timer = furi_timer_alloc(menu_scroll_timer_callback, FuriTimerTypePeriodic, menu); + menu->info_timer = NULL; + // Settings could be set to true from other styles but we don't want a timer + // going if the style doesn't support it (locked in MNTM > Interface > Main Menu > Show ...) + bool allowed_style = momentum_settings.menu_style == MenuStylePs4 || + momentum_settings.menu_style == MenuStyleVertical || + momentum_settings.menu_style == MenuStyleMNTM; + if(allowed_style && (momentum_settings.menu_time || momentum_settings.menu_battery)) { + menu->info_timer = + furi_timer_alloc(menu_status_timer_callback, FuriTimerTypePeriodic, menu); + } with_view_model( menu->view, @@ -553,6 +658,8 @@ Menu* menu_alloc(void) { { MenuItemArray_init(model->items); model->position = 0; + if(momentum_settings.menu_battery) model->battery_pct = furi_hal_power_get_pct(); + if(momentum_settings.menu_time) furi_hal_rtc_get_datetime(&model->current_time); }, true); @@ -566,6 +673,7 @@ void menu_free(Menu* menu) { with_view_model(menu->view, MenuModel * model, { MenuItemArray_clear(model->items); }, false); view_free(menu->view); furi_timer_free(menu->scroll_timer); + if(menu->info_timer) furi_timer_free(menu->info_timer); free(menu); } diff --git a/applications/services/locale/locale.h b/applications/services/locale/locale.h index e9c8dc06a1..d5189eaba6 100644 --- a/applications/services/locale/locale.h +++ b/applications/services/locale/locale.h @@ -19,8 +19,8 @@ typedef enum { } LocaleTimeFormat; typedef enum { - LocaleMidnightFormatTwelve = 0, /**< 12:XX format */ - LocaleMidnightFormatZero = 1, /**< 00:XX format */ + LocaleMidnightFormat12 = 0, /**< 12:XX format */ + LocaleMidnightFormat00 = 1, /**< 00:XX format */ } LocaleMidnightFormat; typedef enum { diff --git a/applications/settings/system/system_settings.c b/applications/settings/system/system_settings.c index 7055d90a90..beb3a50eaf 100644 --- a/applications/settings/system/system_settings.c +++ b/applications/settings/system/system_settings.c @@ -171,8 +171,8 @@ const char* const midnight_format_text[] = { }; const uint32_t midnight_format_value[] = { - LocaleMidnightFormatTwelve, - LocaleMidnightFormatZero, + LocaleMidnightFormat12, + LocaleMidnightFormat00, }; static void midnight_format_changed(VariableItem* item) { diff --git a/lib/momentum/settings.c b/lib/momentum/settings.c index 315124c7c4..5d723312a7 100644 --- a/lib/momentum/settings.c +++ b/lib/momentum/settings.c @@ -12,6 +12,11 @@ MomentumSettings momentum_settings = { .cycle_anims = 0, // Meta.txt .unlock_anims = false, // OFF .menu_style = MenuStyleDsi, // DSi + .menu_name = true, // ON + .menu_level = true, // ON + .menu_time = true, // ON + .menu_battery = true, // ON + .menu_otg = true, // ON .lock_on_boot = false, // OFF .bad_pins_format = false, // OFF .allow_locked_rpc_commands = false, // OFF @@ -81,6 +86,11 @@ static const struct { {setting_int(cycle_anims, -1, 86400)}, {setting_bool(unlock_anims)}, {setting_enum(menu_style, MenuStyleCount)}, + {setting_bool(menu_name)}, + {setting_bool(menu_level)}, + {setting_bool(menu_time)}, + {setting_bool(menu_battery)}, + {setting_bool(menu_otg)}, {setting_bool(bad_pins_format)}, {setting_bool(allow_locked_rpc_commands)}, {setting_bool(lock_on_boot)}, diff --git a/lib/momentum/settings.h b/lib/momentum/settings.h index ee13411313..5cebecd461 100644 --- a/lib/momentum/settings.h +++ b/lib/momentum/settings.h @@ -60,6 +60,11 @@ typedef struct { int32_t cycle_anims; bool unlock_anims; MenuStyle menu_style; + bool menu_name; + bool menu_level; + bool menu_time; + bool menu_battery; + bool menu_otg; bool lock_on_boot; bool bad_pins_format; bool allow_locked_rpc_commands; From ee3d35267c824bf1defe7cbd7544aaf082238bfe Mon Sep 17 00:00:00 2001 From: 956MB Date: Tue, 21 Jan 2025 18:54:09 -0600 Subject: [PATCH 3/4] Fix: Move midnight format setting out of furi_rtc - Also felt like the midnight format setting was too out of place in `MNTM > Interface` with the 5 other submenu entries, so I put it in Misc for now. --- .../scenes/momentum_app_scene_misc.c | 19 ++++++++++++ applications/services/desktop/desktop.c | 7 ++--- applications/services/desktop/desktop_i.h | 2 -- .../desktop/views/desktop_view_locked.c | 5 +--- applications/services/gui/modules/menu.c | 16 +++++----- applications/services/locale/locale.c | 8 ----- applications/services/locale/locale.h | 17 ----------- .../settings/system/system_settings.c | 27 ----------------- lib/momentum/settings.c | 2 ++ lib/momentum/settings.h | 1 + targets/f7/api_symbols.csv | 4 --- targets/f7/furi_hal/furi_hal_rtc.c | 29 +++++-------------- targets/f7/furi_hal/furi_hal_rtc.h | 17 ----------- 13 files changed, 41 insertions(+), 113 deletions(-) diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_misc.c b/applications/main/momentum_app/scenes/momentum_app_scene_misc.c index ca66861f8a..c093957815 100644 --- a/applications/main/momentum_app/scenes/momentum_app_scene_misc.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_misc.c @@ -6,6 +6,7 @@ enum VarItemListIndex { VarItemListIndexSpoof, VarItemListIndexVgm, VarItemListIndexChargeCap, + VarItemListIndexMidnightFormat, VarItemListIndexShowMomentumIntro, }; @@ -25,6 +26,14 @@ static void momentum_app_scene_misc_charge_cap_changed(VariableItem* item) { app->save_settings = true; } +static void momentum_app_scene_interface_midnight_format_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "00:XX" : "12:XX"); + momentum_settings.midnight_format_00 = value; + app->save_settings = true; +} + void momentum_app_scene_misc_on_enter(void* context) { MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; @@ -55,6 +64,16 @@ void momentum_app_scene_misc_on_enter(void* context) { variable_item_set_current_value_index(item, value_index - 1); variable_item_set_current_value_text(item, cap_str); + item = variable_item_list_add( + var_item_list, + "Clock Midnight Format", + 2, + momentum_app_scene_interface_midnight_format_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.midnight_format_00); + variable_item_set_current_value_text( + item, momentum_settings.midnight_format_00 ? "00:XX" : "12:XX"); + variable_item_list_add(var_item_list, "Show Momentum Intro", 0, NULL, app); variable_item_list_set_enter_callback( diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index aa58ae2245..ca48fa7bd3 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -58,13 +58,10 @@ static void desktop_clock_update(Desktop* desktop) { DateTime curr_dt; furi_hal_rtc_get_datetime(&curr_dt); bool time_format_12 = locale_get_time_format() == LocaleTimeFormat12h; - LocaleMidnightFormat midnight_format = locale_get_midnight_format(); if(desktop->clock.hour != curr_dt.hour || desktop->clock.minute != curr_dt.minute || - desktop->clock.format_12 != time_format_12 || - desktop->clock.midnight_format != midnight_format) { + desktop->clock.format_12 != time_format_12) { desktop->clock.format_12 = time_format_12; - desktop->clock.midnight_format = midnight_format; desktop->clock.hour = curr_dt.hour; desktop->clock.minute = curr_dt.minute; view_port_update(desktop->clock_viewport); @@ -99,7 +96,7 @@ static void desktop_clock_draw_callback(Canvas* canvas, void* context) { hour -= 12; } if(hour == 0) { - hour = (desktop->clock.midnight_format == LocaleMidnightFormatZero) ? 0 : 12; + hour = momentum_settings.midnight_format_00 ? 0 : 12; } } diff --git a/applications/services/desktop/desktop_i.h b/applications/services/desktop/desktop_i.h index 12586a5e5d..10badcc071 100644 --- a/applications/services/desktop/desktop_i.h +++ b/applications/services/desktop/desktop_i.h @@ -5,7 +5,6 @@ #include "desktop_keybinds.h" #include "animations/animation_manager.h" -#include "locale/locale.h" #include "views/desktop_view_pin_timeout.h" #include "views/desktop_view_pin_input.h" #include "views/desktop_view_locked.h" @@ -41,7 +40,6 @@ typedef struct { uint8_t hour; uint8_t minute; bool format_12; // 1 - 12 hour, 0 - 24H - LocaleMidnightFormat midnight_format; } DesktopClock; struct Desktop { diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index 93c7ccfde8..7281423d48 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -8,7 +8,6 @@ #include #include -#include "../desktop_i.h" #include "desktop_view_locked.h" #define COVER_MOVING_INTERVAL_MS (50) @@ -44,7 +43,6 @@ typedef struct { bool pin_locked; int8_t cover_offset; DesktopViewLockedState view_state; - LocaleMidnightFormat midnight_format; } DesktopViewLockedModel; void desktop_view_locked_set_callback( @@ -81,7 +79,7 @@ void desktop_view_locked_draw_lockscreen(Canvas* canvas, void* m) { pm = datetime.hour > 12; snprintf(meridian_str, 3, datetime.hour >= 12 ? "PM" : "AM"); if(datetime.hour == 0) { - datetime.hour = (model->midnight_format == LocaleMidnightFormatZero) ? 0 : 12; + datetime.hour = momentum_settings.midnight_format_00 ? 0 : 12; } } snprintf(time_str, 9, "%.2d:%.2d", pm ? datetime.hour - 12 : datetime.hour, datetime.minute); @@ -301,7 +299,6 @@ void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked) { furi_assert(model->view_state == DesktopViewLockedStateUnlocked); model->view_state = DesktopViewLockedStateLocked; model->pin_locked = pin_locked; - model->midnight_format = locale_get_midnight_format(); view_commit_model(locked_view->view, true); } diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index c9f71effab..d6c5689ee3 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -381,14 +381,14 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { furi_hal_rtc_get_datetime(&curr_dt); uint8_t hour = curr_dt.hour; uint8_t min = curr_dt.minute; - if(hour > 12) { - hour -= 12; - } - if(hour == 0) { - hour = (locale_get_midnight_format() == LocaleMidnightFormatTwelve && - locale_get_time_format() == LocaleTimeFormat12h) ? - 12 : - 0; + LocaleTimeFormat time_format = locale_get_time_format(); + if(time_format == LocaleTimeFormat12h) { + if(hour > 12) { + hour -= 12; + } + if(hour == 0) { + hour = (momentum_settings.midnight_format_00 ? 0 : 12); + } } canvas_set_font(canvas, FontSecondary); char clk[20]; diff --git a/applications/services/locale/locale.c b/applications/services/locale/locale.c index b268642436..6acf2eea97 100644 --- a/applications/services/locale/locale.c +++ b/applications/services/locale/locale.c @@ -18,14 +18,6 @@ void locale_set_time_format(LocaleTimeFormat format) { furi_hal_rtc_set_locale_timeformat((FuriHalRtcLocaleTimeFormat)format); } -LocaleMidnightFormat locale_get_midnight_format(void) { - return (LocaleMidnightFormat)furi_hal_rtc_get_locale_midnightformat(); -} - -void locale_set_midnight_format(LocaleMidnightFormat format) { - furi_hal_rtc_set_locale_midnightformat((FuriHalRtcLocaleMidnightFormat)format); -} - LocaleDateFormat locale_get_date_format(void) { return (LocaleDateFormat)furi_hal_rtc_get_locale_dateformat(); } diff --git a/applications/services/locale/locale.h b/applications/services/locale/locale.h index e9c8dc06a1..0046302df3 100644 --- a/applications/services/locale/locale.h +++ b/applications/services/locale/locale.h @@ -18,11 +18,6 @@ typedef enum { LocaleTimeFormat12h = 1, /**< 12-hour format */ } LocaleTimeFormat; -typedef enum { - LocaleMidnightFormatTwelve = 0, /**< 12:XX format */ - LocaleMidnightFormatZero = 1, /**< 00:XX format */ -} LocaleMidnightFormat; - typedef enum { LocaleDateFormatDMY = 0, /**< Day/Month/Year */ LocaleDateFormatMDY = 1, /**< Month/Day/Year */ @@ -69,18 +64,6 @@ LocaleTimeFormat locale_get_time_format(void); */ void locale_set_time_format(LocaleTimeFormat format); -/** Get Locale midnight format - * - * @return The locale midnight format. - */ -LocaleMidnightFormat locale_get_midnight_format(void); - -/** Set Locale midnight format - * - * @param[in] format The locale midnight format - */ -void locale_set_midnight_format(LocaleMidnightFormat format); - /** Format time to furi string * * @param[out] out_str The FuriString to store formatted time diff --git a/applications/settings/system/system_settings.c b/applications/settings/system/system_settings.c index 7055d90a90..43163dc170 100644 --- a/applications/settings/system/system_settings.c +++ b/applications/settings/system/system_settings.c @@ -165,22 +165,6 @@ static void time_format_changed(VariableItem* item) { locale_set_time_format(time_format_value[index]); } -const char* const midnight_format_text[] = { - "12:XX", - "00:XX", -}; - -const uint32_t midnight_format_value[] = { - LocaleMidnightFormatTwelve, - LocaleMidnightFormatZero, -}; - -static void midnight_format_changed(VariableItem* item) { - uint8_t index = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, midnight_format_text[index]); - locale_set_midnight_format(midnight_format_value[index]); -} - const char* const date_format_text[] = { "D/M/Y", "M/D/Y", @@ -366,17 +350,6 @@ SystemSettings* system_settings_alloc(void) { variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, time_format_text[value_index]); - item = variable_item_list_add( - app->var_item_list, - "Midnight Format", - COUNT_OF(midnight_format_text), - midnight_format_changed, - app); - value_index = value_index_uint32( - locale_get_midnight_format(), midnight_format_value, COUNT_OF(midnight_format_value)); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, midnight_format_text[value_index]); - item = variable_item_list_add( app->var_item_list, "Date Format", COUNT_OF(date_format_text), date_format_changed, app); value_index = value_index_uint32( diff --git a/lib/momentum/settings.c b/lib/momentum/settings.c index 315124c7c4..770ca337e0 100644 --- a/lib/momentum/settings.c +++ b/lib/momentum/settings.c @@ -34,6 +34,7 @@ MomentumSettings momentum_settings = { .rgb_backlight = false, // OFF .butthurt_timer = 21600, // 6 H .charge_cap = 100, // 100% + .midnight_format_00 = true, // 00:XX .spi_cc1101_handle = SpiDefault, // &furi_hal_spi_bus_handle_external .spi_nrf24_handle = SpiDefault, // &furi_hal_spi_bus_handle_external .uart_esp_channel = FuriHalSerialIdUsart, // pin 13,14 @@ -103,6 +104,7 @@ static const struct { {setting_bool(rgb_backlight)}, {setting_uint(butthurt_timer, 0, 172800)}, {setting_uint(charge_cap, 5, 100)}, + {setting_bool(midnight_format_00)}, {setting_enum(spi_cc1101_handle, SpiCount)}, {setting_enum(spi_nrf24_handle, SpiCount)}, {setting_enum(uart_esp_channel, FuriHalSerialIdMax)}, diff --git a/lib/momentum/settings.h b/lib/momentum/settings.h index ee13411313..3e02d4405f 100644 --- a/lib/momentum/settings.h +++ b/lib/momentum/settings.h @@ -82,6 +82,7 @@ typedef struct { bool rgb_backlight; uint32_t butthurt_timer; uint32_t charge_cap; + bool midnight_format_00; SpiHandle spi_cc1101_handle; SpiHandle spi_nrf24_handle; FuriHalSerialId uart_esp_channel; diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 136d85d938..f5e79d7eec 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1628,7 +1628,6 @@ Function,+,furi_hal_rtc_get_datetime,void,DateTime* Function,+,furi_hal_rtc_get_fault_data,uint32_t, Function,+,furi_hal_rtc_get_heap_track_mode,FuriHalRtcHeapTrackMode, Function,+,furi_hal_rtc_get_locale_dateformat,FuriHalRtcLocaleDateFormat, -Function,+,furi_hal_rtc_get_locale_midnightformat,FuriHalRtcLocaleMidnightFormat, Function,+,furi_hal_rtc_get_locale_timeformat,FuriHalRtcLocaleTimeFormat, Function,+,furi_hal_rtc_get_locale_units,FuriHalRtcLocaleUnits, Function,+,furi_hal_rtc_get_log_baud_rate,FuriHalRtcLogBaudRate, @@ -1652,7 +1651,6 @@ Function,+,furi_hal_rtc_set_fault_data,void,uint32_t Function,+,furi_hal_rtc_set_flag,void,FuriHalRtcFlag Function,+,furi_hal_rtc_set_heap_track_mode,void,FuriHalRtcHeapTrackMode Function,+,furi_hal_rtc_set_locale_dateformat,void,FuriHalRtcLocaleDateFormat -Function,+,furi_hal_rtc_set_locale_midnightformat,void,FuriHalRtcLocaleMidnightFormat Function,+,furi_hal_rtc_set_locale_timeformat,void,FuriHalRtcLocaleTimeFormat Function,+,furi_hal_rtc_set_locale_units,void,FuriHalRtcLocaleUnits Function,+,furi_hal_rtc_set_log_baud_rate,void,FuriHalRtcLogBaudRate @@ -2349,11 +2347,9 @@ Function,+,locale_format_date,void,"FuriString*, const DateTime*, const LocaleDa Function,+,locale_format_time,void,"FuriString*, const DateTime*, const LocaleTimeFormat, const _Bool" Function,+,locale_get_date_format,LocaleDateFormat, Function,+,locale_get_measurement_unit,LocaleMeasurementUnits, -Function,+,locale_get_midnight_format,LocaleMidnightFormat, Function,+,locale_get_time_format,LocaleTimeFormat, Function,+,locale_set_date_format,void,LocaleDateFormat Function,+,locale_set_measurement_unit,void,LocaleMeasurementUnits -Function,+,locale_set_midnight_format,void,LocaleMidnightFormat Function,+,locale_set_time_format,void,LocaleTimeFormat Function,-,log,double,double Function,-,log10,double,double diff --git a/targets/f7/furi_hal/furi_hal_rtc.c b/targets/f7/furi_hal/furi_hal_rtc.c index 74b978f6ea..ab592fb787 100644 --- a/targets/f7/furi_hal/furi_hal_rtc.c +++ b/targets/f7/furi_hal/furi_hal_rtc.c @@ -31,14 +31,14 @@ typedef struct { uint8_t log_level : 4; uint8_t log_reserved : 4; uint8_t flags; - FuriHalRtcBootMode boot_mode : 4; - FuriHalRtcHeapTrackMode heap_track_mode : 2; - FuriHalRtcLocaleUnits locale_units : 1; - FuriHalRtcLocaleTimeFormat locale_timeformat : 1; - FuriHalRtcLocaleMidnightFormat locale_midnightformat : 1; - FuriHalRtcLocaleDateFormat locale_dateformat : 2; - FuriHalRtcLogDevice log_device : 2; - FuriHalRtcLogBaudRate log_baud_rate : 3; + FuriHalRtcBootMode boot_mode : 4; + FuriHalRtcHeapTrackMode heap_track_mode : 2; + FuriHalRtcLocaleUnits locale_units : 1; + FuriHalRtcLocaleTimeFormat locale_timeformat : 1; + FuriHalRtcLocaleDateFormat locale_dateformat : 2; + FuriHalRtcLogDevice log_device : 2; + FuriHalRtcLogBaudRate log_baud_rate : 3; + uint8_t reserved : 1; } SystemReg; _Static_assert(sizeof(SystemReg) == 4, "SystemReg size mismatch"); @@ -379,19 +379,6 @@ FuriHalRtcLocaleTimeFormat furi_hal_rtc_get_locale_timeformat(void) { return data->locale_timeformat; } -void furi_hal_rtc_set_locale_midnightformat(FuriHalRtcLocaleMidnightFormat value) { - uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); - SystemReg* data = (SystemReg*)&data_reg; - data->locale_midnightformat = value; - furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); -} - -FuriHalRtcLocaleMidnightFormat furi_hal_rtc_get_locale_midnightformat(void) { - uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); - SystemReg* data = (SystemReg*)&data_reg; - return data->locale_midnightformat; -} - void furi_hal_rtc_set_locale_dateformat(FuriHalRtcLocaleDateFormat value) { uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); SystemReg* data = (SystemReg*)&data_reg; diff --git a/targets/f7/furi_hal/furi_hal_rtc.h b/targets/f7/furi_hal/furi_hal_rtc.h index 8f212bf186..49d35eeb9b 100644 --- a/targets/f7/furi_hal/furi_hal_rtc.h +++ b/targets/f7/furi_hal/furi_hal_rtc.h @@ -65,11 +65,6 @@ typedef enum { FuriHalRtcLocaleTimeFormat12h = 0x1, /**< 12-hour format */ } FuriHalRtcLocaleTimeFormat; -typedef enum { - FuriHalRtcLocaleMidnightFormatTwelve = 0x0, /**< 12:XX format */ - FuriHalRtcLocaleMidnightFormatZero = 0x1, /**< 00:XX format */ -} FuriHalRtcLocaleMidnightFormat; - typedef enum { FuriHalRtcLocaleDateFormatDMY = 0x0, /**< Day/Month/Year */ FuriHalRtcLocaleDateFormatMDY = 0x1, /**< Month/Day/Year */ @@ -236,18 +231,6 @@ void furi_hal_rtc_set_locale_timeformat(FuriHalRtcLocaleTimeFormat value); */ FuriHalRtcLocaleTimeFormat furi_hal_rtc_get_locale_timeformat(void); -/** Set RTC Locale Midnight Format - * - * @param[in] value The RTC Locale Midnight Format - */ -void furi_hal_rtc_set_locale_midnightformat(FuriHalRtcLocaleMidnightFormat value); - -/** Get RTC Locale Midnight Format - * - * @return The RTC Locale Midnight Format. - */ -FuriHalRtcLocaleMidnightFormat furi_hal_rtc_get_locale_midnightformat(void); - /** Set RTC Locale Date Format * * @param[in] value The RTC Locale Date Format From dc30a2baddd0e4a35f7bcf27b09e4f8239eb6fc6 Mon Sep 17 00:00:00 2001 From: 956MB Date: Tue, 21 Jan 2025 20:25:01 -0600 Subject: [PATCH 4/4] clock app external --- applications/external | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/external b/applications/external index 66bc0a40d8..dda6b8d9e5 160000 --- a/applications/external +++ b/applications/external @@ -1 +1 @@ -Subproject commit 66bc0a40d89dac291de8a0bab69736860ef273df +Subproject commit dda6b8d9e509b923113c17c3de9c1e78c838c878