mirror of
https://github.com/radio95-rnt/rds95.git
synced 2026-02-26 20:33:53 +01:00
some updates
This commit is contained in:
@@ -413,7 +413,7 @@ void init_lua(RDSModulator* rds_mod) {
|
|||||||
lua_setglobal(L, "core_version");
|
lua_setglobal(L, "core_version");
|
||||||
lua_pushinteger(L, PROGRAMS);
|
lua_pushinteger(L, PROGRAMS);
|
||||||
lua_setglobal(L, "max_programs");
|
lua_setglobal(L, "max_programs");
|
||||||
lua_pushinteger(L, 4);
|
lua_pushinteger(L, EONs);
|
||||||
lua_setglobal(L, "eon_count");
|
lua_setglobal(L, "eon_count");
|
||||||
|
|
||||||
lua_register(L, "set_rds_program_defaults", lua_set_rds_program_defaults);
|
lua_register(L, "set_rds_program_defaults", lua_set_rds_program_defaults);
|
||||||
|
|||||||
69
src/rds.c
69
src/rds.c
@@ -5,6 +5,7 @@
|
|||||||
#include "lua_rds.h"
|
#include "lua_rds.h"
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
// declarations (stupid c)
|
||||||
uint16_t get_next_af(RDSEncoder* enc);
|
uint16_t get_next_af(RDSEncoder* enc);
|
||||||
void get_next_af_oda(RDSEncoder* enc, uint16_t* af_group);
|
void get_next_af_oda(RDSEncoder* enc, uint16_t* af_group);
|
||||||
uint16_t get_next_af_eon(RDSEncoder* enc, uint8_t eon_index);
|
uint16_t get_next_af_eon(RDSEncoder* enc, uint8_t eon_index);
|
||||||
@@ -28,6 +29,30 @@ void get_rds_ert_group(RDSEncoder* enc, RDSGroup *group);
|
|||||||
uint8_t get_rds_custom_groups(RDSEncoder* enc, RDSGroup *group);
|
uint8_t get_rds_custom_groups(RDSEncoder* enc, RDSGroup *group);
|
||||||
uint8_t get_rds_custom_groups2(RDSEncoder* enc, RDSGroup *group);
|
uint8_t get_rds_custom_groups2(RDSEncoder* enc, RDSGroup *group);
|
||||||
|
|
||||||
|
#define HANDLE_UDG_STREAM(chan_idx, udg_prefix) \
|
||||||
|
do { \
|
||||||
|
if (stream != 0) { \
|
||||||
|
udg_idx = enc->state[enc->program].udg_idxs_rds2[chan_idx]; \
|
||||||
|
group->a = enc->data[enc->program].udg_prefix##_rds2[udg_idx][0]; \
|
||||||
|
group->b = enc->data[enc->program].udg_prefix##_rds2[udg_idx][1]; \
|
||||||
|
group->c = enc->data[enc->program].udg_prefix##_rds2[udg_idx][2]; \
|
||||||
|
group->d = enc->data[enc->program].udg_prefix##_rds2[udg_idx][3]; \
|
||||||
|
enc->state[enc->program].udg_idxs_rds2[chan_idx]++; \
|
||||||
|
if (enc->state[enc->program].udg_idxs_rds2[chan_idx] == enc->data[enc->program].udg_prefix##_len_rds2) \
|
||||||
|
enc->state[enc->program].udg_idxs_rds2[chan_idx] = 0; \
|
||||||
|
group->is_type_b = (group->a == 0 && IS_TYPE_B(group->b)); \
|
||||||
|
} else { \
|
||||||
|
udg_idx = enc->state[enc->program].udg_idxs[chan_idx]; \
|
||||||
|
group->b = enc->data[enc->program].udg_prefix[udg_idx][0]; \
|
||||||
|
group->c = enc->data[enc->program].udg_prefix[udg_idx][1]; \
|
||||||
|
group->d = enc->data[enc->program].udg_prefix[udg_idx][2]; \
|
||||||
|
enc->state[enc->program].udg_idxs[chan_idx]++; \
|
||||||
|
if (enc->state[enc->program].udg_idxs[chan_idx] == enc->data[enc->program].udg_prefix##_len) \
|
||||||
|
enc->state[enc->program].udg_idxs[chan_idx] = 0; \
|
||||||
|
group->is_type_b = (IS_TYPE_B(group->b) != 0); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp, uint8_t stream) {
|
static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp, uint8_t stream) {
|
||||||
uint8_t udg_idx;
|
uint8_t udg_idx;
|
||||||
uint8_t ps_seq_idx = (stream == 0) ? 1 : 3;
|
uint8_t ps_seq_idx = (stream == 0) ? 1 : 3;
|
||||||
@@ -57,44 +82,10 @@ static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp,
|
|||||||
get_rds_eon_group(enc, group);
|
get_rds_eon_group(enc, group);
|
||||||
break;
|
break;
|
||||||
case 'X':
|
case 'X':
|
||||||
if(stream != 0) {
|
HANDLE_UDG_STREAM(0, udg1);
|
||||||
udg_idx = enc->state[enc->program].udg_idxs_rds2[0];
|
|
||||||
group->a = enc->data[enc->program].udg1_rds2[udg_idx][0];
|
|
||||||
group->b = enc->data[enc->program].udg1_rds2[udg_idx][1];
|
|
||||||
group->c = enc->data[enc->program].udg1_rds2[udg_idx][2];
|
|
||||||
group->d = enc->data[enc->program].udg1_rds2[udg_idx][3];
|
|
||||||
enc->state[enc->program].udg_idxs_rds2[0]++;
|
|
||||||
if(enc->state[enc->program].udg_idxs_rds2[0] == enc->data[enc->program].udg1_len_rds2) enc->state[enc->program].udg_idxs_rds2[0] = 0;
|
|
||||||
group->is_type_b = (group->a == 0 && IS_TYPE_B(group->b));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
udg_idx = enc->state[enc->program].udg_idxs[0];
|
|
||||||
group->b = enc->data[enc->program].udg1[udg_idx][0];
|
|
||||||
group->c = enc->data[enc->program].udg1[udg_idx][1];
|
|
||||||
group->d = enc->data[enc->program].udg1[udg_idx][2];
|
|
||||||
enc->state[enc->program].udg_idxs[0]++;
|
|
||||||
if(enc->state[enc->program].udg_idxs[0] == enc->data[enc->program].udg1_len) enc->state[enc->program].udg_idxs[0] = 0;
|
|
||||||
group->is_type_b = (IS_TYPE_B(group->b) != 0);
|
|
||||||
break;
|
break;
|
||||||
case 'Y':
|
case 'Y':
|
||||||
if(stream != 0) {
|
HANDLE_UDG_STREAM(1, udg2);
|
||||||
udg_idx = enc->state[enc->program].udg_idxs_rds2[1];
|
|
||||||
group->a = enc->data[enc->program].udg2_rds2[udg_idx][0];
|
|
||||||
group->b = enc->data[enc->program].udg2_rds2[udg_idx][1];
|
|
||||||
group->c = enc->data[enc->program].udg2_rds2[udg_idx][2];
|
|
||||||
group->d = enc->data[enc->program].udg2_rds2[udg_idx][3];
|
|
||||||
enc->state[enc->program].udg_idxs_rds2[1]++;
|
|
||||||
if(enc->state[enc->program].udg_idxs_rds2[1] == enc->data[enc->program].udg2_len_rds2) enc->state[enc->program].udg_idxs_rds2[1] = 0;
|
|
||||||
group->is_type_b = (group->a == 0 && IS_TYPE_B(group->b));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
udg_idx = enc->state[enc->program].udg_idxs[1];
|
|
||||||
group->b = enc->data[enc->program].udg2[udg_idx][0];
|
|
||||||
group->c = enc->data[enc->program].udg2[udg_idx][1];
|
|
||||||
group->d = enc->data[enc->program].udg2[udg_idx][2];
|
|
||||||
enc->state[enc->program].udg_idxs[1]++;
|
|
||||||
if(enc->state[enc->program].udg_idxs[1] == enc->data[enc->program].udg2_len) enc->state[enc->program].udg_idxs[1] = 0;
|
|
||||||
group->is_type_b = (IS_TYPE_B(group->b) != 0);
|
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
if(enc->state[enc->program].rtp_oda == 0) get_rds_rtplus_group(enc, group);
|
if(enc->state[enc->program].rtp_oda == 0) get_rds_rtplus_group(enc, group);
|
||||||
@@ -132,7 +123,7 @@ static uint8_t check_rds_good_group(RDSEncoder* enc, char* grp) {
|
|||||||
if(*grp == '2' && (enc->data[enc->program].rt1_enabled || enc->data[enc->program].rt2_enabled)) good_group = 1;
|
if(*grp == '2' && (enc->data[enc->program].rt1_enabled || enc->data[enc->program].rt2_enabled)) good_group = 1;
|
||||||
if(*grp == 'A' && enc->data[enc->program].ptyn_enabled) good_group = 1;
|
if(*grp == 'A' && enc->data[enc->program].ptyn_enabled) good_group = 1;
|
||||||
if(*grp == 'E') {
|
if(*grp == 'E') {
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < EONs; i++) {
|
||||||
if (enc->data[enc->program].eon[i].enabled) {
|
if (enc->data[enc->program].eon[i].enabled) {
|
||||||
good_group = 1;
|
good_group = 1;
|
||||||
break;
|
break;
|
||||||
@@ -165,7 +156,7 @@ static void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) {
|
|||||||
enc->state[enc->program].last_minute = utc->tm_min;
|
enc->state[enc->program].last_minute = utc->tm_min;
|
||||||
|
|
||||||
uint8_t eon_has_ta = 0;
|
uint8_t eon_has_ta = 0;
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < EONs; i++) {
|
||||||
if (enc->data[enc->program].eon[i].enabled && enc->data[enc->program].eon[i].ta) {
|
if (enc->data[enc->program].eon[i].enabled && enc->data[enc->program].eon[i].ta) {
|
||||||
eon_has_ta = 1;
|
eon_has_ta = 1;
|
||||||
break;
|
break;
|
||||||
@@ -359,7 +350,7 @@ void reset_rds_state(RDSEncoder* enc, uint8_t program) {
|
|||||||
utc = gmtime(&now);
|
utc = gmtime(&now);
|
||||||
tempCoder.state[program].last_minute = utc->tm_min;
|
tempCoder.state[program].last_minute = utc->tm_min;
|
||||||
|
|
||||||
for(int i = 0; i < 4; i++) tempCoder.data[program].eon[i].ta = 0;
|
for(int i = 0; i < EONs; i++) 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));
|
memcpy(&(enc->rtpState[program]), &(tempCoder.rtpState[program]), sizeof(RDSRTPlusState));
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#define AF_CODE_LFMF_FOLLOWS 250
|
#define AF_CODE_LFMF_FOLLOWS 250
|
||||||
|
|
||||||
#define PROGRAMS 3
|
#define PROGRAMS 3
|
||||||
|
#define EONs 4
|
||||||
|
|
||||||
// List of ODAs: https://www.nrscstandards.org/committees/dsm/archive/rds-oda-aids.pdf
|
// List of ODAs: https://www.nrscstandards.org/committees/dsm/archive/rds-oda-aids.pdf
|
||||||
#define ODA_AID_RTPLUS 0x4bd7
|
#define ODA_AID_RTPLUS 0x4bd7
|
||||||
@@ -105,7 +106,7 @@ typedef struct {
|
|||||||
uint16_t udg1_rds2[8][4];
|
uint16_t udg1_rds2[8][4];
|
||||||
uint16_t udg2_rds2[8][4];
|
uint16_t udg2_rds2[8][4];
|
||||||
|
|
||||||
RDSEON eon[4];
|
RDSEON eon[EONs];
|
||||||
} RDSData;
|
} RDSData;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t af_state : 6;
|
uint8_t af_state : 6;
|
||||||
|
|||||||
@@ -312,9 +312,7 @@ void get_rds_eon_group(RDSEncoder* enc, RDSGroup *group) {
|
|||||||
uint8_t i = 0;
|
uint8_t i = 0;
|
||||||
while(i < 4 && !enc->data[enc->program].eon[enc->state[enc->program].eon_index].enabled) {
|
while(i < 4 && !enc->data[enc->program].eon[enc->state[enc->program].eon_index].enabled) {
|
||||||
enc->state[enc->program].eon_index++;
|
enc->state[enc->program].eon_index++;
|
||||||
if(enc->state[enc->program].eon_index == 4) {
|
if(enc->state[enc->program].eon_index >= EONs) enc->state[enc->program].eon_index = 0;
|
||||||
enc->state[enc->program].eon_index = 0;
|
|
||||||
}
|
|
||||||
eon = enc->data[enc->program].eon[enc->state[enc->program].eon_index];
|
eon = enc->data[enc->program].eon[enc->state[enc->program].eon_index];
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@@ -340,7 +338,7 @@ void get_rds_ert_group(RDSEncoder* enc, RDSGroup *group) {
|
|||||||
group->d |= enc->state[enc->program].ert_text[enc->state[enc->program].ert_state * 4 + 3];
|
group->d |= enc->state[enc->program].ert_text[enc->state[enc->program].ert_state * 4 + 3];
|
||||||
|
|
||||||
enc->state[enc->program].ert_state++;
|
enc->state[enc->program].ert_state++;
|
||||||
if (enc->state[enc->program].ert_state == enc->state[enc->program].ert_segments) enc->state[enc->program].ert_state = 0;
|
if (enc->state[enc->program].ert_state >= enc->state[enc->program].ert_segments) enc->state[enc->program].ert_state = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t get_rds_custom_groups(RDSEncoder* enc, RDSGroup *group) {
|
uint8_t get_rds_custom_groups(RDSEncoder* enc, RDSGroup *group) {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ void set_rds_rt1(RDSEncoder* enc, const char *rt1) {
|
|||||||
enc->state[enc->program].rt_segments++;
|
enc->state[enc->program].rt_segments++;
|
||||||
}
|
}
|
||||||
} else enc->state[enc->program].rt_segments = 16;
|
} else enc->state[enc->program].rt_segments = 16;
|
||||||
|
if(enc->state[enc->program].rt_segments > 16) enc->state[enc->program].rt_segments = 16; //make sure
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_rds_rt2(RDSEncoder* enc, const char *rt2) {
|
void set_rds_rt2(RDSEncoder* enc, const char *rt2) {
|
||||||
@@ -40,6 +41,7 @@ void set_rds_rt2(RDSEncoder* enc, const char *rt2) {
|
|||||||
enc->state[enc->program].rt2_segments++;
|
enc->state[enc->program].rt2_segments++;
|
||||||
}
|
}
|
||||||
} else enc->state[enc->program].rt2_segments = 16;
|
} else enc->state[enc->program].rt2_segments = 16;
|
||||||
|
if(enc->state[enc->program].rt2_segments > 16) enc->state[enc->program].rt2_segments = 16; //make sure
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_rds_ps(RDSEncoder* enc, const char *ps) {
|
void set_rds_ps(RDSEncoder* enc, const char *ps) {
|
||||||
@@ -103,6 +105,7 @@ void set_rds_ert(RDSEncoder* enc, const char *ert) {
|
|||||||
enc->state[enc->program].ert_segments++;
|
enc->state[enc->program].ert_segments++;
|
||||||
}
|
}
|
||||||
} else enc->state[enc->program].ert_segments = 32;
|
} else enc->state[enc->program].ert_segments = 32;
|
||||||
|
if(enc->state[enc->program].ert_segments > 32) enc->state[enc->program].ert_segments = 32; //make sure
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void set_rds_rtplus_tags(RDSEncoder* enc, uint8_t *tags) {
|
inline void set_rds_rtplus_tags(RDSEncoder* enc, uint8_t *tags) {
|
||||||
|
|||||||
Reference in New Issue
Block a user