1
2
3 """Models the whole thing.
4 Process, controller and a main loop."""
5
6 import threading
7 import time
8
10 """
11 Manages the whole system.
12
13 process is the current controlled process.
14 controller is the current controller.
15
16 The whole system is executed in a separate thread.
17 The timer is also realized as separate thread.
18 """
19
20 - def __init__(self,process=None,controller=None,logger=None):
21 self.process = process
22 self.controller = controller
23 self.logger = logger
24 self.stepsize = 0.01
25 self.run = 0
26 self.run_event = threading.Event()
27 self.main_thread = threading.Thread(target=self.main_loop)
28 self.main_thread.setDaemon(1)
29 self.main_thread.start()
30 self.timer_event = threading.Event()
31 self.timer_thread = threading.Thread(target=self.timer_loop)
32 self.timer_thread.setDaemon(1)
33 self.timer_thread.start()
34
35 - def main_loop(self):
36 """Realize main control loop as separate thread, so it can be
37 running indepently of the GUI timers"""
38 input = {}
39 output = {'a':0.0}
40 while 1:
41 self.run_event.wait()
42 if not self.run:
43 self.run_event.clear()
44 try:
45 if self.process:
46 input = self.process.getStateValues(input)
47 if self.controller:
48 self.controller.calculate(input,output)
49 else:
50 output['a']=0.0
51 self.process.doStep(self.stepsize)
52 self.process.setControlValues(output)
53 if self.logger:
54 self.logger.log(input,output)
55 else:
56 self.run = 0
57 self.run_event.clear();
58 except:
59 self.run = 0
60 self.run_event.clear();
61 import traceback
62 traceback.print_exc()
63
64
65 if self.run:
66 self.timer_event.wait()
67 self.timer_event.clear()
68
70 """Realize a timer, using sleep is usually more precise
71 than using the GUI timer"""
72 while 1:
73 self.run_event.wait()
74 time.sleep(self.stepsize)
75 self.timer_event.set()
76
78 """Start the main loop."""
79 self.run = 1
80 self.run_event.set()
81
83 """Stop the main loop."""
84 self.run = 0
85 self.run_event.clear()
86
88 """Make a single step of the main loop. ( = stop after one step)"""
89 self.run = 0
90 self.run_event.set()
91