diff --git a/daemon/x52d.conf b/daemon/x52d.conf index f6d3bd0..b62ae11 100644 --- a/daemon/x52d.conf +++ b/daemon/x52d.conf @@ -30,6 +30,23 @@ Secondary=UTC # timezone name as defined by the Olson time database. Tertiary=UTC +# PrimaryFormat controls the clock format of the primary clock. This is +# either 12hr or 24hr, and can be abbreviated to 12 or 24 +PrimaryFormat=12hr + +# SecondaryFormat controls the clock format of the secondary clock. This is +# either 12hr or 24hr, and can be abbreviated to 12 or 24 +SecondaryFormat=12hr + +# TertiaryFormat controls the clock format of the tertiary clock. This is +# either 12hr or 24hr, and can be abbreviated to 12 or 24 +TertiaryFormat=12hr + +# DateFormat controls the format of the date display. This can be one of +# ddmmyy, mmddyy or yymmdd. Alternate representations of these are +# dd-mm-yy, mm-dd-yy or yy-mm-dd respectively. +DateFormat=ddmmyy + ###################################################################### # LED Settings - only applicable to X52Pro ###################################################################### diff --git a/daemon/x52d_clock.c b/daemon/x52d_clock.c index c67807e..2433573 100644 --- a/daemon/x52d_clock.c +++ b/daemon/x52d_clock.c @@ -118,6 +118,39 @@ void x52d_cfg_set_Clock_Tertiary(char* param) x52d_dev_set_clock_timezone(LIBX52_CLOCK_3, get_tz_offset(param)); } +static void set_clock_format(const char *name, libx52_clock_id id, libx52_clock_format fmt) +{ + PINELOG_TRACE("Setting %s clock format to %s", name, + fmt == LIBX52_CLOCK_FORMAT_12HR ? "12 hour" : "24 hour"); + x52d_dev_set_clock_format(id, fmt); +} + +void x52d_cfg_set_Clock_FormatPrimary(libx52_clock_format fmt) +{ + set_clock_format("primary", LIBX52_CLOCK_1, fmt); +} + +void x52d_cfg_set_Clock_FormatSecondary(libx52_clock_format fmt) +{ + set_clock_format("secondary", LIBX52_CLOCK_2, fmt); +} + +void x52d_cfg_set_Clock_FormatTertiary(libx52_clock_format fmt) +{ + set_clock_format("tertiary", LIBX52_CLOCK_3, fmt); +} + +void x52d_cfg_set_Clock_DateFormat(libx52_date_format fmt) +{ + static const char *formats[] = { + "dd-mm-yy", + "mm-dd-yy", + "yy-mm-dd" + }; + PINELOG_TRACE("Setting date format to %s", formats[fmt]); + x52d_dev_set_date_format(fmt); +} + static pthread_t clock_thr; static void * x52_clock_thr(void *param) diff --git a/daemon/x52d_config.def b/daemon/x52d_config.def index 37deb19..8e221dc 100644 --- a/daemon/x52d_config.def +++ b/daemon/x52d_config.def @@ -30,6 +30,18 @@ CFG(Clock, Secondary, clock_2_tz, string_parser, UTC) // timezone name as defined by the Olson time database. CFG(Clock, Tertiary, clock_3_tz, string_parser, UTC) +// Clock format for the primary clock +CFG(Clock, FormatPrimary, clock_format[LIBX52_CLOCK_1], clock_format_parser, 12hr) + +// Clock format for the secondary clock +CFG(Clock, FormatSecondary, clock_format[LIBX52_CLOCK_2], clock_format_parser, 12hr) + +// Clock format for the tertiary clock +CFG(Clock, FormatTertiary, clock_format[LIBX52_CLOCK_3], clock_format_parser, 12hr) + +// Date format for the date display +CFG(Clock, DateFormat, date_format, date_format_parser, ddmmyy) + /********************************************************************** * LED Settings - only applicable to X52Pro *********************************************************************/ diff --git a/daemon/x52d_config.h b/daemon/x52d_config.h index d8fa072..416a72f 100644 --- a/daemon/x52d_config.h +++ b/daemon/x52d_config.h @@ -22,6 +22,12 @@ struct x52d_config { bool clock_enabled; bool primary_clock_local; + + // Since we don't have a _MAX identifier for libx52_clock_id, use + // the maximum clock ID + 1 as the length + libx52_clock_format clock_format[LIBX52_CLOCK_3 + 1]; + libx52_date_format date_format; + char clock_2_tz[NAME_MAX]; char clock_3_tz[NAME_MAX]; @@ -43,6 +49,10 @@ void x52d_cfg_set_Clock_Enabled(bool param); void x52d_cfg_set_Clock_PrimaryIsLocal(bool param); void x52d_cfg_set_Clock_Secondary(char* param); void x52d_cfg_set_Clock_Tertiary(char* param); +void x52d_cfg_set_Clock_FormatPrimary(libx52_clock_format param); +void x52d_cfg_set_Clock_FormatSecondary(libx52_clock_format param); +void x52d_cfg_set_Clock_FormatTertiary(libx52_clock_format param); +void x52d_cfg_set_Clock_DateFormat(libx52_date_format param); void x52d_cfg_set_LED_Fire(libx52_led_state param); void x52d_cfg_set_LED_Throttle(libx52_led_state param); void x52d_cfg_set_LED_A(libx52_led_state param); diff --git a/daemon/x52d_config_parser.c b/daemon/x52d_config_parser.c index 2b2b4da..1132e10 100644 --- a/daemon/x52d_config_parser.c +++ b/daemon/x52d_config_parser.c @@ -92,6 +92,40 @@ static int led_parser(struct x52d_config *cfg, size_t offset, const char *value) return 0; } +static int clock_format_parser(struct x52d_config *cfg, size_t offset, const char *value) +{ + CONFIG_PTR(libx52_clock_format *, config); + CHECK_PARAMS(); + + if (!strcasecmp(value, "12hr") || !strcasecmp(value, "12")) { + *config = LIBX52_CLOCK_FORMAT_12HR; + } else if (!strcasecmp(value, "24hr") || !strcasecmp(value, "24")) { + *config = LIBX52_CLOCK_FORMAT_24HR; + } else { + return EINVAL; + } + + return 0; +} + +static int date_format_parser(struct x52d_config *cfg, size_t offset, const char *value) +{ + CONFIG_PTR(libx52_date_format *, config); + CHECK_PARAMS(); + + if (!strcasecmp(value, "ddmmyy") || !strcasecmp(value, "dd-mm-yy")) { + *config = LIBX52_DATE_FORMAT_DDMMYY; + } else if (!strcasecmp(value, "mmddyy") || !strcasecmp(value, "mm-dd-yy")) { + *config = LIBX52_DATE_FORMAT_MMDDYY; + } else if (!strcasecmp(value, "yymmdd") || !strcasecmp(value, "yy-mm-dd")) { + *config = LIBX52_DATE_FORMAT_YYMMDD; + } else { + return EINVAL; + } + + return 0; +} + /* Map for config->param */ #define CFG(section, key, name, parser, def) {#section, #key, parser, offsetof(struct x52d_config, name)}, const struct config_map {