/* **************************************************************************
* Static definition
* *************************************************************************/
-#define LINUXDVB_EN50494_NAME "en50494"
#define LINUXDVB_EN50494_NOPIN 256
* Class definition
* *************************************************************************/
-//typedef struct linuxdvb_en50494
-//{
-// linuxdvb_diseqc_t;
-//
-// /* en50494 configuration*/
-// uint8_t le_position; /* satelitte A(0) or B(1) */
-// uint16_t le_frequency; /* user band frequency in MHz */
-// uint8_t le_id; /* user band id 0-7 */
-// uint16_t le_pin; /* 0-255 or LINUXDVB_EN50494_NOPIN */
-//
-// /* runtime */
-// uint32_t le_tune_freq; /* the real frequency to tune to */
-//} linuxdvb_en50494_t;
/* prevention of self raised DiSEqC collisions */
static pthread_mutex_t linuxdvb_en50494_lock;
static const char *
linuxdvb_en50494_class_get_title ( idnode_t *o )
{
- static char buf[256];
- linuxdvb_diseqc_t *ld = (linuxdvb_diseqc_t*)o;
- snprintf(buf, sizeof(buf), "%s: %s", LINUXDVB_EN50494_NAME, ld->ld_type);
- return buf;
+ static const char *title = "Unicable";
+ return title;
+}
+
+htsmsg_t *
+linuxdvb_en50494_id_list ( void *o )
+{
+ uint32_t i;
+ htsmsg_t *m = htsmsg_create_list();
+ for (i = 0; i < 8; i++) {
+ htsmsg_add_u32(m, NULL, i);
+ }
+ return m;
+}
+
+htsmsg_t *
+linuxdvb_en50494_pin_list ( void *o )
+{
+ int32_t i;
+
+ htsmsg_t *m = htsmsg_create_list();
+ htsmsg_t *e;
+
+ e = htsmsg_create_map();
+ htsmsg_add_u32(e, "key", 256);
+ htsmsg_add_str(e, "val", "No pin");
+ htsmsg_add_msg(m, NULL, e);
+
+ for (i = 0; i < 256; i++) {
+ e = htsmsg_create_map();
+ htsmsg_add_u32(e, "key", i);
+ htsmsg_add_u32(e, "val", i);
+ htsmsg_add_msg(m, NULL, e);
+ }
+ return m;
}
extern const idclass_t linuxdvb_diseqc_class;
{
.ic_super = &linuxdvb_diseqc_class,
.ic_class = "linuxdvb_en50494",
- .ic_caption = LINUXDVB_EN50494_NAME,
+ .ic_caption = "en50494",
.ic_get_title = linuxdvb_en50494_class_get_title,
.ic_properties = (const property_t[]) {
{
.id = "id",
.name = "ID",
.off = offsetof(linuxdvb_en50494_t, le_id),
+ .list = linuxdvb_en50494_id_list,
},
{
.type = PT_U16,
.id = "pin",
.name = "Pin",
.off = offsetof(linuxdvb_en50494_t, le_pin),
+ .list = linuxdvb_en50494_pin_list,
},
{}
}
};
-
/* **************************************************************************
* Class methods
* *************************************************************************/
linuxdvb_lnb_t *lnb = sc->ls_lnb;
/* band & polarisation */
- uint8_t pol = lnb->lnb_pol(lnb, lm);
- uint8_t band = lnb->lnb_band(lnb, lm);
+ uint8_t pol = lnb->lnb_pol(lnb, lm);
+ uint8_t band = lnb->lnb_band(lnb, lm);
uint32_t freq = lnb->lnb_freq(lnb, lm);
/* transponder value - t*/
uint16_t t = round((( (freq / 1000) + 2 + le->le_frequency) / 4) - 350);
if ( t > 1024) {
- tvherror(LINUXDVB_EN50494_NAME, "transponder value bigger then 1024");
+ tvherror("en50494", "transponder value bigger then 1024");
return -1;
}
data1 |= band << 2; /* 1bit band lower(0)/upper(1) */
data1 |= t >> 8; /* 2bit transponder value bit 1-2 */
data2 = t & 0xFF; /* 8bit transponder value bit 3-10 */
- tvhdebug(LINUXDVB_EN50494_NAME,
- "lnb=%i, id=%i, freq=%i, pin=%i, v/h=%i, l/u=%i, f=%i, data=0x%02X%02X",
- le->le_position, le->le_id, le->le_frequency, le->le_pin, pol, band, freq, data1, data2);
+ tvhdebug("en50494",
+ "lnb=%i id=%i freq=%i pin=%i v/h=%i l/u=%i f=%i, data=0x%02X%02X",
+ le->le_position, le->le_id, le->le_frequency, le->le_pin, pol,
+ band, freq, data1, data2);
pthread_mutex_lock(&linuxdvb_en50494_lock);
for (i = 0; i <= sc->ls_parent->ls_diseqc_repeats; i++) {
/* use 18V */
ret = linuxdvb_diseqc_set_volt(fd, SEC_VOLTAGE_18);
if (ret) {
- tvherror(LINUXDVB_EN50494_NAME, "error setting lnb voltage to 18V");
+ tvherror("en50494", "error setting lnb voltage to 18V");
break;
}
usleep(15000); /* standard: 4ms < x < 22ms */
data1, data2);
}
if (ret != 0) {
- tvherror(LINUXDVB_EN50494_NAME, "error send tune command");
+ tvherror("en50494", "error send tune command");
break;
}
usleep(50000); /* standard: 2ms < x < 60ms */
/* return to 13V */
ret = linuxdvb_diseqc_set_volt(fd, SEC_VOLTAGE_13);
if (ret) {
- tvherror(LINUXDVB_EN50494_NAME, "error setting lnb voltage back to 13V");
+ tvherror("en50494", "error setting lnb voltage back to 13V");
break;
}
}
linuxdvb_en50494_init (void)
{
if (pthread_mutex_init(&linuxdvb_en50494_lock, NULL) != 0) {
- tvherror(LINUXDVB_EN50494_NAME, "failed to init lock mutex");
+ tvherror("en50494", "failed to init lock mutex");
}
}
{
htsmsg_t *m = htsmsg_create_list();
htsmsg_add_str(m, NULL, "None");
- htsmsg_add_str(m, NULL, "EN50494/UniCable");
+ htsmsg_add_str(m, NULL, "Generic");
return m;
}
linuxdvb_en50494_t *le;
if (port > 1) {
- tvherror(LINUXDVB_EN50494_NAME, "only 2 ports/positions are posible. given %i", port);
+ tvherror("en50494", "only 2 ports/positions are posible. given %i", port);
port = 0;
}
- ld = linuxdvb_diseqc_create0(
- calloc(1, sizeof(linuxdvb_en50494_t)),
- NULL,
- &linuxdvb_en50494_class,
- conf,
- LINUXDVB_EN50494_NAME,
- ls);
+ ld = linuxdvb_diseqc_create0(calloc(1, sizeof(linuxdvb_en50494_t)),
+ NULL, &linuxdvb_en50494_class, conf,
+ "en50494", ls);
le = (linuxdvb_en50494_t*)ld;
if (ld) {
ld->ld_tune = linuxdvb_en50494_tune;
return 1;
}
-static htsmsg_t *
-linuxdvb_satconf_class_en50494_id_list ( void *o )
-{
- uint32_t i;
-
- htsmsg_t *m = htsmsg_create_list();
- for (i = 0; i < 8; i++) {
- htsmsg_add_u32(m, NULL, i);
- }
- return m;
-}
-
-static const void *
-linuxdvb_satconf_class_en50494_id_get ( void *p )
-{
- linuxdvb_satconf_t *ls = p;
- linuxdvb_satconf_ele_t *lse = TAILQ_FIRST(&ls->ls_elements);
- linuxdvb_en50494_t *le;
- static uint16_t default_value = 0;
-
- if (!lse && !lse->ls_en50494)
- return &default_value;
-
- le = (linuxdvb_en50494_t*)lse->ls_en50494;
- return &le->le_id;
-}
-
-static int
-linuxdvb_satconf_class_en50494_id_set
- ( void *p, const void *v )
-{
- linuxdvb_satconf_t *ls = p;
- linuxdvb_satconf_ele_t *lse;
- linuxdvb_en50494_t *le;
- uint16_t new_value = *(uint16_t*)v;
-
- if (new_value < 0 || new_value > 7)
- return 1;
-
- TAILQ_FOREACH(lse, &ls->ls_elements, ls_link) {
- if (!lse && !lse->ls_en50494)
- continue;
-
- le = (linuxdvb_en50494_t*)lse->ls_en50494;
- le->le_id = new_value;
- }
- return 0;
-
-}
-
-static const void *
-linuxdvb_satconf_class_en50494_freq_get ( void *p )
-{
- linuxdvb_satconf_t *ls = p;
- linuxdvb_satconf_ele_t *lse = TAILQ_FIRST(&ls->ls_elements);
- linuxdvb_en50494_t *le;
- static uint16_t default_value = 0;
-
- if (!lse && !lse->ls_en50494)
- return &default_value;
-
- le = (linuxdvb_en50494_t*)lse->ls_en50494;
- return &le->le_frequency;
-}
-
-static int
-linuxdvb_satconf_class_en50494_freq_set
- ( void *p, const void *v )
-{
- linuxdvb_satconf_t *ls = p;
- linuxdvb_satconf_ele_t *lse;
- linuxdvb_en50494_t *le;
- uint16_t new_value = *(uint16_t*)v;
-
- TAILQ_FOREACH(lse, &ls->ls_elements, ls_link) {
- if (!lse && !lse->ls_en50494)
- continue;
-
- le = (linuxdvb_en50494_t*)lse->ls_en50494;
- le->le_frequency = new_value;
- }
- return 0;
-}
-
-static htsmsg_t *
-linuxdvb_satconf_class_en50494_pin_list ( void *o )
-{
- int32_t i;
-
- htsmsg_t *m = htsmsg_create_list();
- htsmsg_t *e;
-
- e = htsmsg_create_map();
- htsmsg_add_u32(e, "key", 256);
- htsmsg_add_str(e, "val", "no Pin");
- htsmsg_add_msg(m, NULL, e);
-
- for (i = 0; i < 256; i++) {
- e = htsmsg_create_map();
- htsmsg_add_u32(e, "key", i);
- htsmsg_add_u32(e, "val", i);
- htsmsg_add_msg(m, NULL, e);
- }
- return m;
-}
-
-
-static const void *
-linuxdvb_satconf_class_en50494_pin_get ( void *p )
-{
- linuxdvb_satconf_t *ls = p;
- linuxdvb_satconf_ele_t *lse = TAILQ_FIRST(&ls->ls_elements);
- linuxdvb_en50494_t *le;
- static uint16_t default_value = 256;
-
- if (!lse && !lse->ls_en50494)
- return &default_value;
-
- le = (linuxdvb_en50494_t*)lse->ls_en50494;
- return &le->le_pin;
-}
-
-static int
-linuxdvb_satconf_class_en50494_pin_set
- ( void *p, const void *v )
-{
- linuxdvb_satconf_t *ls = p;
- linuxdvb_satconf_ele_t *lse;
- linuxdvb_en50494_t *le;
- uint16_t new_value = *(uint16_t*)v;
-
- if (new_value < 0 || new_value > 256)
- return 1;
-
- TAILQ_FOREACH(lse, &ls->ls_elements, ls_link) {
- if (!lse && !lse->ls_en50494)
- continue;
-
- le = (linuxdvb_en50494_t*)lse->ls_en50494;
- le->le_pin = new_value;
- }
- return 0;
-}
-
static idnode_set_t *
linuxdvb_satconf_class_get_childs ( idnode_t *o )
{
};
/*
- * en50494
+ * Unicable (EN50494)
*/
+static const void *
+linuxdvb_satconf_class_en50494_id_get ( void *p )
+{
+ linuxdvb_satconf_t *ls = p;
+ linuxdvb_satconf_ele_t *lse = TAILQ_FIRST(&ls->ls_elements);
+ return &(((linuxdvb_en50494_t*)lse->ls_en50494)->le_id);
+}
+
+static int
+linuxdvb_satconf_class_en50494_id_set
+ ( void *p, const void *v )
+{
+ linuxdvb_satconf_t *ls = p;
+ linuxdvb_satconf_ele_t *lse;
+ TAILQ_FOREACH(lse, &ls->ls_elements, ls_link)
+ (((linuxdvb_en50494_t*)lse->ls_en50494)->le_id) = *(uint16_t*)v;
+ return 0;
+}
+
+static const void *
+linuxdvb_satconf_class_en50494_pin_get ( void *p )
+{
+ linuxdvb_satconf_t *ls = p;
+ linuxdvb_satconf_ele_t *lse = TAILQ_FIRST(&ls->ls_elements);
+ return &(((linuxdvb_en50494_t*)lse->ls_en50494)->le_pin);
+}
+
+static int
+linuxdvb_satconf_class_en50494_pin_set
+ ( void *p, const void *v )
+{
+ linuxdvb_satconf_t *ls = p;
+ linuxdvb_satconf_ele_t *lse;
+ TAILQ_FOREACH(lse, &ls->ls_elements, ls_link)
+ (((linuxdvb_en50494_t*)lse->ls_en50494)->le_pin) = *(uint16_t*)v;
+ return 0;
+}
+
+static const void *
+linuxdvb_satconf_class_en50494_freq_get ( void *p )
+{
+ linuxdvb_satconf_t *ls = p;
+ linuxdvb_satconf_ele_t *lse = TAILQ_FIRST(&ls->ls_elements);
+ return &(((linuxdvb_en50494_t*)lse->ls_en50494)->le_frequency);
+}
+
+static int
+linuxdvb_satconf_class_en50494_freq_set
+ ( void *p, const void *v )
+{
+ linuxdvb_satconf_t *ls = p;
+ linuxdvb_satconf_ele_t *lse;
+ TAILQ_FOREACH(lse, &ls->ls_elements, ls_link)
+ (((linuxdvb_en50494_t*)lse->ls_en50494)->le_frequency) = *(uint16_t*)v;
+ return 0;
+}
+
const idclass_t linuxdvb_satconf_en50494_class =
{
.ic_super = &linuxdvb_satconf_class,
.ic_class = "linuxdvb_satconf_en50494",
.ic_caption = "DVB-S EN50494 (UniCable)",
.ic_properties = (const property_t[]) {
+ {
+ .type = PT_U16,
+ .id = "id",
+ .name = "ID",
+ .get = linuxdvb_satconf_class_en50494_id_get,
+ .set = linuxdvb_satconf_class_en50494_id_set,
+ .list = linuxdvb_en50494_id_list,
+ .opts = PO_NOSAVE,
+ },
+ {
+ .type = PT_U16,
+ .id = "pin",
+ .name = "Pin",
+ .get = linuxdvb_satconf_class_en50494_pin_get,
+ .set = linuxdvb_satconf_class_en50494_pin_set,
+ .list = linuxdvb_en50494_pin_list,
+ .opts = PO_NOSAVE,
+ },
+ {
+ .type = PT_U16,
+ .id = "frequency",
+ .name = "Frequency (MHz)",
+ .get = linuxdvb_satconf_class_en50494_freq_get,
+ .set = linuxdvb_satconf_class_en50494_freq_set,
+ .opts = PO_NOSAVE,
+ },
{
.type = PT_STR,
.id = "network_a",
.list = linuxdvb_satconf_ele_class_network_enum,
.opts = PO_NOSAVE,
},
- {
- .type = PT_U16,
- .id = "id",
- .name = "ID",
- .get = linuxdvb_satconf_class_en50494_id_get,
- .set = linuxdvb_satconf_class_en50494_id_set,
- .list = linuxdvb_satconf_class_en50494_id_list,
- .opts = PO_NOSAVE,
- },
- {
- .type = PT_U16,
- .id = "freqency",
- .name = "Freqency (MHz)",
- .get = linuxdvb_satconf_class_en50494_freq_get,
- .set = linuxdvb_satconf_class_en50494_freq_set,
- .opts = PO_NOSAVE,
- },
- {
- .type = PT_U16,
- .id = "pin",
- .name = "Pin",
- .get = linuxdvb_satconf_class_en50494_pin_get,
- .set = linuxdvb_satconf_class_en50494_pin_set,
- .list = linuxdvb_satconf_class_en50494_pin_list,
- .opts = PO_NOSAVE,
- },
{}
}
};
},
{
.type = "en50494",
- .name = "EN50494/UniCable Switch (Universal LNB)",
+ .name = "Unicable Switch (Universal LNB)",
.idc = &linuxdvb_satconf_en50494_class,
.ports = 2,
},
}
/* Create elements */
- i = 0;
- TAILQ_FOREACH(lse, &ls->ls_elements, ls_link) {
+ i = 0;
+ lse = TAILQ_FIRST(&ls->ls_elements);
+ while (i < lst->ports) {
+ if (!lse)
+ lse = linuxdvb_satconf_ele_create0(NULL, NULL, ls);
if (!lse->ls_lnb)
lse->ls_lnb = linuxdvb_lnb_create0(NULL, NULL, lse);
- /* create multi port elements (2/4port & en50494) */
if (lst->ports > 1) {
- if( !lse->ls_en50494 && !strcmp("en50494",lst->type))
- lse->ls_en50494 = linuxdvb_en50494_create0("en50494", NULL, lse, i);
- if( !lse->ls_switch && (!strcmp("2port",lst->type) || !strcmp("4port",lst->type)))
- lse->ls_switch = linuxdvb_switch_create0("Generic", NULL, lse, i, -1);
+ if (!strcmp(lst->type, "en50494")) {
+ if (!lse->ls_en50494)
+ lse->ls_en50494 = linuxdvb_en50494_create0("Generic", NULL, lse, i);
+ } else {
+ if (!lse->ls_switch)
+ lse->ls_switch = linuxdvb_switch_create0("Generic", NULL, lse, i, -1);
+ }
}
+ lse = TAILQ_NEXT(lse, ls_link);
i++;
}
- for (; i < lst->ports; i++) {
- lse = linuxdvb_satconf_ele_create0(NULL, NULL, ls);
- lse->ls_lnb = linuxdvb_lnb_create0(NULL, NULL, lse);
- /* create multi port elements (2/4port & en50494) */
- if (lst->ports > 1) {
- if( !strcmp("en50494",lst->type))
- lse->ls_en50494 = linuxdvb_en50494_create0("en50494", NULL, lse, i);
- if( !strcmp("2port",lst->type) || !strcmp("4port",lst->type))
- lse->ls_switch = linuxdvb_switch_create0("Generic", NULL, lse, i, -1);
- }
- }
return ls;
}
{
.type = PT_STR,
.id = "en50494_type",
- .name = "EN50494 Type",
+ .name = "Unicable Type",
.set = linuxdvb_satconf_ele_class_en50494type_set,
.get = linuxdvb_satconf_ele_class_en50494type_get,
.list = linuxdvb_en50494_list,