SVGHMI: update generated XSLT
authorEdouard Tisserant
Thu, 04 Nov 2021 12:03:43 +0100
changeset 3383 a3b8cfd89648
parent 3382 589abe084e57
child 3384 bd337d21f686
SVGHMI: update generated XSLT
svghmi/gen_index_xhtml.xslt
--- a/svghmi/gen_index_xhtml.xslt	Thu Nov 04 12:02:08 2021 +0100
+++ b/svghmi/gen_index_xhtml.xslt	Thu Nov 04 12:03:43 2021 +0100
@@ -3,6 +3,7 @@
   <xsl:output cdata-section-elements="xhtml:script" method="xml"/>
   <xsl:variable name="svg" select="/svg:svg"/>
   <xsl:variable name="hmi_elements" select="//svg:*[starts-with(@inkscape:label, 'HMI:')]"/>
+  <xsl:param name="instance_name"/>
   <xsl:variable name="hmitree" select="ns:GetHMITree()"/>
   <xsl:variable name="_categories">
     <noindex>
@@ -39,12 +40,16 @@
 </xsl:text>
     <xsl:text>
 </xsl:text>
+    <xsl:text>var current_page_var_index = </xsl:text>
+    <xsl:value-of select="$indexed_hmitree/*[@hmipath = concat('/CURRENT_PAGE_', $instance_name)]/@index"/>
+    <xsl:text>;
+</xsl:text>
+    <xsl:text>
+</xsl:text>
     <xsl:text>var hmitree_types = [
 </xsl:text>
     <xsl:for-each select="$indexed_hmitree/*">
-      <xsl:text>    /* </xsl:text>
-      <xsl:value-of select="@index"/>
-      <xsl:text> */ "</xsl:text>
+      <xsl:text>    "</xsl:text>
       <xsl:value-of select="substring(local-name(), 5)"/>
       <xsl:text>"</xsl:text>
       <xsl:if test="position()!=last()">
@@ -60,9 +65,7 @@
     <xsl:text>var hmitree_paths = [
 </xsl:text>
     <xsl:for-each select="$indexed_hmitree/*">
-      <xsl:text>    /* </xsl:text>
-      <xsl:value-of select="@index"/>
-      <xsl:text> */ "</xsl:text>
+      <xsl:text>    "</xsl:text>
       <xsl:value-of select="@hmipath"/>
       <xsl:text>"</xsl:text>
       <xsl:if test="position()!=last()">
@@ -75,6 +78,26 @@
 </xsl:text>
     <xsl:text>
 </xsl:text>
+    <xsl:text>var hmitree_nodes = {
+</xsl:text>
+    <xsl:for-each select="$indexed_hmitree/*[local-name() = 'HMI_NODE']">
+      <xsl:text>    "</xsl:text>
+      <xsl:value-of select="@hmipath"/>
+      <xsl:text>" : [</xsl:text>
+      <xsl:value-of select="@index"/>
+      <xsl:text>, "</xsl:text>
+      <xsl:value-of select="@class"/>
+      <xsl:text>"]</xsl:text>
+      <xsl:if test="position()!=last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+      <xsl:text>
+</xsl:text>
+    </xsl:for-each>
+    <xsl:text>};
+</xsl:text>
+    <xsl:text>
+</xsl:text>
     <xsl:text>
 </xsl:text>
   </xsl:template>
@@ -656,6 +679,10 @@
       <xsl:value-of select="$desc/path/@index"/>
       <xsl:text>,
 </xsl:text>
+      <xsl:text>    page_class: "</xsl:text>
+      <xsl:value-of select="$indexed_hmitree/*[@hmipath = $desc/path/@value]/@class"/>
+      <xsl:text>",
+</xsl:text>
     </xsl:if>
     <xsl:text>    widgets: [
 </xsl:text>
@@ -8045,17 +8072,17 @@
 </xsl:text>
           <xsl:text>// Open WebSocket to relative "/ws" address
 </xsl:text>
+          <xsl:text>var has_watchdog = window.location.hash == "#watchdog";
+</xsl:text>
           <xsl:text>
 </xsl:text>
           <xsl:text>var ws_url = 
 </xsl:text>
           <xsl:text>    window.location.href.replace(/^http(s?:\/\/[^\/]*)\/.*$/, 'ws$1/ws')
 </xsl:text>
-          <xsl:text>    + '?mode=' + (window.location.hash == "#watchdog" 
-</xsl:text>
-          <xsl:text>                  ? "watchdog"
-</xsl:text>
-          <xsl:text>                  : "multiclient");
+          <xsl:text>    + '?mode=' + (has_watchdog ? "watchdog" : "multiclient");
+</xsl:text>
+          <xsl:text>
 </xsl:text>
           <xsl:text>var ws = new WebSocket(ws_url);
 </xsl:text>
@@ -8375,23 +8402,45 @@
 </xsl:text>
           <xsl:text>
 </xsl:text>
-          <xsl:text>// artificially subscribe the watchdog widget to "/heartbeat" hmi variable
-</xsl:text>
-          <xsl:text>// Since dispatch directly calls change_hmi_value,
-</xsl:text>
-          <xsl:text>// PLC will periodically send variable at given frequency
-</xsl:text>
-          <xsl:text>subscribers(heartbeat_index).add({
-</xsl:text>
-          <xsl:text>    /* type: "Watchdog", */
+          <xsl:text>if(has_watchdog){
+</xsl:text>
+          <xsl:text>    // artificially subscribe the watchdog widget to "/heartbeat" hmi variable
+</xsl:text>
+          <xsl:text>    // Since dispatch directly calls change_hmi_value,
+</xsl:text>
+          <xsl:text>    // PLC will periodically send variable at given frequency
+</xsl:text>
+          <xsl:text>    subscribers(heartbeat_index).add({
+</xsl:text>
+          <xsl:text>        /* type: "Watchdog", */
+</xsl:text>
+          <xsl:text>        frequency: 1,
+</xsl:text>
+          <xsl:text>        indexes: [heartbeat_index],
+</xsl:text>
+          <xsl:text>        new_hmi_value: function(index, value, oldval) {
+</xsl:text>
+          <xsl:text>            apply_hmi_value(heartbeat_index, value+1);
+</xsl:text>
+          <xsl:text>        }
+</xsl:text>
+          <xsl:text>    });
+</xsl:text>
+          <xsl:text>}
+</xsl:text>
+          <xsl:text>
+</xsl:text>
+          <xsl:text>// subscribe to per instance current page hmi variable
+</xsl:text>
+          <xsl:text>subscribers(current_page_var_index).add({
 </xsl:text>
           <xsl:text>    frequency: 1,
 </xsl:text>
-          <xsl:text>    indexes: [heartbeat_index],
+          <xsl:text>    indexes: [current_page_var_index],
 </xsl:text>
           <xsl:text>    new_hmi_value: function(index, value, oldval) {
 </xsl:text>
-          <xsl:text>        apply_hmi_value(heartbeat_index, value+1);
+          <xsl:text>        switch_page(value);
 </xsl:text>
           <xsl:text>    }
 </xsl:text>
@@ -8787,7 +8836,11 @@
 </xsl:text>
           <xsl:text>        page_name = current_subscribed_page;
 </xsl:text>
-          <xsl:text>
+          <xsl:text>    else if(page_index == undefined){
+</xsl:text>
+          <xsl:text>        [page_name, page_index] = page_name.split('@')
+</xsl:text>
+          <xsl:text>    }
 </xsl:text>
           <xsl:text>
 </xsl:text>
@@ -8807,10 +8860,32 @@
 </xsl:text>
           <xsl:text>
 </xsl:text>
-          <xsl:text>    if(page_index == undefined){
+          <xsl:text>    if(page_index == undefined)
 </xsl:text>
           <xsl:text>        page_index = new_desc.page_index;
 </xsl:text>
+          <xsl:text>    else if(typeof(page_index) == "string") {
+</xsl:text>
+          <xsl:text>        let hmitree_node = hmitree_nodes[page_index];
+</xsl:text>
+          <xsl:text>        if(hmitree_node !== undefined){
+</xsl:text>
+          <xsl:text>            let [int_index, hmiclass] = hmitree_node;
+</xsl:text>
+          <xsl:text>            if(hmiclass == new_desc.page_class)
+</xsl:text>
+          <xsl:text>                page_index = int_index;
+</xsl:text>
+          <xsl:text>            else
+</xsl:text>
+          <xsl:text>                page_index = new_desc.page_index;
+</xsl:text>
+          <xsl:text>        } else {
+</xsl:text>
+          <xsl:text>            page_index = new_desc.page_index;
+</xsl:text>
+          <xsl:text>        }
+</xsl:text>
           <xsl:text>    }
 </xsl:text>
           <xsl:text>
@@ -8871,6 +8946,16 @@
 </xsl:text>
           <xsl:text>
 </xsl:text>
+          <xsl:text>    apply_hmi_value(current_page_var_index,
+</xsl:text>
+          <xsl:text>                    page_index == undefined
+</xsl:text>
+          <xsl:text>                        ? page_name
+</xsl:text>
+          <xsl:text>                        : page_name + "@" + hmitree_paths[page_index]);
+</xsl:text>
+          <xsl:text>
+</xsl:text>
           <xsl:text>    return true;
 </xsl:text>
           <xsl:text>};