eapi
 Alle Klassen Funktionen
gui.py
1 # -*- coding: utf-8 -*-
2 
3 """Visualisierungen für die LEDs des EAModuls.
4 
5 Dieses Paket stellt verschiedene Visualisierungen für die LEDs auf dem EAModul
6 zur Verfügung gestellt.
7 
8 Die Klasse EAModulGui visualisiert das EAModul in einem Fenster, die Klasse
9 EAModulCLI visualisiert es in der Konsole.
10 
11 Damit die Visualisierer zum Einsatz kommen können, wird ein EAModul benötigt,
12 dessen LEDs sie darstellen sollen. Daher erstellt man zunächst ein übliches
13 EAModul.
14 
15 >>> from eapi.gui import EAModulGui
16 >>> from eapi.hw import EAModul
17 
18 >>> ea = EAModul()
19 
20 Nun kann z.B. eine GUI für das EA-Modul erstellt werden. Der Aufruf ist
21 blockierend und zeigt ein Fenster mit drei LEDs (rot, gelb und grün) an.
22 
23  gui = EAModulGui(ea)
24 
25 Änderungen an den LEDs am Modul werden nun ebenfalls in der GUI dargestellt.
26 
27 Als weitere Option bietet sich eine Anzeige auf der Konsole an. Hier wird das
28 EAModul in der Klasse EAModulCLI verpackt.
29 
30 >>> ea_konsole = EAModulKonsole(ea)
31 
32 Nun würde ein Schalten der LEDs nicht nur auf dem Modul, sondern auch in der
33 Konsole angezeigt werden.
34 
35  ea.schalte_led(EAModul.LED_ROT, 1)
36 """
37 
38 from tkinter import Tk, Label, StringVar, YES, BOTH
39 from eapi.hw import EAModul
40 
41 
43  """
44  Klasse, die zum Visualisieren des EAModuls dient.
45  """
46  def __init__(self, eamodul):
47  self._ea = eamodul
48  self._ea.led_event_registrieren(EAModul.LED_ROT,
49  self._rote_led_update)
50  self._ea.led_event_registrieren(EAModul.LED_GELB,
51  self._gelbe_led_update)
52  self._ea.led_event_registrieren(EAModul.LED_GRUEN,
53  self._gruene_led_update)
54 
55  def _rote_led_update(self, neuer_wert):
56  """Die Methode wird bei Änderungen der roten LED aufgerufen und muss
57  von Unterklasse überschrieben werden."""
58  raise NotImplementedError(
59  "Muss von einer Unterklasse überschrieben werden!")
60 
61  def _gelbe_led_update(self, neuer_wert):
62  """siehe _rote_led_update"""
63  raise NotImplementedError(
64  "Muss von einer Unterklasse überschrieben werden!")
65 
66  def _gruene_led_update(self, neuer_wert):
67  """siehe _gruene_led_update"""
68  raise NotImplementedError(
69  "Muss von einer Unterklasse überschrieben werden!")
70 
71 
73  """
74  Eine GUI für ein EAModul mit zwei Tastern und drei LEDs.
75  """
76 
77  def __init__(self, eamodul):
78  """
79  Erstellt eine GUI für das gegebenen EAModul.
80  """
81  super().__init__(eamodul)
82 
83  # gui init
84  fenster = Tk()
85  fenster.title("EAModul - GUI")
86  fenster.geometry('300x300')
87 
88  # TODO entfernen, wenn nicht mehr gebraucht
89  """
90  btn_taster0 = Button(fenster, text="Taster 0",
91  command=self.__taster0_gedrueckt)
92  btn_taster0.pack()
93 
94  btn_taster1 = Button(fenster, text="Taster 1",
95  command=self.__taster1_gedrueckt)
96  btn_taster1.pack()
97  """
98 
99  # LEDs erzeugen
100  # TODO Icons statt Text verwenden
101  self.var_rot = StringVar(value="0")
102  self.lbl_led_rot = Label(fenster, textvariable=self.var_rot,
103  bg='lightgrey')
104  self.lbl_led_rot.pack(expand=YES, fill=BOTH)
105 
106  self.var_gelb = StringVar(value="0")
107  self.lbl_led_gelb = Label(fenster, textvariable=self.var_gelb,
108  bg='lightgrey')
109  self.lbl_led_gelb.pack(expand=YES, fill=BOTH)
110 
111  self.var_gruen = StringVar(value="0")
112  self.lbl_led_gruen = Label(fenster, textvariable=self.var_gruen,
113  bg='lightgrey')
114  self.lbl_led_gruen.pack(expand=YES, fill=BOTH)
115 
116  fenster.mainloop()
117 
118  def __taster0_gedrueckt(self):
119  self._ea.schalte_led(EAModul.LED_ROT, True)
120 
121  def __taster1_gedrueckt(self):
122  self._ea.schalte_led(EAModul.LED_ROT, False)
123 
124  def __farbe_fuer_ledwert(self, led_wert, default_wert):
125  """Bestimmt für den led_wert eine Farbe.
126 
127  Wenn der LED-Wert 1 ist, wird der default_wert zurückgegeben, sonst wird
128  lightgrey als Farbe verwendet."""
129 
130  if led_wert == 1:
131  return default_wert
132  else:
133  return "lightgrey"
134 
135  def _rote_led_update(self, neuer_wert):
136  self.var_rot.set(neuer_wert)
137  self.lbl_led_rot.configure(bg=self.__farbe_fuer_ledwert(neuer_wert,
138  "red"))
139 
140  def _gelbe_led_update(self, neuer_wert):
141  self.var_gelb.set(neuer_wert)
142  self.lbl_led_gelb.configure(bg=self.__farbe_fuer_ledwert(neuer_wert,
143  "yellow"))
144 
145  def _gruene_led_update(self, neuer_wert):
146  self.var_gruen.set(neuer_wert)
147  self.lbl_led_gruen.configure(bg=self.__farbe_fuer_ledwert(neuer_wert,
148  "green"))
149 
150 
152  """Eine Klasse, die die LEDs eines EAModul in der Konsole visualisiert.
153 
154  >>> ea = EAModul()
155  >>> ea_konsole = EAModulKonsole(ea)
156 
157  Wenn nun die LEDs geschaltet werden, wird dies durch eine bunte
158  Visualisierung auf der Konsole angezeigt.
159  """
160 
161  # nach http://ascii-table.com/ansi-escape-sequences.php
162  ANSI_BG_BLACK = "\033[40m"
163  ANSI_BG_RED = "\033[41m"
164  ANSI_BG_GREEN = "\033[42m"
165  ANSI_BG_YELLOW = "\033[43m"
166  ANSI_FG_BLACK = "\033[30m"
167  ANSI_FG_WHITE = "\033[37m"
168 
169  ANSI_ALL_ATTRIBUTES_OFF = "\033[0m"
170  ANSI_ERASE_DISPLAY = "\033[2J"
171  ANSI_CURSOR_HOME = "\033[;H"
172  ANSI_BOLD = "\033[1m"
173  ANSI_SAVE_CURSOR = "\033[s"
174  ANSI_RESTORE_CURSOR = "\033[u"
175 
176  def __init__(self, eamodul):
177  super().__init__(eamodul)
178 
179  self.__leds = [0, 0, 0]
180 
181  def _rote_led_update(self, neuer_wert):
182  self.__leds[0] = neuer_wert
183  self.__print_leds()
184 
185  def _gelbe_led_update(self, neuer_wert):
186  self.__leds[1] = neuer_wert
187  self.__print_leds()
188 
189  def _gruene_led_update(self, neuer_wert):
190  self.__leds[2] = neuer_wert
191  self.__print_leds()
192 
193  def __print_leds(self):
194  farbnamen = [" rot ", " gelb ", " grün "]
195  ansifarben = [self.ANSI_BG_RED, self.ANSI_BG_YELLOW, self.ANSI_BG_GREEN]
196 
197  s = self.ANSI_ERASE_DISPLAY + self.ANSI_CURSOR_HOME + \
198  "LEDs: " + self.ANSI_BOLD + self.ANSI_FG_WHITE
199 
200  for i in range(len(self.__leds)):
201 
202  if self.__leds[i] == 1:
203  s += ansifarben[i]
204  else:
205  s += self.ANSI_BG_BLACK
206 
207  s += farbnamen[i]
208 
209  s += self.ANSI_ALL_ATTRIBUTES_OFF
210 
211  print(s)
212 
213 
214 __eamodul = None
215 def __eamodul_erzeugen():
216  """Hilfsmethode, die ein EAModul erstellt, wenn noch keines vorhanden ist.
217  """
218  global __eamodul
219 
220  if __eamodul is None:
221  __eamodul = EAModul()
222 
223  return __eamodul
224 
225 
226 def demo_cli():
227  """
228  Über den Taster 0 an dem Modul kann die gelbe LED gleichzeitig auf dem
229  Board und in der Konsole geschaltet werden. Mit dem Taster 1 kann die rote
230  LED auf die gleichte Weise gesteuert werden.
231  """
232  import time
233  input(str(demo_taster.__doc__) + "\n(Enter für Start)")
234 
235  def taster0_gedrueckt(_):
236  ea = __eamodul_erzeugen()
237  ea.schalte_led(EAModul.LED_GELB, ea.taster_gedrueckt(0))
238 
239  def taster1_gedrueckt(_):
240  ea = __eamodul_erzeugen()
241  ea.schalte_led(EAModul.LED_ROT, ea.taster_gedrueckt(1))
242 
243  ea = __eamodul_erzeugen()
244  ea.taster_event_registrieren(0, taster0_gedrueckt)
245  ea.taster_event_registrieren(1, taster1_gedrueckt)
246 
247  EAModulKonsole(ea)
248 
249  try:
250  while True:
251  time.sleep(0.2)
252 
253  except KeyboardInterrupt:
254  ea.cleanup()
255 
256 
257 def demo_cli_blinken():
258  """
259  Das Demo lässt die LEDs kurz blinken und visualisiert dies zusätzlich auf
260  der Konsole.
261  """
262  import time
263 
264  input(str(demo_cli_blinken.__doc__) + "\n(Enter)")
265  ea = EAModul()
266  EAModulKonsole(ea)
267 
268  ea.schalte_led(EAModul.LED_ROT, 1)
269  time.sleep(0.5)
270  ea.schalte_led(EAModul.LED_ROT, 0)
271  time.sleep(0.5)
272  ea.schalte_led(EAModul.LED_ROT, 1)
273  time.sleep(0.5)
274  ea.schalte_led(EAModul.LED_GELB, 1)
275  time.sleep(0.5)
276  ea.schalte_led(EAModul.LED_GELB, 0)
277  time.sleep(0.5)
278  ea.schalte_led(EAModul.LED_GELB, 1)
279  time.sleep(0.5)
280  ea.schalte_led(EAModul.LED_GRUEN, 1)
281 
282  ea.cleanup()
283 
284 
285 def demo_taster():
286  """
287  Über den Taster 0 an dem Modul kann die gelbe LED gleichzeitig auf dem
288  Board und in der GUI geschaltet werden. Mit dem Taster 1 kann die rote LED
289  auf die gleichte Weise gesteuert werden.
290  """
291  input(str(demo_taster.__doc__) + "\n(Enter für Start)")
292 
293  def taster0_gedrueckt(_):
294  _ea = __eamodul_erzeugen()
295  _ea.schalte_led(EAModul.LED_GELB, ea.taster_gedrueckt(0))
296 
297  def taster1_gedrueckt(_):
298  _ea = __eamodul_erzeugen()
299  _ea.schalte_led(EAModul.LED_ROT, ea.taster_gedrueckt(1))
300 
301  ea = __eamodul_erzeugen()
302  ea.taster_event_registrieren(0, taster0_gedrueckt)
303  ea.taster_event_registrieren(1, taster1_gedrueckt)
304 
305  # GUI startet und blockiert bis zum Ende
306  EAModulGui(ea)
307 
308  ea.cleanup()
309 
310 
311 def main():
312  """
313  Hauptfunktion, die bei Start des Moduls ausgeführt wird.
314  """
315  demo = input("Welches Demo soll gestartet werden?: " +
316  "demo_taster, demo_cli, demo_cli_blinken\n")
317 
318  if demo == "demo_taster":
319  demo_taster()
320  elif demo == "demo_cli":
321  demo_cli()
322  elif demo == "demo_cli_blinken":
323  demo_cli_blinken()
324 
325 
326 if __name__ == '__main__':
327  main()
string ANSI_BG_YELLOW
Definition: gui.py:165
string ANSI_FG_WHITE
Definition: gui.py:167
string ANSI_ALL_ATTRIBUTES_OFF
Definition: gui.py:169
Definition: hw.py:1
string ANSI_ERASE_DISPLAY
Definition: gui.py:170
string ANSI_BG_BLACK
Definition: gui.py:162
string ANSI_BG_GREEN
Definition: gui.py:164
def __farbe_fuer_ledwert
Definition: gui.py:124
string ANSI_CURSOR_HOME
Definition: gui.py:171
string ANSI_BG_RED
Definition: gui.py:163