[FL-3024] Locale settings (#2137)
* Locale settings * Time/date format fix * Locale: add docs, enums for HAL, cleanup. Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									2dea6969fe
								
							
						
					
					
						commit
						f10e82c64d
					
				
							
								
								
									
										11
									
								
								applications/debug/locale_test/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								applications/debug/locale_test/application.fam
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | App( | ||||||
|  |     appid="locale_test", | ||||||
|  |     name="Locale Test", | ||||||
|  |     apptype=FlipperAppType.DEBUG, | ||||||
|  |     entry_point="locale_test_app", | ||||||
|  |     cdefines=["APP_LOCALE"], | ||||||
|  |     requires=["gui", "locale"], | ||||||
|  |     stack_size=2 * 1024, | ||||||
|  |     order=70, | ||||||
|  |     fap_category="Debug", | ||||||
|  | ) | ||||||
							
								
								
									
										102
									
								
								applications/debug/locale_test/locale_test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								applications/debug/locale_test/locale_test.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,102 @@ | |||||||
|  | #include <furi.h> | ||||||
|  | #include <gui/gui.h> | ||||||
|  | #include <gui/elements.h> | ||||||
|  | #include <gui/view_dispatcher.h> | ||||||
|  | #include <gui/modules/dialog_ex.h> | ||||||
|  | #include <locale/locale.h> | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  |     Gui* gui; | ||||||
|  |     ViewDispatcher* view_dispatcher; | ||||||
|  |     View* view; | ||||||
|  | } LocaleTestApp; | ||||||
|  | 
 | ||||||
