summaryrefslogtreecommitdiffstats
path: root/firmware/drivers/rds.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/rds.c')
-rw-r--r--firmware/drivers/rds.c37
1 files changed, 15 insertions, 22 deletions
diff --git a/firmware/drivers/rds.c b/firmware/drivers/rds.c
index 0b9b227563..48c7d398a9 100644
--- a/firmware/drivers/rds.c
+++ b/firmware/drivers/rds.c
@@ -25,6 +25,8 @@
#include <kernel.h>
#include "rds.h"
#include "time.h"
+#include "timefuncs.h"
+#include "settings.h"
#include "string-extra.h"
#define TIMED_OUT(tick) \
@@ -72,15 +74,6 @@ static int rt_data_idx; /* rt_data[0 or 1] */
#define RT_DATA_INC(x) rt_data[rt_data_idx ^= (x)]
#endif /* (CONFIG_RDS & RDS_CFG_PROCESS) */
-#if (CONFIG_RDS & RDS_CFG_ISR)
-/* Functions are called in ISR context */
-#define rds_disable_irq_save() disable_irq_save()
-#define rds_restore_irq(old) restore_irq(old)
-#else /* !(CONFIG_RDS & RDS_CFG_ISR) */
-#define rds_disable_irq_save() 0
-#define rds_restore_irq(old) ((void)(old))
-#endif /* (CONFIG_RDS & RDS_CFG_ISR) */
-
/* RDS code table G0 to UTF-8 translation */
static const uint16_t rds_tbl_g0[0x100-0x20] =
{
@@ -195,8 +188,6 @@ static void register_activity(void)
/* resets the rds parser */
void rds_reset(void)
{
- int oldlevel = rds_disable_irq_save();
-
/* reset general info */
pi_code = 0;
ct_data = 0;
@@ -210,8 +201,6 @@ void rds_reset(void)
ps_segment = 0;
rt_segment = 0;
#endif /* (CONFIG_RDS & RDS_CFG_PROCESS) */
-
- rds_restore_irq(oldlevel);
}
/* initialises the rds parser */
@@ -223,8 +212,6 @@ void rds_init(void)
/* sync RDS state */
void rds_sync(void)
{
- int oldlevel = rds_disable_irq_save();
-
if (rds_active) {
if (TIMED_OUT(rds_timeout)) {
rds_reset();
@@ -238,8 +225,18 @@ void rds_sync(void)
}
}
}
+}
- rds_restore_irq(oldlevel);
+static 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)
@@ -384,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);
}
}
@@ -445,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:;
@@ -458,8 +455,6 @@ void rds_push_info(enum rds_info_id info_id, uintptr_t data, size_t size)
/* read fully-processed RDS data */
size_t rds_pull_info(enum rds_info_id info_id, uintptr_t data, size_t size)
{
- int oldlevel = rds_disable_irq_save();
-
rds_sync();
switch (info_id) {
@@ -490,7 +485,5 @@ size_t rds_pull_info(enum rds_info_id info_id, uintptr_t data, size_t size)
default:
size = 0;
}
-
- rds_restore_irq(oldlevel);
return size;
}