# HG changeset patch # User Edouard Tisserant <edouard.tisserant@gmail.com> # Date 1609253610 -3600 # Node ID 677764fba71d1f36b564250840315401aec9f9e9 # Parent abb487b56911727e16c1e622fd084476d75a73b6 SVGHMI: Update generated xslt diff -r abb487b56911 -r 677764fba71d svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Tue Dec 29 15:39:48 2020 +0100 +++ b/svghmi/gen_index_xhtml.xslt Tue Dec 29 15:53:30 2020 +0100 @@ -59,26 +59,6 @@ </xsl:text> <xsl:text> </xsl:text> - <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:value-of select="substring(local-name(), 5)"/> - <xsl:text> */ "</xsl:text> - <xsl:value-of select="@hmipath"/> - <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> @@ -978,35 +958,50 @@ <xsl:text>" in HMI tree</xsl:text> </xsl:message> <xsl:text>undefined</xsl:text> - <xsl:if test="position()!=last()"> - <xsl:text>,</xsl:text> - </xsl:if> </xsl:when> <xsl:when test="@type = 'PAGE_LOCAL'"> <xsl:text>"</xsl:text> <xsl:value-of select="@value"/> <xsl:text>"</xsl:text> - <xsl:if test="position()!=last()"> - <xsl:text>,</xsl:text> - </xsl:if> </xsl:when> <xsl:when test="@type = 'HMI_LOCAL'"> <xsl:text>hmi_local_index("</xsl:text> <xsl:value-of select="@value"/> <xsl:text>")</xsl:text> - <xsl:if test="position()!=last()"> - <xsl:text>,</xsl:text> - </xsl:if> </xsl:when> + <xsl:otherwise> + <xsl:message terminate="yes"> + <xsl:text>Internal error while processing widget's non indexed HMI tree path : unknown type</xsl:text> + </xsl:message> + </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="@index"/> - <xsl:if test="position()!=last()"> - <xsl:text>,</xsl:text> - </xsl:if> </xsl:otherwise> </xsl:choose> + <xsl:if test="position()!=last()"> + <xsl:text>,</xsl:text> + </xsl:if> + </xsl:for-each> + </xsl:variable> + <xsl:variable name="minmaxes"> + <xsl:for-each select="$widget/path"> + <xsl:choose> + <xsl:when test="@min and @max"> + <xsl:text>[</xsl:text> + <xsl:value-of select="@min"/> + <xsl:text>,</xsl:text> + <xsl:value-of select="@max"/> + <xsl:text>]</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:text>undefined</xsl:text> + </xsl:otherwise> + </xsl:choose> + <xsl:if test="position()!=last()"> + <xsl:text>,</xsl:text> + </xsl:if> </xsl:for-each> </xsl:variable> <xsl:text> "</xsl:text> @@ -1019,6 +1014,8 @@ <xsl:value-of select="$args"/> <xsl:text>],[</xsl:text> <xsl:value-of select="$indexes"/> + <xsl:text>],[</xsl:text> + <xsl:value-of select="$minmaxes"/> <xsl:text>],{ </xsl:text> <xsl:apply-templates mode="widget_defs" select="$widget"> @@ -1178,7 +1175,7 @@ </xsl:text> <xsl:text> </xsl:text> - <xsl:text> constructor(elt_id,args,indexes,members){ + <xsl:text> constructor(elt_id,args,indexes,minmaxes,members){ </xsl:text> <xsl:text> this.element_id = elt_id; </xsl:text> @@ -1188,6 +1185,8 @@ </xsl:text> <xsl:text> this.indexes = indexes; </xsl:text> + <xsl:text> this.minmaxes = minmaxes; +</xsl:text> <xsl:text> Object.keys(members).forEach(prop => this[prop]=members[prop]); </xsl:text> <xsl:text> } @@ -1276,8 +1275,6 @@ </xsl:text> <xsl:text> if(typeof(index) == "string"){ </xsl:text> - <xsl:text> /* XXX return index as path */ -</xsl:text> <xsl:text> index = page_local_index(index, this.container_id); </xsl:text> <xsl:text> } else { @@ -1288,8 +1285,6 @@ </xsl:text> <xsl:text> } </xsl:text> - <xsl:text> /* XXX check for hmi_paths and return path */ -</xsl:text> <xsl:text> } </xsl:text> <xsl:text> return index; @@ -1298,6 +1293,54 @@ </xsl:text> <xsl:text> </xsl:text> + <xsl:text> overshot(new_val, max) { +</xsl:text> + <xsl:text> // TODO: use a Toast +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> undershot(new_val, min) { +</xsl:text> + <xsl:text> // TODO: use a Toast +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> clip_min_max(index, new_val) { +</xsl:text> + <xsl:text> let minmax = this.minmaxes[index]; +</xsl:text> + <xsl:text> if(minmax !== undefined && typeof new_val == "number") { +</xsl:text> + <xsl:text> let [min,max] = minmax; +</xsl:text> + <xsl:text> if(new_val < min){ +</xsl:text> + <xsl:text> this.undershot(new_val, min); +</xsl:text> + <xsl:text> return min; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> if(new_val > max){ +</xsl:text> + <xsl:text> this.overshot(new_val, max); +</xsl:text> + <xsl:text> return max; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> return new_val; +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> <xsl:text> change_hmi_value(index, opstr) { </xsl:text> <xsl:text> let realindex = this.get_variable_index(index); @@ -1308,6 +1351,8 @@ </xsl:text> <xsl:text> let new_val = eval_operation_string(old_val, opstr); </xsl:text> + <xsl:text> new_val = this.clip_min_max(index, new_val); +</xsl:text> <xsl:text> return apply_hmi_value(realindex, new_val); </xsl:text> <xsl:text> } @@ -1320,6 +1365,8 @@ </xsl:text> <xsl:text> if(realindex == undefined) return undefined; </xsl:text> + <xsl:text> new_val = this.clip_min_max(index, new_val); +</xsl:text> <xsl:text> return apply_hmi_value(realindex, new_val); </xsl:text> <xsl:text> } @@ -4068,6 +4115,30 @@ </xsl:text> <xsl:text> } </xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> overshot(new_val, max) { +</xsl:text> + <xsl:text> this.last_display = "max: "+max; +</xsl:text> + <xsl:text> this.request_animate(); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> undershot(new_val, min) { +</xsl:text> + <xsl:text> this.last_display = "min: "+min; +</xsl:text> + <xsl:text> this.request_animate(); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> +</xsl:text> <xsl:text> } </xsl:text> </xsl:template> @@ -4116,11 +4187,21 @@ </xsl:text> </xsl:if> <xsl:if test="$have_value"> - <xsl:text> this.value_elt.textContent = String(value); + <xsl:text> this.last_display = value; +</xsl:text> + <xsl:text> this.request_animate(); </xsl:text> </xsl:if> <xsl:text> }, </xsl:text> + <xsl:if test="$have_value"> + <xsl:text> animate: function(){ +</xsl:text> + <xsl:text> this.value_elt.textContent = String(this.last_display); +</xsl:text> + <xsl:text> }, +</xsl:text> + </xsl:if> <xsl:text> init: function() { </xsl:text> <xsl:if test="$have_edit"> @@ -5139,7 +5220,7 @@ </xsl:text> <xsl:text> } </xsl:text> - <xsl:text> if(this.shift != this._shift){ + <xsl:text> if(this.Shift_sub && this.shift != this._shift){ </xsl:text> <xsl:text> this._shift = this.shift; </xsl:text> @@ -5147,7 +5228,7 @@ </xsl:text> <xsl:text> } </xsl:text> - <xsl:text> if(this.caps != this._caps){ + <xsl:text> if(this.CapsLock_sub && this.caps != this._caps){ </xsl:text> <xsl:text> this._caps = this.caps; </xsl:text>