[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:
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
|
Reference in New Issue
Block a user