equal
deleted
inserted
replaced
1 // svghmi.js |
1 // svghmi.js |
2 |
2 |
3 var cache = hmitree_types.map(_ignored => undefined); |
3 var cache = hmitree_types.map(_ignored => undefined); |
|
4 var updates = {}; |
4 |
5 |
5 function dispatch_value_to_widget(widget, index, value, oldval) { |
6 function dispatch_value_to_widget(widget, index, value, oldval) { |
6 try { |
7 try { |
7 let idxidx = widget.indexes.indexOf(index); |
8 let idxidx = widget.indexes.indexOf(index); |
8 let d = widget.dispatch; |
9 let d = widget.dispatch; |
62 size /* size of string */ |
63 size /* size of string */ |
63 )), size + 1]; /* total increment */ |
64 )), size + 1]; /* total increment */ |
64 } |
65 } |
65 }; |
66 }; |
66 |
67 |
67 // Register message reception handler |
68 // Apply updates recieved through ws.onmessage to subscribed widgets |
|
69 // Called on requestAnimationFrame, modifies DOM |
|
70 function apply_pending_updates() { |
|
71 for(let index in updates){ |
|
72 // serving as a key, index becomes a string |
|
73 // -> pass Number(index) instead |
|
74 dispatch_value(Number(index), updates[index]); |
|
75 delete updates[index]; |
|
76 } |
|
77 } |
|
78 |
|
79 // Message reception handler |
|
80 // Hash is verified and HMI values updates resulting from binary parsing |
|
81 // are stored until browser can compute next frame, DOM is left untouched |
68 ws.onmessage = function (evt) { |
82 ws.onmessage = function (evt) { |
69 |
83 |
70 let data = evt.data; |
84 let data = evt.data; |
71 let dv = new DataView(data); |
85 let dv = new DataView(data); |
72 let i = 0; |
86 let i = 0; |
83 i += 4; |
97 i += 4; |
84 let iectype = hmitree_types[index]; |
98 let iectype = hmitree_types[index]; |
85 if(iectype != undefined){ |
99 if(iectype != undefined){ |
86 let dvgetter = dvgetters[iectype]; |
100 let dvgetter = dvgetters[iectype]; |
87 let [value, bytesize] = dvgetter(dv,i); |
101 let [value, bytesize] = dvgetter(dv,i); |
88 dispatch_value(index, value); |
102 updates[index] = value; |
89 i += bytesize; |
103 i += bytesize; |
90 } else { |
104 } else { |
91 throw new Error("Unknown index "+index) |
105 throw new Error("Unknown index "+index); |
92 } |
106 } |
93 }; |
107 }; |
|
108 // register for rendering on next frame, since there are updates |
|
109 window.requestAnimationFrame(apply_pending_updates); |
94 } catch(err) { |
110 } catch(err) { |
95 // 1003 is for "Unsupported Data" |
111 // 1003 is for "Unsupported Data" |
96 // ws.close(1003, err.message); |
112 // ws.close(1003, err.message); |
97 |
113 |
98 // TODO : remove debug alert ? |
114 // TODO : remove debug alert ? |