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 */
#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,
};
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
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;
[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",
[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[] = {