-
Notifications
You must be signed in to change notification settings - Fork 1
/
display.py
131 lines (107 loc) · 3.73 KB
/
display.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import time
from threading import Timer
from abstractscreen import AbstractScreen
from cdinfoscreen import CDInfoScreen
from cdplayingcreen import CDPlayingScreen
from errorscreen import ErrorScreen
from infoscreen import InfoScreen
from outputwriter import OutputWriter
from radioscreen import RadioScreen
from serialwriter import SerialWriter
from volumescreen import VolumeScreen
VOL_TIMEOUT = 1
"""
socat -d -d pty,raw,echo=0 pty,raw,echo=0
cat < /dev/pts/3
echo "S" > /dev/pts/3
Pri kazde zmene libovolneho prvku posle cely seznam pres seriovy port,
aby se pri prvnim volani nastavilo vsechno a kdykoliv se to mohlo zesynchronizovat
Arduino se samo rozhodne, co zmeni (bude si take udrzovat seznam prvku)
blokovane cteni v hlavnim vlakne v control.py
"""
# singletons
RADIO_SCR = RadioScreen()
CD_INFO_SCR = CDInfoScreen()
CD_PLAYING_SCR = CDPlayingScreen()
ERROR_SCR = ErrorScreen()
INFO_SCR = InfoScreen()
VOLUME_SCR = VolumeScreen()
class Display:
def __init__(self, ser=None):
self.__timer = None
if ser is not None:
self.__writer = SerialWriter(ser)
else:
self.__writer = OutputWriter()
self.__writer.start()
time.sleep(.1)
self.__screen = INFO_SCR
def close(self):
self.__writer.stop()
# the writer thread locks up at joining, therefore the timeout has to be specified
self.__writer.join(0.1)
if self.__timer is not None:
self.__close_timer()
def __del__(self):
self.close()
def getScreen(self) -> AbstractScreen:
return self.__screen
def setRadioScreen(self):
RADIO_SCR.copyFrom(self.__screen)
# print("RADIO: copying from " + str(self.__screen))
# print("has cd: " + str(self.__screen.cdAvailable))
# print("")
self.__screen = RADIO_SCR
def setCDPlayingScreen(self):
CD_PLAYING_SCR.copyFrom(self.__screen)
self.__screen = CD_PLAYING_SCR
def showScreen(self):
# print("Showing screen " + str(self.__screen))
# print("has cd: " + str(self.__screen.cdAvailable))
# print("")
self.__writer.output(self.__screen)
def showCDInfo(self, text: str):
CD_INFO_SCR.copyFrom(self.__screen)
self.__screen = CD_INFO_SCR
self.__screen.setText(text)
self.showScreen()
def showError(self, message: str):
ERROR_SCR.copyFrom(self.__screen)
self.__screen = ERROR_SCR
self.__screen.setText(message)
self.showScreen()
def showInfo(self, message: str):
INFO_SCR.copyFrom(self.__screen)
self.__screen = INFO_SCR
self.__screen.setText(message)
self.showScreen()
def showVolume(self, volume: int):
self.__activate_timer()
# filling the volume screen
VOLUME_SCR.copyFrom(self.__screen)
# print("VOLUME: copying from " + str(self.__screen))
# print("has cd: " + str(self.__screen.cdAvailable))
# print("")
VOLUME_SCR.setVolume(volume)
# displaying without changing the main screen
self.__writer.output(VOLUME_SCR)
def __activate_timer(self):
if self.__timer is None:
self.__start_timer()
else:
if self.__timer.is_alive():
# cancel and reschedule
self.__close_timer()
# new timer
self.__start_timer()
def __start_timer(self):
self.__timer = Timer(VOL_TIMEOUT, self.__timer_finished)
self.__timer.setDaemon(True)
self.__timer.start()
def __close_timer(self):
self.__timer.cancel()
self.__timer.join()
def __timer_finished(self):
# just showing the main screen
self.showScreen()
self.__timer = None