typedef struct dvb_qpsk_config {
dvb_polarisation_t polarisation;
int orbital_pos;
- char orbital_dir;
uint32_t symbol_rate;
dvb_fe_code_rate_t fec_inner;
} dvb_qpsk_config_t;
int dvb_mux_conf_str ( dvb_mux_conf_t *conf, char *buf, size_t bufsize );
-int dvb_sat_position( const dvb_mux_conf_t *mc );
-
const char *dvb_sat_position_to_str( int position, char *buf, size_t buflen );
const int dvb_sat_position_from_str( const char *buf );
dmc.dmc_fe_freq = frequency;
dmc.u.dmc_fe_qpsk.orbital_pos = bcdtoint(ptr[4]) * 100 + bcdtoint(ptr[5]);
- dmc.u.dmc_fe_qpsk.orbital_dir = (ptr[6] & 0x80) ? 'E' : 'W';
+ if ((ptr[6] & 0x80) == 0)
+ dmc.u.dmc_fe_qpsk.orbital_pos *= -1;
dmc.u.dmc_fe_qpsk.polarisation = (ptr[6] >> 5) & 0x03;
dmc.u.dmc_fe_qpsk.symbol_rate = symrate * 100;
if (!fr->bouquet) {
strcpy(name, "???");
if (idnode_is_instance(&bi->mm->mm_id, &dvb_mux_dvbs_class))
- dvb_sat_position_to_str(dvb_sat_position(&((dvb_mux_t *)bi->mm)->lm_tuning),
+ dvb_sat_position_to_str(((dvb_mux_t *)bi->mm)->lm_tuning.u.dmc_fe_qpsk.orbital_pos,
name, sizeof(name));
snprintf(src, sizeof(src), "dvb-%s://dvbs,%s,%04X,%u",
bi->freesat ? "freesat" : "bskyb", name, bi->nbid, fr->regionid);
char src[64] = "";
if (idnode_is_instance(&mux->mm_id, &dvb_mux_dvbs_class)) {
dvb_mux_conf_t *mc = &((dvb_mux_t *)mux)->lm_tuning;
- if (mc->u.dmc_fe_qpsk.orbital_dir) {
+ if (mc->u.dmc_fe_qpsk.orbital_pos != INT_MAX) {
char buf[16];
- dvb_sat_position_to_str(dvb_sat_position(mc), buf, sizeof(buf));
+ dvb_sat_position_to_str(mc->u.dmc_fe_qpsk.orbital_pos, buf, sizeof(buf));
snprintf(src, sizeof(src), "dvb-bouquet://dvbs,%s,%04X,%04X", buf, tsid, bi->nbid);
}
} else if (idnode_is_instance(&mux->mm_id, &dvb_mux_dvbt_class)) {
if (idnode_is_instance(&mm->mm_id, &dvb_mux_dvbs_class)) {
dvb_mux_conf_t *mc = &((dvb_mux_t *)mm)->lm_tuning;
if (mc->dmc_fe_type == DVB_TYPE_S)
- dvb_fastscan_each(mm, dvb_sat_position(mc),
+ dvb_fastscan_each(mm, mc->u.dmc_fe_qpsk.orbital_pos,
mc->dmc_fe_freq, psi_tables_dvb_fastscan);
}
#endif
dvb_mux_conf_str_dvbs ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize )
{
const char *pol = dvb_pol2str(dmc->u.dmc_fe_qpsk.polarisation);
- const char dir = dmc->u.dmc_fe_qpsk.orbital_dir;
+ const int satpos = dmc->u.dmc_fe_qpsk.orbital_pos;
+ char satbuf[16];
+ if (satpos) {
+ snprintf(satbuf, sizeof(buf), "%d.%d%c ", abs(satpos) / 10, abs(satpos) % 10, satpos < 0 ? 'W' : 'E');
+ } else {
+ satbuf[0] = '\0';
+ }
return
snprintf(buf, bufsize,
- "%s pos %d.%d%c freq %d %c sym %d fec %s mod %s roff %s is_id %d pls_mode %s pls_code %d",
+ "%s %sfreq %d %c sym %d fec %s mod %s roff %s is_id %d pls_mode %s pls_code %d",
dvb_delsys2str(dmc->dmc_fe_delsys),
- dmc->u.dmc_fe_qpsk.orbital_pos / 10,
- dmc->u.dmc_fe_qpsk.orbital_pos % 10,
- dir >= ' ' && dir <= 'z' ? dir : '?',
+ satbuf,
dmc->dmc_fe_freq,
pol ? pol[0] : 'X',
dmc->u.dmc_fe_qpsk.symbol_rate,
}
}
-int
-dvb_sat_position(const dvb_mux_conf_t *mc)
-{
- int pos = mc->u.dmc_fe_qpsk.orbital_pos;
- assert(mc->dmc_fe_type == DVB_TYPE_S);
- if (!mc->u.dmc_fe_qpsk.orbital_dir)
- return INT_MAX;
- if (mc->u.dmc_fe_qpsk.orbital_dir == 'W')
- return -pos;
- return pos;
-}
-
const char *
dvb_sat_position_to_str(int position, char *buf, size_t buflen)
{
dvb_fe_type_t ln_type;
} dvb_network_t;
+extern const idclass_t dvb_network_class;
extern const idclass_t dvb_network_dvbt_class;
extern const idclass_t dvb_network_dvbc_class;
extern const idclass_t dvb_network_dvbs_class;
void dvb_network_init ( void );
void dvb_network_done ( void );
-dvb_network_t *dvb_network_find_by_uuid(const char *uuid);
+static inline dvb_network_t *dvb_network_find_by_uuid(const char *uuid)
+ { return idnode_find(uuid, &dvb_network_class, NULL); }
dvb_network_t *dvb_network_create0
( const char *uuid, const idclass_t *idc, htsmsg_t *conf );
-int dvb_network_get_orbital_pos
- ( mpegts_network_t *mn, int *pos, char *dir );
+int dvb_network_get_orbital_pos(mpegts_network_t *mn);
/*
*
static const void *
dvb_mux_dvbs_class_orbital_get ( void *o )
{
- static char buf[256], *s = buf;
+ static char buf[16], *s = buf;
dvb_mux_t *lm = o;
- snprintf(buf, sizeof(buf), "%0.1f%c",
- lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos / 10.0,
- lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir);
+ dvb_sat_position_to_str(lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos, buf, sizeof(buf));
return &s;
}
static int
dvb_mux_dvbs_class_orbital_set ( void *o, const void *s )
{
- float posf;
- char dir;
- int pos, n, save = 0;
- const char *tmp = s;
dvb_mux_t *lm = o;
+ int pos;
- /* Note that 'E' is not passed to dir from sscanf (scientific float format) */
- if ((n = sscanf(tmp, "%f%c", &posf, &dir)) < 1) return 0;
- if (n != 2) {
- dir = tmp[0] != '\0' ? tmp[strlen(tmp)-1] : 0;
- if (dir != 'E' && dir != 'W')
- dir = 0;
- }
- pos = (int)floorf(posf * 10.0);
+ pos = dvb_sat_position_from_str((const char *)s);
- if (pos != lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos ||
- dir != lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir) {
+ if (pos != lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos) {
lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos = pos;
- lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir = dir;
- save = 1;
+ return 1;
}
- return save;
+ return 0;
}
const idclass_t dvb_mux_dvbs_class =
htsmsg_destroy(c);
}
+ /* Update the satellite position for the network settings */
+ if (ln->mn_satpos == INT_MAX && lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos != INT_MAX)
+ ln->mn_satpos = lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos;
+
return lm;
}
static int
dvb_network_check_orbital_pos ( dvb_mux_t *lm, dvb_mux_conf_t *dmc )
{
- if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir &&
- dmc->u.dmc_fe_qpsk.orbital_dir) {
- if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir !=
- dmc->u.dmc_fe_qpsk.orbital_dir)
- return 1;
+ if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos != INT_MAX &&
+ dmc->u.dmc_fe_qpsk.orbital_pos != INT_MAX) {
/* 1W and 0.8W */
if (abs(lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos -
dmc->u.dmc_fe_qpsk.orbital_pos) > 2)
dvb_mux_t *lm;
LIST_FOREACH(mm2, &ln->mn_muxes, mm_network_link) {
lm = (dvb_mux_t *)mm2;
- if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir)
+ if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos != INT_MAX)
break;
}
/* do not allow to mix sattelite positions */
#endif
/* Always save the orbital position */
if (dmc->dmc_fe_type == DVB_TYPE_S) {
- if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir == 0 ||
+ if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos == INT_MAX ||
dvb_network_check_orbital_pos(lm, dmc))
save |= COMPARE(u.dmc_fe_qpsk.orbital_pos);
- save |= COMPARE(u.dmc_fe_qpsk.orbital_dir);
}
/* Do not change anything else without autodiscovery flag */
if (!ln->mn_autodiscovery)
* Search
* ***************************************************************************/
-dvb_network_t*
-dvb_network_find_by_uuid(const char *uuid)
-{
- return idnode_find(uuid, &dvb_network_class, NULL);
-}
-
-int dvb_network_get_orbital_pos
- ( mpegts_network_t *mn, int *pos, char *dir )
+int dvb_network_get_orbital_pos(mpegts_network_t *mn)
{
dvb_network_t *ln = (dvb_network_t *)mn;
mpegts_mux_t *mm;
dvb_mux_t *lm = NULL;
- if (!mn)
- return -1;
+ if (!ln)
+ return INT_MAX;
+ if (ln->mn_satpos != INT_MAX)
+ return ln->mn_satpos;
LIST_FOREACH(mm, &ln->mn_muxes, mm_network_link) {
lm = (dvb_mux_t *)mm;
- if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir)
+ if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos != INT_MAX)
break;
}
- if (mm) {
- *pos = lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos;
- *dir = lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir;
- return 0;
- } else {
- return -1;
- }
+ if (mm)
+ return lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos;
+ return INT_MAX;
}
/******************************************************************************
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link)
if (idnode_is_instance(&mm->mm_id, &dvb_mux_dvbs_class) &&
mm->mm_tsid == tsid &&
- dvb_sat_position(&((dvb_mux_t *)mm)->lm_tuning) == satpos)
+ ((dvb_mux_t *)mm)->lm_tuning.u.dmc_fe_qpsk.orbital_pos == satpos)
mpegts_mux_scan_state_set(mm, MM_SCAN_STATE_PEND);
return;
}
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link)
if (idnode_is_instance(&mm->mm_id, &dvb_mux_dvbs_class) &&
abs(((dvb_mux_t *)mm)->lm_tuning.dmc_fe_freq - freq) < 2000 &&
- dvb_sat_position(&((dvb_mux_t *)mm)->lm_tuning) == satpos)
+ ((dvb_mux_t *)mm)->lm_tuning.u.dmc_fe_qpsk.orbital_pos == satpos)
mpegts_mux_scan_state_set(mm, MM_SCAN_STATE_PEND);
return;
}
int32_t hash = 0;
static char buf[128];
dvb_mux_t *mmd = (dvb_mux_t*)ms->s_dvb_mux;
- char dir;
int pos;
switch ( mmd->lm_tuning.dmc_fe_type) {
case DVB_TYPE_S:
- if (dvb_network_get_orbital_pos(mmd->mm_network, &pos, &dir) < 0)
+ if ((pos = dvb_network_get_orbital_pos(mmd->mm_network)) == INT_MAX)
return NULL;
- hash = (dir == 'E' ? pos : 0xFFFF - pos) << 16;
+ hash = (pos >= 0 ? pos : 0xFFFF - abs(pos)) << 16;
break;
case DVB_TYPE_C:
hash = 0xFFFF0000;