diff --git a/src/ascii_cmd.c b/src/ascii_cmd.c index 679ac51..e4279f1 100644 --- a/src/ascii_cmd.c +++ b/src/ascii_cmd.c @@ -1,5 +1,6 @@ #include "common.h" #include "rds.h" +#include "modulator.h" #include "lib.h" #include "ascii_cmd.h" @@ -207,10 +208,18 @@ static void handle_eccen(unsigned char *arg) { set_rds_ecclic_toggle(arg[0]); } +static void handle_shortrt(unsigned char *arg) { + set_rds_shortrt(arg[0]); +} + static void handle_grpseq(unsigned char *arg) { set_rds_grpseq(arg); } +static void handle_level(unsigned char *arg) { + set_rds_level(strtoul((char *)arg, NULL, 10)/255.0f); +} + static void handle_udg1(unsigned char *arg) { uint16_t blocks[8][3]; int sets = 0; @@ -307,7 +316,8 @@ static const command_handler_t commands_eq2[] = { static const command_handler_t commands_eq6[] = { {"PINEN", handle_pinen, 5}, {"RT1EN", handle_rt1en, 5}, - {"ECCEN", handle_eccen, 5} + {"ECCEN", handle_eccen, 5}, + {"LEVEL", handle_level, 5} }; static const command_handler_t commands_eq7[] = { @@ -316,6 +326,10 @@ static const command_handler_t commands_eq7[] = { {"GRPSEQ", handle_grpseq, 6} }; +static const command_handler_t commands_eq7[] = { + {"SHORTRT", handle_shortrt, 7} +}; + // Process a command using the appropriate command table static bool process_command_table(const command_handler_t *table, int table_size, unsigned char *cmd, unsigned char *arg) { @@ -397,7 +411,6 @@ void process_ascii_cmd(unsigned char *str) { } } - // Process commands with = delimiter at position 7 (format: XXXXXX=y...) if (cmd_len > 6 && str[6] == '=') { cmd = str; cmd[6] = 0; @@ -409,4 +422,16 @@ void process_ascii_cmd(unsigned char *str) { return; } } + + if (cmd_len > 7 && str[7] == '=') { + cmd = str; + cmd[7] = 0; + arg = str + 8; + + if (process_command_table(commands_eq8, + sizeof(commands_eq8) / sizeof(command_handler_t), + cmd, arg)) { + return; + } + } } \ No newline at end of file diff --git a/src/modulator.c b/src/modulator.c index 5515675..7c6e0b4 100644 --- a/src/modulator.c +++ b/src/modulator.c @@ -6,7 +6,11 @@ static struct rds_t rds; static float waveform[2][FILTER_SIZE]; +static float level; + void init_rds_objects() { + level = 1.0f; + memset(&rds, 0, sizeof(rds)); for (uint8_t i = 0; i < 2; i++) { @@ -18,6 +22,10 @@ void init_rds_objects() { } } +void set_rds_level(float _level) { + level = _level; +} + /* Get an RDS sample. This generates the envelope of the waveform using * pre-generated elementary waveform samples. */ @@ -59,5 +67,5 @@ float get_rds_sample() { rds.sample_buffer[rds.out_sample_index++] = 0; if (rds.out_sample_index == SAMPLE_BUFFER_SIZE) rds.out_sample_index = 0; - return sample; + return sample*level; } diff --git a/src/modulator.h b/src/modulator.h index ef0e65c..ebc877e 100644 --- a/src/modulator.h +++ b/src/modulator.h @@ -12,3 +12,4 @@ typedef struct rds_t { } rds_t; extern void init_rds_objects(); +extern void set_rds_level(float _level); diff --git a/src/rds.c b/src/rds.c index ff05f23..a9672d5 100644 --- a/src/rds.c +++ b/src/rds.c @@ -14,7 +14,6 @@ static struct { uint8_t ps_update; uint8_t tps_update; - uint8_t rt1_enabled; uint8_t rt_update; uint8_t rt_ab; uint8_t rt_segments; @@ -311,7 +310,7 @@ static void get_rds_group(uint16_t *blocks) { if(grp == '0') good_group = 1; if(grp == '1' && rds_state.ecclic_enabled) good_group = 1; - if(grp == '2' && rds_state.rt1_enabled) good_group = 1; + if(grp == '2' && rds_data.rt1_enabled) good_group = 1; if(grp == 'A' && rds_state.ptyn_enabled) good_group = 1; if(grp == 'X' && rds_data.udg1_len != 0) good_group = 1; if(grp == 'Y' && rds_data.udg2_len != 0) good_group = 1; @@ -418,7 +417,8 @@ void init_rds_encoder(struct rds_params_t rds_params) { set_rds_pi(rds_params.pi); set_rds_ps(rds_params.ps); rds_state.rt_ab = 1; - set_rds_rt1_enabled(1); + set_rds_shortrt(rds_params.shortrt) + set_rds_rt1_enabled(rds_params.rt1_enabled); set_rds_rt1(rds_params.rt1); set_rds_pty(rds_params.pty); rds_state.ptyn_ab = 1; @@ -467,8 +467,11 @@ void set_rds_pin(uint8_t day, uint8_t hour, uint8_t minute) { rds_data.pin[3] = (minute & INT8_L6); } +void set_rds_shortrt(uint8_t shortrt) { + rds_data.shortrt = shortrt & INT8_0; +} void set_rds_rt1_enabled(uint8_t rt1en) { - rds_state.rt1_enabled = rt1en & INT8_0; + rds_data.rt1_enabled = rt1en & INT8_0; } void set_rds_rt1(unsigned char *rt1) { uint8_t i = 0, len = 0; @@ -479,7 +482,7 @@ void set_rds_rt1(unsigned char *rt1) { while (*rt1 != 0 && len < RT_LENGTH) rds_data.rt1[len++] = *rt1++; - if (len < RT_LENGTH) { + if (len < RT_LENGTH && rds_data.shortrt) { rds_state.rt_segments = 0; rds_data.rt1[len++] = '\r'; diff --git a/src/rds.h b/src/rds.h index a9c5026..f98f1c1 100644 --- a/src/rds.h +++ b/src/rds.h @@ -46,6 +46,8 @@ typedef struct rds_params_t { unsigned char ps[PS_LENGTH]; unsigned char tps[PS_LENGTH]; + uint8_t shortrt; + uint8_t rt1_enabled; unsigned char rt1[RT_LENGTH]; unsigned char ptyn[PTYN_LENGTH]; @@ -242,6 +244,7 @@ extern void set_rds_lic(uint8_t lic); extern void set_rds_ecclic_toggle(uint8_t toggle); extern void set_rds_pin_enabled(uint8_t enabled); extern void set_rds_pin(uint8_t day, uint8_t hour, uint8_t minute); +extern void set_rds_shortrt(uint8_t shortrt); extern void set_rds_rt1_enabled(uint8_t rt1en); extern void set_rds_rt1(unsigned char *rt1); extern void set_rds_ps(unsigned char *ps); diff --git a/src/rds95.c b/src/rds95.c index 33dc18e..4e251a9 100644 --- a/src/rds95.c +++ b/src/rds95.c @@ -68,7 +68,9 @@ int main(int argc, char **argv) { .pi = 0x305F, .ecc = 0xE2, .lps = "radio95 - Radio Nowotomyskie", - .grp_sqc = "00012222FFR" + .grp_sqc = "00012222FFR", + .shortrt = 1, + .rt1_enabled = 1 }; /* PASIMPLE */ pa_simple *device;