summaryrefslogtreecommitdiff
path: root/software/rda1846dongle
diff options
context:
space:
mode:
Diffstat (limited to 'software/rda1846dongle')
-rw-r--r--software/rda1846dongle/rda1846.c67
-rw-r--r--software/rda1846dongle/rda1846.h9
-rw-r--r--software/rda1846dongle/rda1846dongle.c29
3 files changed, 81 insertions, 24 deletions
diff --git a/software/rda1846dongle/rda1846.c b/software/rda1846dongle/rda1846.c
index 6607ec8..921296c 100644
--- a/software/rda1846dongle/rda1846.c
+++ b/software/rda1846dongle/rda1846.c
@@ -326,6 +326,52 @@ rda1846_state_t rda1846_get_state(void)
+uint16_t rda1846_get_dtmf(uint8_t* idx1, uint8_t* idx2, uint8_t* code, uint8_t* valid)
+{
+ uint16_t data;
+ if(rda1846_read_register(RDA1846_REG_DTMF_OUT, &data))
+ return 0xFFFF;
+
+ if(idx1) *idx1 = (uint8_t)((data & 0x0700)>>8);
+ if(idx2) *idx2 = (uint8_t)((data & 0x00E0)>>5);
+ if(code) *code = (uint8_t)(data & 0x000F);
+ if(valid) *valid = data & 0x0010 ? 0 : 1;
+
+ return data;
+}
+
+void rda1846_clear_int(void)
+{
+ rda1846_write_register(0x00, 0x1846);
+}
+
+
+
+void rda1846_set_volume(int8_t vol)
+{
+ uint16_t data;
+ if(vol < -30 || vol > 0)
+ return;
+
+ if(vol >= -15)
+ data = 0x000F | (((vol + 15)<<4) & 0xF0);
+ else
+ data = (vol + 30) & 0x0F;
+
+ rda1846_write_register(RDA1846_REG_RX_VOICE, data);
+}
+
+int8_t rda1846_get_volume(void)
+{
+ uint16_t data;
+ if(rda1846_read_register(RDA1846_REG_RX_VOICE, &data))
+ return 1;
+
+ return (int8_t)(((data & 0x00F0)>>4) + (data & 0x000F)) - 30;
+}
+
+
+
void rda1846_gpio_default(void)
{
rda1846_write_register(RDA1846_REG_GPIO, RDA1846_GPIO_7_VOX | RDA1846_GPIO_6_SQ |
@@ -388,27 +434,6 @@ uint16_t rda1846_get_flags(void)
-uint16_t rda1846_get_dtmf(uint8_t* idx1, uint8_t* idx2, uint8_t* code, uint8_t* valid)
-{
- uint16_t data;
- if(rda1846_read_register(RDA1846_REG_DTMF_OUT, &data))
- return 0xFFFF;
-
- if(idx1) *idx1 = (uint8_t)((data & 0x0700)>>8);
- if(idx2) *idx2 = (uint8_t)((data & 0x00E0)>>5);
- if(code) *code = (uint8_t)(data & 0x000F);
- if(valid) *valid = data & 0x0010 ? 0 : 1;
-
- return data;
-}
-
-void rda1846_clear_int(void)
-{
- rda1846_write_register(0x00, 0x1846);
-}
-
-
-
static char* rda1846_regaddr_to_string(uint8_t addr)
{
switch(addr) {
diff --git a/software/rda1846dongle/rda1846.h b/software/rda1846dongle/rda1846.h
index fd6ac17..d3efa1e 100644
--- a/software/rda1846dongle/rda1846.h
+++ b/software/rda1846dongle/rda1846.h
@@ -57,6 +57,12 @@ channel_bw_t rda1846_get_bw(void);
uint8_t rda1846_set_freq_kHz(int32_t freq);
int32_t rda1846_get_freq_kHz(void);
+uint16_t rda1846_get_dtmf(uint8_t*, uint8_t*, uint8_t*, uint8_t*);
+void rda1846_clear_int(void);
+
+void rda1846_set_volume(int8_t);
+int8_t rda1846_get_volume(void);
+
void rda1846_gpio_default(void);
void rda1846_gpio_55(void);
void rda1846_gpio_AA(void);
@@ -66,9 +72,6 @@ int16_t rda1846_get_rssi(void);
int16_t rda1846_get_vssi(void);
uint16_t rda1846_get_flags(void);
-uint16_t rda1846_get_dtmf(uint8_t*, uint8_t*, uint8_t*, uint8_t*);
-void rda1846_clear_int(void);
-
void rda1846_dump_register(void);
#endif
diff --git a/software/rda1846dongle/rda1846dongle.c b/software/rda1846dongle/rda1846dongle.c
index e058c9d..e0297a7 100644
--- a/software/rda1846dongle/rda1846dongle.c
+++ b/software/rda1846dongle/rda1846dongle.c
@@ -48,6 +48,7 @@
#define DEFAULT_FREQ_70CM 435000
int32_t default_freq = DEFAULT_FREQ_2M;
int32_t current_freq_kHz = DEFAULT_FREQ_2M;
+int8_t current_volume = 0;
static void reset_rda(void)
{
@@ -150,7 +151,15 @@ static void print_status(void)
else
printf("flags: %04X\r\n", flags);
+ int8_t vol = rda1846_get_volume();
+ if(vol > 0)
+ printf("volume: NaN dB\r\n");
+ else
+ printf("volume: %d dB\r\n", vol);
+
+ printf("rf band: %s\r\n", rda1846_rf_band_to_string(rda1846_get_band()));
print_actual_freq();
+ printf("bandwidth: %s\r\n", rda1846_channel_bw_to_string(rda1846_get_bw()));
}
static void print_dtmf(void)
@@ -164,6 +173,23 @@ static void print_dtmf(void)
rda1846_clear_int();
}
+static void update_vol(void)
+{
+ printf("setting volume to %d dB\r\n", current_volume);
+ rda1846_set_volume(current_volume);
+}
+
+static void inc_vol(void)
+{
+ current_volume = (current_volume >= 0) ? 0 : current_volume + 1;
+ update_vol();
+}
+
+static void dec_vol(void)
+{
+ current_volume = (current_volume <= -30) ? -30 : current_volume - 1;
+ update_vol();
+}
static void handle_cmd(uint8_t cmd)
{
@@ -195,6 +221,9 @@ static void handle_cmd(uint8_t cmd)
case 'R': rda1846_receive(); print_status(); break;
case 'T': rda1846_transmit(); print_status(); break;
+ case 'v': dec_vol(); break;
+ case 'V': inc_vol(); break;
+
case 'g': rda1846_gpio_off(); printf("GPIO off\r\n"); break;
case 'G': rda1846_gpio_default(); printf("GPIO to defaults\r\n"); break;
case '5': rda1846_gpio_55(); break;