svghmi/svghmi.js
branchsvghmi
changeset 2859 517583e21bfd
parent 2850 e38654ec6281
child 2860 b7650c6abeda
equal deleted inserted replaced
2858:39c8d6079f0f 2859:517583e21bfd
     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 ?