Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
mpegts dvb: add satellite position field to network, add proper inter…
…action with predefined muxes
  • Loading branch information
perexg committed Feb 5, 2015
1 parent 31cd397 commit 53f8b50
Show file tree
Hide file tree
Showing 9 changed files with 138 additions and 14 deletions.
39 changes: 39 additions & 0 deletions src/api/api_mpegts.c
Expand Up @@ -327,13 +327,50 @@ api_mpegts_mux_sched_create
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
( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp )
{
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;
Expand All @@ -356,6 +393,7 @@ api_dvb_scanfile_list
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);
Expand Down Expand Up @@ -401,6 +439,7 @@ api_mpegts_init ( void )
{ "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
Expand Down
1 change: 1 addition & 0 deletions src/input/mpegts.h
Expand Up @@ -300,6 +300,7 @@ struct mpegts_network
int mn_ignore_chnum;
int mn_sid_chnum;
int mn_localtime;
int mn_satpos;
};

typedef enum mpegts_mux_scan_state
Expand Down
2 changes: 2 additions & 0 deletions src/input/mpegts/dvb.h
Expand Up @@ -236,6 +236,8 @@ void psi_tables_dvb ( struct mpegts_mux *mm );
void psi_tables_atsc_t ( struct mpegts_mux *mm );
void psi_tables_atsc_c ( struct mpegts_mux *mm );

extern htsmsg_t *satellites;

/*
*
*/
Expand Down
5 changes: 5 additions & 0 deletions src/input/mpegts/dvb_support.c
Expand Up @@ -31,6 +31,7 @@
#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
Expand Down Expand Up @@ -923,13 +924,17 @@ dvb_sat_position_from_str( const char *buf )
/**
*
*/
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);
}
3 changes: 3 additions & 0 deletions src/input/mpegts/mpegts_network.c
Expand Up @@ -357,6 +357,9 @@ mpegts_network_create0
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);
Expand Down
73 changes: 68 additions & 5 deletions src/input/mpegts/mpegts_network_dvb.c
Expand Up @@ -76,6 +76,10 @@ dvb_network_class_scanfile_set ( void *o, const void *s )
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))) {
Expand Down Expand Up @@ -103,35 +107,86 @@ dvb_network_class_scanfile_set ( void *o, const void *s )
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 =
Expand Down Expand Up @@ -198,6 +253,14 @@ const idclass_t dvb_network_dvbs_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,
},
{}
}
};
Expand Down
10 changes: 7 additions & 3 deletions src/input/mpegts/scanfile.c
Expand Up @@ -227,7 +227,7 @@ scanfile_network_dvbs_pos(char *n, int *rpos)
{
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]))
Expand All @@ -248,7 +248,7 @@ scanfile_network_dvbs_pos(char *n, int *rpos)
n[pos] = '\0';
*rpos *= 10;
*rpos += frac;
if (n[len-1] == 'W')
if (toupper(n[len-1]) == 'W')
*rpos = -*rpos;
return 1;
}
Expand All @@ -257,7 +257,9 @@ static int
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
Expand Down Expand Up @@ -601,6 +603,7 @@ scanfile_load_file
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,
Expand All @@ -611,6 +614,7 @@ scanfile_load_file
net = calloc(1, sizeof(scanfile_network_t));
net->sfn_id = strdup(buf2);
net->sfn_name = strdup(buf);
net->sfn_satpos = opos;
LIST_INSERT_SORTED(&reg->sfr_networks, net, sfn_link, scanfile_network_cmp);

/* Process file */
Expand Down
1 change: 1 addition & 0 deletions src/input/mpegts/scanfile.h
Expand Up @@ -22,6 +22,7 @@
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;
Expand Down
18 changes: 12 additions & 6 deletions src/webui/static/app/idnode.js
Expand Up @@ -16,6 +16,13 @@ tvheadend.idnode_get_enum = function(conf)
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',
Expand All @@ -24,18 +31,16 @@ tvheadend.idnode_get_enum = function(conf)
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;

Expand Down Expand Up @@ -75,7 +80,8 @@ tvheadend.idnode_enum_store = function(f)
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
});
}

Expand Down

0 comments on commit 53f8b50

Please sign in to comment.