Edouard@2753: Edouard@2793: Edouard@2779: Edouard@2753: Edouard@2763: Edouard@2794: Edouard@2794: Edouard@2794: Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2795: Home Edouard@2795: Edouard@2795: Edouard@2795: No Home page defined! Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2795: No page defined! Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2795: Edouard@2790: Edouard@2790: Edouard@2790: HMI_ROOT Edouard@2790: Edouard@2790: Edouard@2790: HMI_LABEL Edouard@2790: Edouard@2790: Edouard@2790: HMI_CLASS Edouard@2790: Edouard@2790: Edouard@2790: HMI_PLC_STATUS Edouard@2790: Edouard@2790: Edouard@2790: HMI_CURRENT_PAGE Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2791: Edouard@2790: Edouard@2790: Edouard@2791: Edouard@2791: Edouard@2790: Edouard@2791: Edouard@2790: Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2791: / Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2791: Edouard@2791: Edouard@2791: Edouard@2790: Edouard@2790: Edouard@2791: Edouard@2753: Edouard@2791: Edouard@2753: Edouard@2753: Edouard@2753: Edouard@2793: Edouard@2793: Made with SVGHMI. https://beremiz.org Edouard@2793: Edouard@2779: Edouard@2779: Edouard@2779: Edouard@2779: Edouard@2779: Edouard@2794: Edouard@2779: Edouard@2779: Edouard@2779: Edouard@2779: Edouard@2790: Edouard@2791: Edouard@2790: Edouard@2791: Edouard@2779: Edouard@2779: Edouard@2779: Edouard@2779: Edouard@2753: Edouard@2793: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2792: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2794: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: var hmi_index = { Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: : { Edouard@2793: Edouard@2793: name: " Edouard@2793: Edouard@2793: ", Edouard@2793: Edouard@2793: hmipath: " Edouard@2793: Edouard@2793: " Edouard@2793: Edouard@2793: ids: [ Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: " Edouard@2793: Edouard@2793: " Edouard@2793: Edouard@2793: , Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: ] Edouard@2793: Edouard@2793: } Edouard@2793: Edouard@2793: , Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: } Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: var page_desc = { Edouard@2793: Edouard@2794: Edouard@2794: Edouard@2794: " Edouard@2794: Edouard@2794: ": { Edouard@2794: Edouard@2794: id: " Edouard@2794: Edouard@2795: ", Edouard@2794: Edouard@2794: widgets: [ Edouard@2794: Edouard@2794: Edouard@2794: Edouard@2796: Edouard@2794: " Edouard@2794: Edouard@2794: " Edouard@2794: Edouard@2794: , Edouard@2794: Edouard@2794: Edouard@2794: Edouard@2794: Edouard@2794: ] Edouard@2794: Edouard@2793: Edouard@2793: } Edouard@2793: Edouard@2795: Edouard@2795: Edouard@2795: var default_page = " Edouard@2795: Edouard@2795: "; Edouard@2795: Edouard@2793: // svghmi.js Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: (function(){ Edouard@2793: Edouard@2793: // Open WebSocket to relative "/ws" address Edouard@2793: Edouard@2793: var ws = new WebSocket(window.location.href.replace(/^http(s?:\/\/[^\/]*)\/.*$/, 'ws$1/ws')); Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: // Register message reception handler Edouard@2793: Edouard@2793: ws.onmessage = function (evt) { Edouard@2793: Edouard@2793: // TODO : dispatch and cache hmi tree updates Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: var received_msg = evt.data; Edouard@2793: Edouard@2793: // TODO : check for hmitree hash header Edouard@2793: Edouard@2793: // if not matching, reload page Edouard@2793: Edouard@2793: alert("Message is received..."+received_msg); Edouard@2793: Edouard@2793: }; Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: // Once connection established Edouard@2793: Edouard@2793: ws.onopen = function (evt) { Edouard@2793: Edouard@2793: // TODO : enable the HMI (was previously offline, or just starts) Edouard@2793: Edouard@2793: // show main page Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: // TODO : prefix with hmitree hash header Edouard@2793: Edouard@2793: ws.send("test"); Edouard@2793: Edouard@2793: }; Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: var pending_updates = {}; Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: // subscription state, as it should be in hmi server Edouard@2793: Edouard@2793: // expected {index:period} Edouard@2793: Edouard@2793: const subscriptions = new Map(); Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: // subscription state as needed by widget now Edouard@2793: Edouard@2793: // expected {index:[widgets]}; Edouard@2793: Edouard@2793: var subscribers = {}; Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: // return the diff in between curently subscribed and subscription Edouard@2793: Edouard@2793: function update_subscriptions() { Edouard@2793: Edouard@2793: let delta = []; Edouard@2793: Edouard@2793: Object.keys(subscribers).forEach(index => { Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: let previous_period = subscriptions.get(index); Edouard@2793: Edouard@2793: delete subscriptions[index]; Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: let new_period = Math.min(...widgets.map(widget => widget.period)); Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: if(previous_period != new_period) Edouard@2793: Edouard@2793: delta.push({index: index, period: new_period}); Edouard@2793: Edouard@2793: }) Edouard@2793: Edouard@2793: return result; Edouard@2793: Edouard@2793: } Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: function update_value(index, value) { Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: }; Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: function switch_page(page_name) { Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: }; Edouard@2793: Edouard@2793: Edouard@2793: Edouard@2793: })(); Edouard@2793: Edouard@2792: Edouard@2792: Edouard@2782: Edouard@2783: { Edouard@2783: Edouard@2783: var path, role, name, priv; Edouard@2783: Edouard@2783: var id = " Edouard@2782: Edouard@2783: "; Edouard@2782: Edouard@2789: Edouard@2783: name = " Edouard@2783: Edouard@2783: "; Edouard@2782: Edouard@2783: Edouard@2783: /* -------------- */ Edouard@2782: Edouard@2782: Edouard@2782: Edouard@2782: Edouard@2783: /* -------------- */ Edouard@2783: Edouard@2783: res.push({ Edouard@2783: Edouard@2783: path:path, Edouard@2783: Edouard@2783: role:role, Edouard@2783: Edouard@2783: name:name, Edouard@2783: Edouard@2783: priv:priv Edouard@2783: Edouard@2783: }) Edouard@2783: Edouard@2782: } Edouard@2782: Edouard@2782: Edouard@2753: Edouard@2763: ID: Edouard@2763: Edouard@2763: x: Edouard@2763: Edouard@2763: y: Edouard@2763: Edouard@2763: w: Edouard@2763: Edouard@2763: h: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2790: Edouard@2790: Edouard@2790: = Edouard@2790: Edouard@2790: Edouard@2790: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2763: Edouard@2753: Edouard@2753: