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,stepsize=0.01,process=None,controller=None,logger=None):
21 self.process = process
22 self.controller = controller
23 self.logger = logger
24 self.stepsize = stepsize
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 independently of the GUI timers"""
38 while 1:
39 self.run_event.wait()
40 if not self.run:
41 self.run_event.clear()
42 try:
43 if self.process:
44 input = self.process.getStateValues({})
45 output = self.process.getDefaultControlValues()
46 if self.controller:
47 self.controller.calculate(input,output)
48 self.process.doStep(self.stepsize)
49 self.process.setControlValues(output)
50 if self.logger:
51 self.logger.log(input,output)
52 else:
53 self.run = 0
54 self.run_event.clear()
55 except:
56 self.run = 0
57 self.run_event.clear()
58 import traceback
59 traceback.print_exc()
60
61
62 if self.run:
63 self.timer_event.wait()
64 self.timer_event.clear()
65
67 """Realize a timer, using sleep is usually more precise
68 than using the GUI timer"""
69 while 1:
70 self.run_event.wait()
71 time.sleep(self.stepsize)
72 self.timer_event.set()
73
75 """Start the main loop."""
76 self.run = 1
77 self.run_event.set()
78
80 """Stop the main loop."""
81 self.run = 0
82 self.run_event.clear()
83
85 """Make a single step of the main loop. ( = stop after one step)"""
86 self.run = 0
87 self.run_event.set()
88