1
2 from ControlElement import ControlElement
3 from LogicalDisplaySegment import LogicalDisplaySegment, adjust_string
4 from Util import in_range
5 import Task
8 """
9 Class representing a display on the controller
10 """
11 _ascii_translations = {'0': 48,
12 '1': 49,
13 '2': 50,
14 '3': 51,
15 '4': 52,
16 '5': 53,
17 '6': 54,
18 '7': 55,
19 '8': 56,
20 '9': 57,
21 'A': 65,
22 'B': 66,
23 'C': 67,
24 'D': 68,
25 'E': 69,
26 'F': 70,
27 'G': 71,
28 'H': 72,
29 'I': 73,
30 'J': 74,
31 'K': 75,
32 'L': 76,
33 'M': 77,
34 'N': 78,
35 'O': 79,
36 'P': 80,
37 'Q': 81,
38 'R': 82,
39 'S': 83,
40 'T': 84,
41 'U': 85,
42 'V': 86,
43 'W': 87,
44 'X': 88,
45 'Y': 89,
46 'Z': 90,
47 'a': 97,
48 'b': 98,
49 'c': 99,
50 'd': 100,
51 'e': 101,
52 'f': 102,
53 'g': 103,
54 'h': 104,
55 'i': 105,
56 'j': 106,
57 'k': 107,
58 'l': 108,
59 'm': 109,
60 'n': 110,
61 'o': 111,
62 'p': 112,
63 'q': 113,
64 'r': 114,
65 's': 115,
66 't': 116,
67 'u': 117,
68 'v': 118,
69 'w': 119,
70 'x': 120,
71 'y': 121,
72 'z': 122,
73 '@': 64,
74 ' ': 32,
75 '!': 33,
76 '"': 34,
77 '.': 46,
78 ',': 44,
79 ':': 58,
80 ';': 59,
81 '?': 63,
82 '<': 60,
83 '>': 62,
84 '[': 91,
85 ']': 93,
86 '_': 95,
87 '-': 45,
88 '|': 124,
89 '&': 38,
90 '^': 94,
91 '~': 126,
92 '`': 96,
93 "'": 39,
94 '%': 37,
95 '(': 40,
96 ')': 41,
97 '/': 47,
98 '\\': 92,
99 '*': 42,
100 '+': 43}
101
102 - def __init__(self, width_in_chars = None, num_segments = 1, *a, **k):
103 super(PhysicalDisplayElement, self).__init__(*a, **k)
104 raise width_in_chars is not None or AssertionError
105 raise num_segments is not None or AssertionError
106 self._width = width_in_chars
107 self._logical_segments = []
108 self._translation_table = self._ascii_translations
109 self.set_num_segments(num_segments)
110 self._message_header = None
111 self._message_tail = None
112 self._message_part_delimiter = None
113 self._message_clear_all = None
114 self._message_to_send = None
115 self._last_sent_message = None
116 self._block_messages = False
117 self._send_message_task = self._tasks.add(Task.run(self._send_message))
118 self._send_message_task.kill()
119
123
127
128 @property
130 return len(self._logical_segments)
131
142
144 """
145 Given a sequences of data sources, divides the display into
146 the number of segments neded to accomodate them and connects
147 the logical segments to the data sources.
148 """
149 if not sources:
150 self.set_num_segments(1)
151 self.reset()
152 else:
153 self.set_num_segments(len(sources))
154 for segment, source in zip(self._logical_segments, sources):
155 segment.set_data_source(source)
156
158 raise '?' in translation_table['?'] or AssertionError
159 self._translation_table = translation_table
160
162 """
163 Takes message parts as tuples containing the sysex bytes for
164 each part of the message.
165 """
166 self._message_header = header
167 self._message_tail = tail
168 self._message_part_delimiter = delimiter
169
171 self._message_clear_all = message
172
174 if block != self._block_messages:
175 self._block_messages = block
176 self.clear_send_cache()
177
179 return self._logical_segments[index]
180
182 if not self._message_header is not None:
183 raise AssertionError
184 self._message_to_send = len(self._logical_segments) > 0 and not self._block_messages and None
185 self._request_send_message()
186
192
194 if not (self._message_clear_all is not None or self._message_header is not None):
195 raise AssertionError
196 for segment in self._logical_segments:
197 segment.set_data_source(None)
198
199 if not self._block_messages:
200 self._message_to_send = self._message_clear_all != None and self._message_clear_all
201 else:
202 self._message_to_send = self._message_header + self._translate_string(' ' * self._width) + self._message_tail
203 self._request_send_message()
204
206 if midi_bytes != self._last_sent_message:
207 ControlElement.send_midi(self, midi_bytes)
208 self._last_sent_message = midi_bytes
209
213
215 self._send_message_task.restart()
216
222
224 result = 63
225 if char_to_translate in self._translation_table.keys():
226 result = self._translation_table[char_to_translate]
227 else:
228 result = self._translation_table['?']
229 return result
230
233
235 message = self._message_header
236 for segment in self._logical_segments:
237 message += segment.position_identifier()
238 message += self._translate_string(segment.display_string())
239 if self._message_part_delimiter != None and segment != self._logical_segments[-1]:
240 message += self._message_part_delimiter
241
242 message += self._message_tail
243 self._message_to_send = message
244