]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb: remove orbital_dir, use negative orbital_pos value to distinguish East and West
authorJaroslav Kysela <perex@perex.cz>
Thu, 5 Feb 2015 16:33:56 +0000 (17:33 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 5 Feb 2015 16:33:56 +0000 (17:33 +0100)
src/input/mpegts/dvb.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/dvb_support.c
src/input/mpegts/mpegts_dvb.h
src/input/mpegts/mpegts_mux_dvb.c
src/input/mpegts/mpegts_network_dvb.c
src/input/mpegts/mpegts_network_scan.c
src/input/mpegts/mpegts_service.c

index 76e7f19bdba7f4485ee5201a52d1805285890336..034200ac1d92932c7450d0aace51ad4df49a1d15 100644 (file)
@@ -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 );
index 1960eba520de0dd28b725e3abee477b49f9ee5e8..bdff369d153b7479ee4f36672f7e38de58ee1ad8 100644 (file)
@@ -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
index 1673cebb3a32d1bb01f79730e155d701dad1d78f..c543da5287f060691cd685e2ad61bf5ec6a0aa7c 100644 (file)
@@ -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)
 {
index b426040de8de00b2fa4a32981379423492a6aeff..cacb520a2c80baeb0c8351c82fa9c438663ea936 100644 (file)
@@ -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);
 
 /*
  *
index 6dabec4e9e435a827fe4f1931c7150a3921f64cb..f6ddae0ba31087a8c40f3c305340644759d97f48 100644 (file)
@@ -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;
 }
index f7e2641a17ca5448e14788341db7b1135da2856f..d0c1df9c473a3d355d0d6ac75ab8c7fabe8e6ecb 100644 (file)
@@ -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;
 }
 
 /******************************************************************************
index 663d1089ea0f01fc0cdae732b4dfddf7e847127f..e4d86f63e2d79f8a0603da12678de65846ecb76e 100644 (file)
@@ -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;
   }
index 10b8de44c82a06023eecd82f8adffbc183b86d5d..e2b06e39c8aef37bde25ddd5c8e6dc5986d4dba7 100644 (file)
@@ -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;