svghmi/gen_index_xhtml.xslt
branchwxPython4
changeset 3422 700b39cb4525
parent 3414 0ff608310312
child 3418 a1d9a0353053
--- a/svghmi/gen_index_xhtml.xslt	Sun Jan 16 17:00:58 2022 +0100
+++ b/svghmi/gen_index_xhtml.xslt	Wed Feb 02 20:27:17 2022 +0100
@@ -175,14 +175,26 @@
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
-    <xsl:variable name="_type" select="substring-before($args,':')"/>
+    <xsl:variable name="_typefreq" select="substring-before($args,':')"/>
+    <xsl:variable name="typefreq">
+      <xsl:choose>
+        <xsl:when test="$_typefreq">
+          <xsl:value-of select="$_typefreq"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="$args"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+    <xsl:variable name="freq" select="substring-after($typefreq,'|')"/>
+    <xsl:variable name="_type" select="substring-before($typefreq,'|')"/>
     <xsl:variable name="type">
       <xsl:choose>
         <xsl:when test="$_type">
           <xsl:value-of select="$_type"/>
         </xsl:when>
         <xsl:otherwise>
-          <xsl:value-of select="$args"/>
+          <xsl:value-of select="$typefreq"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
@@ -194,6 +206,11 @@
         <xsl:attribute name="type">
           <xsl:value-of select="$type"/>
         </xsl:attribute>
+        <xsl:if test="$freq">
+          <xsl:attribute name="freq">
+            <xsl:value-of select="$freq"/>
+          </xsl:attribute>
+        </xsl:if>
         <xsl:for-each select="str:split(substring-after($args, ':'), ':')">
           <arg>
             <xsl:attribute name="value">
@@ -998,7 +1015,7 @@
   <xsl:template xmlns="http://www.w3.org/2000/svg" mode="unlink_clone" match="svg:*">
     <xsl:param name="seed"/>
     <xsl:choose>
-      <xsl:when test="@id = $hmi_elements/@id">
+      <xsl:when test="@id = $hmi_widgets/@id">
         <use>
           <xsl:attribute name="xlink:href">
             <xsl:value-of select="concat('#',@id)"/>
@@ -1228,13 +1245,25 @@
         </xsl:if>
       </xsl:for-each>
     </xsl:variable>
