0
1
mirror of https://github.com/radio95-rnt/rds95.git synced 2026-02-27 04:43:52 +01:00

set shortrt and level

This commit is contained in:
2025-03-14 18:38:26 +01:00
parent d869d7cbf1
commit ce468204ff
6 changed files with 51 additions and 9 deletions

View File

@@ -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;
}
}
}

View File

@@ -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;
}

View File

@@ -12,3 +12,4 @@ typedef struct rds_t {
} rds_t;
extern void init_rds_objects();
extern void set_rds_level(float _level);

View File

@@ -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';

View File

@@ -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);

View File

@@ -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;