From 36283c6598804d8d492418dbd58dd65d01ac34fc Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 5 Feb 2015 17:33:56 +0100 Subject: [PATCH] dvb: remove orbital_dir, use negative orbital_pos value to distinguish East and West --- src/input/mpegts/dvb.h | 3 -- src/input/mpegts/dvb_psi.c | 11 ++++---- src/input/mpegts/dvb_support.c | 26 ++++++----------- src/input/mpegts/mpegts_dvb.h | 7 +++-- src/input/mpegts/mpegts_mux_dvb.c | 32 ++++++++------------- src/input/mpegts/mpegts_network_dvb.c | 39 +++++++++----------------- src/input/mpegts/mpegts_network_scan.c | 4 +-- src/input/mpegts/mpegts_service.c | 5 ++-- 8 files changed, 47 insertions(+), 80 deletions(-) diff --git a/src/input/mpegts/dvb.h b/src/input/mpegts/dvb.h index 76e7f19b..034200ac 100644 --- a/src/input/mpegts/dvb.h +++ b/src/input/mpegts/dvb.h @@ -431,7 +431,6 @@ typedef enum dvb_polarisation { 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; @@ -517,8 +516,6 @@ void dvb_mux_conf_init ( dvb_mux_conf_t *dmc, dvb_fe_delivery_system_t delsys ); 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 ); diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 1960eba5..bdff369d 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -181,7 +181,8 @@ dvb_desc_sat_del 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; @@ -555,7 +556,7 @@ dvb_freesat_add_service 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); @@ -1230,9 +1231,9 @@ dvb_bat_completed 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)) { @@ -2553,7 +2554,7 @@ psi_tables_dvb ( mpegts_mux_t *mm ) 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 diff --git a/src/input/mpegts/dvb_support.c b/src/input/mpegts/dvb_support.c index 1673cebb..c543da52 100644 --- a/src/input/mpegts/dvb_support.c +++ b/src/input/mpegts/dvb_support.c @@ -816,14 +816,18 @@ static int 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, @@ -867,18 +871,6 @@ dvb_mux_conf_str ( dvb_mux_conf_t *dmc, char *buf, size_t bufsize ) } } -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) { diff --git a/src/input/mpegts/mpegts_dvb.h b/src/input/mpegts/mpegts_dvb.h index b426040d..cacb520a 100644 --- a/src/input/mpegts/mpegts_dvb.h +++ b/src/input/mpegts/mpegts_dvb.h @@ -34,6 +34,7 @@ typedef struct dvb_network 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; @@ -41,13 +42,13 @@ extern const idclass_t dvb_network_atsc_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); /* * diff --git a/src/input/mpegts/mpegts_mux_dvb.c b/src/input/mpegts/mpegts_mux_dvb.c index 6dabec4e..f6ddae0b 100644 --- a/src/input/mpegts/mpegts_mux_dvb.c +++ b/src/input/mpegts/mpegts_mux_dvb.c @@ -450,39 +450,25 @@ dvb_mux_dvbs_class_delsys_enum (void *o) 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 = @@ -745,5 +731,9 @@ dvb_mux_create0 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; } diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index f7e2641a..d0c1df9c 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -320,11 +320,8 @@ dvb_network_check_symbol_rate( dvb_mux_t *lm, dvb_mux_conf_t *dmc, int deltar ) 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) @@ -445,7 +442,7 @@ dvb_network_create_mux 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 */ @@ -500,10 +497,9 @@ dvb_network_create_mux #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) @@ -709,33 +705,24 @@ void dvb_network_done ( void ) * 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; } /****************************************************************************** diff --git a/src/input/mpegts/mpegts_network_scan.c b/src/input/mpegts/mpegts_network_scan.c index 663d1089..e4d86f63 100644 --- a/src/input/mpegts/mpegts_network_scan.c +++ b/src/input/mpegts/mpegts_network_scan.c @@ -289,7 +289,7 @@ mpegts_mux_bouquet_rescan ( const char *src, const char *extra ) 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; } @@ -337,7 +337,7 @@ freq: 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; } diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index 10b8de44..e2b06e39 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -445,14 +445,13 @@ mpegts_service_channel_icon ( service_t *s ) 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;