dvb-fe: Allow returning BER in a float value
authorMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 19 Jan 2013 11:28:36 +0000 (09:28 -0200)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 23 Jan 2013 21:18:08 +0000 (19:18 -0200)
BER is a fractional measure; allow returning it as such, in order
to let userspace to better display it.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
lib/include/dvb-fe.h
lib/libdvbv5/dvb-fe.c

index 026a258..daf2dc3 100644 (file)
@@ -150,6 +150,9 @@ int dvb_fe_retrieve_stats(struct dvb_v5_fe_parms *parms,
                          unsigned cmd, uint32_t *value);
 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);
+
 /* Get both status statistics and dvb parameters */
 
 int dvb_fe_get_event(struct dvb_v5_fe_parms *parms);
index fed586d..38a68ee 100644 (file)
@@ -775,6 +775,32 @@ int dvb_fe_retrieve_stats(struct dvb_v5_fe_parms *parms,
        return 0;
 }
 
+float dvb_fe_retrieve_ber(struct dvb_v5_fe_parms *parms, unsigned layer,
+                         enum fecap_scale_params *scale)
+{
+       float ber;
+       uint32_t ber32;
+
+       if (parms->has_v5_stats) {
+               ber = calculate_BER(parms, layer);
+               if (ber >= 0)
+                       *scale = FE_SCALE_COUNTER;
+               return ber;
+       }
+
+       if (layer) {
+               *scale = FE_SCALE_NOT_AVAILABLE;
+               return -1;
+       }
+
+       if (dvb_fe_retrieve_stats(parms, DTV_BER, &ber32))
+               *scale = FE_SCALE_NOT_AVAILABLE;
+       else
+               *scale = FE_SCALE_RELATIVE;
+
+       return ber32;
+}
+
 static void dvb_fe_update_counters(struct dvb_v5_fe_parms *parms)
 {
        struct dtv_stats *error, *count;