From 2c0ef0f264f2978eea75a0905f44a209f44a5575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Tue, 8 Sep 2009 19:42:40 +0000 Subject: [PATCH] * Add support for DiSEqC 1.1 / 2.1, configured on per-adapter basis. Ticket #99 --- debian/changelog | 3 ++ src/dvb/diseqc.c | 41 ++++++++++++++++++++------ src/dvb/diseqc.h | 3 +- src/dvb/dvb.h | 4 ++- src/dvb/dvb_adapter.c | 25 ++++++++++++++++ src/dvb/dvb_fe.c | 2 +- src/webui/extjs.c | 11 +++++++ src/webui/static/app/dvb.js | 57 ++++++++++++++++++++++++------------- 8 files changed, 115 insertions(+), 31 deletions(-) diff --git a/debian/changelog b/debian/changelog index 6660ba1c..fd7bfb42 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,6 +17,9 @@ hts-tvheadend (2.6) hts; urgency=low * Default character encoding in DVB is ISO6937, not Latin-1. Ticket #96 + * Add support for DiSEqC 1.1 / 2.1, configured on per-adapter basis. + Ticket #99 + hts-tvheadend (2.5) hts; urgency=low * If a previosly detected DVB adapter was not present during startup, diff --git a/src/dvb/diseqc.c b/src/dvb/diseqc.c index 769ca176..c3344d0e 100644 --- a/src/dvb/diseqc.c +++ b/src/dvb/diseqc.c @@ -6,7 +6,7 @@ #include "diseqc.h" -struct diseqc_cmd switch_cmds[] = { +struct diseqc_cmd switch_commited_cmds[] = { { { { 0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf2, 0x00, 0x00 }, 4 }, 0 }, { { { 0xe0, 0x10, 0x38, 0xf1, 0x00, 0x00 }, 4 }, 0 }, @@ -25,6 +25,25 @@ struct diseqc_cmd switch_cmds[] = { { { { 0xe0, 0x10, 0x38, 0xff, 0x00, 0x00 }, 4 }, 0 } }; +struct diseqc_cmd switch_uncommited_cmds[] = { + { { { 0xe0, 0x10, 0x39, 0xf0, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xf1, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xf2, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xf3, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xf4, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xf5, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xf6, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xf7, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xf8, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xf9, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xfa, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xfb, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xfc, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xfd, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xfe, 0x00, 0x00 }, 4 }, 0 }, + { { { 0xe0, 0x10, 0x39, 0xff, 0x00, 0x00 }, 4 }, 0 } +}; + /*--------------------------------------------------------------------------*/ @@ -68,16 +87,22 @@ int diseqc_send_msg (int fd, fe_sec_voltage_t v, struct diseqc_cmd **cmd, } -int diseqc_setup(int frontend_fd, int switch_pos, int voltage_18, int hiband) +int +diseqc_setup(int frontend_fd, int switch_pos, int voltage_18, int hiband, + int diseqc_ver) { struct diseqc_cmd *cmd[2] = { NULL, NULL }; int i = 4 * switch_pos + 2 * hiband + (voltage_18 ? 1 : 0); - - - if(i < 0 || i >= (int) (sizeof(switch_cmds)/sizeof(struct diseqc_cmd))) - return -1; - - cmd[0] = &switch_cmds[i]; + + if (diseqc_ver == 1) { + if(switch_pos < 0 || switch_pos >= (int) (sizeof(switch_uncommited_cmds)/sizeof(struct diseqc_cmd))) + return -1; + cmd[0] = &switch_uncommited_cmds[switch_pos]; + } else { + if(i < 0 || i >= (int) (sizeof(switch_commited_cmds)/sizeof(struct diseqc_cmd))) + return -1; + cmd[0] = &switch_commited_cmds[i]; + } return diseqc_send_msg (frontend_fd, i % 2 ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13, diff --git a/src/dvb/diseqc.h b/src/dvb/diseqc.h index 2038962a..a1ad4509 100644 --- a/src/dvb/diseqc.h +++ b/src/dvb/diseqc.h @@ -18,7 +18,8 @@ extern int diseqc_send_msg(int fd, fe_sec_voltage_t v, struct diseqc_cmd **cmd, /** * set up the switch to position/voltage/tone */ -int diseqc_setup(int frontend_fd, int switch_pos, int voltage_18, int hiband); +int diseqc_setup(int frontend_fd, int switch_pos, int voltage_18, int hiband, + int diseqc_ver); #endif diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 3fd68118..77858593 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -165,7 +165,7 @@ typedef struct th_dvb_adapter { uint32_t tda_autodiscovery; uint32_t tda_idlescan; uint32_t tda_logging; - + uint32_t tda_diseqc_version; char *tda_displayname; int tda_fe_fd; @@ -215,6 +215,8 @@ void dvb_adapter_set_idlescan(th_dvb_adapter_t *tda, int on); void dvb_adapter_set_logging(th_dvb_adapter_t *tda, int on); +void dvb_adapter_set_diseqc_version(th_dvb_adapter_t *tda, unsigned int v); + void dvb_adapter_clone(th_dvb_adapter_t *dst, th_dvb_adapter_t *src); void dvb_adapter_clean(th_dvb_adapter_t *tda); diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index 0482e827..0511c3d5 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -79,6 +79,7 @@ tda_save(th_dvb_adapter_t *tda) htsmsg_add_u32(m, "autodiscovery", tda->tda_autodiscovery); htsmsg_add_u32(m, "idlescan", tda->tda_idlescan); htsmsg_add_u32(m, "logging", tda->tda_logging); + htsmsg_add_u32(m, "diseqc_version", tda->tda_diseqc_version); hts_settings_save(m, "dvbadapters/%s", tda->tda_identifier); htsmsg_destroy(m); } @@ -164,6 +165,29 @@ dvb_adapter_set_logging(th_dvb_adapter_t *tda, int on) } +/** + * + */ +void +dvb_adapter_set_diseqc_version(th_dvb_adapter_t *tda, unsigned int v) +{ + if(v > 1) + v = 1; + + if(tda->tda_diseqc_version == v) + return; + + lock_assert(&global_lock); + + tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" DiSEqC version set to: %s", + tda->tda_displayname, v ? "1.1 / 2.1" : "1.0 / 2.0" ); + + tda->tda_diseqc_version = v; + tda_save(tda); +} + + + /** * */ @@ -294,6 +318,7 @@ dvb_adapter_init(void) htsmsg_get_u32(c, "autodiscovery", &tda->tda_autodiscovery); htsmsg_get_u32(c, "idlescan", &tda->tda_idlescan); htsmsg_get_u32(c, "logging", &tda->tda_logging); + htsmsg_get_u32(c, "diseqc_version", &tda->tda_diseqc_version); } htsmsg_destroy(l); } diff --git a/src/dvb/dvb_fe.c b/src/dvb/dvb_fe.c index 13464409..9c3d6f81 100644 --- a/src/dvb/dvb_fe.c +++ b/src/dvb/dvb_fe.c @@ -340,7 +340,7 @@ dvb_fe_tune(th_dvb_mux_instance_t *tdmi, const char *reason) port, pol == POLARISATION_HORIZONTAL || pol == POLARISATION_CIRCULAR_LEFT, - hiband); + hiband, tda->tda_diseqc_version); usleep(50000); diff --git a/src/webui/extjs.c b/src/webui/extjs.c index fc426a23..71058c42 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -990,6 +990,10 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque) htsmsg_add_u32(r, "automux", tda->tda_autodiscovery); htsmsg_add_u32(r, "idlescan", tda->tda_idlescan); htsmsg_add_u32(r, "logging", tda->tda_logging); + htsmsg_add_str(r, "diseqcversion", + ((const char *[]){"DiSEqC 1.0 / 2.0", + "DiSEqC 1.1 / 2.1"}) + [tda->tda_diseqc_version % 2]); out = json_single_record(r, "dvbadapters"); } else if(!strcmp(op, "save")) { @@ -1006,6 +1010,13 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque) s = http_arg_get(&hc->hc_req_args, "logging"); dvb_adapter_set_logging(tda, !!s); + if((s = http_arg_get(&hc->hc_req_args, "diseqcversion")) != NULL) { + if(!strcmp(s, "DiSEqC 1.0 / 2.0")) + dvb_adapter_set_diseqc_version(tda, 0); + else if(!strcmp(s, "DiSEqC 1.1 / 2.1")) + dvb_adapter_set_diseqc_version(tda, 1); + } + out = htsmsg_create_map(); htsmsg_add_u32(out, "success", 1); } else if(!strcmp(op, "addnetwork")) { diff --git a/src/webui/static/app/dvb.js b/src/webui/static/app/dvb.js index fd4300a6..e952e286 100644 --- a/src/webui/static/app/dvb.js +++ b/src/webui/static/app/dvb.js @@ -998,7 +998,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { var confreader = new Ext.data.JsonReader({ root: 'dvbadapters' - }, ['name', 'automux', 'idlescan', 'logging']); + }, ['name', 'automux', 'idlescan', 'logging', 'diseqcversion']); function saveConfForm () { @@ -1008,6 +1008,39 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { waitMsg:'Saving Data...' }); } + + var items = [ + { + fieldLabel: 'Adapter name', + name: 'name', + width: 250 + }, + new Ext.form.Checkbox({ + fieldLabel: 'Autodetect muxes', + name: 'automux' + }), + new Ext.form.Checkbox({ + fieldLabel: 'Idle scanning', + name: 'idlescan' + }), + new Ext.form.Checkbox({ + fieldLabel: 'Detailed logging', + name: 'logging' + }) + ]; + + if(satConfStore) { + v = new Ext.form.ComboBox({ + name: 'diseqcversion', + fieldLabel: 'DiSEqC version', + editable: false, + allowBlank: false, + mode: 'remote', + triggerAction: 'all', + store: ['DiSEqC 1.0 / 2.0', 'DiSEqC 1.1 / 2.1'] + }); + items.push(v); + } var confform = new Ext.FormPanel({ title:'Adapter configuration', @@ -1022,25 +1055,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { waitMsgTarget: true, reader: confreader, defaultType: 'textfield', - items: [ - { - fieldLabel: 'Adapter name', - name: 'name', - width: 250 - }, - new Ext.form.Checkbox({ - fieldLabel: 'Autodetect muxes', - name: 'automux' - }), - new Ext.form.Checkbox({ - fieldLabel: 'Idle scanning', - name: 'idlescan' - }), - new Ext.form.Checkbox({ - fieldLabel: 'Detailed logging', - name: 'logging' - }) - ], + items: items, buttons: [{ text: 'Save', handler: saveConfForm @@ -1051,6 +1066,8 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { url:'dvb/adapter/' + adapterId, params:{'op':'load'}, success:function(form, action) { + console.log(form); + console.log(action); confform.enable(); } });