|  | static void locale_test_view_draw_callback(Canvas* canvas, void* _model) { | ||||||
|  |     UNUSED(_model); | ||||||
|  | 
 | ||||||
|  |     // Prepare canvas
 | ||||||
|  |     canvas_set_color(canvas, ColorBlack); | ||||||
|  |     canvas_set_font(canvas, FontSecondary); | ||||||
|  | 
 | ||||||
|  |     FuriString* tmp_string = furi_string_alloc(); | ||||||
|  | 
 | ||||||
|  |     float temp = 25.3f; | ||||||
|  |     LocaleMeasurementUnits units = locale_get_measurement_unit(); | ||||||
|  |     if(units == LocaleMeasurementUnitsMetric) { | ||||||
|  |         furi_string_printf(tmp_string, "Temp: %5.1fC", (double)temp); | ||||||
|  |     } else { | ||||||
|  |         temp = locale_celsius_to_fahrenheit(temp); | ||||||
|  |         furi_string_printf(tmp_string, "Temp: %5.1fF", (double)temp); | ||||||
|  |     } | ||||||
|  |     canvas_draw_str(canvas, 0, 10, furi_string_get_cstr(tmp_string)); | ||||||
|  | 
 | ||||||
|  |     FuriHalRtcDateTime datetime; | ||||||
|  |     furi_hal_rtc_get_datetime(&datetime); | ||||||
|  | 
 | ||||||
|  |     locale_format_time(tmp_string, &datetime, locale_get_time_format(), false); | ||||||
|  |     canvas_draw_str(canvas, 0, 25, furi_string_get_cstr(tmp_string)); | ||||||
|  | 
 | ||||||
|  |     locale_format_date(tmp_string, &datetime, locale_get_date_format(), "/"); | ||||||
|  |     canvas_draw_str(canvas, 0, 40, furi_string_get_cstr(tmp_string)); | ||||||
|  | 
 | ||||||
|  |     furi_string_free(tmp_string); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static bool locale_test_view_input_callback(InputEvent* event, void* context) { | ||||||
|  |     UNUSED(event); | ||||||
|  |     UNUSED(context); | ||||||
|  |     return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static uint32_t locale_test_exit(void* context) { | ||||||
|  |     UNUSED(context); | ||||||
|  |     return VIEW_NONE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static LocaleTestApp* locale_test_alloc() { | ||||||
|  |     LocaleTestApp* app = malloc(sizeof(LocaleTestApp)); | ||||||
|  | 
 | ||||||
|  |     // Gui
 | ||||||
|  |     app->gui = furi_record_open(RECORD_GUI); | ||||||
|  | 
 | ||||||
|  |     // View dispatcher
 | ||||||
|  |     app->view_dispatcher = view_dispatcher_alloc(); | ||||||
|  |     view_dispatcher_enable_queue(app->view_dispatcher); | ||||||
|  |     view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); | ||||||
|  | 
 | ||||||
|  |     // Views
 | ||||||
|  |     app->view = view_alloc(); | ||||||
|  |     view_set_draw_callback(app->view, locale_test_view_draw_callback); | ||||||
|  |     view_set_input_callback(app->view, locale_test_view_input_callback); | ||||||
|  | 
 | ||||||
|  |     view_set_previous_callback(app->view, locale_test_exit); | ||||||
|  |     view_dispatcher_add_view(app->view_dispatcher, 0, app->view); | ||||||
|  |     view_dispatcher_switch_to_view(app->view_dispatcher, 0); | ||||||
|  | 
 | ||||||
|  |     return app; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void locale_test_free(LocaleTestApp* app) { | ||||||
|  |     furi_assert(app); | ||||||
|  | 
 | ||||||
|  |     // Free views
 | ||||||
|  |     view_dispatcher_remove_view(app->view_dispatcher, 0); | ||||||
|  | 
 | ||||||
|  |     view_free(app->view); | ||||||
|  |     view_dispatcher_free(app->view_dispatcher); | ||||||
|  | 
 | ||||||
|  |     // Close gui record
 | ||||||
|  |     furi_record_close(RECORD_GUI); | ||||||
|  |     app->gui = NULL; | ||||||
|  | 
 | ||||||
|  |     // Free rest
 | ||||||
|  |     free(app); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int32_t locale_test_app(void* p) { | ||||||
|  |     UNUSED(p); | ||||||
|  |     LocaleTestApp* app = locale_test_alloc(); | ||||||
|  |     view_dispatcher_run(app->view_dispatcher); | ||||||
|  |     locale_test_free(app); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								applications/services/locale/application.fam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								applications/services/locale/application.fam
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | App( | ||||||
|  |     appid="locale", | ||||||
|  |     name="LocaleSrv", | ||||||
|  |     apptype=FlipperAppType.STARTUP, | ||||||
|  |     entry_point="locale_on_system_start", | ||||||
|  |     cdefines=["SRV_LOCALE"], | ||||||
|  |     order=90, | ||||||
|  |     sdk_headers=["locale.h"], | ||||||
|  | ) | ||||||
							
								
								
									
										109
									
								
								applications/services/locale/locale.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								applications/services/locale/locale.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,109 @@ | |||||||
|  | #include "locale.h" | ||||||
|  | 
 | ||||||
|  | #define TAG "LocaleSrv" | ||||||
|  | 
 | ||||||
|  | LocaleMeasurementUnits locale_get_measurement_unit(void) { | ||||||
|  |     return (LocaleMeasurementUnits)furi_hal_rtc_get_locale_units(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void locale_set_measurement_unit(LocaleMeasurementUnits format) { | ||||||
|  |     furi_hal_rtc_set_locale_units((FuriHalRtcLocaleUnits)format); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | LocaleTimeFormat locale_get_time_format(void) { | ||||||
|  |     return (LocaleTimeFormat)furi_hal_rtc_get_locale_timeformat(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void locale_set_time_format(LocaleTimeFormat format) { | ||||||
|  |     furi_hal_rtc_set_locale_timeformat((FuriHalRtcLocaleTimeFormat)format); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | LocaleDateFormat locale_get_date_format(void) { | ||||||
|  |     return (LocaleDateFormat)furi_hal_rtc_get_locale_dateformat(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void locale_set_date_format(LocaleDateFormat format) { | ||||||
|  |     furi_hal_rtc_set_locale_dateformat((FuriHalRtcLocaleDateFormat)format); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float locale_fahrenheit_to_celsius(float temp_f) { | ||||||
|  |     return (temp_f - 32.f) / 1.8f; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | float locale_celsius_to_fahrenheit(float temp_c) { | ||||||
|  |     return (temp_c * 1.8f + 32.f); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void locale_format_time( | ||||||
|  |     FuriString* out_str, | ||||||
|  |     const FuriHalRtcDateTime* datetime, | ||||||
|  |     const LocaleTimeFormat format, | ||||||
|  |     const bool show_seconds) { | ||||||
|  |     furi_assert(out_str); | ||||||
|  |     furi_assert(datetime); | ||||||
|  | 
 | ||||||
|  |     uint8_t hours = datetime->hour; | ||||||
|  |     uint8_t am_pm = 0; | ||||||
|  |     if(format == LocaleTimeFormat12h) { | ||||||
|  |         if(hours > 12) { | ||||||
|  |             hours -= 12; | ||||||
|  |             am_pm = 2; | ||||||
|  |         } else { | ||||||
|  |             am_pm = 1; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if(show_seconds) { | ||||||
|  |         furi_string_printf(out_str, "%02u:%02u:%02u", hours, datetime->minute, datetime->second); | ||||||
|  |     } else { | ||||||
|  |         furi_string_printf(out_str, "%02u:%02u", hours, datetime->minute); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if(am_pm > 0) { | ||||||
|  |         furi_string_cat_printf(out_str, " %s", (am_pm == 1) ? ("AM") : ("PM")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void locale_format_date( | ||||||
|  |     FuriString* out_str, | ||||||
|  |     const FuriHalRtcDateTime* datetime, | ||||||
|  |     const LocaleDateFormat format, | ||||||
|  |     const char* separator) { | ||||||
|  |     furi_assert(out_str); | ||||||
|  |     furi_assert(datetime); | ||||||
|  |     furi_assert(separator); | ||||||
|  | 
 | ||||||
|  |     if(format == LocaleDateFormatDMY) { | ||||||
|  |         furi_string_printf( | ||||||
|  |             out_str, | ||||||
|  |             "%02u%s%02u%s%04u", | ||||||
|  |             datetime->day, | ||||||
|  |             separator, | ||||||
|  |             datetime->month, | ||||||
|  |             separator, | ||||||
|  |             datetime->year); | ||||||
|  |     } else if(format == LocaleDateFormatMDY) { | ||||||
|  |         furi_string_printf( | ||||||
|  |             out_str, | ||||||
|  |             "%02u%s%02u%s%04u", | ||||||
|  |             datetime->month, | ||||||
|  |             separator, | ||||||
|  |             datetime->day, | ||||||
|  |             separator, | ||||||
|  |             datetime->year); | ||||||
|  |     } else { | ||||||
|  |         furi_string_printf( | ||||||
|  |             out_str, | ||||||
|  |             "%04u%s%02u%s%02u", | ||||||
|  |             datetime->year, | ||||||
|  |             separator, | ||||||
|  |             datetime->month, | ||||||
|  |             separator, | ||||||
|  |             datetime->day); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int32_t locale_on_system_start(void* p) { | ||||||
|  |     UNUSED(p); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										107
									
								
								applications/services/locale/locale.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								applications/services/locale/locale.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <furi.h> | ||||||
|  | #include <furi_hal.h> | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     LocaleMeasurementUnitsMetric = 0, /**< Metric measurement units */ | ||||||
|  |     LocaleMeasurementUnitsImperial = 1, /**< Imperial measurement units */ | ||||||
|  | } LocaleMeasurementUnits; | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     LocaleTimeFormat24h = 0, /**< 24-hour format */ | ||||||
|  |     LocaleTimeFormat12h = 1, /**< 12-hour format */ | ||||||
|  | } LocaleTimeFormat; | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     LocaleDateFormatDMY = 0, /**< Day/Month/Year */ | ||||||
|  |     LocaleDateFormatMDY = 1, /**< Month/Day/Year */ | ||||||
|  |     LocaleDateFormatYMD = 2, /**< Year/Month/Day */ | ||||||
|  | } LocaleDateFormat; | ||||||
|  | 
 | ||||||
|  | /** Get Locale measurement units
 | ||||||
|  |  * | ||||||
|  |  * @return     The locale measurement units. | ||||||
|  |  */ | ||||||
|  | LocaleMeasurementUnits locale_get_measurement_unit(); | ||||||
|  | 
 | ||||||
|  | /** Set locale measurement units
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  format  The locale measurements units | ||||||
|  |  */ | ||||||
|  | void locale_set_measurement_unit(LocaleMeasurementUnits format); | ||||||
|  | 
 | ||||||
|  | /** Convert Fahrenheit to Celsius
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  temp_f  The Temperature in Fahrenheit | ||||||
|  |  * | ||||||
|  |  * @return     The Temperature in Celsius  | ||||||
|  |  */ | ||||||
|  | float locale_fahrenheit_to_celsius(float temp_f); | ||||||
|  | 
 | ||||||
|  | /** Convert Celsius to Fahrenheit
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  temp_c  The Temperature in Celsius  | ||||||
|  |  * | ||||||
|  |  * @return     The Temperature in Fahrenheit | ||||||
|  |  */ | ||||||
|  | float locale_celsius_to_fahrenheit(float temp_c); | ||||||
|  | 
 | ||||||
|  | /** Get Locale time format
 | ||||||
|  |  * | ||||||
|  |  * @return     The locale time format. | ||||||
|  |  */ | ||||||
|  | LocaleTimeFormat locale_get_time_format(); | ||||||
|  | 
 | ||||||
|  | /** Set Locale Time Format
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  format  The Locale Time Format | ||||||
|  |  */ | ||||||
|  | void locale_set_time_format(LocaleTimeFormat format); | ||||||
|  | 
 | ||||||
|  | /** Format time to furi string
 | ||||||
|  |  * | ||||||
|  |  * @param[out] out_str       The FuriString to store formatted time | ||||||
|  |  * @param[in]  datetime      Pointer to the datetime | ||||||
|  |  * @param[in]  format        The Locale Time Format | ||||||
|  |  * @param[in]  show_seconds  The show seconds flag | ||||||
|  |  */ | ||||||
|  | void locale_format_time( | ||||||
|  |     FuriString* out_str, | ||||||
|  |     const FuriHalRtcDateTime* datetime, | ||||||
|  |     const LocaleTimeFormat format, | ||||||
|  |     const bool show_seconds); | ||||||
|  | 
 | ||||||
|  | /** Get Locale DateFormat
 | ||||||
|  |  * | ||||||
|  |  * @return     The Locale DateFormat. | ||||||
|  |  */ | ||||||
|  | LocaleDateFormat locale_get_date_format(); | ||||||
|  | 
 | ||||||
|  | /** Set Locale DateFormat
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  format  The Locale DateFormat | ||||||
|  |  */ | ||||||
|  | void locale_set_date_format(LocaleDateFormat format); | ||||||
|  | 
 | ||||||
|  | /** Format date to furi string
 | ||||||
|  |  * | ||||||
|  |  * @param[out] out_str    The FuriString to store formatted date | ||||||
|  |  * @param[in]  datetime   Pointer to the datetime | ||||||
|  |  * @param[in]  format     The format | ||||||
|  |  * @param[in]  separator  The separator | ||||||
|  |  */ | ||||||
|  | void locale_format_date( | ||||||
|  |     FuriString* out_str, | ||||||
|  |     const FuriHalRtcDateTime* datetime, | ||||||
|  |     const LocaleDateFormat format, | ||||||
|  |     const char* separator); | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
| @ -3,7 +3,7 @@ App( | |||||||
|     name="System", |     name="System", | ||||||
|     apptype=FlipperAppType.SETTINGS, |     apptype=FlipperAppType.SETTINGS, | ||||||
|     entry_point="system_settings_app", |     entry_point="system_settings_app", | ||||||
|     requires=["gui"], |     requires=["gui", "locale"], | ||||||
|     stack_size=1 * 1024, |     stack_size=1 * 1024, | ||||||
|     order=70, |     order=70, | ||||||
| ) | ) | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| #include "system_settings.h" | #include "system_settings.h" | ||||||
| #include <loader/loader.h> | #include <loader/loader.h> | ||||||
| #include <lib/toolbox/value_index.h> | #include <lib/toolbox/value_index.h> | ||||||
|  | #include <locale/locale.h> | ||||||
| 
 | 
 | ||||||
| const char* const log_level_text[] = { | const char* const log_level_text[] = { | ||||||
|     "Default", |     "Default", | ||||||
| @ -70,6 +71,59 @@ static void heap_trace_mode_changed(VariableItem* item) { | |||||||
|     furi_hal_rtc_set_heap_track_mode(heap_trace_mode_value[index]); |     furi_hal_rtc_set_heap_track_mode(heap_trace_mode_value[index]); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const char* const mesurement_units_text[] = { | ||||||
|  |     "Metric", | ||||||
|  |     "Imperial", | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint32_t mesurement_units_value[] = { | ||||||
|  |     LocaleMeasurementUnitsMetric, | ||||||
|  |     LocaleMeasurementUnitsImperial, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static void mesurement_units_changed(VariableItem* item) { | ||||||
|  |     // SystemSettings* app = variable_item_get_context(item);
 | ||||||
|  |     uint8_t index = variable_item_get_current_value_index(item); | ||||||
|  |     variable_item_set_current_value_text(item, mesurement_units_text[index]); | ||||||
|  |     locale_set_measurement_unit(mesurement_units_value[index]); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const char* const time_format_text[] = { | ||||||
|  |     "24h", | ||||||
|  |     "12h", | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint32_t time_format_value[] = { | ||||||
|  |     LocaleTimeFormat24h, | ||||||
|  |     LocaleTimeFormat12h, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static void time_format_changed(VariableItem* item) { | ||||||
|  |     // SystemSettings* app = variable_item_get_context(item);
 | ||||||
|  |     uint8_t index = variable_item_get_current_value_index(item); | ||||||
|  |     variable_item_set_current_value_text(item, time_format_text[index]); | ||||||
|  |     locale_set_time_format(time_format_value[index]); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const char* const date_format_text[] = { | ||||||
|  |     "D/M/Y", | ||||||
|  |     "M/D/Y", | ||||||
|  |     "Y/M/D", | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const uint32_t date_format_value[] = { | ||||||
|  |     LocaleDateFormatDMY, | ||||||
|  |     LocaleDateFormatMDY, | ||||||
|  |     LocaleDateFormatYMD, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static void date_format_changed(VariableItem* item) { | ||||||
|  |     // SystemSettings* app = variable_item_get_context(item);
 | ||||||
|  |     uint8_t index = variable_item_get_current_value_index(item); | ||||||
|  |     variable_item_set_current_value_text(item, date_format_text[index]); | ||||||
|  |     locale_set_date_format(date_format_value[index]); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static uint32_t system_settings_exit(void* context) { | static uint32_t system_settings_exit(void* context) { | ||||||
|     UNUSED(context); |     UNUSED(context); | ||||||
|     return VIEW_NONE; |     return VIEW_NONE; | ||||||
| @ -91,6 +145,31 @@ SystemSettings* system_settings_alloc() { | |||||||
|     uint8_t value_index; |     uint8_t value_index; | ||||||
|     app->var_item_list = variable_item_list_alloc(); |     app->var_item_list = variable_item_list_alloc(); | ||||||
| 
 | 
 | ||||||
|  |     item = variable_item_list_add( | ||||||
|  |         app->var_item_list, | ||||||
|  |         "Units", | ||||||
|  |         COUNT_OF(mesurement_units_text), | ||||||
|  |         mesurement_units_changed, | ||||||
|  |         app); | ||||||
|  |     value_index = value_index_uint32( | ||||||
|  |         locale_get_measurement_unit(), mesurement_units_value, COUNT_OF(mesurement_units_value)); | ||||||
|  |     variable_item_set_current_value_index(item, value_index); | ||||||
|  |     variable_item_set_current_value_text(item, mesurement_units_text[value_index]); | ||||||
|  | 
 | ||||||
|  |     item = variable_item_list_add( | ||||||
|  |         app->var_item_list, "Time Format", COUNT_OF(time_format_text), time_format_changed, app); | ||||||
|  |     value_index = value_index_uint32( | ||||||
|  |         locale_get_time_format(), time_format_value, COUNT_OF(time_format_value)); | ||||||
|  |     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, "Date Format", COUNT_OF(date_format_text), date_format_changed, app); | ||||||
|  |     value_index = value_index_uint32( | ||||||
|  |         locale_get_date_format(), date_format_value, COUNT_OF(date_format_value)); | ||||||
|  |     variable_item_set_current_value_index(item, value_index); | ||||||
|  |     variable_item_set_current_value_text(item, date_format_text[value_index]); | ||||||
|  | 
 | ||||||
|     item = variable_item_list_add( |     item = variable_item_list_add( | ||||||
|         app->var_item_list, "Log Level", COUNT_OF(log_level_text), log_level_changed, app); |         app->var_item_list, "Log Level", COUNT_OF(log_level_text), log_level_changed, app); | ||||||
|     value_index = value_index_uint32( |     value_index = value_index_uint32( | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| entry,status,name,type,params | entry,status,name,type,params | ||||||
| Version,+,11.0,, | Version,+,11.1,, | ||||||
| Header,+,applications/services/bt/bt_service/bt.h,, | Header,+,applications/services/bt/bt_service/bt.h,, | ||||||
| Header,+,applications/services/cli/cli.h,, | Header,+,applications/services/cli/cli.h,, | ||||||
| Header,+,applications/services/cli/cli_vcp.h,, | Header,+,applications/services/cli/cli_vcp.h,, | ||||||
| @ -29,6 +29,7 @@ Header,+,applications/services/gui/view_dispatcher.h,, | |||||||
| Header,+,applications/services/gui/view_stack.h,, | Header,+,applications/services/gui/view_stack.h,, | ||||||
| Header,+,applications/services/input/input.h,, | Header,+,applications/services/input/input.h,, | ||||||
| Header,+,applications/services/loader/loader.h,, | Header,+,applications/services/loader/loader.h,, | ||||||
|  | Header,+,applications/services/locale/locale.h,, | ||||||
| Header,+,applications/services/notification/notification.h,, | Header,+,applications/services/notification/notification.h,, | ||||||
| Header,+,applications/services/notification/notification_messages.h,, | Header,+,applications/services/notification/notification_messages.h,, | ||||||
| Header,+,applications/services/power/power_service/power.h,, | Header,+,applications/services/power/power_service/power.h,, | ||||||
| @ -1265,6 +1266,9 @@ Function,+,furi_hal_rtc_get_boot_mode,FuriHalRtcBootMode, | |||||||
| Function,+,furi_hal_rtc_get_datetime,void,FuriHalRtcDateTime* | Function,+,furi_hal_rtc_get_datetime,void,FuriHalRtcDateTime* | ||||||
| Function,+,furi_hal_rtc_get_fault_data,uint32_t, | Function,+,furi_hal_rtc_get_fault_data,uint32_t, | ||||||
| Function,+,furi_hal_rtc_get_heap_track_mode,FuriHalRtcHeapTrackMode, | Function,+,furi_hal_rtc_get_heap_track_mode,FuriHalRtcHeapTrackMode, | ||||||
|  | Function,+,furi_hal_rtc_get_locale_dateformat,FuriHalRtcLocaleDateFormat, | ||||||
|  | Function,+,furi_hal_rtc_get_locale_timeformat,FuriHalRtcLocaleTimeFormat, | ||||||
|  | Function,+,furi_hal_rtc_get_locale_units,FuriHalRtcLocaleUnits, | ||||||
| Function,+,furi_hal_rtc_get_log_level,uint8_t, | Function,+,furi_hal_rtc_get_log_level,uint8_t, | ||||||
| Function,+,furi_hal_rtc_get_pin_fails,uint32_t, | Function,+,furi_hal_rtc_get_pin_fails,uint32_t, | ||||||
| Function,+,furi_hal_rtc_get_register,uint32_t,FuriHalRtcRegister | Function,+,furi_hal_rtc_get_register,uint32_t,FuriHalRtcRegister | ||||||
| @ -1278,6 +1282,9 @@ Function,+,furi_hal_rtc_set_datetime,void,FuriHalRtcDateTime* | |||||||
| Function,+,furi_hal_rtc_set_fault_data,void,uint32_t | Function,+,furi_hal_rtc_set_fault_data,void,uint32_t | ||||||
| Function,+,furi_hal_rtc_set_flag,void,FuriHalRtcFlag | Function,+,furi_hal_rtc_set_flag,void,FuriHalRtcFlag | ||||||
| Function,+,furi_hal_rtc_set_heap_track_mode,void,FuriHalRtcHeapTrackMode | 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_timeformat,void,FuriHalRtcLocaleTimeFormat | ||||||
|  | Function,+,furi_hal_rtc_set_locale_units,void,FuriHalRtcLocaleUnits | ||||||
| Function,+,furi_hal_rtc_set_log_level,void,uint8_t | Function,+,furi_hal_rtc_set_log_level,void,uint8_t | ||||||
| Function,+,furi_hal_rtc_set_pin_fails,void,uint32_t | Function,+,furi_hal_rtc_set_pin_fails,void,uint32_t | ||||||
| Function,+,furi_hal_rtc_set_register,void,"FuriHalRtcRegister, uint32_t" | Function,+,furi_hal_rtc_set_register,void,"FuriHalRtcRegister, uint32_t" | ||||||
| @ -1736,6 +1743,16 @@ Function,+,loader_update_menu,void, | |||||||
| Function,+,loading_alloc,Loading*, | Function,+,loading_alloc,Loading*, | ||||||
| Function,+,loading_free,void,Loading* | Function,+,loading_free,void,Loading* | ||||||
| Function,+,loading_get_view,View*,Loading* | Function,+,loading_get_view,View*,Loading* | ||||||
|  | Function,+,locale_celsius_to_fahrenheit,float,float | ||||||
|  | Function,+,locale_fahrenheit_to_celsius,float,float | ||||||
|  | Function,+,locale_format_date,void,"FuriString*, const FuriHalRtcDateTime*, const LocaleDateFormat, const char*" | ||||||
|  | Function,+,locale_format_time,void,"FuriString*, const FuriHalRtcDateTime*, const LocaleTimeFormat, const _Bool" | ||||||
|  | Function,+,locale_get_date_format,LocaleDateFormat, | ||||||
|  | Function,+,locale_get_measurement_unit,LocaleMeasurementUnits, | ||||||
|  | Function,+,locale_get_time_format,LocaleTimeFormat, | ||||||
|  | Function,+,locale_set_date_format,void,LocaleDateFormat | ||||||
|  | Function,+,locale_set_measurement_unit,void,LocaleMeasurementUnits | ||||||
|  | Function,+,locale_set_time_format,void,LocaleTimeFormat | ||||||
| Function,-,localtime,tm*,const time_t* | Function,-,localtime,tm*,const time_t* | ||||||
| Function,-,localtime_r,tm*,"const time_t*, tm*" | Function,-,localtime_r,tm*,"const time_t*, tm*" | ||||||
| Function,-,log,double,double | Function,-,log,double,double | ||||||
|  | |||||||
| 
 | 
| @ -29,12 +29,15 @@ typedef struct { | |||||||
|     uint8_t log_level : 4; |     uint8_t log_level : 4; | ||||||
|     uint8_t log_reserved : 4; |     uint8_t log_reserved : 4; | ||||||
|     uint8_t flags; |     uint8_t flags; | ||||||
|     uint8_t boot_mode : 4; |     FuriHalRtcBootMode boot_mode : 4; | ||||||
|     uint8_t heap_track_mode : 2; |     FuriHalRtcHeapTrackMode heap_track_mode : 2; | ||||||
|     uint16_t reserved : 10; |     FuriHalRtcLocaleUnits locale_units : 1; | ||||||
| } DeveloperReg; |     FuriHalRtcLocaleTimeFormat locale_timeformat : 1; | ||||||
|  |     FuriHalRtcLocaleDateFormat locale_dateformat : 2; | ||||||
|  |     uint8_t reserved : 6; | ||||||
|  | } SystemReg; | ||||||
| 
 | 
 | ||||||
| _Static_assert(sizeof(DeveloperReg) == 4, "DeveloperReg size mismatch"); | _Static_assert(sizeof(SystemReg) == 4, "SystemReg size mismatch"); | ||||||
| 
 | 
 | ||||||
| #define FURI_HAL_RTC_SECONDS_PER_MINUTE 60 | #define FURI_HAL_RTC_SECONDS_PER_MINUTE 60 | ||||||
| #define FURI_HAL_RTC_SECONDS_PER_HOUR (FURI_HAL_RTC_SECONDS_PER_MINUTE * 60) | #define FURI_HAL_RTC_SECONDS_PER_HOUR (FURI_HAL_RTC_SECONDS_PER_MINUTE * 60) | ||||||
| @ -172,7 +175,7 @@ void furi_hal_rtc_set_register(FuriHalRtcRegister reg, uint32_t value) { | |||||||
| 
 | 
 | ||||||
| void furi_hal_rtc_set_log_level(uint8_t level) { | void furi_hal_rtc_set_log_level(uint8_t level) { | ||||||
|     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|     DeveloperReg* data = (DeveloperReg*)&data_reg; |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|     data->log_level = level; |     data->log_level = level; | ||||||
|     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); |     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); | ||||||
|     furi_log_set_level(level); |     furi_log_set_level(level); | ||||||
| @ -180,13 +183,13 @@ void furi_hal_rtc_set_log_level(uint8_t level) { | |||||||
| 
 | 
 | ||||||
| uint8_t furi_hal_rtc_get_log_level() { | uint8_t furi_hal_rtc_get_log_level() { | ||||||
|     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|     DeveloperReg* data = (DeveloperReg*)&data_reg; |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|     return data->log_level; |     return data->log_level; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void furi_hal_rtc_set_flag(FuriHalRtcFlag flag) { | void furi_hal_rtc_set_flag(FuriHalRtcFlag flag) { | ||||||
|     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|     DeveloperReg* data = (DeveloperReg*)&data_reg; |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|     data->flags |= flag; |     data->flags |= flag; | ||||||
|     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); |     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); | ||||||
| 
 | 
 | ||||||
| @ -197,7 +200,7 @@ void furi_hal_rtc_set_flag(FuriHalRtcFlag flag) { | |||||||
| 
 | 
 | ||||||
| void furi_hal_rtc_reset_flag(FuriHalRtcFlag flag) { | void furi_hal_rtc_reset_flag(FuriHalRtcFlag flag) { | ||||||
|     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|     DeveloperReg* data = (DeveloperReg*)&data_reg; |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|     data->flags &= ~flag; |     data->flags &= ~flag; | ||||||
|     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); |     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); | ||||||
| 
 | 
 | ||||||
| @ -208,34 +211,73 @@ void furi_hal_rtc_reset_flag(FuriHalRtcFlag flag) { | |||||||
| 
 | 
 | ||||||
| bool furi_hal_rtc_is_flag_set(FuriHalRtcFlag flag) { | bool furi_hal_rtc_is_flag_set(FuriHalRtcFlag flag) { | ||||||
|     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|     DeveloperReg* data = (DeveloperReg*)&data_reg; |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|     return data->flags & flag; |     return data->flags & flag; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void furi_hal_rtc_set_boot_mode(FuriHalRtcBootMode mode) { | void furi_hal_rtc_set_boot_mode(FuriHalRtcBootMode mode) { | ||||||
|     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|     DeveloperReg* data = (DeveloperReg*)&data_reg; |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|     data->boot_mode = mode; |     data->boot_mode = mode; | ||||||
|     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); |     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| FuriHalRtcBootMode furi_hal_rtc_get_boot_mode() { | FuriHalRtcBootMode furi_hal_rtc_get_boot_mode() { | ||||||
|     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|     DeveloperReg* data = (DeveloperReg*)&data_reg; |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|     return (FuriHalRtcBootMode)data->boot_mode; |     return data->boot_mode; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void furi_hal_rtc_set_heap_track_mode(FuriHalRtcHeapTrackMode mode) { | void furi_hal_rtc_set_heap_track_mode(FuriHalRtcHeapTrackMode mode) { | ||||||
|     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|     DeveloperReg* data = (DeveloperReg*)&data_reg; |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|     data->heap_track_mode = mode; |     data->heap_track_mode = mode; | ||||||
|     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); |     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| FuriHalRtcHeapTrackMode furi_hal_rtc_get_heap_track_mode() { | FuriHalRtcHeapTrackMode furi_hal_rtc_get_heap_track_mode() { | ||||||
|     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|     DeveloperReg* data = (DeveloperReg*)&data_reg; |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|     return (FuriHalRtcHeapTrackMode)data->heap_track_mode; |     return data->heap_track_mode; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void furi_hal_rtc_set_locale_units(FuriHalRtcLocaleUnits value) { | ||||||
|  |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|  |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|  |     data->locale_units = value; | ||||||
|  |     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | FuriHalRtcLocaleUnits furi_hal_rtc_get_locale_units() { | ||||||
|  |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|  |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|  |     return data->locale_units; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void furi_hal_rtc_set_locale_timeformat(FuriHalRtcLocaleTimeFormat value) { | ||||||
|  |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|  |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|  |     data->locale_timeformat = value; | ||||||
|  |     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | FuriHalRtcLocaleTimeFormat furi_hal_rtc_get_locale_timeformat() { | ||||||
|  |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|  |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|  |     return data->locale_timeformat; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void furi_hal_rtc_set_locale_dateformat(FuriHalRtcLocaleDateFormat value) { | ||||||
|  |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|  |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|  |     data->locale_dateformat = value; | ||||||
|  |     furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | FuriHalRtcLocaleDateFormat furi_hal_rtc_get_locale_dateformat() { | ||||||
|  |     uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem); | ||||||
|  |     SystemReg* data = (SystemReg*)&data_reg; | ||||||
|  |     return data->locale_dateformat; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void furi_hal_rtc_set_datetime(FuriHalRtcDateTime* datetime) { | void furi_hal_rtc_set_datetime(FuriHalRtcDateTime* datetime) { | ||||||
|  | |||||||
| @ -59,53 +59,194 @@ typedef enum { | |||||||
|     FuriHalRtcRegisterMAX, /**< Service value, do not use */ |     FuriHalRtcRegisterMAX, /**< Service value, do not use */ | ||||||
| } FuriHalRtcRegister; | } FuriHalRtcRegister; | ||||||
| 
 | 
 | ||||||
|  | typedef enum { | ||||||
|  |     FuriHalRtcLocaleUnitsMetric = 0, /**< Metric measurement units */ | ||||||
|  |     FuriHalRtcLocaleUnitsImperial = 1, /**< Imperial measurement units */ | ||||||
|  | } FuriHalRtcLocaleUnits; | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     FuriHalRtcLocaleTimeFormat24h = 0, /**< 24-hour format */ | ||||||
|  |     FuriHalRtcLocaleTimeFormat12h = 1, /**< 12-hour format */ | ||||||
|  | } FuriHalRtcLocaleTimeFormat; | ||||||
|  | 
 | ||||||
|  | typedef enum { | ||||||
|  |     FuriHalRtcLocaleDateFormatDMY = 0, /**< Day/Month/Year */ | ||||||
|  |     FuriHalRtcLocaleDateFormatMDY = 1, /**< Month/Day/Year */ | ||||||
|  |     FuriHalRtcLocaleDateFormatYMD = 2, /**< Year/Month/Day */ | ||||||
|  | } FuriHalRtcLocaleDateFormat; | ||||||
|  | 
 | ||||||
| /** Early initialization */ | /** Early initialization */ | ||||||
| void furi_hal_rtc_init_early(); | void furi_hal_rtc_init_early(); | ||||||
| 
 | 
 | ||||||
| /** Early deinitialization */ | /** Early de-initialization */ | ||||||
| void furi_hal_rtc_deinit_early(); | void furi_hal_rtc_deinit_early(); | ||||||
| 
 | 
 | ||||||
| /** Initialize RTC subsystem */ | /** Initialize RTC subsystem */ | ||||||
| void furi_hal_rtc_init(); | void furi_hal_rtc_init(); | ||||||
| 
 | 
 | ||||||
|  | /** Get RTC register content
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  reg   The register identifier | ||||||
|  |  * | ||||||
|  |  * @return     content of the register | ||||||
|  |  */ | ||||||
| uint32_t furi_hal_rtc_get_register(FuriHalRtcRegister reg); | uint32_t furi_hal_rtc_get_register(FuriHalRtcRegister reg); | ||||||
| 
 | 
 | ||||||
|  | /** Set register content
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  reg    The register identifier | ||||||
|  |  * @param[in]  value  The value to store into register | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_set_register(FuriHalRtcRegister reg, uint32_t value); | void furi_hal_rtc_set_register(FuriHalRtcRegister reg, uint32_t value); | ||||||
| 
 | 
 | ||||||
|  | /** Set Log Level value
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  level  The level to store | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_set_log_level(uint8_t level); | void furi_hal_rtc_set_log_level(uint8_t level); | ||||||
| 
 | 
 | ||||||
|  | /** Get Log Level value
 | ||||||
|  |  * | ||||||
|  |  * @return     The Log Level value | ||||||
|  |  */ | ||||||
| uint8_t furi_hal_rtc_get_log_level(); | uint8_t furi_hal_rtc_get_log_level(); | ||||||
| 
 | 
 | ||||||
|  | /** Set RTC Flag
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  flag  The flag to set | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_set_flag(FuriHalRtcFlag flag); | void furi_hal_rtc_set_flag(FuriHalRtcFlag flag); | ||||||
| 
 | 
 | ||||||
|  | /** Reset RTC Flag
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  flag  The flag to reset | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_reset_flag(FuriHalRtcFlag flag); | void furi_hal_rtc_reset_flag(FuriHalRtcFlag flag); | ||||||
| 
 | 
 | ||||||
|  | /** Check if RTC Flag is set
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  flag  The flag to check | ||||||
|  |  * | ||||||
|  |  * @return     true if set | ||||||
|  |  */ | ||||||
| bool furi_hal_rtc_is_flag_set(FuriHalRtcFlag flag); | bool furi_hal_rtc_is_flag_set(FuriHalRtcFlag flag); | ||||||
| 
 | 
 | ||||||
|  | /** Set RTC boot mode
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  mode  The mode to set | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_set_boot_mode(FuriHalRtcBootMode mode); | void furi_hal_rtc_set_boot_mode(FuriHalRtcBootMode mode); | ||||||
| 
 | 
 | ||||||
|  | /** Get RTC boot mode
 | ||||||
|  |  * | ||||||
|  |  * @return     The RTC boot mode. | ||||||
|  |  */ | ||||||
| FuriHalRtcBootMode furi_hal_rtc_get_boot_mode(); | FuriHalRtcBootMode furi_hal_rtc_get_boot_mode(); | ||||||
| 
 | 
 | ||||||
|  | /** Set Heap Track mode
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  mode  The mode to set | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_set_heap_track_mode(FuriHalRtcHeapTrackMode mode); | void furi_hal_rtc_set_heap_track_mode(FuriHalRtcHeapTrackMode mode); | ||||||
| 
 | 
 | ||||||
|  | /** Get RTC Heap Track mode
 | ||||||
|  |  * | ||||||
|  |  * @return     The RTC heap track mode. | ||||||
|  |  */ | ||||||
| FuriHalRtcHeapTrackMode furi_hal_rtc_get_heap_track_mode(); | FuriHalRtcHeapTrackMode furi_hal_rtc_get_heap_track_mode(); | ||||||
| 
 | 
 | ||||||
|  | /** Set locale units
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  mode  The RTC Locale Units | ||||||
|  |  */ | ||||||
|  | void furi_hal_rtc_set_locale_units(FuriHalRtcLocaleUnits value); | ||||||
|  | 
 | ||||||
|  | /** Get RTC Locale Units
 | ||||||
|  |  * | ||||||
|  |  * @return     The RTC Locale Units. | ||||||
|  |  */ | ||||||
|  | FuriHalRtcLocaleUnits furi_hal_rtc_get_locale_units(); | ||||||
|  | 
 | ||||||
|  | /** Set RTC Locale Time Format
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  value  The RTC Locale Time Format | ||||||
|  |  */ | ||||||
|  | void furi_hal_rtc_set_locale_timeformat(FuriHalRtcLocaleTimeFormat value); | ||||||
|  | 
 | ||||||
|  | /** Get RTC Locale Time Format
 | ||||||
|  |  * | ||||||
|  |  * @return     The RTC Locale Time Format. | ||||||
|  |  */ | ||||||
|  | FuriHalRtcLocaleTimeFormat furi_hal_rtc_get_locale_timeformat(); | ||||||
|  | 
 | ||||||
|  | /** Set RTC Locale Date Format
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  value  The RTC Locale Date Format | ||||||
|  |  */ | ||||||
|  | void furi_hal_rtc_set_locale_dateformat(FuriHalRtcLocaleDateFormat value); | ||||||
|  | 
 | ||||||
|  | /** Get RTC Locale Date Format
 | ||||||
|  |  * | ||||||
|  |  * @return     The RTC Locale Date Format | ||||||
|  |  */ | ||||||
|  | FuriHalRtcLocaleDateFormat furi_hal_rtc_get_locale_dateformat(); | ||||||
|  | 
 | ||||||
|  | /** Set RTC Date Time
 | ||||||
|  |  * | ||||||
|  |  * @param      datetime  The date time to set | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_set_datetime(FuriHalRtcDateTime* datetime); | void furi_hal_rtc_set_datetime(FuriHalRtcDateTime* datetime); | ||||||
| 
 | 
 | ||||||
|  | /** Get RTC Date Time
 | ||||||
|  |  * | ||||||
|  |  * @param      datetime  The datetime | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_get_datetime(FuriHalRtcDateTime* datetime); | void furi_hal_rtc_get_datetime(FuriHalRtcDateTime* datetime); | ||||||
| 
 | 
 | ||||||
|  | /** Validate Date Time
 | ||||||
|  |  * | ||||||
|  |  * @param      datetime  The datetime to validate | ||||||
|  |  * | ||||||
|  |  * @return     { description_of_the_return_value } | ||||||
|  |  */ | ||||||
| bool furi_hal_rtc_validate_datetime(FuriHalRtcDateTime* datetime); | bool furi_hal_rtc_validate_datetime(FuriHalRtcDateTime* datetime); | ||||||
| 
 | 
 | ||||||
|  | /** Set RTC Fault Data
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  value  The value | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_set_fault_data(uint32_t value); | void furi_hal_rtc_set_fault_data(uint32_t value); | ||||||
| 
 | 
 | ||||||
|  | /** Get RTC Fault Data
 | ||||||
|  |  * | ||||||
|  |  * @return     RTC Fault Data value | ||||||
|  |  */ | ||||||
| uint32_t furi_hal_rtc_get_fault_data(); | uint32_t furi_hal_rtc_get_fault_data(); | ||||||
| 
 | 
 | ||||||
|  | /** Set Pin Fails count
 | ||||||
|  |  * | ||||||
|  |  * @param[in]  value  The Pin Fails count | ||||||
|  |  */ | ||||||
| void furi_hal_rtc_set_pin_fails(uint32_t value); | void furi_hal_rtc_set_pin_fails(uint32_t value); | ||||||
| 
 | 
 | ||||||
|  | /** Get Pin Fails count
 | ||||||
|  |  * | ||||||
|  |  * @return     Pin Fails Count | ||||||
|  |  */ | ||||||
| uint32_t furi_hal_rtc_get_pin_fails(); | uint32_t furi_hal_rtc_get_pin_fails(); | ||||||
| 
 | 
 | ||||||
|  | /** Get UNIX Timestamp
 | ||||||
|  |  * | ||||||
|  |  * @return     Unix Timestamp in seconds from UNIX epoch start | ||||||
|  |  */ | ||||||
| uint32_t furi_hal_rtc_get_timestamp(); | uint32_t furi_hal_rtc_get_timestamp(); | ||||||
| 
 | 
 | ||||||
|  | /** Convert DateTime to UNIX timestamp
 | ||||||
|  |  * | ||||||
|  |  * @param      datetime  The datetime | ||||||
|  |  * | ||||||
|  |  * @return     UNIX Timestamp in seconds from UNIX epoch start | ||||||
|  |  */ | ||||||
| uint32_t furi_hal_rtc_datetime_to_timestamp(FuriHalRtcDateTime* datetime); | uint32_t furi_hal_rtc_datetime_to_timestamp(FuriHalRtcDateTime* datetime); | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Nikolay Minaylov
						Nikolay Minaylov