// function openaps ( ) { return this; } jQuery.fn.reverse = function() { return this.pushStack(this.get().reverse(), arguments); }; var openaps = { }; openaps.BUS = 'org.openaps'; var SERVICE_IFACE = 'org.openaps.Service'; openaps.IFACE = { Service: SERVICE_IFACE , Instance: SERVICE_IFACE + '.Instance' , Heartbeat: SERVICE_IFACE + '.Instance.Heartbeat' , Do: SERVICE_IFACE + '.Do' , Scheduler: SERVICE_IFACE + '.Scheduler' , Trigger: SERVICE_IFACE + '.Trigger' }; var PATH = '/org/openaps/Services'; openaps.PATHS = { Service: PATH , Do: PATH + '/Do' , Heartbeat: PATH + '/Heartbeat' , Instance: PATH + '/Instance' , Scheduler: PATH + '/Scheduler' }; function update_event (dom, props) { } function create_event (cfg, path ) { var clone = cfg.clones.Scheduled.clone(true); // console.log('adding', clone, cfg.events.find("#TimelineEnd")); var trigger = openaps.dbus.proxy(openaps.IFACE.Trigger, path).wait(function ( ) { console.log("UPDATING TRIGGER", trigger.data.name, trigger.data.Status, trigger.data, path); clone.prop('data-trigger-expected', trigger.data.expected); clone.data('trigger-expected', trigger.data.expected); clone.find('H4').text(trigger.data.name); for (var field in this.data) { var selector = '.v.' + field; clone.find(selector).each(function ( ) { var target = $(this); target.filter('P, SPAN, DIV, H1, H2, H3, H4, H5, H6, SPAN, TT, DD').text(trigger.data[field]); }); } var prior = cfg.Activity.find('TBODY.EventScheduled').not('.skeleton'); // console.log("PRIOR", prior, prior.length, prior.is("TBODY")); if (prior.is("TBODY")) { var insertion = prior.filter(function (i, elem) { var $this = $(this); var expected = $this.data('trigger-expected'); if (expected >= trigger.data.expected) { return true; } return false; }); if (insertion && insertion.is('TBODY')) { var last = insertion.filter(":last"); last.after(clone); } else { prior.filter(":first").before(clone); } } else { cfg.Activity.find('#TimelineEnd').after(clone); } $(trigger).on('signal', function (ch, signal, args) { console.log("UPDATING TRIGGER", trigger.data.name, trigger.data.Status, trigger.data); // clone.filter('.EventScheduled').removeClass('nominal').toggleClass('pending', trigger.data.Status == 'Running'); clone.find('.timeline-end').toggleClass('timeline-end', trigger.data.Status == 'Armed'); switch (trigger.data.Status) { case 'Armed': clone.addClass('nominal').removeClass('pending'); break; case 'Running': clone.removeClass('EventScheduled'); clone.find('.listing-actions .cancel').prop('disabled', true); clone.removeClass('nominal').toggleClass('pending', true); clone.find('.listing-maybe').removeClass('listing-maybe'); break; case 'Fired': case 'Fire': case 'Fire': clone.removeClass('nominal').addClass('pending'); clone.find('.timeline-end').removeClass('timeline-end'); clone.find('.timeline-point').removeClass('timeline-end'); break; case 'Error': clone.removeClass('pending').addClass('error finished errors'); break; case 'Success': clone.removeClass('pending').addClass('active finished success'); break; case 'Done': case 'Finish': clone.removeClass('pending').addClass('finished'); break; case 'Remove': case 'Gone': clone.removeClass('pending').addClass('gone finished'); setTimeout(function ( ) { $(trigger).off('signal'); }, 5000); // clone.find('') // break; default: break; } for (var field in trigger.data) { var selector = '.v.' + field; clone.find(selector).each(function ( ) { var target = $(this); target.filter('P, SPAN, DIV, H1, H2, H3, H4, H5, H6, SPAN, TT, DD').text(trigger.data[field]); }); } }); // console.log('TRIGGER', this.valid, this.data); }); } function update_timeline (ev, path, prop_spec) { console.log(ev.type, prop_spec); switch (ev.type) { case 'InterfacesAdded': var cfg = ev.data; create_event(cfg, path); break; case 'InterfacesRemoved': break; default: break; } } $(document).ready(function ( ) { var cfg = { Activity: $('#ActivityEvents') , events: $('#EventTimeline') , clones: { End: $('#TimelineEnd').clone(true).removeClass('skeleton') , Scheduled: $('#ActivityEvents .EventScheduled').clone(true).removeClass('skeleton') , Maybe: $('#ActivityEvents .EventMaybe').clone(true).removeClass('skeleton') , Current: $('#ActivityEvents .EventCurrent').clone(true).removeClass('skeleton') , Pending: $('#ActivityEvents .EventPending').clone(true).removeClass('skeleton') } }; // cfg.Activity.tablesorter( ); cfg.Activity.trigger('update'); // var bus = cockpit.dbus(openaps.BUS, { bus: "session" }); var bus = cockpit.dbus(openaps.BUS); openaps.dbus = bus; // $(bus).on('notify', console.log.bind(console, 'NOTIFY XYXYX')); // $(bus).on('signal', console.log.bind(console, 'SIGNAL XYXYX')); // var mgr = bus.proxy('org.freedesktop.DBus.Properties', openaps.PATHS.Service); var mgr = bus.proxy('org.freedesktop.DBus.ObjectManager', openaps.PATHS.Instance); mgr.call('GetManagedObjects').always(function (managed) { console.log('got managed', managed); openaps.instance = managed; }); // openaps.dbus = mgr; var root = bus.proxy('org.freedesktop.DBus.ObjectManager', openaps.PATHS.Service); root.call('GetManagedObjects').always(function (managed) { console.log('got root managed', managed); openaps.root = managed[0]; for (var path in managed[0]) { // console.log('path', path); var objs = openaps.root[path]; for (var iface in objs) { var fields = objs[iface]; var name = iface.split('.').pop( ); // console.log('new name', name, path, name); if (Object.keys(fields).length > 0) { console.log(iface, path, Object.keys(fields)); openaps[name] = bus.proxy(iface, path); } } } /* var Do = bus.proxy(openaps.IFACE.Do, openaps.PATHS.Do); openaps.Do = Do; openaps.Scheduler = bus.proxy(openaps.IFACE.Scheduler, openaps.PATHS.Scheduler); */ console.log(openaps); $(openaps.Do).on("Phase", cfg, function (ev, status, props) { console.log("DO", ev.type, status, props.name.v, props); }); $([openaps.Scheduler, openaps.Heartbeat, openaps.Instance]).on("signal", function (ev, signal) { console.log('signal', ev.type, signal); }); $([openaps.Scheduler, openaps.Heartbeat, openaps.Instance]).on("Trigger Phase Fire", function (ev, signal) { console.log('signal', ev.type, signal, arguments); }); $(openaps.Scheduler).on("changed added removed Trigger Phase", function (ev, signal, path) { console.log('Scheduler XYYX', ev.type, signal, path, [].slice.call(arguments, 2)); }); // $(openaps.Do).on("signal", function (ev) { console.log('Do signal', ev.type, arguments); }); console.log("Scheduler", "1111", openaps.Scheduler, openaps.Scheduler.valid, openaps.IFACE.Scheduler, openaps.PATHS.Scheduler); $(openaps.Scheduler.as('org.freedesktop.DBus.ObjectManager')).on("InterfacesAdded InterfacesRemoved", cfg, function (ev, signal) { console.log('Scheduler MGR', ev.type, ev.data, signal, arguments); }); $(openaps.Scheduler.as('org.freedesktop.DBus.ObjectManager')).on("InterfacesAdded InterfacesRemoved", cfg, update_timeline); openaps.Scheduler.as('org.freedesktop.DBus.ObjectManager').call("GetManagedObjects").always(function (scheduled) { scheduled = scheduled.pop( ); // console.log("FIRST SCHEDULES", scheduled); var i = 0; for (var path in scheduled) { i++; function later (p) { function step ( ) { create_event(cfg, p); } return step; } setTimeout(later(path), i * 100); } }); }); var heartbeat = bus.proxy(openaps.IFACE.Heartbeat, openaps.PATHS.Heartbeat); openaps.heartbeat = heartbeat; $(openaps.heartbeat).on("Heartbeat", cfg, function (ev) { console.log('Heartbeat', arguments); var last = ev.data.Activity.find('TBODY.EventScheduled:last'); var sentinel = ev.data.Activity.find('#TimelineEnd').remove( ); last.after(sentinel); }); /* */ }); if (!window.openaps) { window.openaps = openaps; }