--- a/svghmi/gen_index_xhtml.xslt Thu Oct 17 15:48:09 2019 +0200
+++ b/svghmi/gen_index_xhtml.xslt Sat Oct 19 01:23:30 2019 +0200
@@ -198,10 +198,6 @@
<xsl:value-of select="$widget/@type"/>
- <xsl:text> frequency: </xsl:text>
- <xsl:apply-templates mode="refresh_frequency" select="$widget"/>
<xsl:for-each select="$widget/arg">
@@ -236,8 +232,15 @@
+ <xsl:text> element: document.getElementById("</xsl:text> + <xsl:value-of select="@id"/> + <xsl:apply-templates mode="widget_defs" select="$widget"> + <xsl:with-param name="hmi_element" select="."/> <xsl:if test="position()!=last()">
@@ -319,7 +322,43 @@
<xsl:text>function dispatch_value(index, value) {
- <xsl:text> console.log("dispatch_value("+index+", "+value+")");
+ <xsl:text> let widgets = subscribers[index]; + <xsl:text> if(widgets.size > 0) { + <xsl:text> for(let widget of widgets){ + <xsl:text> let idxidx = widget.indexes.indexOf(index); + <xsl:text> if(idxidx == -1){ + <xsl:text> throw new Error("Dispatching to widget not interested, should not happen."); + <xsl:text> let d = widget.dispatch; + <xsl:text> if(typeof(d) == "function" && idxidx == 0){ + <xsl:text> return d.call(widget,value); + <xsl:text> }else if(typeof(d) == "object" && d.length >= idxidx){ + <xsl:text> d[idxidx].call(widget,value); + <xsl:text> }/* else dispatch_0, ..., dispatch_n ? */ + <xsl:text> throw new Error("Dunno how to dispatch to widget at index = " + index); @@ -357,7 +396,7 @@
- <xsl:text> console.log("Recv something.");
+ <xsl:text> //console.log("Recv something."); @@ -365,7 +404,7 @@
<xsl:text> if(hash_int != dv.getUint8(i)){
- <xsl:text> throw new Error("Hash doesn't match")
+ <xsl:text> throw new Error("Hash doesn't match"); @@ -375,7 +414,7 @@
- <xsl:text> console.log("Recv something GOOD.");
+ <xsl:text> //console.log("Recv something GOOD."); @@ -383,7 +422,7 @@
<xsl:text> let index = dv.getUint32(i, true);
- <xsl:text> console.log("Recv something index is "+index);
+ <xsl:text> //console.log("Recv something index is "+index); @@ -722,16 +761,30 @@
- <xsl:template mode="refresh_frequency" match="widget">
- <xsl:text>10</xsl:text>
- <xsl:template mode="refresh_frequency" match="widget[@type='Meter']">
- <xsl:text>10</xsl:text>
+ <xsl:template mode="widget_defs" match="widget[@type='Display']"> + <xsl:param name="hmi_element"/> + <xsl:text>frequency: 5, + <xsl:text>dispatch: function(value) { + <xsl:when test="$hmi_element[self::svg:text]"> + <xsl:text> this.element.textContent = String(value); + <xsl:message terminate="yes">Display widget as a group not implemented</xsl:message> - <xsl:template mode="refresh_frequency" match="widget[@type='Display']">
+ <xsl:template mode="widget_defs" match="widget[@type='Meter']"> + <xsl:text> frequency: 10, - <xsl:template mode="refresh_frequency" match="widget[@type='Input']">
+ <xsl:template mode="widget_defs" match="widget[@type='Input']"> + <xsl:text> frequency: 5, --- a/svghmi/gen_index_xhtml.ysl2 Thu Oct 17 15:48:09 2019 +0200
+++ b/svghmi/gen_index_xhtml.ysl2 Sat Oct 19 01:23:30 2019 +0200
@@ -191,7 +191,6 @@
const "widget", "func:parselabel(@inkscape:label)/widget";
| type: "«$widget/@type»",
- | frequency: `apply "$widget", mode="refresh_frequency"`,
| "«@value»"`if "position()!=last()" > ,`
@@ -204,7 +203,9 @@
error > No match for HMI «$hmipath»;
| «$hmitree_match/@index»`if "position()!=last()" > ,`
+ | element: document.getElementById("«@id»"), + apply "$widget", mode="widget_defs" with "hmi_element","."; | }`if "position()!=last()" > ,`
@@ -306,8 +307,33 @@
- template "widget", mode="refresh_frequency" > 10
+ template "widget[@type='Display']", mode="widget_defs" { + | dispatch: function(value) { + when "$hmi_element[self::svg:text]"{ + // TODO : care about <tspan> ? + | this.element.textContent = String(value); + error "Display widget as a group not implemented"; + template "widget[@type='Meter']", mode="widget_defs" { + template "widget[@type='Input']", mode="widget_defs" { + // | frequency: 10`apply ".", mode="refresh_frequency"`, + // template "widget", mode="refresh_frequency" > 10 template "widget[@type='Meter']", mode="refresh_frequency" > 10
template "widget[@type='Display']", mode="refresh_frequency" > 5
template "widget[@type='Input']", mode="refresh_frequency" > 5
--- a/svghmi/svghmi.js Thu Oct 17 15:48:09 2019 +0200
+++ b/svghmi/svghmi.js Sat Oct 19 01:23:30 2019 +0200
@@ -1,7 +1,25 @@
function dispatch_value(index, value) {
- console.log("dispatch_value("+index+", "+value+")");
+ let widgets = subscribers[index]; + for(let widget of widgets){ + let idxidx = widget.indexes.indexOf(index); + throw new Error("Dispatching to widget not interested, should not happen."); + let d = widget.dispatch; + if(typeof(d) == "function" && idxidx == 0){ + return d.call(widget,value); + }else if(typeof(d) == "object" && d.length >= idxidx){ + d[idxidx].call(widget,value); + }/* else dispatch_0, ..., dispatch_n ? */ + throw new Error("Dunno how to dispatch to widget at index = " + index); // Open WebSocket to relative "/ws" address
@@ -23,14 +41,13 @@
for(let hash_int of hmi_hash) {
if(hash_int != dv.getUint8(i)){
- throw new Error("Hash doesn't match")
+ throw new Error("Hash doesn't match"); while(i < data.byteLength){
let index = dv.getUint32(i, true);
- console.log("Recv something index is "+index);
let iectype = hmitree_types[index];
if(iectype != undefined){