diff options
| author | Bertrik Sikken <bertrik@sikken.nl> | 2012-02-07 19:50:33 +0100 |
|---|---|---|
| committer | Bertrik Sikken <bertrik@sikken.nl> | 2012-02-18 11:02:13 +0100 |
| commit | 43a940c8cb7201c8e925ac4ef28aff86cb02f42f (patch) | |
| tree | 5564010c87507b1bfff8c0ce563cf9fe3bae21e2 | |
| parent | 9a32a7b40442e54ee6d8e2403e0f9a154dc4c77f (diff) | |
| download | rockbox-43a940c8cb7201c8e925ac4ef28aff86cb02f42f.zip rockbox-43a940c8cb7201c8e925ac4ef28aff86cb02f42f.tar.gz rockbox-43a940c8cb7201c8e925ac4ef28aff86cb02f42f.tar.bz2 rockbox-43a940c8cb7201c8e925ac4ef28aff86cb02f42f.tar.xz | |
rds: add basic RDS clock-time support
Change-Id: I931182ccd20cf8899f3ce9b6b8d7c7c5f4ea006f
| -rw-r--r-- | apps/debug_menu.c | 2 | ||||
| -rw-r--r-- | firmware/drivers/rds.c | 47 | ||||
| -rw-r--r-- | firmware/export/rds.h | 2 |
3 files changed, 50 insertions, 1 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c index 28f36ed..f8f2161 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c @@ -1871,11 +1871,11 @@ static int radio_callback(int btn, struct gui_synclist *lists) #endif /* RDA55802 */ #ifdef HAVE_RDS_CAP - simplelist_addline(SIMPLELIST_ADD_LINE, "RDS Info:"); simplelist_addline(SIMPLELIST_ADD_LINE, "PI:%04X PS:'%8s'", rds_get_pi(), rds_get_ps()); simplelist_addline(SIMPLELIST_ADD_LINE, "RT:%s", rds_get_rt()); + simplelist_addline(SIMPLELIST_ADD_LINE, "CT:%d", rds_get_ct()); #endif return ACTION_REDRAW; } diff --git a/firmware/drivers/rds.c b/firmware/drivers/rds.c index 73118b4..eb14cfb 100644 --- a/firmware/drivers/rds.c +++ b/firmware/drivers/rds.c @@ -23,6 +23,7 @@ #include <string.h> #include <strlcpy.h> #include "rds.h" +#include "time.h" /* programme identification */ static uint16_t pi_code; @@ -36,6 +37,8 @@ static char rt_data[65]; static char rt_copy[65]; static int rt_segment; static int rt_abflag; +/* date/time */ +static time_t ct_data; #ifdef RDS_ISR_PROCESSING /* Functions are called in ISR context */ @@ -76,6 +79,7 @@ void rds_reset(void) ps_segment = 0; rt_copy[0] = '\0'; rt_segment = 0; + ct_data = 0; rds_restore_irq(oldlevel); } @@ -177,6 +181,40 @@ static bool handle_group2(uint16_t data[4]) return false; } +/* handles a group 4a packet (clock-time) */ +static bool handle_group4a(uint16_t data[4]) +{ + int daycode = ((data[1] << 15) & 0x18000) | + ((data[2] >> 1) & 0x07FFF); + int hour = ((data[2] << 4) & 0x10) | + ((data[3] >> 12) & 0x0F); + int minute = ((data[3] >> 6) & 0x3F); + int offset_sig = (data[3] >> 5) & 1; + int offset_abs = data[3] & 0x1F; + + if (daycode < 55927) { + /* invalid date, before 2012-01-01 */ + return false; + } + if ((hour >= 24) || (minute >= 60)) { + /* invalid time */ + return false; + } + if (offset_abs > 24) { + /* invalid local time offset */ + return false; + } + + /* convert modified julian day + time to UTC */ + time_t seconds = (daycode - 40587) * 86400; + seconds += hour * 3600; + seconds += minute * 60; + seconds += ((offset_sig == 0) ? offset_abs : -offset_abs) * 1800; + ct_data = seconds; + + return true; +} + /* processes one rds packet, returns true if a new message was received */ bool rds_process(uint16_t data[4]) { @@ -200,6 +238,9 @@ bool rds_process(uint16_t data[4]) case 4: /* group 2A: radio text */ case 5: /* group 2B: radio text */ return handle_group2(data); + + case 8: /* group 4A: clock-time */ + return handle_group4a(data); default: break; @@ -229,3 +270,9 @@ char* rds_get_rt(void) return get_rt(); } +/* returns the most recent valid clock-time value (or 0 if invalid) */ +time_t rds_get_ct(void) +{ + return ct_data; +} + diff --git a/firmware/export/rds.h b/firmware/export/rds.h index 990f9b4..ff1608f 100644 --- a/firmware/export/rds.h +++ b/firmware/export/rds.h @@ -20,6 +20,7 @@ ****************************************************************************/ #include <stdint.h> #include <stdbool.h> +#include "time.h" void rds_init(void); @@ -29,5 +30,6 @@ bool rds_process(uint16_t data[4]); uint16_t rds_get_pi(void); char* rds_get_ps(void); char* rds_get_rt(void); +time_t rds_get_ct(void); |