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

won't work (100%)

This commit is contained in:
2025-03-14 22:10:56 +01:00
parent 0dee049746
commit 211ed65c50
11 changed files with 458 additions and 673 deletions

View File

@@ -13,23 +13,23 @@ typedef struct {
} command_handler_t;
// Command handlers
static void handle_ptyn(unsigned char *arg) {
static void handle_ptyn(unsigned char *arg, RDSModulator* enc) {
arg[PTYN_LENGTH] = 0;
set_rds_ptyn(xlat(arg));
set_rds_ptyn(enc, xlat(arg));
}
static void handle_afch(unsigned char *arg) {
static void handle_afch(unsigned char *arg, RDSModulator* enc) {
if (arg[0] == 'A' || arg[0] == 'B') {
return;
}
if(arg[0] == '\0') {
clear_rds_af();
memset(enc->enc->data->af, 0, sizeof(enc->enc->data->af));
return;
}
clear_rds_af();
memset(enc->enc->data->af, 0, sizeof(enc->enc->data->af));
uint8_t arg_count;
rds_af_t new_af;
RDSAFs new_af;
uint8_t af[MAX_AFS], *af_iter;
arg_count = sscanf((char *)arg,
@@ -54,105 +54,111 @@ static void handle_afch(unsigned char *arg) {
af_iter++;
}
set_rds_af(new_af);
memcpy(enc->enc->data->af, &new_af, sizeof(enc->enc->data->af));
}
static void handle_tps(unsigned char *arg) {
static void handle_tps(unsigned char *arg, RDSModulator* enc) {
arg[PS_LENGTH * 2] = 0;
set_rds_tps(xlat(arg));
set_rds_tps(enc, xlat(arg));
}
static void handle_rt1(unsigned char *arg) {
static void handle_rt1(unsigned char *arg, RDSModulator* enc) {
arg[RT_LENGTH * 2] = 0;
set_rds_rt1(xlat(arg));
set_rds_rt1(enc, xlat(arg));
}
static void handle_pty(unsigned char *arg) {
static void handle_pty(unsigned char *arg, RDSModulator* enc) {
arg[2] = 0;
set_rds_pty(strtoul((char *)arg, NULL, 10));
enc->enc->data->pty = strtoul((char *)arg, NULL, 10);
}
static void handle_ecc(unsigned char *arg) {
static void handle_ecc(unsigned char *arg, RDSModulator* enc) {
arg[2] = 0;
set_rds_ecc(strtoul((char *)arg, NULL, 16));
enc->enc->data->ecc = strtoul((char *)arg, NULL, 16);
}
static void handle_lic(unsigned char *arg) {
static void handle_lic(unsigned char *arg, RDSModulator* enc) {
arg[2] = 0;
set_rds_lic(strtoul((char *)arg, NULL, 16));
enc->enc->data->lic = strtoul((char *)arg, NULL, 16);
}
static void handle_rtp(unsigned char *arg) {
static void handle_rtp(unsigned char *arg, RDSModulator* enc) {
char tag_names[2][32];
uint8_t tags[6];
if (sscanf((char *)arg, "%hhu,%hhu,%hhu,%hhu,%hhu,%hhu",
&tags[0], &tags[1], &tags[2], &tags[3], &tags[4], &tags[5]) == 6) {
set_rds_rtplus_tags(tags);
set_rds_rtplus_tags(enc, tags);
} else if (sscanf((char *)arg, "%31[^,],%hhu,%hhu,%31[^,],%hhu,%hhu",
tag_names[0], &tags[1], &tags[2], tag_names[1], &tags[4], &tags[5]) == 6) {
tags[0] = get_rtp_tag_id(tag_names[0]);
tags[3] = get_rtp_tag_id(tag_names[1]);
set_rds_rtplus_tags(tags);
set_rds_rtplus_tags(enc, tags);
}
}
static void handle_lps(unsigned char *arg) {
static void handle_lps(unsigned char *arg, RDSModulator* enc) {
arg[LPS_LENGTH] = 0;
set_rds_lps(arg);
set_rds_lps(enc, arg);
}
static void handle_pin(unsigned char *arg) {
static void handle_pin(unsigned char *arg, RDSModulator* enc) {
uint8_t pin[3];
if (sscanf((char *)arg, "%hhu,%hhu,%hhu", &pin[0], &pin[1], &pin[2]) == 3) {
set_rds_pin(pin[0], pin[1], pin[2]);
for (int i = 0; i < 3; i++) {
enc->enc->data->pin[i+1] = pin[i];
}
}
}
static void handle_ps(unsigned char *arg) {
static void handle_ps(unsigned char *arg, RDSModulator* enc) {
if (arg[0] == '\0') arg[0] = ' '; // Fix for strings that start with a space
arg[PS_LENGTH * 2] = 0;
set_rds_ps(xlat(arg));
set_rds_ps(enc, xlat(arg));
}
static void handle_ct(unsigned char *arg) {
set_rds_ct(arg[0]);
static void handle_ct(unsigned char *arg, RDSModulator* enc) {
arg[2] = 1;
enc->enc->data->ct = arg[0];
}
static void handle_di(unsigned char *arg) {
static void handle_di(unsigned char *arg, RDSModulator* enc) {
arg[2] = 0;
set_rds_di(strtoul((char *)arg, NULL, 10));
enc->enc->data->di = arg[0];
}
static void handle_tp(unsigned char *arg) {
set_rds_tp(arg[0]);
static void handle_tp(unsigned char *arg, RDSModulator* enc) {
arg[1] = 0;
enc->enc->data->tp = arg[0];
}
static void handle_ta(unsigned char *arg) {
set_rds_ta(arg[0]);
static void handle_ta(unsigned char *arg, RDSModulator* enc) {
arg[1] = 0;
enc->enc->data->ta = arg[0];
}
static void handle_ms(unsigned char *arg) {
set_rds_ms(arg[0]);
static void handle_ms(unsigned char *arg, RDSModulator* enc) {
arg[1] = 0;
enc->enc->data->ms = arg[0];
}
static void handle_pi(unsigned char *arg) {
static void handle_pi(unsigned char *arg, RDSModulator* enc) {
arg[4] = 0;
set_rds_pi(strtoul((char *)arg, NULL, 16));
enc->enc->data->pi = strtoul((char *)arg, NULL, 16);
}
static void handle_af(unsigned char *arg) {
static void handle_af(unsigned char *arg, RDSModulator* enc) {
if (arg[0] == 'A' || arg[0] == 'B') {
return;
}
if(arg[0] == '\0') {
clear_rds_af();
memset(enc->enc->data->af, 0, sizeof(enc->enc->data->af));
return;
}
clear_rds_af();
memset(enc->enc->data->af, 0, sizeof(enc->enc->data->af));
uint8_t arg_count;
rds_af_t new_af;
RDSAFs new_af;
float af[MAX_AFS], *af_iter;
arg_count = sscanf((char *)arg,
@@ -168,63 +174,70 @@ static void handle_af(unsigned char *arg) {
&af[20], &af[21], &af[22], &af[23], &af[24]);
af_iter = af;
memset(&new_af, 0, sizeof(struct rds_af_t));
memset(&new_af, 0, sizeof(RDSAFs));
while (arg_count-- != 0) {
add_rds_af(&new_af, *af_iter++);
}
set_rds_af(new_af);
memcpy(enc->enc->data->af, &new_af, sizeof(enc->enc->data->af));
}
static void handle_g(unsigned char *arg) {
static void handle_g(unsigned char *arg, RDSModulator* enc) {
uint16_t blocks[3];
int count = sscanf((char *)arg, "%4hx%4hx%4hx", &blocks[0], &blocks[1], &blocks[2]);
if (count == 3) {
set_rds_cg(blocks);
enc->enc->state->custom_group[0] = 1;
enc->enc->state->custom_group[1] = blocks[0];
enc->enc->state->custom_group[2] = blocks[1];
enc->enc->state->custom_group[3] = blocks[2];
}
}
static void handle_pinen(unsigned char *arg) {
static void handle_pinen(unsigned char *arg, RDSModulator* enc) {
arg[1] = 0;
set_rds_pin_enabled(strtoul((char *)arg, NULL, 10));
enc->enc->data->pin[0] = arg[0];
}
static void handle_rt1en(unsigned char *arg) {
set_rds_rt1_enabled(arg[0]);
}
static void handle_ptynen(unsigned char *arg) {
static void handle_rt1en(unsigned char *arg, RDSModulator* enc) {
arg[1] = 0;
set_rds_ptyn_enabled(strtoul((char *)arg, NULL, 10));
enc->enc->data->rt1_enabled = arg[0];
}
static void handle_rtprun(unsigned char *arg) {
static void handle_ptynen(unsigned char *arg, RDSModulator* enc) {
arg[1] = 0;
set_rds_rtplus_flags(strtoul((char *)arg, NULL, 10));
set_rds_ptyn_enabled(enc->enc, strtoul((char *)arg, NULL, 10));
}
static void handle_eccen(unsigned char *arg) {
set_rds_ecclic_toggle(arg[0]);
static void handle_rtprun(unsigned char *arg, RDSModulator* enc) {
arg[1] = 0;
set_rds_rtplus_flags(enc->enc, strtoul((char *)arg, NULL, 10));
}
static void handle_shortrt(unsigned char *arg) {
set_rds_shortrt(arg[0]);
static void handle_eccen(unsigned char *arg, RDSModulator* enc) {
arg[1] = 0;
enc->enc->data->ecclic_enabled = arg[0];
}
static void handle_grpseq(unsigned char *arg) {
set_rds_grpseq(arg);
static void handle_shortrt(unsigned char *arg, RDSModulator* enc) {
arg[1] = 0;
enc->enc->data->shortrt = arg[0];
}
static void handle_level(unsigned char *arg) {
set_rds_level(strtoul((char *)arg, NULL, 10)/255.0f);
static void handle_grpseq(unsigned char *arg, RDSModulator* enc) {
memset(enc->enc->data->grp_sqc, 0, 24);
memcpy(enc->enc->data->grp_sqc, arg, 24);
}
static void handle_rdsgen(unsigned char *arg) {
set_rds_gen(strtoul((char *)arg, NULL, 10));
static void handle_level(unsigned char *arg, RDSModulator* enc) {
enc->level = strtoul((char *)arg, NULL, 10)/255.0f;
}
static void handle_udg1(unsigned char *arg) {
static void handle_rdsgen(unsigned char *arg, RDSModulator* enc) {
enc->rdsgen = strtoul((char *)arg, NULL, 10);
}
static void handle_udg1(unsigned char *arg, RDSModulator* enc) {
uint16_t blocks[8][3];
int sets = 0;
unsigned char *ptr = arg;
@@ -250,9 +263,10 @@ static void handle_udg1(unsigned char *arg) {
}
}
set_rds_udg1(sets, blocks);
memcpy(enc->enc->data->udg2, &blocks, sets * sizeof(uint16_t[3]));
enc->enc->data->udg2_len = sets;
}
static void handle_udg2(unsigned char *arg) {
static void handle_udg2(unsigned char *arg, RDSModulator* enc) {
uint16_t blocks[8][3]; // Up to 8 sets of 3 blocks each
int sets = 0;
unsigned char *ptr = arg;
@@ -279,7 +293,8 @@ static void handle_udg2(unsigned char *arg) {
}
}
set_rds_udg2(sets, blocks);
memcpy(enc->enc->data->udg2, &blocks, sets * sizeof(uint16_t[3]));
enc->enc->data->udg2_len = sets;
}
// Command tables organized by delimiter position and command length
@@ -337,17 +352,17 @@ static const command_handler_t commands_eq8[] = {
// 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) {
unsigned char *cmd, unsigned char *arg, RDSModulator* enc) {
for (int i = 0; i < table_size; i++) {
if (ustrcmp(cmd, (unsigned char *)table[i].cmd) == 0) {
table[i].handler(arg);
table[i].handler(arg, enc);
return true;
}
}
return false;
}
void process_ascii_cmd(unsigned char *str) {
void process_ascii_cmd(RDSModulator* enc, unsigned char *str) {
unsigned char *cmd, *arg;
uint16_t cmd_len = _strnlen((const char*)str, CTL_BUFFER_SIZE);
@@ -359,7 +374,7 @@ void process_ascii_cmd(unsigned char *str) {
if (process_command_table(commands_eq2,
sizeof(commands_eq2) / sizeof(command_handler_t),
cmd, arg)) {
cmd, arg, enc)) {
return;
}
}
@@ -372,7 +387,7 @@ void process_ascii_cmd(unsigned char *str) {
if (process_command_table(commands_eq3,
sizeof(commands_eq3) / sizeof(command_handler_t),
cmd, arg)) {
cmd, arg, enc)) {
return;
}
}
@@ -385,7 +400,7 @@ void process_ascii_cmd(unsigned char *str) {
if (process_command_table(commands_eq4,
sizeof(commands_eq4) / sizeof(command_handler_t),
cmd, arg)) {
cmd, arg, enc)) {
return;
}
}
@@ -398,7 +413,7 @@ void process_ascii_cmd(unsigned char *str) {
if (process_command_table(commands_eq5,
sizeof(commands_eq5) / sizeof(command_handler_t),
cmd, arg)) {
cmd, arg, enc)) {
return;
}
}
@@ -411,7 +426,7 @@ void process_ascii_cmd(unsigned char *str) {
if (process_command_table(commands_eq6,
sizeof(commands_eq6) / sizeof(command_handler_t),
cmd, arg)) {
cmd, arg, enc)) {
return;
}
}
@@ -423,7 +438,7 @@ void process_ascii_cmd(unsigned char *str) {
if (process_command_table(commands_eq7,
sizeof(commands_eq7) / sizeof(command_handler_t),
cmd, arg)) {
cmd, arg, enc)) {
return;
}
}
@@ -435,7 +450,7 @@ void process_ascii_cmd(unsigned char *str) {
if (process_command_table(commands_eq8,
sizeof(commands_eq8) / sizeof(command_handler_t),
cmd, arg)) {
cmd, arg, enc)) {
return;
}
}