mirror of
https://github.com/radio95-rnt/rds95.git
synced 2026-02-27 04:43:52 +01:00
shrink source code file size, add ascii cmd addressing
This commit is contained in:
2
.vscode/.server-controller-port.log
vendored
2
.vscode/.server-controller-port.log
vendored
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"port": 13452,
|
"port": 13452,
|
||||||
"time": 1744647168046,
|
"time": 1744724934249,
|
||||||
"version": "0.0.3"
|
"version": "0.0.3"
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ static void handle_ecc(char *arg, RDSModulator* mod, char* output) {
|
|||||||
static void handle_rtp(char *arg, RDSModulator* mod, char* output) {
|
static void handle_rtp(char *arg, RDSModulator* mod, char* output) {
|
||||||
uint8_t tags[6];
|
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) {
|
if (sscanf(arg, "%hhu,%hhu,%hhu,%hhu,%hhu,%hhu", &tags[0], &tags[1], &tags[2], &tags[3], &tags[4], &tags[5]) == 6) {
|
||||||
set_rds_rtplus_tags(mod->enc, tags);
|
set_rds_rtplus_tags(mod->enc, tags);
|
||||||
strcpy(output, "+\0");
|
strcpy(output, "+\0");
|
||||||
} else strcpy(output, "-\0");
|
} else strcpy(output, "-\0");
|
||||||
@@ -58,7 +58,7 @@ static void handle_rtp(char *arg, RDSModulator* mod, char* output) {
|
|||||||
static void handle_ertp(char *arg, RDSModulator* mod, char* output) {
|
static void handle_ertp(char *arg, RDSModulator* mod, char* output) {
|
||||||
uint8_t tags[6];
|
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) {
|
if (sscanf(arg, "%hhu,%hhu,%hhu,%hhu,%hhu,%hhu", &tags[0], &tags[1], &tags[2], &tags[3], &tags[4], &tags[5]) == 6) {
|
||||||
set_rds_ertplus_tags(mod->enc, tags);
|
set_rds_ertplus_tags(mod->enc, tags);
|
||||||
strcpy(output, "+\0");
|
strcpy(output, "+\0");
|
||||||
} else strcpy(output, "-\0");
|
} else strcpy(output, "-\0");
|
||||||
@@ -138,7 +138,7 @@ static void handle_af(char *arg, RDSModulator* mod, char* output) {
|
|||||||
RDSAFs new_af;
|
RDSAFs new_af;
|
||||||
float af[MAX_AFS], *af_iter;
|
float af[MAX_AFS], *af_iter;
|
||||||
|
|
||||||
arg_count = sscanf((char *)arg,
|
arg_count = sscanf(arg,
|
||||||
"%f,%f,%f,%f,%f,"
|
"%f,%f,%f,%f,%f,"
|
||||||
"%f,%f,%f,%f,%f,"
|
"%f,%f,%f,%f,%f,"
|
||||||
"%f,%f,%f,%f,%f,"
|
"%f,%f,%f,%f,%f,"
|
||||||
@@ -172,7 +172,7 @@ static void handle_afo(char *arg, RDSModulator* mod, char* output) {
|
|||||||
RDSAFsODA new_af_oda;
|
RDSAFsODA new_af_oda;
|
||||||
float af[MAX_AFS], *af_iter;
|
float af[MAX_AFS], *af_iter;
|
||||||
|
|
||||||
arg_count = sscanf((char *)arg,
|
arg_count = sscanf(arg,
|
||||||
"%f,%f,%f,%f,%f,"
|
"%f,%f,%f,%f,%f,"
|
||||||
"%f,%f,%f,%f,%f,"
|
"%f,%f,%f,%f,%f,"
|
||||||
"%f,%f,%f,%f,%f,"
|
"%f,%f,%f,%f,%f,"
|
||||||
@@ -193,9 +193,39 @@ static void handle_afo(char *arg, RDSModulator* mod, char* output) {
|
|||||||
strcpy(output, "+\0");
|
strcpy(output, "+\0");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handle_adr(char *arg, RDSModulator* mod, char* output) {
|
||||||
|
uint16_t ids[2];
|
||||||
|
int count = sscanf(arg, "%d,%d", &ids[0], &ids[1]);
|
||||||
|
if(count == 1) {
|
||||||
|
mod->enc->encoder_data.encoder_addr[0] = ids[0];
|
||||||
|
} else if(count == 2) {
|
||||||
|
mod->enc->encoder_data.encoder_addr[0] = ids[0];
|
||||||
|
mod->enc->encoder_data.encoder_addr[1] = ids[1];
|
||||||
|
} else {
|
||||||
|
strcpy(output, "-\0");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strcpy(output, "+\0");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_site(char *arg, RDSModulator* mod, char* output) {
|
||||||
|
uint16_t ids[2];
|
||||||
|
int count = sscanf(arg, "%d,%d", &ids[0], &ids[1]);
|
||||||
|
if(count == 1) {
|
||||||
|
mod->enc->encoder_data.site_addr[0] = ids[0];
|
||||||
|
} else if(count == 2) {
|
||||||
|
mod->enc->encoder_data.site_addr[0] = ids[0];
|
||||||
|
mod->enc->encoder_data.site_addr[1] = ids[1];
|
||||||
|
} else {
|
||||||
|
strcpy(output, "-\0");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strcpy(output, "+\0")
|
||||||
|
}
|
||||||
|
|
||||||
static void handle_g(char *arg, RDSModulator* mod, char* output) {
|
static void handle_g(char *arg, RDSModulator* mod, char* output) {
|
||||||
uint16_t blocks[4];
|
uint16_t blocks[4];
|
||||||
int count = sscanf((char *)arg, "%4hx%4hx%4hx%4hx", &blocks[0], &blocks[1], &blocks[2], &blocks[3]);
|
int count = sscanf(arg, "%4hx%4hx%4hx%4hx", &blocks[0], &blocks[1], &blocks[2], &blocks[3]);
|
||||||
if (count == 3) {
|
if (count == 3) {
|
||||||
mod->enc->state[mod->enc->program].custom_group[0] = 1;
|
mod->enc->state[mod->enc->program].custom_group[0] = 1;
|
||||||
mod->enc->state[mod->enc->program].custom_group[1] = blocks[0];
|
mod->enc->state[mod->enc->program].custom_group[1] = blocks[0];
|
||||||
@@ -314,7 +344,7 @@ static void handle_udg(char *arg, char *pattern, RDSModulator* mod, char* output
|
|||||||
char *ptr = arg;
|
char *ptr = arg;
|
||||||
|
|
||||||
while (sets < 8) {
|
while (sets < 8) {
|
||||||
int count = sscanf((char *)ptr, "%4hx%4hx%4hx", &blocks[sets][0], &blocks[sets][1], &blocks[sets][2]);
|
int count = sscanf(ptr, "%4hx%4hx%4hx", &blocks[sets][0], &blocks[sets][1], &blocks[sets][2]);
|
||||||
if (count != 3) {
|
if (count != 3) {
|
||||||
all_scanned = 0;
|
all_scanned = 0;
|
||||||
break;
|
break;
|
||||||
@@ -412,7 +442,7 @@ static void handle_eonaf(char *arg, char *pattern, RDSModulator* mod, char* outp
|
|||||||
RDSAFs new_af;
|
RDSAFs new_af;
|
||||||
float af[MAX_AFS], *af_iter;
|
float af[MAX_AFS], *af_iter;
|
||||||
|
|
||||||
arg_count = sscanf((char *)arg,
|
arg_count = sscanf(arg,
|
||||||
"%f,%f,%f,%f,%f,"
|
"%f,%f,%f,%f,%f,"
|
||||||
"%f,%f,%f,%f,%f,"
|
"%f,%f,%f,%f,%f,"
|
||||||
"%f,%f,%f,%f,%f,"
|
"%f,%f,%f,%f,%f,"
|
||||||
@@ -458,7 +488,8 @@ static const command_handler_t commands_eq4[] = {
|
|||||||
{"RTP", handle_rtp, 3},
|
{"RTP", handle_rtp, 3},
|
||||||
{"LPS", handle_lps, 3},
|
{"LPS", handle_lps, 3},
|
||||||
{"ERT", handle_ert, 3},
|
{"ERT", handle_ert, 3},
|
||||||
{"AFO", handle_afo, 3}
|
{"AFO", handle_afo, 3},
|
||||||
|
{"ADR", handle_adr, 3}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const command_handler_t commands_eq5[] = {
|
static const command_handler_t commands_eq5[] = {
|
||||||
@@ -468,6 +499,7 @@ static const command_handler_t commands_eq5[] = {
|
|||||||
{"SLCD", handle_slcd, 4},
|
{"SLCD", handle_slcd, 4},
|
||||||
{"ERTP", handle_ertp, 4},
|
{"ERTP", handle_ertp, 4},
|
||||||
{"LINK", handle_link, 4},
|
{"LINK", handle_link, 4},
|
||||||
|
{"SITE", handle_site, 4}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const command_handler_t commands_eq2[] = {
|
static const command_handler_t commands_eq2[] = {
|
||||||
@@ -517,7 +549,7 @@ static const pattern_command_handler_t pattern_commands[] = {
|
|||||||
static bool process_command_table(const command_handler_t *table, int table_size,
|
static bool process_command_table(const command_handler_t *table, int table_size,
|
||||||
char *cmd, char *arg, char *output, RDSModulator* mod) {
|
char *cmd, char *arg, char *output, RDSModulator* mod) {
|
||||||
for (int i = 0; i < table_size; i++) {
|
for (int i = 0; i < table_size; i++) {
|
||||||
if (strcmp(cmd, (char *)table[i].cmd) == 0) {
|
if (strcmp(cmd, table[i].cmd) == 0) {
|
||||||
table[i].handler(arg, mod, output);
|
table[i].handler(arg, mod, output);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -546,6 +578,31 @@ static bool process_pattern_commands(char *cmd, char *arg, char *output, RDSModu
|
|||||||
}
|
}
|
||||||
|
|
||||||
void process_ascii_cmd(RDSModulator* mod, char *str, char *cmd_output) {
|
void process_ascii_cmd(RDSModulator* mod, char *str, char *cmd_output) {
|
||||||
|
if(mod->enc->encoder_data.ascii_data.expected_encoder_addr != 0 && mod->enc->encoder_data.ascii_data.expected_encoder_addr != 255) {
|
||||||
|
uint8_t reached = 0;
|
||||||
|
for(int i = 0; i < 2; i++) {
|
||||||
|
if(mod->enc->encoder_data.encoder_addr[i] == mod->enc->encoder_data.expected_encoder_addr) {
|
||||||
|
reached = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!reached) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(mod->enc->encoder_data.expected_site_addr != 0) {
|
||||||
|
uint8_t reached = 0;
|
||||||
|
for(int i = 0; i < 2; i++) {
|
||||||
|
if(mod->enc->encoder_data.site_addr[i] == mod->enc->encoder_data.expected_site_addr) {
|
||||||
|
reached = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!reached) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char *cmd, *arg;
|
char *cmd, *arg;
|
||||||
|
|
||||||
char output[255];
|
char output[255];
|
||||||
@@ -564,7 +621,7 @@ void process_ascii_cmd(RDSModulator* mod, char *str, char *cmd_output) {
|
|||||||
|
|
||||||
for (size_t i = 0; i < sizeof(commands_exact) / sizeof(command_handler_t); i++) {
|
for (size_t i = 0; i < sizeof(commands_exact) / sizeof(command_handler_t); i++) {
|
||||||
const command_handler_t *handler = &commands_exact[i];
|
const command_handler_t *handler = &commands_exact[i];
|
||||||
if (cmd_len == handler->cmd_length && strcmp(upper_str, (char *)handler->cmd) == 0) {
|
if (cmd_len == handler->cmd_length && strcmp(upper_str, handler->cmd) == 0) {
|
||||||
handler->handler(NULL, mod, output);
|
handler->handler(NULL, mod, output);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
53
src/rds.c
53
src/rds.c
@@ -4,39 +4,34 @@
|
|||||||
#include "lib.h"
|
#include "lib.h"
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
void saveToFile(RDSEncoder *emp, const char *option) {
|
void saveToFile(RDSEncoder *enc, const char *option) {
|
||||||
char encoderPath[128];
|
char encoderPath[128];
|
||||||
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME"));
|
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME"));
|
||||||
FILE *file;
|
|
||||||
|
|
||||||
RDSEncoder tempEncoder;
|
RDSEncoder tempEncoder;
|
||||||
file = fopen(encoderPath, "rb");
|
FILE *file = fopen(encoderPath, "rb");
|
||||||
if (file != NULL) {
|
if (file != NULL) {
|
||||||
fread(&tempEncoder, sizeof(RDSEncoder), 1, file);
|
fread(&tempEncoder, sizeof(RDSEncoder), 1, file);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
} else {
|
} else memcpy(&tempEncoder, enc, sizeof(RDSEncoder));
|
||||||
memcpy(&tempEncoder, emp, sizeof(RDSEncoder));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(strcmp(option, "PROGRAM") == 0) {
|
if(strcmp(option, "PROGRAM") == 0) {
|
||||||
memcpy(&(tempEncoder.data[emp->program]), &(emp->data[emp->program]), sizeof(RDSData));
|
memcpy(&(tempEncoder.data[enc->program]), &(enc->data[enc->program]), sizeof(RDSData));
|
||||||
memcpy(&(tempEncoder.rtpData[emp->program]), &(emp->rtpData[emp->program]), sizeof(RDSRTPlusData)*2);
|
memcpy(&(tempEncoder.rtpData[enc->program]), &(enc->rtpData[enc->program]), sizeof(RDSRTPlusData)*2);
|
||||||
tempEncoder.program = emp->program;
|
tempEncoder.program = enc->program;
|
||||||
} else if (strcmp(option, "ALL") == 0) {
|
} else if (strcmp(option, "ALL") == 0) {
|
||||||
memcpy(&tempEncoder.data, &emp->data, sizeof(RDSData)*PROGRAMS);
|
memcpy(&tempEncoder.data, &enc->data, sizeof(RDSData)*PROGRAMS);
|
||||||
memcpy(&tempEncoder.rtpData, &emp->rtpData, sizeof(RDSRTPlusData)*PROGRAMS*2);
|
memcpy(&tempEncoder.rtpData, &enc->rtpData, sizeof(RDSRTPlusData)*PROGRAMS*2);
|
||||||
memcpy(&tempEncoder.encoder_data, &emp->encoder_data, sizeof(RDSEncoderData));
|
memcpy(&tempEncoder.encoder_data, &enc->encoder_data, sizeof(RDSEncoderData));
|
||||||
tempEncoder.program = emp->program;
|
tempEncoder.program = enc->program;
|
||||||
} else {
|
} else return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RDSEncoderFile rdsEncoderfile;
|
RDSEncoderFile rdsEncoderfile;
|
||||||
rdsEncoderfile.file_starter = 225;
|
rdsEncoderfile.file_starter = 225;
|
||||||
rdsEncoderfile.file_middle = 160;
|
rdsEncoderfile.file_middle = 160;
|
||||||
rdsEncoderfile.file_ender = 95;
|
rdsEncoderfile.file_ender = 95;
|
||||||
memcpy(&(rdsEncoderfile.data[emp->program]), &(tempEncoder.data[emp->program]), sizeof(RDSData));
|
memcpy(&(rdsEncoderfile.data[enc->program]), &(tempEncoder.data[enc->program]), sizeof(RDSData));
|
||||||
memcpy(&(rdsEncoderfile.rtpData[emp->program]), &(tempEncoder.rtpData[emp->program]), sizeof(RDSRTPlusData)*2);
|
memcpy(&(rdsEncoderfile.rtpData[enc->program]), &(tempEncoder.rtpData[enc->program]), sizeof(RDSRTPlusData)*2);
|
||||||
memcpy(&(rdsEncoderfile.encoder_data), &(tempEncoder.encoder_data), sizeof(RDSEncoderData));
|
memcpy(&(rdsEncoderfile.encoder_data), &(tempEncoder.encoder_data), sizeof(RDSEncoderData));
|
||||||
rdsEncoderfile.program = tempEncoder.program;
|
rdsEncoderfile.program = tempEncoder.program;
|
||||||
rdsEncoderfile.crc = crc16_ccitt((char*)&rdsEncoderfile, offsetof(RDSEncoderFile, crc));
|
rdsEncoderfile.crc = crc16_ccitt((char*)&rdsEncoderfile, offsetof(RDSEncoderFile, crc));
|
||||||
@@ -51,10 +46,10 @@ void saveToFile(RDSEncoder *emp, const char *option) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void loadFromFile(RDSEncoder *enc) {
|
void loadFromFile(RDSEncoder *enc) {
|
||||||
RDSEncoderFile rdsEncoderfile;
|
|
||||||
|
|
||||||
char encoderPath[128];
|
char encoderPath[128];
|
||||||
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME"));
|
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME"));
|
||||||
|
|
||||||
|
RDSEncoderFile rdsEncoderfile;
|
||||||
FILE *file = fopen(encoderPath, "rb");
|
FILE *file = fopen(encoderPath, "rb");
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
perror("Error opening file");
|
perror("Error opening file");
|
||||||
@@ -788,24 +783,16 @@ void set_rds_defaults(RDSEncoder* enc, uint8_t program) {
|
|||||||
|
|
||||||
reset_rds_state(enc, program);
|
reset_rds_state(enc, program);
|
||||||
|
|
||||||
enc->encoder_data.ascii_data.expected_encoder_addr = 255;
|
enc->encoder_data.ascii_data.expected_encoder_addr = 255; // Unknown
|
||||||
enc->encoder_data.ascii_data.expected_site_addr = 255;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_rds_encoder(RDSEncoder* enc) {
|
void init_rds_encoder(RDSEncoder* enc) {
|
||||||
for(int i = 0; i < PROGRAMS; i++) {
|
for(int i = 0; i < PROGRAMS; i++) set_rds_defaults(enc, i);
|
||||||
set_rds_defaults(enc, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rdssaved()) {
|
if (rdssaved()) loadFromFile(enc);
|
||||||
loadFromFile(enc);
|
else saveToFile(enc, "ALL");
|
||||||
} else {
|
|
||||||
saveToFile(enc, "ALL");
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int i = 0; i < PROGRAMS; i++) {
|
for(int i = 0; i < PROGRAMS; i++) reset_rds_state(enc, i);
|
||||||
reset_rds_state(enc, i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_rds_rt1(RDSEncoder* enc, char *rt1) {
|
void set_rds_rt1(RDSEncoder* enc, char *rt1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user