+    <xsl:variable name="freq">
+      <xsl:choose>
+        <xsl:when test="$widget/@freq">
+          <xsl:value-of select="$widget/@freq"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text>undefined</xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
     <xsl:text>  "</xsl:text>
     <xsl:value-of select="@id"/>
     <xsl:text>": new </xsl:text>
     <xsl:value-of select="$widget/@type"/>
     <xsl:text>Widget ("</xsl:text>
     <xsl:value-of select="@id"/>
-    <xsl:text>",[</xsl:text>
+    <xsl:text>",</xsl:text>
+    <xsl:value-of select="$freq"/>
+    <xsl:text>,[</xsl:text>
     <xsl:value-of select="$args"/>
     <xsl:text>],[</xsl:text>
     <xsl:value-of select="$indexes"/>
@@ -1424,12 +1453,14 @@
 </xsl:text>
     <xsl:text>
 </xsl:text>
-    <xsl:text>    constructor(elt_id,args,indexes,minmaxes,members){
+    <xsl:text>    constructor(elt_id, freq, args, indexes, minmaxes, members){
 </xsl:text>
     <xsl:text>        this.element_id = elt_id;
 </xsl:text>
     <xsl:text>        this.element = id(elt_id);
 </xsl:text>
+    <xsl:text>        if(freq !== undefined) this.frequency = freq;
+</xsl:text>
     <xsl:text>        this.args = args;
 </xsl:text>
     <xsl:text>        this.indexes = indexes;
@@ -2183,6 +2214,62 @@
       <xsl:text>Boolean variable</xsl:text>
     </path>
   </xsl:template>
+  <xsl:variable name="_push_button_fsm">
+    <fsm>
+      <state name="init">
+        <on-dispatch value="false">
+          <jump state="reflect_off"/>
+        </on-dispatch>
+        <on-dispatch value="true">
+          <jump state="reflect_on"/>
+        </on-dispatch>
+      </state>
+      <state name="reflect_on">
+        <show eltname="active"/>
+        <on-mouse position="down">
+          <jump state="on"/>
+        </on-mouse>
+        <on-mouse position="up">
+          <jump state="off"/>
+        </on-mouse>
+        <on-dispatch value="false">
+          <jump state="reflect_off"/>
+        </on-dispatch>
+      </state>
+      <state name="on">
+        <hmi-value value="true"/>
+        <show eltname="active"/>
+        <on-mouse position="up">
+          <jump state="off"/>
+        </on-mouse>
+        <on-dispatch value="false">
+          <jump state="reflect_off"/>
+        </on-dispatch>
+      </state>
+      <state name="reflect_off">
+        <show eltname="inactive"/>
+        <on-mouse position="down">
+          <jump state="on"/>
+        </on-mouse>
+        <on-mouse position="up">
+          <jump state="off"/>
+        </on-mouse>
+        <on-dispatch value="true">
+          <jump state="reflect_on"/>
+        </on-dispatch>
+      </state>
+      <state name="off">
+        <hmi-value value="false"/>
+        <show eltname="inactive"/>
+        <on-mouse position="down">
+          <jump state="on"/>
+        </on-mouse>
+        <on-dispatch value="true">
+          <jump state="reflect_on"/>
+        </on-dispatch>
+      </state>
+    </fsm>
+  </xsl:variable>
   <xsl:variable name="_button_fsm">
     <fsm>
       <state name="init">
@@ -2313,6 +2400,10 @@
     <xsl:value-of select="@name"/>
     <xsl:text>_action(){
 </xsl:text>
+    <xsl:text>console.log("Entering state </xsl:text>
+    <xsl:value-of select="@name"/>
+    <xsl:text>");
+</xsl:text>
     <xsl:apply-templates mode="actions" select="*"/>
     <xsl:text>    }
 </xsl:text>
@@ -2331,74 +2422,80 @@
     <xsl:text>);
 </xsl:text>
   </xsl:template>
+  <xsl:template name="generated_button_class">
+    <xsl:param name="fsm"/>
+    <xsl:text>    frequency = 5;
+</xsl:text>
+    <xsl:text>    display = "inactive";
+</xsl:text>
+    <xsl:text>    state = "init";
+</xsl:text>
+    <xsl:text>    dispatch(value) {
+</xsl:text>
+    <xsl:apply-templates mode="dispatch_transition" select="$fsm"/>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    onmouseup(evt) {
+</xsl:text>
+    <xsl:text>        svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
+</xsl:text>
+    <xsl:apply-templates mode="mouse_transition" select="$fsm">
+      <xsl:with-param name="position" select="'up'"/>
+    </xsl:apply-templates>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    onmousedown(evt) {
+</xsl:text>
+    <xsl:text>        svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
+</xsl:text>
+    <xsl:apply-templates mode="mouse_transition" select="$fsm">
+      <xsl:with-param name="position" select="'down'"/>
+    </xsl:apply-templates>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:apply-templates mode="actions" select="$fsm"/>
+    <xsl:text>    animate(){
+</xsl:text>
+    <xsl:text>        if (this.active_elt &amp;&amp; this.inactive_elt) {
+</xsl:text>
+    <xsl:for-each select="str:split('active inactive')">
+      <xsl:text>            if(this.display == "</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>")
+</xsl:text>
+      <xsl:text>                this.</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>_elt.style.display = "";
+</xsl:text>
+      <xsl:text>            else
+</xsl:text>
+      <xsl:text>                this.</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>_elt.style.display = "none";
+</xsl:text>
+    </xsl:for-each>
+    <xsl:text>        }
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+    <xsl:text>    init() {
+</xsl:text>
+    <xsl:text>        this.bound_onmouseup = this.onmouseup.bind(this);
+</xsl:text>
+    <xsl:text>        this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
+</xsl:text>
+    <xsl:text>    }
+</xsl:text>
+  </xsl:template>
   <xsl:template match="widget[@type='Button']" mode="widget_class">
     <xsl:text>class </xsl:text>
     <xsl:text>ButtonWidget</xsl:text>
     <xsl:text> extends Widget{
 </xsl:text>
     <xsl:variable name="fsm" select="exsl:node-set($_button_fsm)"/>
-    <xsl:text>    frequency = 5;
-</xsl:text>
-    <xsl:text>    display = "inactive";
-</xsl:text>
-    <xsl:text>    state = "init";
-</xsl:text>
-    <xsl:text>    dispatch(value) {
-</xsl:text>
-    <xsl:apply-templates mode="dispatch_transition" select="$fsm"/>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>    onmouseup(evt) {
-</xsl:text>
-    <xsl:text>        svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
-</xsl:text>
-    <xsl:apply-templates mode="mouse_transition" select="$fsm">
-      <xsl:with-param name="position" select="'up'"/>
-    </xsl:apply-templates>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>    onmousedown(evt) {
-</xsl:text>
-    <xsl:text>        svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
-</xsl:text>
-    <xsl:apply-templates mode="mouse_transition" select="$fsm">
-      <xsl:with-param name="position" select="'down'"/>
-    </xsl:apply-templates>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:apply-templates mode="actions" select="$fsm"/>
-    <xsl:text>    animate(){
-</xsl:text>
-    <xsl:text>        if (this.active_elt &amp;&amp; this.inactive_elt) {
-</xsl:text>
-    <xsl:for-each select="str:split('active inactive')">
-      <xsl:text>            if(this.display == "</xsl:text>
-      <xsl:value-of select="."/>
-      <xsl:text>")
-</xsl:text>
-      <xsl:text>                this.</xsl:text>
-      <xsl:value-of select="."/>
-      <xsl:text>_elt.style.display = "";
-</xsl:text>
-      <xsl:text>            else
-</xsl:text>
-      <xsl:text>                this.</xsl:text>
-      <xsl:value-of select="."/>
-      <xsl:text>_elt.style.display = "none";
-</xsl:text>
-    </xsl:for-each>
-    <xsl:text>        }
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
-    <xsl:text>    init() {
-</xsl:text>
-    <xsl:text>        this.bound_onmouseup = this.onmouseup.bind(this);
-</xsl:text>
-    <xsl:text>        this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
-</xsl:text>
-    <xsl:text>    }
-</xsl:text>
+    <xsl:call-template name="generated_button_class">
+      <xsl:with-param name="fsm" select="$fsm"/>
+    </xsl:call-template>
     <xsl:text>}
 </xsl:text>
   </xsl:template>
@@ -2412,6 +2509,28 @@
       <xsl:with-param name="mandatory" select="'no'"/>
     </xsl:call-template>
   </xsl:template>
+  <xsl:template match="widget[@type='PushButton']" mode="widget_class">
+    <xsl:text>class </xsl:text>
+    <xsl:text>PushButtonWidget</xsl:text>
+    <xsl:text> extends Widget{
+</xsl:text>
+    <xsl:variable name="fsm" select="exsl:node-set($_push_button_fsm)"/>
+    <xsl:call-template name="generated_button_class">
+      <xsl:with-param name="fsm" select="$fsm"/>
+    </xsl:call-template>
+    <xsl:text>}
+</xsl:text>
+  </xsl:template>
+  <xsl:template match="widget[@type='PushButton']" mode="widget_defs">
+    <xsl:param name="hmi_element"/>
+    <xsl:call-template name="defs_by_labels">
+      <xsl:with-param name="hmi_element" select="$hmi_element"/>
+      <xsl:with-param name="labels">
+        <xsl:text>active inactive</xsl:text>
+      </xsl:with-param>
+      <xsl:with-param name="mandatory" select="'no'"/>
+    </xsl:call-template>
+  </xsl:template>
   <xsl:template match="widget[@type='CircularBar']" mode="widget_desc">
     <type>
       <xsl:value-of select="@type"/>
@@ -8682,6 +8801,8 @@
 </xsl:text>
           <xsl:text>function send_hmi_value(index, value) {
 </xsl:text>
+          <xsl:text>    console.log("send_hmi_value("+index+", "+value+")")
+</xsl:text>
           <xsl:text>    if(index &gt; last_remote_index){
 </xsl:text>
           <xsl:text>        updates.set(index, value);
@@ -8730,9 +8851,11 @@
 </xsl:text>
           <xsl:text>function apply_hmi_value(index, new_val) {
 </xsl:text>
-          <xsl:text>    let old_val = cache[index];
-</xsl:text>
-          <xsl:text>    if(new_val != undefined &amp;&amp; old_val != new_val)
+          <xsl:text>    console.log("apply_hmi_value("+index+", "+new_val+")")
+</xsl:text>
+          <xsl:text>    /*let old_val = cache[index];*/
+</xsl:text>
+          <xsl:text>    if(new_val != undefined /*&amp;&amp; old_val != new_val*/)
 </xsl:text>
           <xsl:text>        send_hmi_value(index, new_val);
 </xsl:text>