diff --git a/apps/features.txt b/apps/features.txt
index ec2113cbc8..45e06e5e64 100644
--- a/apps/features.txt
+++ b/apps/features.txt
@@ -105,6 +105,10 @@ radio_remote
#endif
#endif
+#if defined(HAVE_RDS_CAP)
+rds
+#endif
+
#if defined(HAVE_RECORDING)
recording
#if defined(HAVE_LINE_IN)
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 43d73a8445..c951028494 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -16229,3 +16229,20 @@
*: "Prefer Image File"
+
+ id: LANG_FM_SYNC_RDS_TIME
+ desc: in radio screen and Settings
+ user: core
+
+ *: none
+ rds: "Sync RDS Time"
+
+
+ *: none
+ rds: "Sync RDS Time"
+
+
+ *: none
+ rds: "Sync RDS Time"
+
+
diff --git a/apps/menus/radio_menu.c b/apps/menus/radio_menu.c
index a6d259a21d..682cecf2b4 100644
--- a/apps/menus/radio_menu.c
+++ b/apps/menus/radio_menu.c
@@ -87,6 +87,9 @@ MENUITEM_FUNCTION(presetclear_item, 0, ID2P(LANG_FM_PRESET_CLEAR),
MENUITEM_SETTING(set_region, &global_settings.fm_region, NULL);
MENUITEM_SETTING(force_mono, &global_settings.fm_force_mono, NULL);
+#if defined(HAVE_RDS_CAP) && defined(CONFIG_RTC)
+MENUITEM_SETTING(sync_rds_time, &global_settings.sync_rds_time, NULL);
+#endif
#ifndef FM_MODE
extern int radio_mode;
@@ -146,6 +149,9 @@ MAKE_MENU(radio_settings_menu, ID2P(LANG_FM_MENU), NULL,
#endif
#ifdef FM_RECORDING_SETTINGS
&recsettings_item,
+#endif
+#if defined(HAVE_RDS_CAP) && defined(CONFIG_RTC)
+ &sync_rds_time,
#endif
&scan_presets_item);
diff --git a/apps/menus/time_menu.c b/apps/menus/time_menu.c
index edd2e19a2b..674279c01a 100644
--- a/apps/menus/time_menu.c
+++ b/apps/menus/time_menu.c
@@ -242,6 +242,9 @@ static int time_menu_callback(int action,
return action;
}
+#if defined(HAVE_RDS_CAP) && defined(CONFIG_RTC)
+MENUITEM_SETTING(sync_rds_time, &global_settings.sync_rds_time, NULL);
+#endif
MAKE_MENU(time_menu, ID2P(LANG_TIME_MENU), time_menu_callback, Icon_NOICON,
&time_set,
@@ -250,6 +253,9 @@ MAKE_MENU(time_menu, ID2P(LANG_TIME_MENU), time_menu_callback, Icon_NOICON,
#if defined(HAVE_RECORDING) || CONFIG_TUNER
&alarm_wake_up_screen,
#endif
+#endif
+#if defined(HAVE_RDS_CAP) && defined(CONFIG_RTC)
+ &sync_rds_time,
#endif
&timeformat);
diff --git a/apps/settings.h b/apps/settings.h
index 936280ba5a..8ff006d682 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -458,6 +458,9 @@ struct user_settings
unsigned char rfms_file[MAX_FILENAME+1]; /* last remote-fms */
#endif
#endif /* CONFIG_TUNER */
+#if defined(HAVE_RDS_CAP) && defined(CONFIG_RTC)
+ bool sync_rds_time; /* use RDS time to set the clock */
+#endif
/* misc options */
#ifndef HAVE_WHEEL_ACCELERATION
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 7b24db22e5..aa2ebbf883 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1096,6 +1096,9 @@ const struct settings_list settings[] = {
false, "force fm mono", toggle_mono_mode),
SYSTEM_SETTING(NVRAM(4), last_frequency, 0),
#endif
+#if defined(HAVE_RDS_CAP) && defined(CONFIG_RTC)
+ OFFON_SETTING(0, sync_rds_time, LANG_FM_SYNC_RDS_TIME, false, "sync_rds_time", NULL),
+#endif
#if BATTERY_TYPES_COUNT > 1
CHOICE_SETTING(0, battery_type, LANG_BATTERY_TYPE, 0, "battery type",
diff --git a/firmware/drivers/rds.c b/firmware/drivers/rds.c
index 2d8466ae36..9e37b6591c 100644
--- a/firmware/drivers/rds.c
+++ b/firmware/drivers/rds.c
@@ -25,6 +25,8 @@
#include
#include "rds.h"
#include "time.h"
+#include "timefuncs.h"
+#include "settings.h"
#include "string-extra.h"
#define TIMED_OUT(tick) \
@@ -225,6 +227,18 @@ void rds_sync(void)
}
}
+void rds_set_time(time_t time)
+{
+ ct_data = time;
+#ifdef CONFIG_RTC
+ if (ct_data && global_settings.sync_rds_time) {
+ struct tm *tm = gmtime(&ct_data);
+
+ set_time(tm);
+ }
+#endif
+}
+
#if (CONFIG_RDS & RDS_CFG_PROCESS)
/* handles a group 0 packet, returns true if a new message was received */
static void handle_group0(const uint16_t data[4])
@@ -367,7 +381,7 @@ static void handle_group4a(const uint16_t data[4])
seconds += hour * 3600;
seconds += minute * 60;
seconds += ((offset_sig == 0) ? offset_abs : -offset_abs) * 1800;
- ct_data = seconds;
+ rds_set_time(seconds);
}
}
@@ -428,7 +442,7 @@ void rds_push_info(enum rds_info_id info_id, uintptr_t data, size_t size)
SET_TIMEOUT(rt_copy_tmo, TEXT_TIMEOUT);
break;
case RDS_INFO_CT:
- ct_data = (time_t)data;
+ rds_set_time((time_t)data);
break;
default:;
diff --git a/manual/appendix/config_file_options.tex b/manual/appendix/config_file_options.tex
index 09bc148535..b188c953f8 100644
--- a/manual/appendix/config_file_options.tex
+++ b/manual/appendix/config_file_options.tex
@@ -370,6 +370,10 @@
force fm mono
& off, on & N/A\\
}%
+ \opt{rds}{
+ sync RDS time
+ & off, on & N/A\\
+ }%
\bottomrule
\end{longtable}
diff --git a/manual/configure_rockbox/time_and_date.tex b/manual/configure_rockbox/time_and_date.tex
index aa3f563eed..36da0e6204 100644
--- a/manual/configure_rockbox/time_and_date.tex
+++ b/manual/configure_rockbox/time_and_date.tex
@@ -21,4 +21,9 @@ if voice support is enabled.
}%\opt{recording,radio}
}%\opt{alarm}
\item[Time Format:] Choose 12 or 24 hour clock.
+ \opt{rds}{
+ \item[Sync RDS time:]
+ If this option is enabled, your clock will be kept in sync with the time provided
+ by Radio Data System (RDS) if the currently selected station provides it.
+ }%\opt{rds}
\end{description}