7 <variable name="AlarmStatus" type="HMI_STRING" initial="'alarm'"/> |
7 <variable name="AlarmStatus" type="HMI_STRING" initial="'alarm'"/> |
8 </variables> |
8 </variables> |
9 <globals> |
9 <globals> |
10 <xhtml:p><![CDATA[ |
10 <xhtml:p><![CDATA[ |
11 from twisted.web.resource import Resource |
11 from twisted.web.resource import Resource |
12 import json, time, random |
12 import json, time, random, collections |
13 |
13 |
14 Alarms = [] |
14 Alarms = [] |
|
15 AlarmIndex = {} |
|
16 lastid = 0 |
15 |
17 |
16 def TriggerAlarm(changed_var_name): |
18 def TriggerAlarm(changed_var_name): |
17 global Alarms |
19 global Alarms, lastid |
18 Alarms.append((time.time(), PLCGlobals.AlarmText, PLCGlobals.AlarmStatus)) |
20 new_entry = [time.time(), PLCGlobals.AlarmText, PLCGlobals.AlarmStatus, lastid] |
|
21 Alarms.append(new_entry) |
|
22 AlarmIndex[lastid] = new_entry |
|
23 lastid = lastid + 1 |
19 PLCGlobals.AlarmNotify = random.randint(0, 4294967296) |
24 PLCGlobals.AlarmNotify = random.randint(0, 4294967296) |
20 |
25 |
21 class AlarmJsonResource(Resource): |
26 class AlarmJsonResource(Resource): |
22 def render_GET(self, request): |
27 def render_GET(self, request): |
23 return '' |
28 return '' |
24 |
29 |
25 def render_POST(self, request): |
30 def render_POST(self, request): |
26 newstr = request.content.getvalue() |
31 newstr = request.content.getvalue() |
27 newdata = json.loads(newstr) |
32 newdata = json.loads(newstr) |
28 print newdata |
|
29 vars = newdata[u'vars'] |
33 vars = newdata[u'vars'] |
30 args = newdata[u'args'] |
34 args = newdata[u'args'] |
31 visible = newdata[u'visible'] |
35 visible = newdata[u'visible'] |
|
36 options = newdata[u'options'] |
|
37 |
|
38 if len(options) == 2 : |
|
39 action, alarmid = options |
|
40 if action == "onClick[acknowledge]": |
|
41 AlarmIndex[int(alarmid)][2] = "ack" |
|
42 |
32 svars = (vars + [0,0])[:3] |
43 svars = (vars + [0,0])[:3] |
33 range_feedback = svars[1] |
44 range_feedback = svars[1] |
34 slider_position = svars[2] |
45 slider_position = svars[2] |
35 answer = self.renderTable(range_feedback, slider_position, visible, *(args+svars[3:])) |
46 answer = self.renderTable(range_feedback, slider_position, visible, *(args+svars[3:])) |
36 janswer = json.dumps(answer) |
47 janswer = json.dumps(answer) |
37 print janswer |
|
38 return janswer |
48 return janswer |
39 |
49 |
40 def renderTable(self, old_range, old_position, visible, *options): |
50 def renderTable(self, old_range, old_position, visible, *options): |
41 new_range = len(Alarms) |
51 new_range = len(Alarms) |
42 delta = new_range - visible |
52 delta = new_range - visible |
43 new_position = 0 if delta <= 0 else delta if old_position > delta else old_position |
53 new_position = 0 if delta <= 0 else delta if old_position > delta else old_position |
44 new_visible = new_range if delta <= 0 else visible |
54 new_visible = new_range if delta <= 0 else visible |
45 |
55 |
46 visible_alarms = [] |
56 visible_alarms = [] |
47 for ts, text, status in Alarms[new_position:new_position + new_visible]: |
57 for ts, text, status, alarmid in Alarms[new_position:new_position + new_visible]: |
48 visible_alarms.append({ |
58 visible_alarms.append({ |
49 "time": time.ctime(ts), |
59 "time": time.ctime(ts), |
50 "text": text, # TODO translate text |
60 "text": text, # TODO translate text |
51 "status": status |
61 "status": status, |
|
62 "alarmid": alarmid |
52 }) |
63 }) |
53 |
64 |
54 return new_range, new_position, visible_alarms |
65 return new_range, new_position, visible_alarms |
55 |
66 |
56 |
67 |