--- a/svghmi/gen_index_xhtml.xslt Thu Mar 19 11:32:20 2020 +0100
+++ b/svghmi/gen_index_xhtml.xslt Thu Mar 19 19:23:56 2020 +0100
@@ -579,6 +579,8 @@
<xsl:for-each select="$widget/path">
@@ -614,6 +616,9 @@
<xsl:apply-templates mode="widget_defs" select="$widget">
<xsl:with-param name="hmi_element" select="."/>
+ <xsl:apply-templates mode="widget_subscribe" select="$widget"> + <xsl:with-param name="hmi_element" select="."/> <xsl:if test="position()!=last()">
@@ -621,6 +626,13 @@
+ <xsl:template mode="widget_subscribe" match="widget"> + <xsl:text> sub: subscribe, + <xsl:text> unsub: unsubscribe, + <xsl:template mode="widget_subscribe" match="widget[@type='Page']"/> <xsl:template name="defs_by_labels">
<xsl:param name="labels" select="''"/>
<xsl:param name="mandatory" select="'yes'"/>
@@ -1024,8 +1036,6 @@
<xsl:text> let d = widget.dispatch;
- <xsl:text> console.log(index, idx, idxidx, value);
<xsl:text> if(typeof(d) == "function" && idxidx == 0){
<xsl:text> d.call(widget, value, oldval);
@@ -1372,8 +1382,6 @@
<xsl:text> dispatch: function(value) {
- <xsl:text> // console.log("Heartbeat" + value);
<xsl:text> change_hmi_value(heartbeat_index, "+1");
@@ -1566,6 +1574,46 @@
+ <xsl:text>function unsubscribe(){ + <xsl:text> widget = this; + <xsl:text> /* remove subsribers */ + <xsl:text> for(let index of widget.indexes){ + <xsl:text> let idx = index + widget.offset; + <xsl:text> subscribers[idx].delete(widget); + <xsl:text> widget.offset = 0; + <xsl:text>function subscribe(new_offset=0){ + <xsl:text> widget = this; + <xsl:text> /* set the offset because relative */ + <xsl:text> widget.offset = new_offset; + <xsl:text> /* add widget's subsribers */ + <xsl:text> for(let index of widget.indexes){ + <xsl:text> subscribers[index + new_offset].add(widget); <xsl:text>function switch_subscribed_page(page_name, page_index) {
<xsl:text> let old_desc = page_desc[current_subscribed_page];
@@ -1594,67 +1642,17 @@
- <xsl:text> for(let widget of old_desc.absolute_widgets){
- <xsl:text> /* remove subsribers */
- <xsl:text> for(let index of widget.indexes){
- <xsl:text> subscribers[index].delete(widget);
- <xsl:text> for(let widget of old_desc.relative_widgets){
+ <xsl:text> old_desc.absolute_widgets.map(w=>w.unsub()); - <xsl:text> /* remove subsribers */
- <xsl:text> for(let index of widget.indexes){
- <xsl:text> let idx = widget.offset ? index + widget.offset : index;
- <xsl:text> subscribers[idx].delete(widget);
- <xsl:text> /* lose the offset */
- <xsl:text> delete widget.offset;
+ <xsl:text> old_desc.relative_widgets.map(w=>w.unsub()); - <xsl:text> for(let widget of new_desc.absolute_widgets){
- <xsl:text> /* add widget's subsribers */
- <xsl:text> for(let index of widget.indexes){
- <xsl:text> subscribers[index].add(widget);
+ <xsl:text> new_desc.absolute_widgets.map(w=>w.sub()); <xsl:text> var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index;
- <xsl:text> for(let widget of new_desc.relative_widgets){
- <xsl:text> /* set the offset because relative */
- <xsl:text> widget.offset = new_offset;
- <xsl:text> /* add widget's subsribers */
- <xsl:text> for(let index of widget.indexes){
- <xsl:text> subscribers[index + new_offset].add(widget);
+ <xsl:text> new_desc.relative_widgets.map(w=>w.sub(new_offset)); --- 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);
- console.log(index, idx, idxidx, value);
if(typeof(d) == "function" && idxidx == 0){
d.call(widget, value, oldval);
@@ -182,7 +181,6 @@
indexes: [heartbeat_index],
dispatch: function(value) {
- // console.log("Heartbeat" + value);
change_hmi_value(heartbeat_index, "+1");
@@ -279,6 +277,26 @@
+ /* remove subsribers */ + for(let index of widget.indexes){ + let idx = index + widget.offset; + subscribers[idx].delete(widget); +function subscribe(new_offset=0){ + /* 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 @@
- 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);
+ old_desc.absolute_widgets.map(w=>w.unsub()); + old_desc.relative_widgets.map(w=>w.unsub()); - for(let widget of new_desc.absolute_widgets){
- /* add widget's subsribers */
- for(let index of widget.indexes){
- subscribers[index].add(widget);
+ 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)); --- a/svghmi/widgets_common.ysl2 Thu Mar 19 11:32:20 2020 +0100
+++ b/svghmi/widgets_common.ysl2 Thu Mar 19 19:23:56 2020 +0100
@@ -17,9 +17,10 @@
| type: "«$widget/@type»",
| "«@value»"`if "position()!=last()" > ,`
@@ -34,9 +35,17 @@
apply "$widget", mode="widget_defs" with "hmi_element",".";
+ apply "$widget", mode="widget_subscribe" with "hmi_element","."; | }`if "position()!=last()" > ,`
+// default : normal subscribing +template "widget", mode="widget_subscribe" { +// page aren't subscribers +template "widget[@type='Page']", mode="widget_subscribe"; function "defs_by_labels" {