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