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

this commit is bad

This commit is contained in:
2025-03-22 17:34:23 +01:00
parent 18fe67e39c
commit ade8b4e29c
8 changed files with 818 additions and 744 deletions

View File

@@ -1,5 +1,5 @@
{ {
"port": 13452, "port": 13452,
"time": 1742639833627, "time": 1742659000234,
"version": "0.0.3" "version": "0.0.3"
} }

View File

@@ -8,5 +8,8 @@
"common.h": "c", "common.h": "c",
"modulator.h": "c", "modulator.h": "c",
"control_pipe.h": "c" "control_pipe.h": "c"
} },
"C_Cpp.codeAnalysis.clangTidy.checks.disabled": [
"clang-diagnostic-error"
]
} }

View File

@@ -37,6 +37,10 @@ void saveToFile(RDSEncoder *emp, const char *option) {
} else if (strcmp(option, "RT1") == 0 || strcmp(option, "TEXT") == 0) { } else if (strcmp(option, "RT1") == 0 || strcmp(option, "TEXT") == 0) {
memcpy(tempEncoder.data[emp->program].rt1, emp->data[emp->program].rt1, RT_LENGTH); memcpy(tempEncoder.data[emp->program].rt1, emp->data[emp->program].rt1, RT_LENGTH);
tempEncoder.data[emp->program].rt1_enabled = emp->data[emp->program].rt1_enabled; tempEncoder.data[emp->program].rt1_enabled = emp->data[emp->program].rt1_enabled;
memcpy(tempEncoder.data[emp->program].default_rt, emp->data[emp->program].default_rt, RT_LENGTH);
} else if (strcmp(option, "RT2") == 0) {
memcpy(tempEncoder.data[emp->program].rt2, emp->data[emp->program].rt2, RT_LENGTH);
tempEncoder.data[emp->program].rt2_enabled = emp->data[emp->program].rt2_enabled;
} else if (strcmp(option, "PTYN") == 0) { } else if (strcmp(option, "PTYN") == 0) {
memcpy(tempEncoder.data[emp->program].ptyn, emp->data[emp->program].ptyn, PTYN_LENGTH); memcpy(tempEncoder.data[emp->program].ptyn, emp->data[emp->program].ptyn, PTYN_LENGTH);
tempEncoder.data[emp->program].ptyn_enabled = emp->data[emp->program].ptyn_enabled; tempEncoder.data[emp->program].ptyn_enabled = emp->data[emp->program].ptyn_enabled;
@@ -78,7 +82,6 @@ void saveToFile(RDSEncoder *emp, const char *option) {
memcpy(tempEncoder.rtpData[emp->program].type, emp->rtpData[emp->program].type, sizeof(emp->rtpData[emp->program].type)); memcpy(tempEncoder.rtpData[emp->program].type, emp->rtpData[emp->program].type, sizeof(emp->rtpData[emp->program].type));
memcpy(&(tempEncoder.odas[emp->program]), &(emp->odas[emp->program]), sizeof(RDSODA)*MAX_ODAS); memcpy(&(tempEncoder.odas[emp->program]), &(emp->odas[emp->program]), sizeof(RDSODA)*MAX_ODAS);
memcpy(&(tempEncoder.oda_state[emp->program]), &(emp->oda_state[emp->program]), sizeof(RDSODAState)); memcpy(&(tempEncoder.oda_state[emp->program]), &(emp->oda_state[emp->program]), sizeof(RDSODAState));
tempEncoder.rtpData[emp->program].toggle = emp->rtpData[emp->program].toggle;
} else if (strcmp(option, "UDG1") == 0) { } else if (strcmp(option, "UDG1") == 0) {
memcpy(tempEncoder.data[emp->program].udg1, emp->data[emp->program].udg1, sizeof(emp->data[emp->program].udg1)); memcpy(tempEncoder.data[emp->program].udg1, emp->data[emp->program].udg1, sizeof(emp->data[emp->program].udg1));
tempEncoder.data[emp->program].udg1_len = emp->data[emp->program].udg1_len; tempEncoder.data[emp->program].udg1_len = emp->data[emp->program].udg1_len;
@@ -313,8 +316,22 @@ static void get_rds_rt_group(RDSEncoder* enc, uint16_t *blocks) {
enc->state[enc->program].rt_state = 0; enc->state[enc->program].rt_state = 0;
} }
uint8_t ab = enc->state[enc->program].rt_ab;
switch (enc->data[enc->program].rt_type)
{
case 0:
ab = 0;
break;
case 1:
ab = (enc->state[enc->program].current_rt == 0) ? 1 : 0;
break;
case 2:
default:
break;
}
blocks[1] |= 2 << 12; blocks[1] |= 2 << 12;
blocks[1] |= enc->state[enc->program].rt_ab << 4; blocks[1] |= ab << 4;
blocks[1] |= enc->state[enc->program].rt_state; blocks[1] |= enc->state[enc->program].rt_state;
blocks[2] = enc->state[enc->program].rt_text[enc->state[enc->program].rt_state * 4 ] << 8; blocks[2] = enc->state[enc->program].rt_text[enc->state[enc->program].rt_state * 4 ] << 8;
blocks[2] |= enc->state[enc->program].rt_text[enc->state[enc->program].rt_state * 4 + 1]; blocks[2] |= enc->state[enc->program].rt_text[enc->state[enc->program].rt_state * 4 + 1];
@@ -322,7 +339,8 @@ static void get_rds_rt_group(RDSEncoder* enc, uint16_t *blocks) {
blocks[3] |= enc->state[enc->program].rt_text[enc->state[enc->program].rt_state * 4 + 3]; blocks[3] |= enc->state[enc->program].rt_text[enc->state[enc->program].rt_state * 4 + 3];
enc->state[enc->program].rt_state++; enc->state[enc->program].rt_state++;
if (enc->state[enc->program].rt_state >= enc->state[enc->program].rt_segments) enc->state[enc->program].rt_state = 0; uint8_t segments = (enc->state[enc->program].current_rt == 1) ? enc->data[enc->program].rt2_segments : enc->data[enc->program].rt_segments;
if (enc->state[enc->program].rt_state >= segments) enc->state[enc->program].rt_state = 0;
} }
static void get_rds_oda_group(RDSEncoder* enc, uint16_t *blocks) { static void get_rds_oda_group(RDSEncoder* enc, uint16_t *blocks) {
@@ -425,7 +443,7 @@ static void get_rds_lic_group(RDSEncoder* enc, uint16_t *blocks) {
static void get_rds_rtplus_group(RDSEncoder* enc, uint16_t *blocks) { static void get_rds_rtplus_group(RDSEncoder* enc, uint16_t *blocks) {
blocks[1] |= GET_GROUP_TYPE(enc->rtpData[enc->program].group) << 12; blocks[1] |= GET_GROUP_TYPE(enc->rtpData[enc->program].group) << 12;
blocks[1] |= GET_GROUP_VER(enc->rtpData[enc->program].group) << 11; blocks[1] |= GET_GROUP_VER(enc->rtpData[enc->program].group) << 11;
blocks[1] |= enc->rtpData[enc->program].toggle << 4 | enc->rtpData[enc->program].running << 3; blocks[1] |= enc->rtpState[enc->program].toggle << 4 | enc->rtpData[enc->program].running << 3;
blocks[1] |= (enc->rtpData[enc->program].type[0] & 0xf8) >> 3; blocks[1] |= (enc->rtpData[enc->program].type[0] & 0xf8) >> 3;
blocks[2] = (enc->rtpData[enc->program].type[0] & 0x07) << 13; blocks[2] = (enc->rtpData[enc->program].type[0] & 0x07) << 13;
@@ -532,7 +550,24 @@ static void get_rds_group(RDSEncoder* enc, uint16_t *blocks) {
} }
if(enc->data[enc->program].tp && enc->data[enc->program].ta && enc->state[enc->program].ta_timeout && !eon_has_ta) { if(enc->data[enc->program].tp && enc->data[enc->program].ta && enc->state[enc->program].ta_timeout && !eon_has_ta) {
enc->state[enc->program].ta_timeout--; enc->state[enc->program].ta_timeout--;
if(enc->state[enc->program].ta_timeout == 0) enc->data[enc->program].ta = 0; if(enc->state[enc->program].ta_timeout == 0) {
enc->data[enc->program].ta = 0;
enc->state[enc->program].ta_timeout = enc->state[enc->program].original_ta_timeout;
};
}
if(enc->data[enc->program].rt1_enabled && enc->data[enc->program].rt2_enabled && enc->data[enc->program].rt_switching_period != 0) {
enc->data[enc->program].rt_switching_period--;
if(enc->data[enc->program].rt_switching_period == 0) {
enc->state[enc->program].current_rt ^= 1;
if (enc->state[enc->program].current_rt == 1) {
memcpy(enc->state[enc->program].rt_text, enc->data[enc->program].rt2, RT_LENGTH);
} else {
memcpy(enc->state[enc->program].rt_text, enc->data[enc->program].rt1, RT_LENGTH);
}
enc->state[enc->program].rt_state = 0;
enc->data[enc->program].rt_switching_period = enc->data[enc->program].original_rt_switching_period;
}
} }
if(enc->data[enc->program].ct) { if(enc->data[enc->program].ct) {
@@ -691,10 +726,12 @@ void reset_rds_state(RDSEncoder* enc, uint8_t program) {
RDSEncoder tempCoder; RDSEncoder tempCoder;
tempCoder.program = program; tempCoder.program = program;
memset(&(tempCoder.state[program]), 0, sizeof(RDSState)); memset(&(tempCoder.state[program]), 0, sizeof(RDSState));
memset(&(tempCoder.rtpState[program]), 0, sizeof(RDSRTPlusState));
tempCoder.state[program].rt_ab = 1; tempCoder.state[program].rt_ab = 1;
tempCoder.state[program].ptyn_ab = 1; tempCoder.state[program].ptyn_ab = 1;
set_rds_rt1(&tempCoder, enc->data[program].rt1); set_rds_rt1(&tempCoder, enc->data[program].rt1);
set_rds_rt1(&tempCoder, enc->data[program].rt2);
set_rds_ps(&tempCoder, enc->data[program].ps); set_rds_ps(&tempCoder, enc->data[program].ps);
set_rds_dps1(&tempCoder, enc->data[program].dps1); set_rds_dps1(&tempCoder, enc->data[program].dps1);
set_rds_tps(&tempCoder, enc->data[program].tps); set_rds_tps(&tempCoder, enc->data[program].tps);
@@ -706,13 +743,16 @@ void reset_rds_state(RDSEncoder* enc, uint8_t program) {
time_t now; time_t now;
time(&now); time(&now);
utc = gmtime(&now); utc = gmtime(&now);
enc->state[program].last_minute = utc->tm_min; tempCoder.state[program].last_minute = utc->tm_min;
tempCoder.rtpState[program].toggle = 0;
for(int i = 0; i < EONS; i++) { for(int i = 0; i < EONS; i++) {
tempCoder.data[program].eon[i].ta = 0; tempCoder.data[program].eon[i].ta = 0;
} }
memcpy(&(enc->state[program]), &(tempCoder.state[program]), sizeof(RDSState)); memcpy(&(enc->state[program]), &(tempCoder.state[program]), sizeof(RDSState));
memcpy(&(enc->rtpState[program]), &(tempCoder.rtpState[program]), sizeof(RDSRTPlusState));
} }
void set_rds_defaults(RDSEncoder* enc, uint8_t program) { void set_rds_defaults(RDSEncoder* enc, uint8_t program) {
@@ -741,6 +781,8 @@ void set_rds_defaults(RDSEncoder* enc, uint8_t program) {
enc->data[program].dps_label_period = 8; enc->data[program].dps_label_period = 8;
enc->data[program].dps1_numberofrepeats = 1; enc->data[program].dps1_numberofrepeats = 1;
enc->data[program].rt_type = 2;
reset_rds_state(enc, program); reset_rds_state(enc, program);
init_rtplus(enc, GROUP_11A, program); init_rtplus(enc, GROUP_11A, program);
@@ -787,6 +829,26 @@ void set_rds_rt1(RDSEncoder* enc, char *rt1) {
} }
} }
void set_rds_rt2(RDSEncoder* enc, char *rt2) {
uint8_t i = 0, len = 0;
memset(enc->data[enc->program].rt2, ' ', RT_LENGTH);
while (*rt2 != 0 && len < RT_LENGTH) enc->data[enc->program].rt2[len++] = *rt2++;
if (len < RT_LENGTH && enc->data[enc->program].shortrt) {
enc->state[enc->program].rt2_segments = 0;
enc->data[enc->program].rt2[len++] = '\r';
while (i < len) {
i += 4;
enc->state[enc->program].rt2_segments++;
}
} else {
enc->state[enc->program].rt2_segments = 16;
}
}
void set_rds_ps(RDSEncoder* enc, char *ps) { void set_rds_ps(RDSEncoder* enc, char *ps) {
uint8_t len = 0; uint8_t len = 0;
@@ -868,7 +930,7 @@ void set_rds_rtplus_tags(RDSEncoder* enc, uint8_t *tags) {
enc->rtpData[enc->program].start[1] = tags[4] & 0x3f; enc->rtpData[enc->program].start[1] = tags[4] & 0x3f;
enc->rtpData[enc->program].len[1] = tags[5] & 0x1f; enc->rtpData[enc->program].len[1] = tags[5] & 0x1f;
enc->rtpData[enc->program].toggle ^= 1; enc->rtpState[enc->program].toggle ^= 1;
enc->rtpData[enc->program].running = 1; enc->rtpData[enc->program].running = 1;
enc->rtpData[enc->program].enabled = 1; enc->rtpData[enc->program].enabled = 1;
} }

View File

@@ -77,11 +77,14 @@ typedef struct
RDSSchedulerItem items[49]; RDSSchedulerItem items[49];
} RDSScheduler; } RDSScheduler;
typedef struct { typedef struct {
uint16_t pi;
char ps[PS_LENGTH];
char rt1[RT_LENGTH];
uint8_t dsn; uint8_t dsn;
uint8_t psn; uint8_t psn;
uint16_t pi;
uint8_t ecclic_enabled : 1; uint8_t ecclic_enabled : 1;
uint16_t lic : 12; uint16_t lic : 12;
uint8_t ecc; uint8_t ecc;
@@ -92,7 +95,6 @@ typedef struct {
uint8_t ms : 1; uint8_t ms : 1;
uint8_t di : 4; uint8_t di : 4;
char ps[PS_LENGTH];
char tps[PS_LENGTH]; char tps[PS_LENGTH];
uint8_t eqtext1 : 1; uint8_t eqtext1 : 1;
@@ -102,8 +104,7 @@ typedef struct {
char dps2[DPS_LENGTH]; char dps2[DPS_LENGTH];
uint8_t dps1_mode : 2; uint8_t dps1_mode : 2;
uint8_t dps2_mode : 2; uint8_t dps2_mode : 2;
uint8_t dps1_numberofrepeats : 7; uint8_t dps1_numberofrepeats : 8; // last bit will be clear
uint8_t dps1_numberofrepeats_clear : 1;
uint8_t dps2_numberofrepeats; uint8_t dps2_numberofrepeats;
uint8_t dps_label_period; uint8_t dps_label_period;
uint8_t dps_restart : 1; uint8_t dps_restart : 1;
@@ -116,8 +117,8 @@ typedef struct {
uint8_t rt_type : 2; uint8_t rt_type : 2;
uint8_t rt_text_timeout; uint8_t rt_text_timeout;
uint8_t rt_switching_period; uint8_t rt_switching_period;
uint8_t orignal_rt_switching_period;
char default_rt[RT_LENGTH]; char default_rt[RT_LENGTH];
char rt1[RT_LENGTH];
char rt2[RT_LENGTH]; char rt2[RT_LENGTH];
uint8_t ptyn_enabled : 1; uint8_t ptyn_enabled : 1;
@@ -176,6 +177,8 @@ typedef struct {
uint8_t rt_update : 1; uint8_t rt_update : 1;
uint8_t rt_ab : 1; uint8_t rt_ab : 1;
uint8_t rt_segments : 5; uint8_t rt_segments : 5;
uint8_t rt2_segments : 5;
uint8_t current_rt : 1;
char ptyn_text[RT_LENGTH]; char ptyn_text[RT_LENGTH];
uint8_t ptyn_state : 1; uint8_t ptyn_state : 1;
@@ -195,10 +198,12 @@ typedef struct {
uint8_t last_minute : 6; uint8_t last_minute : 6;
uint8_t ta_timeout : 7; uint8_t ta_timeout : 7;
uint8_t original_ta_timeout : 7;
uint8_t eon_index : 3; uint8_t eon_index : 3;
uint8_t eon_state : 4; uint8_t eon_state : 4;
} RDSState; } RDSState;
typedef struct { typedef struct {
uint8_t group; uint8_t group;
uint16_t aid; uint16_t aid;
@@ -208,15 +213,18 @@ typedef struct {
uint8_t current : 4; uint8_t current : 4;
uint8_t count : 4; uint8_t count : 4;
} RDSODAState; } RDSODAState;
typedef struct { typedef struct {
uint8_t group; uint8_t group;
uint8_t enabled : 1; uint8_t enabled : 1;
uint8_t running : 1; uint8_t running : 1;
uint8_t toggle : 1;
uint8_t type[2]; uint8_t type[2];
uint8_t start[2]; uint8_t start[2];
uint8_t len[2]; uint8_t len[2];
} RDSRTPlusData; } RDSRTPlusData;
typedef struct {
uint8_t toggle : 1;
} RDSRTPlusState;
typedef struct typedef struct
{ {
@@ -240,6 +248,7 @@ typedef struct {
RDSODA odas[PROGRAMS][MAX_ODAS]; RDSODA odas[PROGRAMS][MAX_ODAS];
RDSODAState oda_state[PROGRAMS]; RDSODAState oda_state[PROGRAMS];
RDSRTPlusData rtpData[PROGRAMS]; RDSRTPlusData rtpData[PROGRAMS];
RDSRTPlusState rtpState[PROGRAMS];
uint8_t program : 3; uint8_t program : 3;
} RDSEncoder; } RDSEncoder;
typedef struct { typedef struct {