# HG changeset patch # User Edouard Tisserant # Date 1636023823 -3600 # Node ID a3b8cfd896480c3c695d43a57cae2f1b903d1da2 # Parent 589abe084e57cffc945f70c63cbd6f77d1fa69e7 SVGHMI: update generated XSLT diff -r 589abe084e57 -r a3b8cfd89648 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>};