mirror of
https://github.com/radio95-rnt/rds95.git
synced 2026-07-29 08:19:17 +02:00
reinvent the group sequence
This commit is contained in:
@@ -222,11 +222,6 @@ function rds.set_grpseq(grpseq) end
|
||||
---@return string
|
||||
function rds.get_grpseq() end
|
||||
|
||||
---@param grpseq2 string
|
||||
function rds.set_grpseq2(grpseq2) end
|
||||
---@return string
|
||||
function rds.get_grpseq2() end
|
||||
|
||||
---Puts in a RDS1 group in the buffer, note that block A is filled in always
|
||||
---@param b integer
|
||||
---@param c integer
|
||||
|
||||
+1
-1
@@ -119,7 +119,7 @@ local function group_handler(group_type)
|
||||
if group_type == "O" then return get_aid()
|
||||
elseif group_type == "K" then return get_data() end
|
||||
end
|
||||
rds.ext.register_group("OK", group_handler)
|
||||
rds.ext.register_group("\x06\xff", group_handler)
|
||||
|
||||
table.insert(hooks.on_state, function ()
|
||||
_RDS_ODAs = {}
|
||||
|
||||
@@ -79,7 +79,6 @@ function hooks.data_handle(data)
|
||||
elseif data == "lps" then return string.format("LPS=%s\r\n", rds.get_lps())
|
||||
elseif data == "ert" then return string.format("ERT=%s\r\n", rds.ext.get_ert())
|
||||
elseif data == "grpseq" then return string.format("GRPSEQ=%s\r\n", rds.get_grpseq())
|
||||
elseif data == "grpseq2" then return string.format("GRPSEQ2=%s\r\n", rds.get_grpseq2())
|
||||
else
|
||||
local eon_cmd, eon_num = data:match("^eon(%d+)([a-z]+)$")
|
||||
if eon_cmd then
|
||||
@@ -261,9 +260,6 @@ function hooks.data_handle(data)
|
||||
elseif cmd == "grpseq" then
|
||||
rds.set_grpseq(value)
|
||||
return "+\r\n"
|
||||
elseif cmd == "grpseq2" then
|
||||
rds.set_grpseq2(value)
|
||||
return "+\r\n"
|
||||
elseif cmd == "rtp" or cmd == "ertp" then
|
||||
local is_ertp = (cmd == "ertp")
|
||||
local t1, s1, l1, t2, s2, l2 = value:match("(%d+),(%d+),(%d+),(%d+),(%d+),(%d+)")
|
||||
|
||||
@@ -14,13 +14,11 @@ void encoder_saveToFile(RDSEncoder *enc) {
|
||||
} else memcpy(&tempEncoder, enc, sizeof(RDSEncoder));
|
||||
|
||||
memcpy(tempEncoder.data, enc->data, sizeof(RDSData) * PROGRAMS);
|
||||
memcpy(&tempEncoder.encoder_data, &enc->encoder_data, sizeof(RDSEncoderData));
|
||||
tempEncoder.program = enc->program;
|
||||
tempEncoder.enabled_streams = enc->enabled_streams;
|
||||
|
||||
RDSEncoderFile rdsEncoderfile = {.file_starter = 225, .file_middle = 160, .file_ender = 95, .program = tempEncoder.program, .enabled_streams = tempEncoder.enabled_streams};
|
||||
memcpy(&rdsEncoderfile.data, &tempEncoder.data, sizeof(RDSData)*PROGRAMS);
|
||||
memcpy(&rdsEncoderfile.encoder_data, &tempEncoder.encoder_data, sizeof(RDSEncoderData));
|
||||
|
||||
rdsEncoderfile.crc = crc16_ccitt((char *)&rdsEncoderfile, offsetof(RDSEncoderFile, crc));
|
||||
|
||||
@@ -58,7 +56,6 @@ int encoder_loadFromFile(RDSEncoder *enc) {
|
||||
}
|
||||
|
||||
memcpy(&(enc->data), &(rdsEncoderfile.data), sizeof(RDSData)*PROGRAMS);
|
||||
memcpy(&(enc->encoder_data), &(rdsEncoderfile.encoder_data), sizeof(RDSEncoderData));
|
||||
enc->program = rdsEncoderfile.program;
|
||||
enc->enabled_streams = rdsEncoderfile.enabled_streams;
|
||||
return 0;
|
||||
|
||||
+1
-20
@@ -165,16 +165,6 @@ BOOL_GETTER(rt_enabled)
|
||||
BOOL_SETTER(ptyn_enabled)
|
||||
BOOL_GETTER(ptyn_enabled)
|
||||
|
||||
int lua_set_rds2_mode(lua_State *localL) {
|
||||
enc->encoder_data.rds2_mode = luaL_checkinteger(localL, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lua_get_rds2_mode(lua_State *localL) {
|
||||
lua_pushinteger(localL, enc->encoder_data.rds2_mode);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int lua_set_rds_streams(lua_State *localL) {
|
||||
enc->enabled_streams = luaL_checkinteger(localL, 1);
|
||||
return 0;
|
||||
@@ -259,16 +249,7 @@ STR_RAW_SETTER(rt_raw, set_rds_rt)
|
||||
STR_RAW_SETTER(lps, set_rds_lps)
|
||||
STR_RAW_GETTER(lps, LPS_LENGTH)
|
||||
|
||||
STR_RAW_SETTER(grp_sqc_rds2, set_rds_grpseq2)
|
||||
STR_RAW_GETTER(grp_sqc_rds2, 32)
|
||||
|
||||
int lua_set_rds_grp_sqc(lua_State *localL) {
|
||||
const char* str = luaL_checklstring(localL, 1, NULL);
|
||||
if(_strnlen(str, 2) < 1) set_rds_grpseq(enc, DEFAULT_GRPSQC, writing_program);
|
||||
else set_rds_grpseq(enc, str, writing_program);
|
||||
return 0;
|
||||
}
|
||||
|
||||
STR_RAW_SETTER(grp_sqc, set_rds_grpseq)
|
||||
STR_RAW_GETTER(grp_sqc, 32)
|
||||
|
||||
AF_SETTER(af_group0, af, RDSAFs, add_rds_af)
|
||||
|
||||
@@ -136,9 +136,6 @@ void init_lua(RDSEncoder* _enc) {
|
||||
lua_registertotable(L, "set_grpseq", lua_set_rds_grp_sqc);
|
||||
lua_registertotable(L, "get_grpseq", lua_get_rds_grp_sqc);
|
||||
|
||||
lua_registertotable(L, "set_grpseq2", lua_set_rds_grp_sqc_rds2);
|
||||
lua_registertotable(L, "get_grpseq2", lua_get_rds_grp_sqc_rds2);
|
||||
|
||||
lua_registertotable(L, "put_custom_group", lua_put_rds_custom_group);
|
||||
lua_registertotable(L, "put_rds2_custom_group", lua_put_rds2_custom_group);
|
||||
|
||||
|
||||
@@ -22,70 +22,62 @@ uint8_t get_rds_custom_groups2(RDSEncoder* enc, RDSGroup *group);
|
||||
int get_rdsp_lua_group(RDSGroup *group, const char grp);
|
||||
|
||||
static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp, uint8_t stream) {
|
||||
uint8_t ps_seq_idx = (stream == 0) ? 1 : 3;
|
||||
uint8_t grp_seq_idx = (stream == 0) ? 0 : 2;
|
||||
switch (*grp)
|
||||
{
|
||||
default:
|
||||
case '0':
|
||||
if(enc->state[enc->program].grp_seq_idx[ps_seq_idx] < 4) enc->state[enc->program].grp_seq_idx[grp_seq_idx]--;
|
||||
else enc->state[enc->program].grp_seq_idx[ps_seq_idx] = 0;
|
||||
|
||||
enc->state[enc->program].grp_seq_idx[ps_seq_idx]++;
|
||||
switch (*grp) {
|
||||
case 0:
|
||||
get_rds_ps_group(enc, group);
|
||||
break;
|
||||
case '1':
|
||||
case 2:
|
||||
if(enc->state[enc->program].data_ecc == 0 && enc->data[enc->program].slc_data != 0) get_rds_slcdata_group(enc, group);
|
||||
else get_rds_ecc_group(enc, group);
|
||||
TOGGLE(enc->state[enc->program].data_ecc);
|
||||
break;
|
||||
case '2':
|
||||
case 4:
|
||||
get_rds_rt_group(enc, group);
|
||||
break;
|
||||
case 'A':
|
||||
case 20:
|
||||
get_rds_ptyn_group(enc, group);
|
||||
break;
|
||||
case 'E':
|
||||
case 28:
|
||||
get_rds_eon_group(enc, group);
|
||||
break;
|
||||
case 'F':
|
||||
case 30:
|
||||
get_rds_lps_group(enc, group);
|
||||
break;
|
||||
case 'T':
|
||||
case 31:
|
||||
get_rds_fasttuning_group(enc, group);
|
||||
break;
|
||||
case 'L':
|
||||
case 'R':
|
||||
case 'P':
|
||||
case 'S':
|
||||
case 'O':
|
||||
case 'K':
|
||||
case 'U':
|
||||
case 'X':
|
||||
case 'Y':
|
||||
default:
|
||||
if(get_rdsp_lua_group(group, *grp) == 0) get_rds_ps_group(enc, group);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t check_rds_good_group(RDSEncoder* enc, char* grp) {
|
||||
uint8_t good_group = 0;
|
||||
if(*grp == '0') good_group = 1;
|
||||
if(*grp == '1' && (enc->data[enc->program].ecc != 0 || enc->data[enc->program].slc_data != 0)) good_group = 1;
|
||||
if(*grp == '2' && enc->data[enc->program].rt_enabled) good_group = 1;
|
||||
if(*grp == 'A' && enc->data[enc->program].ptyn_enabled) good_group = 1;
|
||||
if(*grp == 'E') {
|
||||
if(*grp == 2) {
|
||||
if(enc->data[enc->program].ecc != 0 || enc->data[enc->program].slc_data != 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
if(*grp == 4) {
|
||||
if(enc->data[enc->program].rt_enabled) return 1;
|
||||
return 0;
|
||||
}
|
||||
if(*grp == 20) {
|
||||
if(enc->data[enc->program].ptyn_enabled) return 1;
|
||||
return 0;
|
||||
}
|
||||
if(*grp == 28) {
|
||||
for (int i = 0; i < EONs; i++) {
|
||||
if (enc->data[enc->program].eon[i].enabled) {
|
||||
good_group = 1;
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(*grp == 'F' && enc->data[enc->program].lps[0] != '\0') good_group = 1;
|
||||
if(*grp == 'T') good_group = 1;
|
||||
if(*grp == 'L' || *grp == 'R' || *grp == 'P' || *grp == 'S' || *grp == 'O' || *grp == 'K' || *grp == 'U' || *grp == 'X' || *grp == 'Y') good_group = 1;
|
||||
return good_group;
|
||||
if(*grp == 30) {
|
||||
if(enc->data[enc->program].lps[0] != '\0') return 1;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) {
|
||||
@@ -124,57 +116,23 @@ void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) {
|
||||
group->a = 0;
|
||||
if(get_rds_custom_groups2(enc, group)) goto group_coded_rds2;
|
||||
|
||||
if(enc->encoder_data.rds2_mode == 0) {
|
||||
int generated = lua_rds2_group(group, stream);
|
||||
if(group->a == 0 && generated == 1) group->is_type_b = (IS_TYPE_B(group->b) != 0);
|
||||
else if(generated == 0) {
|
||||
group->b = enc->state[enc->program].last_stream0_group[0];
|
||||
group->c = enc->state[enc->program].last_stream0_group[1];
|
||||
group->d = enc->state[enc->program].last_stream0_group[2];
|
||||
group->is_type_b = enc->state[enc->program].last_stream0_group_type_b;
|
||||
goto group_coded_rds2;
|
||||
} else if(enc->encoder_data.rds2_mode == 1) {
|
||||
while(good_group == 0) {
|
||||
grp_sqc_idx = enc->state[enc->program].grp_seq_idx[2];
|
||||
if(enc->data[enc->program].grp_sqc_rds2[grp_sqc_idx] == '\0') {
|
||||
enc->state[enc->program].grp_seq_idx[2] = 0;
|
||||
grp_sqc_idx = 0;
|
||||
}
|
||||
grp = enc->data[enc->program].grp_sqc_rds2[grp_sqc_idx];
|
||||
|
||||
good_group = check_rds_good_group(enc, &grp);
|
||||
|
||||
if(!good_group) cant_find_group++;
|
||||
else cant_find_group = 0;
|
||||
|
||||
if(!good_group && cant_find_group == 23) {
|
||||
cant_find_group = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
enc->state[enc->program].grp_seq_idx[2]++;
|
||||
}
|
||||
if(!good_group) grp = '0';
|
||||
|
||||
get_rds_sequence_group(enc, group, &grp, stream);
|
||||
|
||||
goto group_coded_rds2;
|
||||
} else if(enc->encoder_data.rds2_mode == 2) {
|
||||
int generated = lua_rds2_group(group, stream);
|
||||
if(group->a == 0 && generated == 1) group->is_type_b = (IS_TYPE_B(group->b) != 0);
|
||||
else if(generated == 0) {
|
||||
group->b = enc->state[enc->program].last_stream0_group[0];
|
||||
group->c = enc->state[enc->program].last_stream0_group[1];
|
||||
group->d = enc->state[enc->program].last_stream0_group[2];
|
||||
group->is_type_b = enc->state[enc->program].last_stream0_group_type_b;
|
||||
}
|
||||
goto group_coded_rds2;
|
||||
}
|
||||
goto group_coded_rds2;
|
||||
}
|
||||
|
||||
if(get_rds_custom_groups(enc, group)) goto group_coded;
|
||||
|
||||
while(good_group == 0) {
|
||||
grp_sqc_idx = enc->state[enc->program].grp_seq_idx[0];
|
||||
if(enc->data[enc->program].grp_sqc[grp_sqc_idx] == '\0') {
|
||||
enc->state[enc->program].grp_seq_idx[0] = 0;
|
||||
grp_sqc_idx = enc->state[enc->program].grp_seq_idx;
|
||||
if(grp_sqc_idx > enc->data[enc->program].grp_sqc_len) {
|
||||
enc->state[enc->program].grp_seq_idx = 0;
|
||||
grp_sqc_idx = 0;
|
||||
}
|
||||
grp = enc->data[enc->program].grp_sqc[grp_sqc_idx];
|
||||
@@ -188,9 +146,9 @@ void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) {
|
||||
break;
|
||||
}
|
||||
|
||||
enc->state[enc->program].grp_seq_idx[0]++;
|
||||
enc->state[enc->program].grp_seq_idx++;
|
||||
}
|
||||
if(!good_group) grp = '0';
|
||||
if(!good_group) grp = 0;
|
||||
|
||||
get_rds_sequence_group(enc, group, &grp, stream);
|
||||
|
||||
@@ -267,7 +225,6 @@ void reset_rds_state(RDSEncoder* enc, uint8_t program) {
|
||||
set_rds_lps(&tempCoder, enc->data[program].lps, program);
|
||||
set_rds_ptyn(&tempCoder, enc->data[program].ptyn, program);
|
||||
set_rds_grpseq(&tempCoder, enc->data[program].grp_sqc, program);
|
||||
set_rds_grpseq2(&tempCoder, enc->data[program].grp_sqc_rds2, program);
|
||||
|
||||
struct tm *utc;
|
||||
time_t now;
|
||||
@@ -284,10 +241,9 @@ void reset_rds_state(RDSEncoder* enc, uint8_t program) {
|
||||
|
||||
void set_rds_defaults(RDSEncoder* enc, uint8_t program) {
|
||||
memset(&(enc->data[program]), 0, sizeof(RDSData));
|
||||
memset(&(enc->encoder_data), 0, sizeof(RDSEncoderData));
|
||||
|
||||
enc->data[program].ct = 1;
|
||||
strcpy((char *)enc->data[program].grp_sqc, DEFAULT_GRPSQC);
|
||||
strcpy((char *)enc->data[program].grp_sqc, "0");
|
||||
enc->data[program].tp = 1;
|
||||
enc->data[program].pi = 0xFFFF;
|
||||
strcpy((char *)enc->data[program].ps, "* RDS * ");
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#define PS_LENGTH 8
|
||||
#define PTYN_LENGTH 8
|
||||
#define LPS_LENGTH 32
|
||||
#define DEFAULT_GRPSQC "002222XYOK"
|
||||
#define MAX_AFS 25
|
||||
|
||||
#define AF_CODE_FILLER 205
|
||||
@@ -69,7 +68,9 @@ typedef struct {
|
||||
|
||||
char lps[LPS_LENGTH];
|
||||
|
||||
uint8_t grp_sqc_len;
|
||||
char grp_sqc[32];
|
||||
uint8_t grp_sqc_rds2_len;
|
||||
char grp_sqc_rds2[32];
|
||||
|
||||
RDSEON eon[EONs];
|
||||
@@ -107,7 +108,7 @@ typedef struct {
|
||||
uint16_t custom_group2[GROUP_LENGTH + 1];
|
||||
|
||||
uint8_t data_ecc : 1;
|
||||
uint8_t grp_seq_idx[4];
|
||||
uint8_t grp_seq_idx;
|
||||
|
||||
uint8_t fasttuning_state : 3;
|
||||
|
||||
@@ -127,10 +128,6 @@ typedef struct {
|
||||
} RDSState;
|
||||
|
||||
typedef struct {
|
||||
uint8_t rds2_mode : 2;
|
||||
} RDSEncoderData;
|
||||
typedef struct {
|
||||
RDSEncoderData encoder_data;
|
||||
RDSData data[PROGRAMS];
|
||||
RDSState state[PROGRAMS];
|
||||
uint8_t program : 3;
|
||||
@@ -140,7 +137,6 @@ typedef struct {
|
||||
uint8_t file_starter; // Always is 225 first polish radio programme am frequency
|
||||
RDSData data[PROGRAMS];
|
||||
uint8_t file_middle; // Always is 160, average of both
|
||||
RDSEncoderData encoder_data;
|
||||
uint8_t program : 3;
|
||||
uint8_t enabled_streams : 3;
|
||||
uint8_t file_ender; // Always is 95 my freq
|
||||
@@ -171,4 +167,3 @@ void set_rds_tps(RDSEncoder* enc, const char *tps, uint8_t program);
|
||||
void set_rds_lps(RDSEncoder* enc, const char *lps, uint8_t program);
|
||||
void set_rds_ptyn(RDSEncoder *enc, const char *ptyn, uint8_t program);
|
||||
void set_rds_grpseq(RDSEncoder* enc, const char *grpseq, uint8_t program);
|
||||
void set_rds_grpseq2(RDSEncoder* enc, const char *grpseq2, uint8_t program);
|
||||
+3
-22
@@ -78,29 +78,10 @@ void set_rds_ptyn(RDSEncoder* enc, const char *ptyn, uint8_t program) {
|
||||
while (*ptyn != 0 && len < PTYN_LENGTH) enc->data[program].ptyn[len++] = *ptyn++;
|
||||
}
|
||||
|
||||
void set_rds_grpseq(RDSEncoder* enc, const char *grpseq, uint8_t program) {
|
||||
void set_rds_grpseq(RDSEncoder* enc, const char *grpseq, size_t size, uint8_t program) {
|
||||
uint8_t len = 0;
|
||||
|
||||
if(grpseq[0] == '\0') {
|
||||
while (DEFAULT_GRPSQC[len] != 0 && len < 32) {
|
||||
enc->data[program].grp_sqc[len] = DEFAULT_GRPSQC[len];
|
||||
len++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
enc->data[program].grp_sqc_len = size;
|
||||
memset(enc->data[program].grp_sqc, 0, 32);
|
||||
while (*grpseq != 0 && len < 32) enc->data[program].grp_sqc[len++] = *grpseq++;
|
||||
}
|
||||
void set_rds_grpseq2(RDSEncoder* enc, const char *grpseq2, uint8_t program) {
|
||||
uint8_t len = 0;
|
||||
|
||||
if(grpseq2[0] == '\0') {
|
||||
memset(enc->data[program].grp_sqc_rds2, 0, 32);
|
||||
memcpy(enc->data[program].grp_sqc_rds2, enc->data[program].grp_sqc, 32);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(enc->data[program].grp_sqc_rds2, 0, 32);
|
||||
while (*grpseq2 != 0 && len < 32) enc->data[program].grp_sqc_rds2[len++] = *grpseq2++;
|
||||
while (len < size && len < 32) enc->data[program].grp_sqc[len++] = *grpseq++;
|
||||
}
|
||||
Reference in New Issue
Block a user