dvb-fe: Add a method to report PER
authorMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 19 Jan 2013 14:15:00 +0000 (12:15 -0200)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 23 Jan 2013 21:18:08 +0000 (19:18 -0200)
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
lib/include/dvb-fe.h
lib/include/dvb-v5-std.h
lib/libdvbv5/dvb-fe.c
lib/libdvbv5/dvb-v5-std.c

index daf2dc3..52898d1 100644 (file)
@@ -152,6 +152,8 @@ int dvb_fe_get_stats(struct dvb_v5_fe_parms *parms);
 
 float dvb_fe_retrieve_ber(struct dvb_v5_fe_parms *parms, unsigned layer,
                           enum fecap_scale_params *scale);
+float dvb_fe_retrieve_per(struct dvb_v5_fe_parms *parms, unsigned layer,
+                         enum fecap_scale_params *scale);
 
 /* Get both status statistics and dvb parameters */
 
index 351ed88..037453c 100644 (file)
@@ -60,10 +60,11 @@ extern const void *dvb_v5_attr_names[];
 
 #define DTV_STATUS              (DTV_MAX_USER_COMMAND + 1)
 #define DTV_BER                 (DTV_MAX_USER_COMMAND + 2)
+#define DTV_PER                 (DTV_MAX_USER_COMMAND + 3)
 
-#define DTV_MAX_STAT_COMMAND    DTV_BER
+#define DTV_MAX_STAT_COMMAND    DTV_PER
 
-#define DTV_NUM_STATS_PROPS 8              /* 6 from DVBv5.10 API plus Status and BER */
+#define DTV_NUM_STATS_PROPS 9              /* 6 from DVBv5.10 API plus Status, BER and PER */
 
 enum dvb_sat_polarization {
        POLARIZATION_OFF        = 0,
@@ -74,7 +75,7 @@ enum dvb_sat_polarization {
 };
 
 extern const char *dvb_sat_pol_name[6];
-extern const char *dvb_user_name[13];
+extern const char *dvb_user_name[14];
 extern const void *dvb_user_attr_names[];
 
 #endif
index 38a68ee..a14e83c 100644 (file)
@@ -801,6 +801,28 @@ float dvb_fe_retrieve_ber(struct dvb_v5_fe_parms *parms, unsigned layer,
        return ber32;
 }
 
+float dvb_fe_retrieve_per(struct dvb_v5_fe_parms *parms, unsigned layer,
+                         enum fecap_scale_params *scale)
+{
+       uint64_t n, d;
+
+       if (!parms->stats.has_per[layer]) {
+               *scale = FE_SCALE_NOT_AVAILABLE;
+               return -1;
+       }
+
+       d = parms->stats.cur[layer].block_count - parms->stats.prev[layer].block_count;
+       if (!d) {
+               *scale = FE_SCALE_NOT_AVAILABLE;
+               return -1;
+       }
+       *scale = FE_SCALE_COUNTER;
+
+       n = parms->stats.cur[layer].block_error - parms->stats.prev[layer].block_error;
+
+       return ((float)n)/d;
+}
+
 static void dvb_fe_update_counters(struct dvb_v5_fe_parms *parms)
 {
        struct dtv_stats *error, *count;
index c7101eb..cde7691 100644 (file)
@@ -221,7 +221,7 @@ const char *dvb_sat_pol_name[6] = {
        [5] = NULL,
 };
 
-const char *dvb_user_name[13] = {
+const char *dvb_user_name[14] = {
        [DTV_POLARIZATION - DTV_USER_COMMAND_START] =   "POLARIZATION",
        [DTV_VIDEO_PID - DTV_USER_COMMAND_START] =      "VIDEO PID",
        [DTV_AUDIO_PID - DTV_USER_COMMAND_START] =      "AUDIO PID",
@@ -234,7 +234,8 @@ const char *dvb_user_name[13] = {
        [DTV_FREQ_BPF - DTV_USER_COMMAND_START] =       "FREQ BPF",
        [DTV_STATUS - DTV_USER_COMMAND_START] =         "STATUS",
        [DTV_BER - DTV_USER_COMMAND_START] =            "BER",
-       [12] = NULL,
+       [DTV_PER - DTV_USER_COMMAND_START] =            "PER",
+       [13] = NULL,
 };
 
 const void *dvb_user_attr_names[] = {