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:
2
.vscode/.server-controller-port.log
vendored
2
.vscode/.server-controller-port.log
vendored
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"port": 13452,
|
"port": 13452,
|
||||||
"time": 1742639833627,
|
"time": 1742659000234,
|
||||||
"version": "0.0.3"
|
"version": "0.0.3"
|
||||||
}
|
}
|
||||||
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@@ -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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
76
src/rds.c
76
src/rds.c
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
23
src/rds.h
23
src/rds.h
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user