1 #include "LEDCtrl.h"
2
3 typedef struct {
4 char Character ;
5 int Values[LED_VALUES_PER_CHARACTER] ;
6 } LEDCharacter ;
7
8
9 // Initialization of each character LED
10 static LEDCharacter LEDDefinition [] =
11 {
12 { ' ', 0, 0, 0, 0, 0, 0, 0 },
13 { '!', 4, 4, 4, 4, 4, 0, 4 },
14 { '"', 10, 10, 0, 0, 0, 0, 0 },
15 { '#', 10, 10, 31, 10, 31, 10, 10 },
16 { '$', 4, 14, 16, 14, 1, 14, 4 },
17 { '%', 1, 9, 2, 4, 8, 18, 16 },
18 { '&', 12, 18, 18, 12, 19, 18, 13 },
19 { '\'', 24, 8, 8, 0, 0, 0, 0 },
20 { '(', 2, 4, 8, 8, 8, 4, 2 },
21 { ')', 8, 4, 2, 2, 2, 4, 8 },
22 { '*', 0, 4, 21, 14, 21, 4, 0 },
23 { '+', 0, 4, 4, 31, 4, 4, 0 },
24 { ',', 0, 0, 0, 0, 8, 8, 16 },
25 { '-', 0, 0, 0, 14, 0, 0, 0 },
26 { '.', 0, 0, 0, 0, 0, 0, 16 },
27 { '/', 1, 1, 2, 4, 8, 16, 16 },
28 { '0', 14, 17, 19, 21, 25, 17, 14 },
29 { '1', 4, 12, 20, 4, 4, 4, 14 },
30 { '2', 14, 17, 1, 2, 4, 8, 31 },
31 { '3', 14, 17, 1, 14, 1, 17, 14 },
32 { '4', 2, 6, 10, 18, 31, 2, 2 },
33 { '5', 31, 16, 16, 14, 1, 1, 30 },
34 { '6', 6, 8, 16, 30, 17, 17, 14 },
35 { '7', 31, 1, 2, 4, 8, 8, 8 },
36 { '8', 14, 17, 17, 14, 17, 17, 14 },
37 { '9', 14, 17, 17, 15, 1, 1, 14 },
38 { ':', 0, 0, 16, 0, 16, 0, 0 },
39 { ';', 0, 0, 8, 0, 8, 8, 16 },
40 { '<', 0, 2, 4, 8, 4, 2, 0 },
41 { '=', 0, 0, 31, 0, 31, 0, 0 },
42 { '>', 0, 8, 4, 2, 4, 8, 0 },
43 { '?', 14, 17, 1, 2, 4, 0, 4 },
44 { '@', 14, 17, 23, 21, 23, 16, 14 },
45 { 'A', 14, 17, 17, 17, 31, 17, 17 },
46 { 'B', 30, 17, 17, 30, 17, 17, 30 },
47 { 'C', 14, 17, 16, 16, 16, 17, 14 },
48 { 'D', 28, 18, 17, 17, 17, 18, 28 },
49 { 'E', 31, 16, 16, 30, 16, 16, 31 },
50 { 'F', 31, 16, 16, 30, 16, 16, 16 },
51 { 'G', 14, 17, 16, 23, 17, 17, 14 },
52 { 'H', 17, 17, 17, 31, 17, 17, 17 },
53 { 'I', 14, 4, 4, 4, 4, 4, 14 },
54 { 'J', 7, 2, 2, 2, 2, 18, 12 },
55 { 'K', 17, 18, 20, 24, 20, 18, 17 },
56 { 'L', 16, 16, 16, 16, 16, 16, 31 },
57 { 'M', 17, 27, 21, 21, 17, 17, 17 },
58 { 'N', 17, 25, 21, 19, 17, 17, 17 },
59 { 'O', 14, 17, 17, 17, 17, 17, 14 },
60 { 'P', 30, 17, 17, 30, 16, 16, 16 },
61 { 'Q', 14, 17, 17, 17, 21, 14, 1 },
62 { 'R', 30, 17, 17, 30, 20, 18, 17 },
63 { 'S', 14, 17, 16, 14, 1, 17, 14 },
64 { 'T', 31, 4, 4, 4, 4, 4, 4 },
65 { 'U', 17, 17, 17, 17, 17, 17, 14 },
66 { 'V', 17, 17, 17, 17, 17, 10, 4 },
67 { 'W', 17, 17, 17, 21, 21, 27, 17 },
68 { 'X', 17, 17, 10, 4, 10, 17, 17 },
69 { 'Y', 17, 17, 10, 4, 4, 4, 4 },
70 { 'Z', 31, 1, 2, 4, 8, 16, 31 },
71 { '[', 14, 8, 8, 8, 8, 8, 14 },
72 { '\\', 0, 16, 8, 4, 2, 1, 0 },
73 { ']', 14, 2, 2, 2, 2, 2, 14 },
74 { '^', 4, 10, 0, 0, 0, 0, 0 },
75 { '_', 0, 0, 0, 0, 0, 0, 31 },
76 { '`', 8, 4, 0, 0, 0, 0, 0 },
77 { 'a', 0, 0, 14, 1, 15, 17, 15 },
78 { 'b', 16, 16, 30, 17, 17, 17, 30 },
79 { 'c', 0, 0, 15, 16, 16, 16, 15 },
80 { 'd', 1, 1, 15, 17, 17, 17, 15 },
81 { 'e', 0, 0, 14, 17, 31, 16, 14 },
82 { 'f', 6, 8, 8, 28, 8, 8, 8 },
83 { 'g', 0, 14, 17, 17, 15, 1, 14 },
84 { 'h', 16, 16, 22, 25, 17, 17, 17 },
85 { 'i', 4, 0, 12, 4, 4, 4, 14 },
86 { 'j', 2, 0, 6, 2, 2, 10, 4 },
87 { 'k', 16, 16, 18, 20, 24, 20, 18 },
88 { 'l', 12, 4, 4, 4, 4, 4, 14 },
89 { 'm', 0, 0, 26, 21, 21, 21, 21 },
90 { 'n', 0, 0, 22, 25, 17, 17, 17 },
91 { 'o', 0, 0, 14, 17, 17, 17, 14 },
92 { 'p', 0, 0, 28, 18, 18, 28, 16 },
93 { 'q', 0, 0, 14, 18, 18, 14, 2 },
94 { 'r', 0, 0, 22, 24, 16, 16, 16 },
95 { 's', 0, 0, 14, 16, 14, 1, 14 },
96 { 't', 8, 8, 28, 8, 8, 10, 4 },
97 { 'u', 0, 0, 17, 17, 17, 17, 14 },
98 { 'v', 0, 0, 17, 17, 17, 10, 4 },
99 { 'w', 0, 0, 17, 17, 21, 21, 10 },
100 { 'x', 0, 0, 17, 10, 4, 10, 17 },
101 { 'y', 0, 0, 17, 10, 4, 4, 4 },
102 { 'z', 0, 0, 31, 2, 4, 8, 31 },
103 { '{', 2, 4, 4, 8, 4, 4, 2 },
104 { '|', 4, 4, 4, 4, 4, 4, 4 },
105 { '}', 8, 4, 4, 2, 4, 4, 8 },
106 { '�', 4, 10, 4, 0, 0, 0, 0 },
107 { '~', 0, 0, 8, 21, 2, 0, 0 },
108 { '�', 0, 10, 0, 0, 0, 0, 0 }
109 };
110
111
112 // Classe LEDCtrl
LEDCtrl()113 LEDCtrl::LEDCtrl()
114 {
115 InitializeLEDSet( ) ;
116 DisplayedString = "" ;
117 CharNumber = 0 ;
118 OneLEDSize = 2 ;
119 FgLightOnColor = LtRed ;
120 FgLightOffColor = Black ;
121 BgColor = Black ;
122 PosX = 0 ;
123 PosY = 0 ;
124 }
125
126
LEDCtrl(String Value,int OneLEDSize,Color FgLightOnColor,Color FgLightOffColor,Color BgColor)127 LEDCtrl::LEDCtrl( String Value,
128 int OneLEDSize, // 2 pixels for one LED
129 Color FgLightOnColor,
130 Color FgLightOffColor,
131 Color BgColor ) : OneLEDSize(OneLEDSize), FgLightOnColor(FgLightOnColor),
132 FgLightOffColor(FgLightOffColor), BgColor(BgColor)
133 {
134 InitializeLEDSet( ) ;
135
136 DisplayedString = Value ;
137 CharNumber = DisplayedString.GetLength( ) ;
138 PosX = 0 ;
139 PosY = 0 ;
140 }
141
SetString(String Value)142 LEDCtrl& LEDCtrl::SetString( String Value ) {
143 DisplayedString = Value ;
144 CharNumber = DisplayedString.GetLength( ) ;
145 return *this;
146 }
147
~LEDCtrl()148 LEDCtrl::~LEDCtrl()
149 {
150 LEDSet.Clear( ) ;
151 UnknownLED.Clear( ) ;
152 }
153
154
InitializeLEDSet()155 void LEDCtrl::InitializeLEDSet( )
156 {
157 int TabSize = sizeof( LEDDefinition ) / sizeof( LEDCharacter ) ;
158 LEDSet.Clear( ) ;
159 for( int Index = 0 ; Index < TabSize ; Index++ )
160 {
161 Array<int> IntTab ;
162 for( int Line = 0 ; Line < LED_VALUES_PER_CHARACTER ; Line++ )
163 {
164 IntTab.Add( LEDDefinition [Index].Values [Line] ) ;
165 }
166 LEDSet.Add( Format( "%c", LEDDefinition [Index].Character ), IntTab ) ;
167 }
168 // And also for one unkonwn character
169 for( int Line = 0 ; Line < LED_VALUES_PER_CHARACTER ; Line++ )
170 {
171 UnknownLED.Add( 31 ) ; // All LEDs light on
172 }
173
174 return ;
175 }
176
177
DecomposeLine(int Value)178 Array<bool> LEDCtrl::DecomposeLine( int Value )
179 {
180 Array<bool> TheDigits ;
181
182 TheDigits.Clear( ) ;
183 TheDigits.Add( ( ( Value & 16 ) >> 4 ) ) ;
184 TheDigits.Add( ( ( Value & 8 ) >> 3 ) ) ;
185 TheDigits.Add( ( ( Value & 4 ) >> 2 ) ) ;
186 TheDigits.Add( ( ( Value & 2 ) >> 1 ) ) ;
187 TheDigits.Add( ( ( Value & 1 ) >> 0 ) ) ;
188
189 return TheDigits ;
190 }
191
192
Paint(Draw & w)193 void LEDCtrl::Paint( Draw& w )
194 {
195 int IndX, IndY ;
196 int Depl ;
197 int UpPosX, UpPosY ;
198 int BottomPosX, BottomPosY ;
199 Color ColorOn, ColorOff ;
200 Array<int> TheChar ;
201 Array<bool> TheDigits ;
202
203
204 Size sz = GetSize();
205 w.DrawRect(0, 0, sz.cx, sz.cy, BgColor);
206
207 if( DisplayedString.GetLength( ) == 0 )
208 {
209 return ;
210 }
211
212 Depl = 5 ;
213 for( int Index = 0 ; Index < CharNumber ; Index++ )
214 {
215 IndY = 0 ;
216 // <<= seems to copy the Array<int>, else = "core". Why ?
217 TheChar <<= LEDSet.Get( Format( "%c", DisplayedString [ Index ] ), UnknownLED ) ;
218 for( int Line = 0 ; Line < LED_VALUES_PER_CHARACTER ; Line++ )
219 {
220 TheDigits = DecomposeLine( TheChar [Line] ) ;
221 IndX = 0 ;
222 for( int Value = 0 ; Value < TheDigits.GetCount( ) ; Value++ )
223 {
224 UpPosX = Depl + IndX ;
225 UpPosY = OneLEDSize * IndY + 4 ;
226 BottomPosX = UpPosX + OneLEDSize ;
227 BottomPosY = UpPosY + OneLEDSize ;
228
229 if( TheDigits [Value] == true )
230 {
231 ColorOn = FgLightOnColor ;
232 ColorOff = FgLightOffColor ;
233 }
234 else
235 {
236 ColorOn = FgLightOffColor ;
237 ColorOff = BgColor ;
238 }
239 w.DrawRect(UpPosX, UpPosY, OneLEDSize, OneLEDSize, ColorOn);
240 w.DrawLine(UpPosX, UpPosY, BottomPosX, UpPosY, 1, ColorOff) ;
241 w.DrawLine(UpPosX, BottomPosY, BottomPosX, BottomPosY, 1, ColorOff) ;
242 w.DrawLine(UpPosX, UpPosY, UpPosX, BottomPosY, 1, ColorOff) ;
243 w.DrawLine(BottomPosX, UpPosY, BottomPosX, BottomPosY, 1, ColorOff) ;
244 IndX += OneLEDSize ;
245 }
246 IndY += 1 ;
247 }
248 Depl += ( OneLEDSize * 5 ) + 2 ;
249 }
250
251 return ;
252 }
253
254
SetDisplayedString(String Value)255 LEDCtrl& LEDCtrl::SetDisplayedString( String Value )
256 {
257 DisplayedString = Value ;
258 CharNumber = DisplayedString.GetLength( ) ;
259 SetPosZ( PosX, PosY ) ;
260 Refresh() ;
261 return *this ;
262 }
263
264
SetFgLightOnColor(Color Value)265 LEDCtrl& LEDCtrl::SetFgLightOnColor( Color Value )
266 {
267 FgLightOnColor = Value ;
268 Refresh() ;
269 return *this ;
270 }
271
272
SetFgLightOffColor(Color Value)273 LEDCtrl& LEDCtrl::SetFgLightOffColor( Color Value )
274 {
275 FgLightOffColor = Value ;
276 Refresh() ;
277 return *this ;
278 }
279
280
SetBgColor(Color Value)281 LEDCtrl& LEDCtrl::SetBgColor( Color Value )
282 {
283 BgColor = Value ;
284 Refresh() ;
285 return *this ;
286 }
287
288
SetStringSize(int CharactersNumber)289 LEDCtrl& LEDCtrl::SetStringSize( int CharactersNumber )
290 {
291 CharNumber = CharactersNumber ;
292 SetPosZ( PosX, PosY ) ;
293 Refresh() ;
294 return *this ;
295 }
296
297
SetLEDSize(int LEDSize)298 LEDCtrl& LEDCtrl::SetLEDSize( int LEDSize )
299 {
300 OneLEDSize = LEDSize ;
301 SetPosZ( PosX, PosY ) ;
302 Refresh() ;
303 return *this ;
304 }
305
306
SetPosZ(int X,int Y)307 LEDCtrl& LEDCtrl::SetPosZ( int X, int Y )
308 {
309 int VSize = OneLEDSize * 7 + 8 ;
310 int HSize = ( ( OneLEDSize * 5 ) + 2 ) * CharNumber + 8 ;
311
312 LeftPosZ(X, HSize).TopPosZ(Y, VSize) ;
313 PosX = X ;
314 PosY = Y ;
315
316 return *this ;
317 }
318
319
320
321 // Classe AnimatedLEDCtrl
AnimatedLEDCtrl()322 AnimatedLEDCtrl::AnimatedLEDCtrl()
323 : LEDCtrl( )
324 {
325 }
326
327
AnimatedLEDCtrl(String Value,LEDAnimationType Type,int MaxCharNumber,int Timer,int OneLEDSize,Color FgLightOnColor,Color FgLightOffColor,Color BgColor)328 AnimatedLEDCtrl::AnimatedLEDCtrl( String Value,
329 LEDAnimationType Type,
330 int MaxCharNumber,
331 int Timer, // 1 second by default
332 int OneLEDSize, // 2 pixels for one LED
333 Color FgLightOnColor,
334 Color FgLightOffColor,
335 Color BgColor ) : MaxCharNumber(MaxCharNumber), Timer(Timer),
336 Type(Type), LEDCtrl( "", OneLEDSize, FgLightOnColor, FgLightOffColor, BgColor )
337 {
338 CharIndex = 0 ;
339 SetString(Value);
340 }
341
SetString(String Value)342 AnimatedLEDCtrl& AnimatedLEDCtrl::SetString( String Value ) {
343 TheSourceString = Value ;
344 SetAnimationType( Type ) ;
345 return *this;
346 }
347
348
~AnimatedLEDCtrl()349 AnimatedLEDCtrl::~AnimatedLEDCtrl()
350 {
351 }
352
353
SetAnimationType(LEDAnimationType Type)354 AnimatedLEDCtrl& AnimatedLEDCtrl::SetAnimationType( LEDAnimationType Type )
355 {
356 this->Type = Type ;
357 TheDisplayedString = "" ;
358 switch( Type )
359 {
360 case LED_SLIDING :
361 // The string to be displayed must contain MaxCharNumber spaces + the string Value
362 for( int Index = 0 ; Index < MaxCharNumber ; Index++ )
363 {
364 TheDisplayedString += " " ;
365 }
366
367 TheDisplayedString += TheSourceString ;
368 DisplayedStringLength = MaxCharNumber + TheSourceString.GetLength( ) ;
369
370 SetStringSize( MaxCharNumber ) ;
371 SetTimeCallback( (-1) * Timer, THISBACK(DoSliding));
372 break ;
373
374 case LED_BLINKING :
375 TheDisplayedString += TheSourceString ;
376 SetStringSize( TheSourceString.GetLength( ) ) ;
377 SetTimeCallback( (-1) * Timer, THISBACK(DoBlinking));
378 break ;
379 }
380 return *this;
381 }
382
383
DoSliding(void)384 void AnimatedLEDCtrl::DoSliding( void )
385 {
386 String TheNewString ;
387
388 TheNewString = TheDisplayedString.Mid( CharIndex, MaxCharNumber ) ;
389 int Index = TheNewString.GetLength( ) ;
390 while( Index < MaxCharNumber )
391 {
392 TheNewString += " " ;
393 Index++ ;
394 }
395 SetDisplayedString( TheNewString ) ;
396 CharIndex++ ;
397 if( CharIndex >= DisplayedStringLength )
398 {
399 CharIndex = 0 ;
400 }
401 }
402
403
DoBlinking(void)404 void AnimatedLEDCtrl::DoBlinking( void )
405 {
406 static bool State = true ;
407 String TheNewString = "" ;
408
409 if( State == true )
410 {
411 TheNewString += TheDisplayedString.Mid( 0, MaxCharNumber ) ;
412 State = false ;
413 }
414 else
415 {
416 for( int Index = 0 ; Index < TheDisplayedString.GetLength( ) ; Index++ )
417 {
418 TheNewString += " " ;
419 }
420 State = true ;
421 }
422
423 SetDisplayedString( TheNewString ) ;
424
425 return ;
426 }
427
428
429
430