From e16707bef79f072ea068a39a7bcb508ea76807d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Mon, 19 Nov 2012 15:21:39 +0100 Subject: [PATCH] Display SNR (in dB) in status tab But only for adapters we know that support it --- src/dvb/dvb.h | 4 +++- src/dvb/dvb_adapter.c | 9 +++++++-- src/dvb/dvb_fe.c | 18 +++++++++++++----- src/webui/static/app/status.js | 11 +++++++++++ 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 92fcaf2c..5ae0d876 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -97,9 +97,10 @@ typedef struct th_dvb_mux_instance { struct th_dvb_adapter *tdmi_adapter; - uint16_t tdmi_snr, tdmi_signal; + uint16_t tdmi_signal; uint32_t tdmi_ber, tdmi_unc; float tdmi_unc_avg; + float tdmi_snr; #define TDMI_FEC_ERR_HISTOGRAM_SIZE 10 uint32_t tdmi_fec_err_histogram[TDMI_FEC_ERR_HISTOGRAM_SIZE]; @@ -219,6 +220,7 @@ typedef struct th_dvb_adapter { char *tda_fe_path; int tda_fe_fd; int tda_type; + int tda_snr_valid; struct dvb_frontend_info *tda_fe_info; int tda_adapter_num; diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index 1847304a..8e35dfe7 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -510,9 +510,14 @@ tda_add(int adapter_num) dvb_adapter_checkspeed(tda); + + if(!strcmp(tda->tda_fe_info->name, "Sony CXD2820R (DVB-T/T2)")) + tda->tda_snr_valid = 1; + tvhlog(LOG_INFO, "dvb", - "Found adapter %s (%s) via %s", path, tda->tda_fe_info->name, - hostconnection2str(tda->tda_hostconnection)); + "Found adapter %s (%s) via %s%s", path, tda->tda_fe_info->name, + hostconnection2str(tda->tda_hostconnection), + tda->tda_snr_valid ? ", Reports valid SNR values" : ""); TAILQ_INSERT_TAIL(&dvb_adapters, tda, tda_global_link); diff --git a/src/dvb/dvb_fe.c b/src/dvb/dvb_fe.c index 2731e13a..7120ab5c 100644 --- a/src/dvb/dvb_fe.c +++ b/src/dvb/dvb_fe.c @@ -182,9 +182,14 @@ dvb_fe_monitor(void *aux) } /* signal/noise ratio */ - if(ioctl(tda->tda_fe_fd, FE_READ_SNR, &v) == -1 && v != tdmi->tdmi_snr) { - tdmi->tdmi_snr = v; - notify = 1; + if(tda->tda_snr_valid) { + if(ioctl(tda->tda_fe_fd, FE_READ_SNR, &v) != -1) { + float snr = v / 10.0; + if(tdmi->tdmi_snr != snr) { + tdmi->tdmi_snr = snr; + notify = 1; + } + } } } @@ -218,7 +223,9 @@ dvb_fe_monitor(void *aux) htsmsg_add_str(m, "id", tdmi->tdmi_identifier); htsmsg_add_u32(m, "quality", tdmi->tdmi_quality); htsmsg_add_u32(m, "signal", tdmi->tdmi_signal); - htsmsg_add_u32(m, "snr", tdmi->tdmi_snr); + + if(tda->tda_snr_valid) + htsmsg_add_dbl(m, "snr", tdmi->tdmi_snr); htsmsg_add_u32(m, "ber", tdmi->tdmi_ber); htsmsg_add_u32(m, "unc", tdmi->tdmi_unc); notify_by_msg("dvbMux", m); @@ -226,7 +233,8 @@ dvb_fe_monitor(void *aux) m = htsmsg_create_map(); htsmsg_add_str(m, "identifier", tda->tda_identifier); htsmsg_add_u32(m, "signal", MIN(tdmi->tdmi_signal * 100 / 65535, 100)); - htsmsg_add_u32(m, "snr", tdmi->tdmi_snr); + if(tda->tda_snr_valid) + htsmsg_add_dbl(m, "snr", tdmi->tdmi_snr); htsmsg_add_u32(m, "ber", tdmi->tdmi_ber); htsmsg_add_u32(m, "unc", tdmi->tdmi_unc); htsmsg_add_dbl(m, "uncavg", tdmi->tdmi_unc_avg); diff --git a/src/webui/static/app/status.js b/src/webui/static/app/status.js index bf3c2cbb..3ecf1f17 100644 --- a/src/webui/static/app/status.js +++ b/src/webui/static/app/status.js @@ -168,6 +168,17 @@ tvheadend.status_adapters = function() { width : 50, header : "Uncorrected bit error rate", dataIndex : 'uncavg' + },{ + width : 50, + header : "SNR", + dataIndex : 'snr', + renderer: function(value) { + if(value > 0) { + return value.toFixed(1) + " dB"; + } else { + return 'Unknown'; + } + } }, signal]); var panel = new Ext.grid.GridPanel({