--- a/svghmi/gen_index_xhtml.xslt Fri Nov 08 11:33:49 2019 +0100
+++ b/svghmi/gen_index_xhtml.xslt Fri Nov 08 11:35:01 2019 +0100
@@ -111,10 +111,10 @@
<xsl:text>none</xsl:text>
<xsl:attribute name="height">
- <xsl:text>100vh</xsl:text>
+ <xsl:text>100%</xsl:text> <xsl:attribute name="width">
- <xsl:text>100vw</xsl:text>
+ <xsl:text>100%</xsl:text> <xsl:apply-templates mode="inline_svg" select="@* | node()"/>
@@ -340,6 +340,8 @@
<xsl:text>var cache = hmitree_types.map(function(_ignored) {return undefined});
@@ -424,14 +426,6 @@
- <xsl:text>// Open WebSocket to relative "/ws" address
- <xsl:text>var ws = new WebSocket(window.location.href.replace(/^http(s?:\/\/[^\/]*)\/.*$/, 'ws$1/ws'));
- <xsl:text>ws.binaryType = 'arraybuffer';
<xsl:text>const dvgetters = {
<xsl:text> INT: [DataView.prototype.getInt16, 2],
@@ -444,86 +438,8 @@
- <xsl:text>// Register message reception handler
- <xsl:text>ws.onmessage = function (evt) {
- <xsl:text> var data = evt.data;
- <xsl:text> var dv = new DataView(data);
- <xsl:text> hmi_hash.forEach(function(hash_int) {
- <xsl:text> if(hash_int != dv.getUint8(i)){
- <xsl:text> throw new Error("Hash doesn't match");
- <xsl:text> while(i < data.byteLength){
- <xsl:text> var index = dv.getUint32(i, true);
- <xsl:text> var iectype = hmitree_types[index];
- <xsl:text> if(iectype != undefined){
- <xsl:text> var _dvgetter = dvgetters[iectype];
- <xsl:text> var dvgetter = _dvgetter[0];
- <xsl:text> var bytesize = _dvgetter[1];
- <xsl:text> var value = dvgetter.call(dv,i,true);
- <xsl:text> dispatch_value(index, value);
- <xsl:text> i += bytesize;
- <xsl:text> throw new Error("Unknown index "+index)
- <xsl:text> } catch(err) {
- <xsl:text> // 1003 is for "Unsupported Data"
- <xsl:text> // ws.close(1003, err.message);
- <xsl:text> // TODO : remove debug alert ?
- <xsl:text> alert("Error : "+err.message+"\nHMI will be reloaded.");
- <xsl:text> // force reload ignoring cache
- <xsl:text> location.reload(true);
@@ -564,7 +480,121 @@
<xsl:text>// hmitree indexed array of integers
- <xsl:text>var subscriptions = hmitree_types.map(function(_ignored) {return 0});
+ <xsl:text>var subscriptions = hmitree_types.map(function(_ignored) {return 0;}); + <xsl:text>/*! (c) Andrea Giammarchi - ISC */ + <xsl:text>var self = this || /* istanbul ignore next */ {}; + <xsl:text>try { self.Set = Set; } + <xsl:text>catch (Set) { + <xsl:text> (function (i, dPs) {'use strict'; + <xsl:text> var proto = dPs(Set.prototype, {size: { + <xsl:text> configurable: true, + <xsl:text> get: function () { + <xsl:text> return this._v.length; + <xsl:text> proto.add = function (value) { + <xsl:text> if (!has(this, value)) + <xsl:text> this._v.push(value); + <xsl:text> return this; + <xsl:text> proto.clear = function () { + <xsl:text> var length = this._v.length; + <xsl:text> this._v.splice(0, length); + <xsl:text> proto.delete = function (value) { + <xsl:text> return has(this, value) && !!this._v.splice(i, 1); + <xsl:text> proto.entries = function () { + <xsl:text> return this._v.map(pair); + <xsl:text> proto.forEach = function (callback, context) { + <xsl:text> this._v.forEach( + <xsl:text> function (value, i) { + <xsl:text> callback.call(context, value, value, this); + <xsl:text> proto.has = function (key) { + <xsl:text> return has(this, key); + <xsl:text> proto.keys = proto.values = function () { + <xsl:text> return this._v.slice(0); + <xsl:text> self.Set = Set; + <xsl:text> function Set(iterable) { + <xsl:text> dPs(this, {_v: {value: []}}); + <xsl:text> if (iterable) + <xsl:text> iterable.forEach(this.add, this); + <xsl:text> function has(self, value) { + <xsl:text> i = self._v.indexOf(value); + <xsl:text> return -1 < i; + <xsl:text> function pair(value) { + <xsl:text> return [value, value]; + <xsl:text> }(0, Object.defineProperties)); @@ -572,7 +602,9 @@
<xsl:text>// hmitree indexed array of Sets of widgets objects
- <xsl:text>var subscribers = hmitree_types.map(function(_ignored) {return new Set()});
+ <xsl:text>var subscribers = hmitree_types.map(function(_ignored) {return new Set();}); @@ -774,6 +806,12 @@
+ <xsl:text>// Open WebSocket to relative "/ws" address + <xsl:text>ws = new WebSocket(window.location.href.replace(/^http(s?:\/\/[^\/]*)\/.*$/, 'ws$1/ws')); + <xsl:text>ws.binaryType = 'arraybuffer'; <xsl:text>// Once connection established
@@ -808,6 +846,90 @@
+ <xsl:text>// Register message reception handler + <xsl:text>ws.onmessage = function (evt) { + <xsl:text> var data = evt.data; + <xsl:text> var dv = new DataView(data); + <xsl:text> hmi_hash.forEach(function(hash_int) { + <xsl:text> if(hash_int != dv.getUint8(i)){ + <xsl:text> throw new Error("Hash doesn't match"); + <xsl:text> while(i < data.byteLength){ + <xsl:text> var index = dv.getUint32(i, true); + <xsl:text> var iectype = hmitree_types[index]; + <xsl:text> if(iectype != undefined){ + <xsl:text> var _dvgetter = dvgetters[iectype]; + <xsl:text> var dvgetter = _dvgetter[0]; + <xsl:text> var bytesize = _dvgetter[1]; + <xsl:text> var value = dvgetter.call(dv,i,true); + <xsl:text> dispatch_value(index, value); + <xsl:text> i += bytesize; + <xsl:text> throw new Error("Unknown index "+index) + <xsl:text> } catch(err) { + <xsl:text> // 1003 is for "Unsupported Data" + <xsl:text> // ws.close(1003, err.message); + <xsl:text> // TODO : remove debug alert ? + <xsl:text> alert("Error : "+err.message+"\nHMI will be reloaded."); + <xsl:text> // force reload ignoring cache + <xsl:text> location.reload(true); @@ -866,7 +988,11 @@
<xsl:text> this.value_elt.textContent = String(value);
- <xsl:text> var [min,max,totallength] = this.range;
+ <xsl:text> var min = this.range[0]; + <xsl:text> var max = this.range[1]; + <xsl:text> var totallength = this.range[2]; <xsl:text> var length = Math.max(0,Math.min(totallength,(Number(value)-min)*totallength/(max-min)));
--- a/svghmi/gen_index_xhtml.ysl2 Fri Nov 08 11:33:49 2019 +0100
+++ b/svghmi/gen_index_xhtml.ysl2 Fri Nov 08 11:35:01 2019 +0100
@@ -112,8 +112,8 @@
template "svg:svg/@height", mode="inline_svg";
template "svg:svg", mode="inline_svg" xsl:copy {
attrib "preserveAspectRatio" > none
- attrib "height" > 100vh
apply "@* | node()", mode="inline_svg";
@@ -358,7 +358,9 @@
labels("value min max needle range");
| dispatch: function(value) {
| this.value_elt.textContent = String(value);
- | var [min,max,totallength] = this.range;
+ | var min = this.range[0]; + | var max = this.range[1]; + | var totallength = this.range[2]; | var length = Math.max(0,Math.min(totallength,(Number(value)-min)*totallength/(max-min)));
| var tip = this.range_elt.getPointAtLength(length);
// TODO : deal with transformations between needle and range
--- a/svghmi/svghmi.js Fri Nov 08 11:33:49 2019 +0100
+++ b/svghmi/svghmi.js Fri Nov 08 11:35:01 2019 +0100
@@ -1,5 +1,6 @@
var cache = hmitree_types.map(function(_ignored) {return undefined});
function dispatch_value_to_widget(widget, index, value, oldval) {
@@ -42,56 +43,13 @@
-// Open WebSocket to relative "/ws" address
-var ws = new WebSocket(window.location.href.replace(/^http(s?:\/\/[^\/]*)\/.*$/, 'ws$1/ws'));
-ws.binaryType = 'arraybuffer';
INT: [DataView.prototype.getInt16, 2],
BOOL: [DataView.prototype.getInt8, 1]
-// Register message reception handler
-ws.onmessage = function (evt) {
- var dv = new DataView(data);
- hmi_hash.forEach(function(hash_int) {
- if(hash_int != dv.getUint8(i)){
- throw new Error("Hash doesn't match");
- while(i < data.byteLength){
- var index = dv.getUint32(i, true);
- var iectype = hmitree_types[index];
- if(iectype != undefined){
- var _dvgetter = dvgetters[iectype];
- var dvgetter = _dvgetter[0];
- var bytesize = _dvgetter[1];
- var value = dvgetter.call(dv,i,true);
- dispatch_value(index, value);
- throw new Error("Unknown index "+index)
- // 1003 is for "Unsupported Data"
- // ws.close(1003, err.message);
- // TODO : remove debug alert ?
- alert("Error : "+err.message+"\\\\nHMI will be reloaded.");
- // force reload ignoring cache
function send_blob(data) {
@@ -112,11 +70,69 @@
// subscription state, as it should be in hmi server
// hmitree indexed array of integers
-var subscriptions = hmitree_types.map(function(_ignored) {return 0});
+var subscriptions = hmitree_types.map(function(_ignored) {return 0;}); +/*! (c) Andrea Giammarchi - ISC */ +var self = this || /* istanbul ignore next */ {}; + (function (i, dPs) {'use strict'; + var proto = dPs(Set.prototype, {size: { + proto.add = function (value) { + proto.clear = function () { + var length = this._v.length; + this._v.splice(0, length); + proto.delete = function (value) { + return has(this, value) && !!this._v.splice(i, 1); + proto.entries = function () { + return this._v.map(pair); + proto.forEach = function (callback, context) { + callback.call(context, value, value, this); + proto.has = function (key) { + proto.keys = proto.values = function () { + return this._v.slice(0); + function Set(iterable) { + dPs(this, {_v: {value: []}}); + iterable.forEach(this.add, this); + function has(self, value) { + i = self._v.indexOf(value); + }(0, Object.defineProperties)); // subscription state as needed by widget now
// hmitree indexed array of Sets of widgets objects
-var subscribers = hmitree_types.map(function(_ignored) {return new Set()});
+var subscribers = hmitree_types.map(function(_ignored) {return new Set();}); function update_subscriptions() {
@@ -217,6 +233,9 @@
+// Open WebSocket to relative "/ws" address +ws = new WebSocket(window.location.href.replace(/^http(s?:\/\/[^\/]*)\/.*$/, 'ws$1/ws')); +ws.binaryType = 'arraybuffer'; // Once connection established
ws.onopen = function (evt) {
@@ -234,3 +253,45 @@
alert("Connection closed. code:"+evt.code+" reason:"+evt.reason+" wasClean:"+evt.wasClean+".");
+// Register message reception handler +ws.onmessage = function (evt) { + var dv = new DataView(data); + hmi_hash.forEach(function(hash_int) { + if(hash_int != dv.getUint8(i)){ + throw new Error("Hash doesn't match"); + while(i < data.byteLength){ + var index = dv.getUint32(i, true); + var iectype = hmitree_types[index]; + if(iectype != undefined){ + var _dvgetter = dvgetters[iectype]; + var dvgetter = _dvgetter[0]; + var bytesize = _dvgetter[1]; + var value = dvgetter.call(dv,i,true); + dispatch_value(index, value); + throw new Error("Unknown index "+index) + // 1003 is for "Unsupported Data" + // ws.close(1003, err.message); + // TODO : remove debug alert ? + alert("Error : "+err.message+"\\\\nHMI will be reloaded."); + // force reload ignoring cache