mirror of
https://github.com/radio95-rnt/rds95.git
synced 2026-02-27 04:43:52 +01:00
do the cycle shift proplerly, shorten the code a bit and add a device arg
This commit is contained in:
66
src/rds.c
66
src/rds.c
@@ -10,34 +10,35 @@ void saveToFile(RDSEncoder *enc, const char *option) {
|
||||
|
||||
RDSEncoder tempEncoder;
|
||||
FILE *file = fopen(encoderPath, "rb");
|
||||
if (file != NULL) {
|
||||
if (file) {
|
||||
fread(&tempEncoder, sizeof(RDSEncoder), 1, file);
|
||||
fclose(file);
|
||||
} else memcpy(&tempEncoder, enc, sizeof(RDSEncoder));
|
||||
|
||||
if(strcmp(option, "PROGRAM") == 0) {
|
||||
memcpy(&(tempEncoder.data[enc->program]), &(enc->data[enc->program]), sizeof(RDSData));
|
||||
memcpy(&(tempEncoder.rtpData[enc->program]), &(enc->rtpData[enc->program]), sizeof(RDSRTPlusData)*2);
|
||||
tempEncoder.program = enc->program;
|
||||
if (strcmp(option, "PROGRAM") == 0) {
|
||||
memcpy(&tempEncoder.data[enc->program], &enc->data[enc->program], sizeof(RDSData));
|
||||
memcpy(&tempEncoder.rtpData[enc->program], &enc->rtpData[enc->program], sizeof(RDSRTPlusData) * 2);
|
||||
} else if (strcmp(option, "ALL") == 0) {
|
||||
memcpy(&tempEncoder.data, &enc->data, sizeof(RDSData)*PROGRAMS);
|
||||
memcpy(&tempEncoder.rtpData, &enc->rtpData, sizeof(RDSRTPlusData)*PROGRAMS*2);
|
||||
memcpy(tempEncoder.data, enc->data, sizeof(RDSData) * PROGRAMS);
|
||||
memcpy(tempEncoder.rtpData, enc->rtpData, sizeof(RDSRTPlusData) * PROGRAMS * 2);
|
||||
memcpy(&tempEncoder.encoder_data, &enc->encoder_data, sizeof(RDSEncoderData));
|
||||
tempEncoder.program = enc->program;
|
||||
} else return;
|
||||
tempEncoder.program = enc->program;
|
||||
|
||||
RDSEncoderFile rdsEncoderfile;
|
||||
rdsEncoderfile.file_starter = 225;
|
||||
rdsEncoderfile.file_middle = 160;
|
||||
rdsEncoderfile.file_ender = 95;
|
||||
memcpy(&(rdsEncoderfile.data[enc->program]), &(tempEncoder.data[enc->program]), sizeof(RDSData));
|
||||
memcpy(&(rdsEncoderfile.rtpData[enc->program]), &(tempEncoder.rtpData[enc->program]), sizeof(RDSRTPlusData)*2);
|
||||
memcpy(&(rdsEncoderfile.encoder_data), &(tempEncoder.encoder_data), sizeof(RDSEncoderData));
|
||||
rdsEncoderfile.program = tempEncoder.program;
|
||||
rdsEncoderfile.crc = crc16_ccitt((char*)&rdsEncoderfile, offsetof(RDSEncoderFile, crc));
|
||||
RDSEncoderFile rdsEncoderfile = {
|
||||
.file_starter = 225,
|
||||
.file_middle = 160,
|
||||
.file_ender = 95,
|
||||
.program = tempEncoder.program,
|
||||
};
|
||||
memcpy(&rdsEncoderfile.data[enc->program], &tempEncoder.data[enc->program], sizeof(RDSData));
|
||||
memcpy(&rdsEncoderfile.rtpData[enc->program], &tempEncoder.rtpData[enc->program], sizeof(RDSRTPlusData) * 2);
|
||||
memcpy(&rdsEncoderfile.encoder_data, &tempEncoder.encoder_data, sizeof(RDSEncoderData));
|
||||
|
||||
rdsEncoderfile.crc = crc16_ccitt((char *)&rdsEncoderfile, offsetof(RDSEncoderFile, crc));
|
||||
|
||||
file = fopen(encoderPath, "wb");
|
||||
if (file == NULL) {
|
||||
if (!file) {
|
||||
perror("Error opening file");
|
||||
return;
|
||||
}
|
||||
@@ -51,20 +52,19 @@ void loadFromFile(RDSEncoder *enc) {
|
||||
|
||||
RDSEncoderFile rdsEncoderfile;
|
||||
FILE *file = fopen(encoderPath, "rb");
|
||||
if (file == NULL) {
|
||||
if (!file) {
|
||||
perror("Error opening file");
|
||||
return;
|
||||
}
|
||||
fread(&rdsEncoderfile, sizeof(RDSEncoderFile), 1, file);
|
||||
fread(&rdsEncoderfile, sizeof(rdsEncoderfile), 1, file);
|
||||
fclose(file);
|
||||
|
||||
|
||||
if (rdsEncoderfile.file_starter != 225 || rdsEncoderfile.file_ender != 95 || rdsEncoderfile.file_middle != 160) {
|
||||
fprintf(stderr, "[RDSENCODER-FILE] Invalid file format\n");
|
||||
return;
|
||||
}
|
||||
|
||||
uint16_t calculated_crc = crc16_ccitt((char*)&rdsEncoderfile, offsetof(RDSEncoderFile, crc));
|
||||
if (calculated_crc != rdsEncoderfile.crc) {
|
||||
if (crc16_ccitt((char*)&rdsEncoderfile, offsetof(RDSEncoderFile, crc)) != rdsEncoderfile.crc) {
|
||||
fprintf(stderr, "[RDSENCODER-FILE] CRC mismatch! Data may be corrupted\n");
|
||||
return;
|
||||
}
|
||||
@@ -77,15 +77,13 @@ void loadFromFile(RDSEncoder *enc) {
|
||||
enc->program = rdsEncoderfile.program;
|
||||
}
|
||||
|
||||
int rdssaved() {
|
||||
int isFileSaved() {
|
||||
char encoderPath[128];
|
||||
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME"));
|
||||
FILE *file = fopen(encoderPath, "rb");
|
||||
if (file) {
|
||||
fclose(file);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
if(!file) return 0;
|
||||
fclose(file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint16_t get_next_af(RDSEncoder* enc) {
|
||||
@@ -160,11 +158,8 @@ static void get_rds_ps_group(RDSEncoder* enc, RDSGroup *group) {
|
||||
if(enc->state[enc->program].ps_csegment == 0) group->b |= enc->data[enc->program].dpty << 2;
|
||||
group->b |= enc->state[enc->program].ps_csegment;
|
||||
group->c = get_next_af(enc);
|
||||
if(enc->data[enc->program].ta && enc->state[enc->program].tps_text[0] != '\0') {
|
||||
group->d = enc->state[enc->program].tps_text[enc->state[enc->program].ps_csegment * 2] << 8 | enc->state[enc->program].tps_text[enc->state[enc->program].ps_csegment * 2 + 1];
|
||||
} else {
|
||||
group->d = enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2] << 8 | enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2 + 1];
|
||||
}
|
||||
if(enc->data[enc->program].ta && enc->state[enc->program].tps_text[0] != '\0') group->d = enc->state[enc->program].tps_text[enc->state[enc->program].ps_csegment * 2] << 8 | enc->state[enc->program].tps_text[enc->state[enc->program].ps_csegment * 2 + 1];
|
||||
else group->d = enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2] << 8 | enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2 + 1];
|
||||
|
||||
enc->state[enc->program].ps_csegment++;
|
||||
if (enc->state[enc->program].ps_csegment == 4) enc->state[enc->program].ps_csegment = 0;
|
||||
@@ -297,7 +292,6 @@ static void get_rds_ct_group(RDSEncoder* enc, RDSGroup *group) {
|
||||
group->d = (utc->tm_hour & 0xf) << 12 | utc->tm_min << 6;
|
||||
|
||||
local_time = localtime(&now);
|
||||
|
||||
offset = local_time->__tm_gmtoff / (30 * 60);
|
||||
if (offset < 0) group->d |= 1 << 5;
|
||||
group->d |= abs(offset);
|
||||
@@ -806,7 +800,7 @@ void set_rds_defaults(RDSEncoder* enc, uint8_t program) {
|
||||
void init_rds_encoder(RDSEncoder* enc) {
|
||||
for(int i = 0; i < PROGRAMS; i++) set_rds_defaults(enc, i);
|
||||
|
||||
if (rdssaved()) loadFromFile(enc);
|
||||
if (isFileSaved()) loadFromFile(enc);
|
||||
else saveToFile(enc, "ALL");
|
||||
|
||||
for(int i = 0; i < PROGRAMS; i++) reset_rds_state(enc, i);
|
||||
|
||||
Reference in New Issue
Block a user