diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 01deb9b4..92f555ff 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -231,6 +231,7 @@ htsmsg_t *dvb_fe_opts(th_dvb_adapter_t *tda, const char *which); const char* dvb_mux_fec2str(int fec); const char* dvb_mux_delsys2str(int delsys); const char* dvb_mux_qam2str(int qam); +const char* dvb_mux_rolloff2str(int rolloff); void dvb_mux_save(th_dvb_mux_instance_t *tdmi); diff --git a/src/dvb/dvb_multiplex.c b/src/dvb/dvb_multiplex.c index 3b91c031..61aa64f5 100644 --- a/src/dvb/dvb_multiplex.c +++ b/src/dvb/dvb_multiplex.c @@ -169,8 +169,31 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc, if(tdmi != NULL) { /* Update stuff ... */ int save = 0; + char buf2[1024]; if(tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) { + if (tdmi->tdmi_fe_status == TDMI_FE_OK) { + dvb_mux_nicename(buf, sizeof(buf), tdmi); + tvhlog(LOG_DEBUG, "dvb", "Configuration for mux \"%s\" not updated because signal is OK", buf); + + return NULL; + } + + sprintf(buf2, "("); + if (tdmi->tdmi_conf.dmc_fe_modulation != dmc->dmc_fe_modulation) + sprintf(buf2, "%s %s->%s, ", buf2, + dvb_mux_qam2str(tdmi->tdmi_conf.dmc_fe_modulation), + dvb_mux_qam2str(dmc->dmc_fe_modulation)); + if (tdmi->tdmi_conf.dmc_fe_delsys != dmc->dmc_fe_delsys) + sprintf(buf2, "%s %s->%s, ", buf2, + dvb_mux_delsys2str(tdmi->tdmi_conf.dmc_fe_delsys), + dvb_mux_delsys2str(dmc->dmc_fe_delsys)); + if (tdmi->tdmi_conf.dmc_fe_rolloff != dmc->dmc_fe_rolloff) + sprintf(buf2, "%s %s->%s, ", buf2, + dvb_mux_rolloff2str(tdmi->tdmi_conf.dmc_fe_rolloff), + dvb_mux_rolloff2str(dmc->dmc_fe_rolloff)); + sprintf(buf2, "%s )", buf2); + memcpy(&tdmi->tdmi_conf, dmc, sizeof(struct dvb_mux_conf)); save = 1; } @@ -184,7 +207,7 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc, dvb_mux_save(tdmi); dvb_mux_nicename(buf, sizeof(buf), tdmi); tvhlog(LOG_DEBUG, "dvb", - "Configuration for mux \"%s\" updated by %s", buf, source); + "Configuration for mux \"%s\" updated by %s %s", buf, source, buf2); dvb_mux_notify(tdmi); } @@ -452,6 +475,13 @@ const char* dvb_mux_qam2str(int qam) { return val2str(qam, qamtab); } +/** + * for external use + */ +const char* dvb_mux_rolloff2str(int rolloff) { + return val2str(rolloff, rollofftab); +} + /** * */ @@ -788,6 +818,38 @@ dvb_mux_set_enable(th_dvb_mux_instance_t *tdmi, int enabled) } +/** + * + */ +static void +dvb_mux_fe_status(char *buf, size_t size, th_dvb_mux_instance_t *tdmi) +{ + switch (tdmi->tdmi_fe_status) { + case TDMI_FE_UNKNOWN: + default: + snprintf(buf, size, "Unknown"); + break; + case TDMI_FE_NO_SIGNAL: + snprintf(buf, size, "No Signal"); + break; + case TDMI_FE_FAINT_SIGNAL: + snprintf(buf, size, "Faint Signal"); + break; + case TDMI_FE_BAD_SIGNAL: + snprintf(buf, size, "Bad Signal"); + break; + case TDMI_FE_CONSTANT_FEC: + snprintf(buf, size, "Constant FEC"); + break; + case TDMI_FE_BURSTY_FEC: + snprintf(buf, size, "Bursty FEC"); + break; + case TDMI_FE_OK: + snprintf(buf, size, "Ok"); + break; + } +} + /** * */ @@ -849,6 +911,9 @@ dvb_mux_build_msg(th_dvb_mux_instance_t *tdmi) dvb_mux_modulation(buf, sizeof(buf), tdmi); htsmsg_add_str(m, "mod", buf); + dvb_mux_fe_status(buf, sizeof(buf), tdmi); + htsmsg_add_str(m, "fe_status", buf); + htsmsg_add_str(m, "pol", dvb_polarisation_to_str_long(tdmi->tdmi_conf.dmc_polarisation)); diff --git a/src/webui/static/app/dvb.js b/src/webui/static/app/dvb.js index a80ec8b5..8a5ee629 100644 --- a/src/webui/static/app/dvb.js +++ b/src/webui/static/app/dvb.js @@ -74,7 +74,11 @@ tvheadend.dvb_muxes = function(adapterData, satConfStore) { 'Unset' : r.data.name; } - }); + }, { + header: "Frontend status", + dataIndex: 'fe_status', + width: 30 + }); } cmlist.push( @@ -91,7 +95,7 @@ tvheadend.dvb_muxes = function(adapterData, satConfStore) { var rec = Ext.data.Record.create([ 'id', 'enabled','network', 'freq', 'pol', 'satconf', - 'muxid', 'quality', 'mod' + 'muxid', 'quality', 'fe_status', 'mod' ]); var store = new Ext.data.JsonStore({