summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBertrik Sikken <bertrik@sikken.nl>2010-11-11 21:13:29 +0000
committerBertrik Sikken <bertrik@sikken.nl>2010-11-11 21:13:29 +0000
commitde870b3ee049262f984254305c7a062a1cdf3026 (patch)
treef9636eb3e4634ac223a0c5a6dadeb4e1a25b61db
parentb787c0dd05ef4ddd6727a86b06d2491be8600f07 (diff)
downloadrockbox-de870b3ee049262f984254305c7a062a1cdf3026.tar.gz
rockbox-de870b3ee049262f984254305c7a062a1cdf3026.zip
Signal strength meter for FM radio - FS#8151 by Przemysław Hołubowski
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28559 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/gui/skin_engine/skin_tokens.c11
-rw-r--r--apps/lang/english.lang17
-rw-r--r--apps/lang/polski.lang17
-rw-r--r--apps/radio/radio_skin.c4
-rw-r--r--firmware/drivers/tuner/lv24020lp.c22
-rw-r--r--firmware/drivers/tuner/rda5802.c22
-rw-r--r--firmware/drivers/tuner/si4700.c18
-rw-r--r--firmware/drivers/tuner/tea5760uk.c17
-rw-r--r--firmware/drivers/tuner/tea5767.c16
-rw-r--r--firmware/export/lv24020lp.h1
-rw-r--r--firmware/export/rda5802.h1
-rw-r--r--firmware/export/si4700.h1
-rw-r--r--firmware/export/tea5760.h1
-rw-r--r--firmware/export/tea5767.h1
-rw-r--r--firmware/export/tuner.h3
-rw-r--r--lib/skin_parser/tag_table.c3
-rw-r--r--lib/skin_parser/tag_table.h3
17 files changed, 157 insertions, 1 deletions
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index 665e73a545..efe67a186e 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -475,6 +475,17 @@ const char *get_radio_token(struct wps_token *token, int preset_offset,
475 case SKIN_TOKEN_TUNER_CURFREQ: 475 case SKIN_TOKEN_TUNER_CURFREQ:
476 return format_freq_MHz(radio_current_frequency(), 476 return format_freq_MHz(radio_current_frequency(),
477 region_data->freq_step, buf, buf_size); 477 region_data->freq_step, buf, buf_size);
478#ifdef HAVE_RADIO_RSSI
479 case SKIN_TOKEN_TUNER_RSSI:
480 snprintf(buf, buf_size, "%d",tuner_get(RADIO_RSSI));
481 return buf;
482 case SKIN_TOKEN_TUNER_RSSI_MIN:
483 snprintf(buf, buf_size, "%d",tuner_get(RADIO_RSSI_MIN));
484 return buf;
485 case SKIN_TOKEN_TUNER_RSSI_MAX:
486 snprintf(buf, buf_size, "%d",tuner_get(RADIO_RSSI_MAX));
487 return buf;
488#endif
478 case SKIN_TOKEN_PRESET_NAME: 489 case SKIN_TOKEN_PRESET_NAME:
479 case SKIN_TOKEN_PRESET_FREQ: 490 case SKIN_TOKEN_PRESET_FREQ:
480 case SKIN_TOKEN_PRESET_ID: 491 case SKIN_TOKEN_PRESET_ID:
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 903413005b..0817134976 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -12647,3 +12647,20 @@
12647 *: "Start File Browser at root" 12647 *: "Start File Browser at root"
12648 </voice> 12648 </voice>
12649</phrase> 12649</phrase>
12650<phrase>
12651 id: LANG_FM_RSSI
12652 desc: Signal strength of a received FM station
12653 user: core
12654 <source>
12655 *: none
12656 radio: "Signal strength:"
12657 </source>
12658 <dest>
12659 *: none
12660 radio: "Signal strength:"
12661 </dest>
12662 <voice>
12663 *: none
12664 radio: "Signal strength:"
12665 </voice>
12666</phrase>
diff --git a/apps/lang/polski.lang b/apps/lang/polski.lang
index 8661a2da6b..bc54d11c14 100644
--- a/apps/lang/polski.lang
+++ b/apps/lang/polski.lang
@@ -12580,3 +12580,20 @@
12580 *: "Rozpocznij Przeglądanie Plików Tutaj" 12580 *: "Rozpocznij Przeglądanie Plików Tutaj"
12581 </voice> 12581 </voice>
12582 </phrase> 12582 </phrase>
12583<phrase>
12584 id: LANG_FM_RSSI
12585 desc: Signal strength of a received FM station
12586 user: core
12587 <source>
12588 *: none
12589 radio: "Signal strength:"
12590 </source>
12591 <dest>
12592 *: none
12593 radio: "Poziom sygnału:"
12594 </dest>
12595 <voice>
12596 *: none
12597 radio: "Poziom sygnału:"
12598 </voice>
12599</phrase>
diff --git a/apps/radio/radio_skin.c b/apps/radio/radio_skin.c
index 3079693cc3..68314d62b5 100644
--- a/apps/radio/radio_skin.c
+++ b/apps/radio/radio_skin.c
@@ -27,6 +27,7 @@
27#include "skin_engine/skin_engine.h" 27#include "skin_engine/skin_engine.h"
28#include "settings.h" 28#include "settings.h"
29#include "radio.h" 29#include "radio.h"
30#include "tuner.h"
30#include "action.h" 31#include "action.h"
31#include "appevents.h" 32#include "appevents.h"
32#include "statusbar-skinned.h" 33#include "statusbar-skinned.h"
@@ -41,6 +42,9 @@ char* default_radio_skin(enum screen_type screen)
41 "%Sx(Station:) %tf MHz\n" 42 "%Sx(Station:) %tf MHz\n"
42 "%?St(force fm mono)<%Sx(Force Mono)|%?ts<%Sx(Stereo)|%Sx(Mono)>>\n" 43 "%?St(force fm mono)<%Sx(Force Mono)|%?ts<%Sx(Stereo)|%Sx(Mono)>>\n"
43 "%Sx(Mode:) %?tm<%Sx(Scan)|%Sx(Preset)>\n" 44 "%Sx(Mode:) %?tm<%Sx(Scan)|%Sx(Preset)>\n"
45#ifdef HAVE_RADIO_RSSI
46 "%Sx(Signal strength:) %tr dBuV\n"
47#endif
44#if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR) 48#if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR)
45 "%?Rr<%Sx(Time:) %Rh:%Rn:%Rs|%?St(prerecording time)<%pm|%Sx(Prerecord Time) %Rs>>\n" 49 "%?Rr<%Sx(Time:) %Rh:%Rn:%Rs|%?St(prerecording time)<%pm|%Sx(Prerecord Time) %Rs>>\n"
46#endif 50#endif
diff --git a/firmware/drivers/tuner/lv24020lp.c b/firmware/drivers/tuner/lv24020lp.c
index 0228888309..590ca9641e 100644
--- a/firmware/drivers/tuner/lv24020lp.c
+++ b/firmware/drivers/tuner/lv24020lp.c
@@ -35,6 +35,10 @@
35 35
36static struct mutex tuner_mtx; 36static struct mutex tuner_mtx;
37 37
38/* define RSSI range */
39#define RSSI_MIN 5
40#define RSSI_MAX 75
41
38/* define to enable tuner logging */ 42/* define to enable tuner logging */
39#undef SANYO_TUNER_LOG_FILE 43#undef SANYO_TUNER_LOG_FILE
40#undef SANYO_TUNER_LOGF 44#undef SANYO_TUNER_LOGF
@@ -966,6 +970,8 @@ int lv24020lp_set(int setting, int value)
966int lv24020lp_get(int setting) 970int lv24020lp_get(int setting)
967{ 971{
968 int val = -1; 972 int val = -1;
973 const unsigned char fst[7] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f};
974 unsigned char fst_ndx, fs;
969 975
970 mutex_lock(&tuner_mtx); 976 mutex_lock(&tuner_mtx);
971 977
@@ -994,6 +1000,22 @@ int lv24020lp_get(int setting)
994 break; 1000 break;
995 } 1001 }
996 1002
1003 case RADIO_RSSI:
1004 fs = RSS_FS(lv24020lp_read(RADIO_STAT));
1005 for(fst_ndx=0; fst_ndx<7; fst_ndx++)
1006 if(fs == fst[fst_ndx])
1007 break;
1008 val = 75 - 10*fst_ndx;
1009 break;
1010
1011 case RADIO_RSSI_MIN:
1012 val = RSSI_MIN;
1013 break;
1014
1015 case RADIO_RSSI_MAX:
1016 val = RSSI_MAX;
1017 break;
1018
997 default: 1019 default:
998 val = lv24020lp_debug_info(setting); 1020 val = lv24020lp_debug_info(setting);
999 } 1021 }
diff --git a/firmware/drivers/tuner/rda5802.c b/firmware/drivers/tuner/rda5802.c
index 43dffe2355..82dc0bbcb9 100644
--- a/firmware/drivers/tuner/rda5802.c
+++ b/firmware/drivers/tuner/rda5802.c
@@ -34,6 +34,10 @@
34 34
35#define I2C_ADR 0x20 35#define I2C_ADR 0x20
36 36
37/* define RSSI range */
38#define RSSI_MIN 0
39#define RSSI_MAX 70
40
37/** Registers and bits **/ 41/** Registers and bits **/
38#define POWERCFG 0x2 42#define POWERCFG 0x2
39#define CHANNEL 0x3 43#define CHANNEL 0x3
@@ -263,6 +267,12 @@ static bool rda5802_st(void)
263 return (rda5802_read_reg(READCHAN) & READCHAN_ST); 267 return (rda5802_read_reg(READCHAN) & READCHAN_ST);
264} 268}
265 269
270static int rda5802_rssi(void)
271{
272 uint16_t status = rda5802_read_reg(STATUSRSSI);
273 return STATUSRSSI_RSSIr(status);
274}
275
266/* tuner abstraction layer: set something to the tuner */ 276/* tuner abstraction layer: set something to the tuner */
267int rda5802_set(int setting, int value) 277int rda5802_set(int setting, int value)
268{ 278{
@@ -323,6 +333,18 @@ int rda5802_get(int setting)
323 case RADIO_STEREO: 333 case RADIO_STEREO:
324 val = rda5802_st(); 334 val = rda5802_st();
325 break; 335 break;
336
337 case RADIO_RSSI:
338 val = rda5802_rssi();
339 break;
340
341 case RADIO_RSSI_MIN:
342 val = RSSI_MIN;
343 break;
344
345 case RADIO_RSSI_MAX:
346 val = RSSI_MAX;
347 break;
326 } 348 }
327 349
328 return val; 350 return val;
diff --git a/firmware/drivers/tuner/si4700.c b/firmware/drivers/tuner/si4700.c
index dfc0e46caf..4747357037 100644
--- a/firmware/drivers/tuner/si4700.c
+++ b/firmware/drivers/tuner/si4700.c
@@ -50,6 +50,10 @@ extern int si4700_st(void);
50 50
51#define I2C_ADR 0x20 51#define I2C_ADR 0x20
52 52
53/* define RSSI range */
54#define RSSI_MIN 0
55#define RSSI_MAX 70
56
53/** Registers and bits - "x" denotes Si4702/03 only (so they say) **/ 57/** Registers and bits - "x" denotes Si4702/03 only (so they say) **/
54#define DEVICEID 0x0 58#define DEVICEID 0x0
55#define CHIPID 0x1 59#define CHIPID 0x1
@@ -197,7 +201,7 @@ extern int si4700_st(void);
197#define STATUSRSSI_BLERA (0x3 << 9) /* x */ 201#define STATUSRSSI_BLERA (0x3 << 9) /* x */
198#define STATUSRSSI_ST (0x1 << 8) 202#define STATUSRSSI_ST (0x1 << 8)
199#define STATUSRSSI_RSSI (0xff << 0) 203#define STATUSRSSI_RSSI (0xff << 0)
200 #define STATUSRSSI_RSSIr(x) ((x) & 0xff) 204#define STATUSRSSI_RSSIr(x) ((x) & 0xff)
201 205
202/* READCHAN (0xB) */ 206/* READCHAN (0xB) */
203#define READCHAN_BLERB (0x3 << 14) /* x */ 207#define READCHAN_BLERB (0x3 << 14) /* x */
@@ -481,6 +485,18 @@ int si4700_get(int setting)
481 case RADIO_STEREO: 485 case RADIO_STEREO:
482 val = si4700_st(); 486 val = si4700_st();
483 break; 487 break;
488
489 case RADIO_RSSI:
490 val = STATUSRSSI_RSSIr(si4700_read_reg(STATUSRSSI));
491 break;
492
493 case RADIO_RSSI_MIN:
494 val = RSSI_MIN;
495 break;
496
497 case RADIO_RSSI_MAX:
498 val = RSSI_MAX;
499 break;
484 } 500 }
485 501
486 return val; 502 return val;
diff --git a/firmware/drivers/tuner/tea5760uk.c b/firmware/drivers/tuner/tea5760uk.c
index 20234e28ed..c1dff598b3 100644
--- a/firmware/drivers/tuner/tea5760uk.c
+++ b/firmware/drivers/tuner/tea5760uk.c
@@ -30,6 +30,10 @@
30 30
31#define I2C_ADR 0x22 31#define I2C_ADR 0x22
32 32
33/* define RSSI range */
34#define RSSI_MIN 4
35#define RSSI_MAX 46
36
33static bool tuner_present = false; 37static bool tuner_present = false;
34static unsigned char write_bytes[7] = { 38static unsigned char write_bytes[7] = {
35 0x00, /* INTREG LSB */ 39 0x00, /* INTREG LSB */
@@ -138,6 +142,19 @@ int tea5760_get(int setting)
138 case RADIO_STEREO: 142 case RADIO_STEREO:
139 val = read_bytes[9] >> 2; 143 val = read_bytes[9] >> 2;
140 break; 144 break;
145
146 case RADIO_RSSI:
147 val = (read_bytes[9] >> 4) & 0x0F;
148 val = 4 + (28 * val + 5) / 10;
149 break;
150
151 case RADIO_RSSI_MIN:
152 val = RSSI_MIN;
153 break;
154
155 case RADIO_RSSI_MAX:
156 val = RSSI_MAX;
157 break;
141 } 158 }
142 159
143 return val; 160 return val;
diff --git a/firmware/drivers/tuner/tea5767.c b/firmware/drivers/tuner/tea5767.c
index 67aa808f23..3f3af68602 100644
--- a/firmware/drivers/tuner/tea5767.c
+++ b/firmware/drivers/tuner/tea5767.c
@@ -34,6 +34,10 @@
34#define I2C_ADR 0xC0 34#define I2C_ADR 0xC0
35#endif 35#endif
36 36
37/* define RSSI range */
38#define RSSI_MIN 10
39#define RSSI_MAX 55
40
37static bool tuner_present = true; 41static bool tuner_present = true;
38static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; 42static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 };
39 43
@@ -132,6 +136,18 @@ int tea5767_get(int setting)
132 case RADIO_STEREO: 136 case RADIO_STEREO:
133 val = read_bytes[2] >> 7; 137 val = read_bytes[2] >> 7;
134 break; 138 break;
139
140 case RADIO_RSSI:
141 val = 10 + 3*(read_bytes[3] >> 4);
142 break;
143
144 case RADIO_RSSI_MIN:
145 val = RSSI_MIN;
146 break;
147
148 case RADIO_RSSI_MAX:
149 val = RSSI_MAX;
150 break;
135 } 151 }
136 152
137 return val; 153 return val;
diff --git a/firmware/export/lv24020lp.h b/firmware/export/lv24020lp.h
index 753949f361..f2e123b094 100644
--- a/firmware/export/lv24020lp.h
+++ b/firmware/export/lv24020lp.h
@@ -25,6 +25,7 @@
25 25
26/* Define additional tuner messages here */ 26/* Define additional tuner messages here */
27#define HAVE_RADIO_REGION 27#define HAVE_RADIO_REGION
28#define HAVE_RADIO_RSSI
28 29
29#define LV24020LP_CTRL_STAT (RADIO_GET_CHIP_FIRST+0) 30#define LV24020LP_CTRL_STAT (RADIO_GET_CHIP_FIRST+0)
30#define LV24020LP_REG_STAT (RADIO_GET_CHIP_FIRST+1) 31#define LV24020LP_REG_STAT (RADIO_GET_CHIP_FIRST+1)
diff --git a/firmware/export/rda5802.h b/firmware/export/rda5802.h
index 87707966fd..0dae3ab5d2 100644
--- a/firmware/export/rda5802.h
+++ b/firmware/export/rda5802.h
@@ -26,6 +26,7 @@
26#define _RDA5802_H_ 26#define _RDA5802_H_
27 27
28#define HAVE_RADIO_REGION 28#define HAVE_RADIO_REGION
29#define HAVE_RADIO_RSSI
29 30
30struct rda5802_dbg_info 31struct rda5802_dbg_info
31{ 32{
diff --git a/firmware/export/si4700.h b/firmware/export/si4700.h
index c4aff6ff30..debc176ec5 100644
--- a/firmware/export/si4700.h
+++ b/firmware/export/si4700.h
@@ -26,6 +26,7 @@
26#define _SI4700_H_ 26#define _SI4700_H_
27 27
28#define HAVE_RADIO_REGION 28#define HAVE_RADIO_REGION
29#define HAVE_RADIO_RSSI
29 30
30struct si4700_dbg_info 31struct si4700_dbg_info
31{ 32{
diff --git a/firmware/export/tea5760.h b/firmware/export/tea5760.h
index ea857dec3e..a5af67aac1 100644
--- a/firmware/export/tea5760.h
+++ b/firmware/export/tea5760.h
@@ -27,6 +27,7 @@
27#include "tuner.h" 27#include "tuner.h"
28 28
29#define HAVE_RADIO_REGION 29#define HAVE_RADIO_REGION
30#define HAVE_RADIO_RSSI
30 31
31struct tea5760_dbg_info 32struct tea5760_dbg_info
32{ 33{
diff --git a/firmware/export/tea5767.h b/firmware/export/tea5767.h
index 64dd266311..6def18576f 100644
--- a/firmware/export/tea5767.h
+++ b/firmware/export/tea5767.h
@@ -25,6 +25,7 @@
25 25
26#define HAVE_RADIO_REGION 26#define HAVE_RADIO_REGION
27#define HAVE_RADIO_MUTE_TIMEOUT 27#define HAVE_RADIO_MUTE_TIMEOUT
28#define HAVE_RADIO_RSSI
28 29
29struct tea5767_dbg_info 30struct tea5767_dbg_info
30{ 31{
diff --git a/firmware/export/tuner.h b/firmware/export/tuner.h
index 9263c08d90..c8bea86112 100644
--- a/firmware/export/tuner.h
+++ b/firmware/export/tuner.h
@@ -46,6 +46,9 @@ enum
46 RADIO_STEREO, 46 RADIO_STEREO,
47 /* RADIO_EVENT is an event that requests a screen update */ 47 /* RADIO_EVENT is an event that requests a screen update */
48 RADIO_EVENT, 48 RADIO_EVENT,
49 RADIO_RSSI,
50 RADIO_RSSI_MIN,
51 RADIO_RSSI_MAX,
49 52
50 /* Put new general-purpose readback values above this line */ 53 /* Put new general-purpose readback values above this line */
51 __RADIO_GET_STANDARD_LAST 54 __RADIO_GET_STANDARD_LAST
diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c
index 9a68834589..b579ee2aaa 100644
--- a/lib/skin_parser/tag_table.c
+++ b/lib/skin_parser/tag_table.c
@@ -153,6 +153,9 @@ static const struct tag_info legal_tags[] =
153 { SKIN_TOKEN_TUNER_MINFREQ, "ta", "", SKIN_REFRESH_STATIC }, 153 { SKIN_TOKEN_TUNER_MINFREQ, "ta", "", SKIN_REFRESH_STATIC },
154 { SKIN_TOKEN_TUNER_MAXFREQ, "tb", "", SKIN_REFRESH_STATIC }, 154 { SKIN_TOKEN_TUNER_MAXFREQ, "tb", "", SKIN_REFRESH_STATIC },
155 { SKIN_TOKEN_TUNER_CURFREQ, "tf", "", SKIN_REFRESH_DYNAMIC }, 155 { SKIN_TOKEN_TUNER_CURFREQ, "tf", "", SKIN_REFRESH_DYNAMIC },
156 { SKIN_TOKEN_TUNER_RSSI, "tr", "", SKIN_REFRESH_DYNAMIC },
157 { SKIN_TOKEN_TUNER_RSSI_MIN, "tl", "", SKIN_REFRESH_STATIC },
158 { SKIN_TOKEN_TUNER_RSSI_MAX, "th", "", SKIN_REFRESH_STATIC },
156 { SKIN_TOKEN_PRESET_ID, "Ti", "", SKIN_REFRESH_STATIC }, 159 { SKIN_TOKEN_PRESET_ID, "Ti", "", SKIN_REFRESH_STATIC },
157 { SKIN_TOKEN_PRESET_NAME, "Tn", "", SKIN_REFRESH_STATIC }, 160 { SKIN_TOKEN_PRESET_NAME, "Tn", "", SKIN_REFRESH_STATIC },
158 { SKIN_TOKEN_PRESET_FREQ, "Tf", "", SKIN_REFRESH_STATIC }, 161 { SKIN_TOKEN_PRESET_FREQ, "Tf", "", SKIN_REFRESH_STATIC },
diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h
index a7ac164e10..ad72dab3d3 100644
--- a/lib/skin_parser/tag_table.h
+++ b/lib/skin_parser/tag_table.h
@@ -249,6 +249,9 @@ enum skin_token_type {
249 SKIN_TOKEN_TUNER_MINFREQ, /* changes based on "region" */ 249 SKIN_TOKEN_TUNER_MINFREQ, /* changes based on "region" */
250 SKIN_TOKEN_TUNER_MAXFREQ, /* changes based on "region" */ 250 SKIN_TOKEN_TUNER_MAXFREQ, /* changes based on "region" */
251 SKIN_TOKEN_TUNER_CURFREQ, 251 SKIN_TOKEN_TUNER_CURFREQ,
252 SKIN_TOKEN_TUNER_RSSI,
253 SKIN_TOKEN_TUNER_RSSI_MIN,
254 SKIN_TOKEN_TUNER_RSSI_MAX,
252 SKIN_TOKEN_PRESET_ID, /* "id" of this preset.. really the array element number */ 255 SKIN_TOKEN_PRESET_ID, /* "id" of this preset.. really the array element number */
253 SKIN_TOKEN_PRESET_NAME, 256 SKIN_TOKEN_PRESET_NAME,
254 SKIN_TOKEN_PRESET_FREQ, 257 SKIN_TOKEN_PRESET_FREQ,