return err;
}
+static int
+api_dvb_orbitalpos_list
+ ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp )
+{
+ htsmsg_t *l, *e, *c;
+ htsmsg_field_t *f;
+ const char *s;
+ int satpos, i;
+ char buf[128];
+
+ if (!satellites)
+ return 0;
+
+ l = htsmsg_create_list();
+ HTSMSG_FOREACH(f, satellites) {
+ if((c = htsmsg_get_map_by_field(f)) == NULL)
+ continue;
+ if(htsmsg_get_s32(c, "pos", &satpos))
+ continue;
+ if((s = htsmsg_get_str(c, "name")) == NULL)
+ continue;
+ e = htsmsg_create_map();
+ dvb_sat_position_to_str(satpos, buf, sizeof(buf));
+ htsmsg_add_str(e, "key", buf);
+ i = strlen(buf);
+ snprintf(buf + i, sizeof(buf) - i, " : %s", s);
+ htsmsg_add_str(e, "val", buf);
+ htsmsg_add_msg(l, NULL, e);
+ }
+ *resp = htsmsg_create_map();
+ htsmsg_add_msg(*resp, "entries", l);
+
+ return 0;
+}
+
+
#if ENABLE_MPEGTS_DVB
static int
api_dvb_scanfile_list
{
char buf[512];
const char *type = htsmsg_get_str(args, "type");
+ int satpos = htsmsg_get_s32_or_default(args, "satpos", INT_MAX);
scanfile_region_list_t *list = NULL;
htsmsg_t *l, *e;
scanfile_region_t *r;
l = htsmsg_create_list();
LIST_FOREACH(r, list, sfr_link) {
LIST_FOREACH(n, &r->sfr_networks, sfn_link) {
+ if (satpos != INT_MAX && n->sfn_satpos != satpos) continue;
e = htsmsg_create_map();
sprintf(buf, "%s/%s/%s", type, r->sfr_id, n->sfn_id);
htsmsg_add_str(e, "key", buf);
{ "mpegts/mux_sched/class", ACCESS_ADMIN, api_idnode_class, (void*)&mpegts_mux_sched_class },
{ "mpegts/mux_sched/grid", ACCESS_ADMIN, api_idnode_grid, api_mpegts_mux_sched_grid },
{ "mpegts/mux_sched/create", ACCESS_ADMIN, api_mpegts_mux_sched_create, NULL },
+ { "dvb/orbitalpos/list", ACCESS_ADMIN, api_dvb_orbitalpos_list, NULL },
#if ENABLE_MPEGTS_DVB
{ "dvb/scanfile/list", ACCESS_ADMIN, api_dvb_scanfile_list, NULL },
#endif
int mn_ignore_chnum;
int mn_sid_chnum;
int mn_localtime;
+ int mn_satpos;
};
typedef enum mpegts_mux_scan_state
void psi_tables_atsc_t ( struct mpegts_mux *mm );
void psi_tables_atsc_c ( struct mpegts_mux *mm );
+extern htsmsg_t *satellites;
+
/*
*
*/
#include "dvb_charset_tables.h"
#include "input.h"
#include "intlconv.h"
+#include "settings.h"
static int convert_iso_8859[16] = {
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1, 11, 12, 13
/**
*
*/
+htsmsg_t *satellites;
+
void dvb_init( void )
{
+ satellites = hts_settings_load("satellites");
}
void dvb_done( void )
extern SKEL_DECLARE(mpegts_table_state_skel, struct mpegts_table_state);
SKEL_FREE(mpegts_table_state_skel);
+ htsmsg_destroy(satellites);
}
TAILQ_INIT(&mn->mn_scan_active);
gtimer_arm(&mn->mn_scan_timer, mpegts_network_scan_timer_cb, mn, 0);
+ /* Defaults */
+ mn->mn_satpos = INT_MAX;
+
/* Load config */
if (conf)
idnode_load(&mn->mn_id, conf);
if (!(sfn = scanfile_find(s)))
return 0;
+ /* Set satellite position */
+ if (sfn->sfn_satpos != INT_MAX && ln->mn_satpos == INT_MAX)
+ ln->mn_satpos = sfn->sfn_satpos;
+
/* Create */
LIST_FOREACH(dmc, &sfn->sfn_muxes, dmc_link) {
if (!(mm = dvb_network_find_mux(ln, dmc, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE))) {
return 0;
}
static htsmsg_t *
-dvb_network_class_scanfile_list ( const char *type )
+dvb_network_class_scanfile_list ( void *o, const char *type )
{
+ dvb_network_t *ln = o;
htsmsg_t *e, *m = htsmsg_create_map();
htsmsg_add_str(m, "type", "api");
htsmsg_add_str(m, "uri", "dvb/scanfile/list");
+ htsmsg_add_str(m, "stype", "none");
e = htsmsg_create_map();
htsmsg_add_str(e, "type", type);
+ if (ln && ln->mn_satpos != INT_MAX)
+ htsmsg_add_s32(e, "satpos", ln->mn_satpos);
htsmsg_add_msg(m, "params", e);
return m;
}
+
static htsmsg_t *
dvb_network_dvbt_class_scanfile_list ( void *o )
{
- return dvb_network_class_scanfile_list("dvbt");
+ return dvb_network_class_scanfile_list(o, "dvbt");
}
static htsmsg_t *
dvb_network_dvbc_class_scanfile_list ( void *o )
{
- return dvb_network_class_scanfile_list("dvbc");
+ return dvb_network_class_scanfile_list(o, "dvbc");
}
static htsmsg_t *
dvb_network_dvbs_class_scanfile_list ( void *o )
{
- return dvb_network_class_scanfile_list("dvbs");
+ return dvb_network_class_scanfile_list(o, "dvbs");
}
static htsmsg_t *
dvb_network_atsc_class_scanfile_list ( void *o )
{
- return dvb_network_class_scanfile_list("atsc");
+ return dvb_network_class_scanfile_list(o, "atsc");
+}
+
+static const void *
+dvb_network_class_orbital_pos_get ( void *o )
+{
+ dvb_network_t *ln = o;
+ static char buf[16];
+ static const char *s;
+ s = NULL;
+ if (ln->mn_satpos != INT_MAX) {
+ dvb_sat_position_to_str(ln->mn_satpos, buf, sizeof(buf));
+ s = buf;
+ } else
+ s = "";
+ return &s;
+}
+
+static int
+dvb_network_class_orbital_pos_set ( void *o, const void *s )
+{
+ dvb_network_t *ln = o;
+ int satpos;
+
+ /* Find */
+ if (!s)
+ return 0;
+
+ satpos = dvb_sat_position_from_str(s);
+ if (satpos != ln->mn_satpos) {
+ ln->mn_satpos = satpos;
+ return 1;
+ }
+
+ return 0;
+}
+
+static htsmsg_t *
+dvb_network_class_orbital_pos_list ( void *o )
+{
+ htsmsg_t *e, *m = htsmsg_create_map();
+ htsmsg_add_str(m, "type", "api");
+ htsmsg_add_str(m, "uri", "dvb/orbitalpos/list");
+ htsmsg_add_str(m, "stype", "none");
+ e = htsmsg_create_map();
+ htsmsg_add_msg(m, "params", e);
+ return m;
}
const idclass_t dvb_network_class =
.list = dvb_network_dvbs_class_scanfile_list,
.opts = PO_NOSAVE,
},
+ {
+ .type = PT_STR,
+ .id = "orbital_pos",
+ .name = "Orbital Position",
+ .set = dvb_network_class_orbital_pos_set,
+ .get = dvb_network_class_orbital_pos_get,
+ .list = dvb_network_class_orbital_pos_list,
+ },
{}
}
};
{
int len = strlen(n), pos = len - 1, frac = 0;
- if (len > 0 && n[pos] != 'W' && n[pos] != 'E')
+ if (len > 0 && toupper(n[pos]) != 'W' && toupper(n[pos]) != 'E')
return 0;
pos--;
while (pos >= 0 && isdigit(n[pos]))
n[pos] = '\0';
*rpos *= 10;
*rpos += frac;
- if (n[len-1] == 'W')
+ if (toupper(n[len-1]) == 'W')
*rpos = -*rpos;
return 1;
}
scanfile_network_cmp
( scanfile_network_t *a, scanfile_network_t *b )
{
- return strcmp(a->sfn_name, b->sfn_name);
+ if (a->sfn_satpos == b->sfn_satpos)
+ return strcmp(a->sfn_name, b->sfn_name);
+ return b->sfn_satpos - a->sfn_satpos;
}
static int
scanfile_region_cmp
str++;
}
*str = '\0';
+ opos = INT_MAX;
if (!strcmp(type, "dvb-s") && scanfile_network_dvbs_pos(buf, &opos)) {
snprintf(buf3, sizeof(buf3), "%c%3i.%i%c:%s", opos < 0 ? '<' : '>',
abs(opos) / 10, abs(opos) % 10,
net = calloc(1, sizeof(scanfile_network_t));
net->sfn_id = strdup(buf2);
net->sfn_name = strdup(buf);
+ net->sfn_satpos = opos;
LIST_INSERT_SORTED(®->sfr_networks, net, sfn_link, scanfile_network_cmp);
/* Process file */
typedef struct scanfile_network {
const char *sfn_id;
const char *sfn_name;
+ int sfn_satpos;
LIST_ENTRY(scanfile_network) sfn_link;
LIST_HEAD(,dvb_mux_conf) sfn_muxes;
} scanfile_network_t;
if (key in tvheadend.idnode_enum_stores)
return tvheadend.idnode_enum_stores[key];
+ var stype = Ext.data.SortTypes.none;
+ var sinfo = conf.sort;
+ if (conf.stype !== 'none') {
+ stype = Ext.data.SortTypes.asUCString;
+ sinfo = { field: 'val', 'direction': 'ASC' };
+ }
+
/* Build store */
var st = new Ext.data.JsonStore({
root: conf.root || 'entries',
fields: conf.fields ||
[
'key',
+ 'val',
{
name: 'val',
- sortType: Ext.data.SortTypes.asUCString
+ sortType: stype
}
],
id: conf.id || 'key',
autoLoad: true,
listeners: conf.listeners || {},
- sortInfo: conf.sort || {
- field: 'val',
- direction: 'ASC'
- }
+ sortInfo: sinfo
});
tvheadend.idnode_enum_stores[key] = st;
return tvheadend.idnode_get_enum({
url: 'api/' + f['enum'].uri,
params: f['enum'].params,
- event: f['enum'].event
+ event: f['enum'].event,
+ stype: f['enum'].stype
});
}