tests/svghmi/py_ext_0@py_ext/pyfile.xml
author Edouard Tisserant <edouard.tisserant@gmail.com>
Sun, 14 Feb 2021 05:22:30 +0100
branchsvghmi
changeset 3139 1f5ca646ce6e
parent 3069 a9b03c2634c5
child 3151 8e5d383a58cb
permissions -rw-r--r--
SVGHMI: Add inhibition to widget's apply_hmi_value() so that it does not change variable more frquently than given widget's frequency. This prevents flooding network with many update if browser is producing events at high rate, as for exemple when dragging ScrollBar's cursor.
<?xml version='1.0' encoding='utf-8'?>
<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <variables>
    <variable name="AlarmNotify" type="HMI_INT"/>
    <variable name="SendAlarm" type="HMI_INT" onchange="TriggerAlarm"/>
    <variable name="AlarmText" type="HMI_STRING" initial="'POS'"/>
    <variable name="AlarmStatus" type="HMI_STRING" initial="'alarm'"/>
  </variables>
  <globals>
    <xhtml:p><![CDATA[
from twisted.web.resource import Resource
import json, time, random, collections

Alarms = []
AlarmIndex = {}
lastid = 0

def TriggerAlarm(changed_var_name):
    global Alarms, lastid
    new_entry = [time.time(), PLCGlobals.AlarmText, PLCGlobals.AlarmStatus, lastid]
    Alarms.append(new_entry)
    AlarmIndex[lastid] = new_entry
    lastid = lastid + 1
    PLCGlobals.AlarmNotify = random.randint(0, 4294967296)

class AlarmJsonResource(Resource):
    def render_GET(self, request):
        return ''

    def render_POST(self, request):
        newstr = request.content.getvalue()
        newdata = json.loads(newstr)
        args = newdata[u'args']
        range_feedback = newdata[u'range']
        slider_position = newdata[u'position']
        visible = newdata[u'visible']
        extra = newdata[u'extra']
        options = newdata[u'options']

        if len(options) == 2 :
            action, alarmid = options
            if action == "onClick[acknowledge]":
                AlarmIndex[int(alarmid)][2] = "ack"

        answer = self.renderTable(range_feedback, slider_position, visible, extra)
        janswer = json.dumps(answer)
        return janswer

    def renderTable(self, old_range, old_position, visible, extra):
        if len(extra) > 0 and extra[0] != "":
            fAlarms = [alrm for alrm in Alarms if alrm[1].find(extra[0])!=-1]
        else:
            fAlarms = Alarms
        new_range = len(fAlarms)
        delta = new_range - visible
        new_position = 0 if delta <= 0 else delta if old_position > delta else old_position
        new_visible = new_range if delta <= 0 else visible
        
        visible_alarms = []
        for ts, text, status, alarmid in fAlarms[new_position:new_position + new_visible]:
            visible_alarms.append({
                "time": time.ctime(ts),
                "text": text, # TODO translate text
                "status": status,
                "alarmid": alarmid
            })

        return new_range, new_position, visible_alarms


]]></xhtml:p>
  </globals>
  <init>
    <xhtml:p><![CDATA[
]]></xhtml:p>
  </init>
  <cleanup>
    <xhtml:p><![CDATA[
]]></xhtml:p>
  </cleanup>
  <start>
    <xhtml:p><![CDATA[

svghmi_root.putChild("alarms", AlarmJsonResource())


]]></xhtml:p>
  </start>
  <stop>
    <xhtml:p><![CDATA[
]]></xhtml:p>
  </stop>
</PyFile>