diff -r 7beddc62a388 -r 4eeed820fd3a svghmi/svghmi.js --- a/svghmi/svghmi.js Thu Mar 19 11:32:20 2020 +0100 +++ b/svghmi/svghmi.js Thu Mar 19 19:23:56 2020 +0100 @@ -8,7 +8,6 @@ let idx = widget.offset ? index - widget.offset : index; let idxidx = widget.indexes.indexOf(idx); let d = widget.dispatch; - console.log(index, idx, idxidx, value); if(typeof(d) == "function" && idxidx == 0){ d.call(widget, value, oldval); } @@ -182,7 +181,6 @@ frequency: 1, indexes: [heartbeat_index], dispatch: function(value) { - // console.log("Heartbeat" + value); change_hmi_value(heartbeat_index, "+1"); } }); @@ -279,6 +277,26 @@ yield* b; }; +function unsubscribe(){ + widget = this; + /* remove subsribers */ + for(let index of widget.indexes){ + let idx = index + widget.offset; + subscribers[idx].delete(widget); + } + widget.offset = 0; +} + +function subscribe(new_offset=0){ + widget = this; + /* set the offset because relative */ + widget.offset = new_offset; + /* add widget's subsribers */ + for(let index of widget.indexes){ + subscribers[index + new_offset].add(widget); + } +} + function switch_subscribed_page(page_name, page_index) { let old_desc = page_desc[current_subscribed_page]; let new_desc = page_desc[page_name]; @@ -293,37 +311,12 @@ } if(old_desc){ - for(let widget of old_desc.absolute_widgets){ - /* remove subsribers */ - for(let index of widget.indexes){ - subscribers[index].delete(widget); - } - } - for(let widget of old_desc.relative_widgets){ - /* remove subsribers */ - for(let index of widget.indexes){ - let idx = widget.offset ? index + widget.offset : index; - subscribers[idx].delete(widget); - } - /* lose the offset */ - delete widget.offset; - } - } - for(let widget of new_desc.absolute_widgets){ - /* add widget's subsribers */ - for(let index of widget.indexes){ - subscribers[index].add(widget); - } - } + old_desc.absolute_widgets.map(w=>w.unsub()); + old_desc.relative_widgets.map(w=>w.unsub()); + } + new_desc.absolute_widgets.map(w=>w.sub()); var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index; - for(let widget of new_desc.relative_widgets){ - /* set the offset because relative */ - widget.offset = new_offset; - /* add widget's subsribers */ - for(let index of widget.indexes){ - subscribers[index + new_offset].add(widget); - } - } + new_desc.relative_widgets.map(w=>w.sub(new_offset)); update_subscriptions();