svghmi/svghmi.js
branchsvghmi
changeset 2889 4eeed820fd3a
parent 2871 ed9b16b33628
child 2890 ae8063127e95
--- 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();