1 | /*********************************************************************
|
2 | * Anzeige auf Display Libary Source Code
|
3 | *********************************************************************
|
4 | * FileName: Anzeige.c
|
5 | * Dependencies: Anzeige.h
|
6 | * Processor: PIC18F4685
|
7 | * Complier: Microchip C18
|
8 | *
|
9 | *
|
10 | * Author Date Comment
|
11 | *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
12 | * Stephan Krause 17/8/12 Version 1.0 - Initial Release
|
13 | *********************************************************************/
|
14 |
|
15 |
|
16 | #include "Anzeige.h"
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | /*********************************************************************
|
22 | * Function: void SetLayout(void);
|
23 | *
|
24 | * Overview: Setzten des Layouts
|
25 | * Malen der Umrandung, Scrollbarumrandung
|
26 | *
|
27 | * PreCondition: None
|
28 | *
|
29 | * Input: None
|
30 | *
|
31 | * Output: None
|
32 | *
|
33 | * Side Effects: Clears Display
|
34 | ********************************************************************/
|
35 | void SetLayout(char with_scrollbar){
|
36 | // Trennlinie oben
|
37 | LCD_DrawLine(0,10,159,10, PIXEL_ON);
|
38 |
|
39 | if (with_scrollbar){
|
40 | // Umrandung für Scrollbar
|
41 | LCD_DrawRectangle(156,20,158,149, PIXEL_ON, 0);
|
42 | /*Pfeil für Scrollleiste nach oben*/
|
43 | LCD_DrawLine(156,18,158,18, PIXEL_ON);
|
44 | LCD_DrawLine(156,17,158,17, PIXEL_ON);
|
45 | LCD_DrawLine(157,14,157,17, PIXEL_ON);
|
46 | /*Pfeil für Scrollleiste nach unten*/
|
47 | LCD_DrawLine(156,151,158,151, PIXEL_ON);
|
48 | LCD_DrawLine(156,152,158,152, PIXEL_ON);
|
49 | LCD_DrawLine(157,152,157,155, PIXEL_ON);
|
50 | }
|
51 |
|
52 |
|
53 |
|
54 | return;
|
55 | }
|
56 |
|
57 | /*********************************************************************
|
58 | * Function: void UpdateStatusBar(void);
|
59 | *
|
60 | * Overview: Aktuallisiert die Statusbar
|
61 | * Temperatur, Uhrzeit, Statussymbole
|
62 | *
|
63 | * PreCondition: None
|
64 | *
|
65 | * Input: None
|
66 | *
|
67 | * Output: None
|
68 | *
|
69 | * Side Effects:
|
70 | ********************************************************************/
|
71 | void UpdateStatusBar(void){
|
72 | LCD_DrawRectangle(0,0,159,9, PIXEL_OFF, 1);
|
73 | LCD_DrawConstString(18,0, "18 C 14.Sep, 16:20", PIXEL_ON);
|
74 | }
|
75 |
|
76 |
|
77 | /*********************************************************************
|
78 | * Function: void Anzeige_UpdateScrollbar(void);
|
79 | *
|
80 | * Overview: Zeichnen des Scrollbar Schiebers mit entsprechender
|
81 | * Länge und Position
|
82 | *
|
83 | * PreCondition: Global Var, struct Anzeige_LokListe.CursorPosition
|
84 | * Lokanzahl
|
85 | *
|
86 | * Input: None
|
87 | *
|
88 | * Output: None
|
89 | *
|
90 | * Side Effects:
|
91 | ********************************************************************/
|
92 | void Anzeige_UpdateScrollbar(void){
|
93 | static unsigned char von=0,bis=127;
|
94 | unsigned int x;
|
95 |
|
96 | LCD_DrawLine(157,21+von,157,21+bis, PIXEL_OFF);
|
97 |
|
98 | if(Lokanzahl > (Anzeige_LokListe.LastItem-Anzeige_LokListe.FirstItem+1)){
|
99 | // scrollbar malen
|
100 | // berechnen
|
101 | x = (unsigned int)(((unsigned float)127/Lokanzahl)*(Anzeige_LokListe.LastItem-Anzeige_LokListe.FirstItem+1));
|
102 | von = (unsigned int)(((unsigned float)127/Lokanzahl)*(Anzeige_LokListe.FirstItem));
|
103 |
|
104 | bis = von + x;
|
105 | if (Anzeige_LokListe.LastItem == (Lokanzahl-1)){
|
106 | bis = 127;
|
107 | von = bis - x;
|
108 | }
|
109 |
|
110 | LCD_DrawLine(157,21+von,157,21+bis, PIXEL_ON);
|
111 |
|
112 | } else {
|
113 | LCD_DrawLine(157,21,157,148, PIXEL_ON);
|
114 | }
|
115 | }
|
116 |
|
117 |
|
118 | /*********************************************************************
|
119 | * Function: void Anzeige_UpdateListe(unsigned char mode);
|
120 | *
|
121 | * Overview: Von Anzeige.FirstItem bis Anzeige_LokListe.LastItem werden die LokIDs
|
122 | * aus der LokIDListe gelesen, die namen und soll geschwindigkeiten
|
123 | * geladen und angezeigt. Maximal 14 Loks werden angezeigt
|
124 | *
|
125 | * PreCondition: None
|
126 | *
|
127 | * Input: mode - 1 komplett neu zeichnen
|
128 | * 2 nur lokdaten aktuallisieren
|
129 | *
|
130 | * Output: None
|
131 | *
|
132 | * Side Effects: None
|
133 | ********************************************************************/
|
134 | void Anzeige_UpdateListe(unsigned char mode){
|
135 | /* anzeige aufbauen:
|
136 | * Anzeige_LokListe.FirstItem nehmen, einsetzen in .Liste[] -> so erhält man die ID der Lok an dieser Anzeigeposition
|
137 | * Laden der Lokdaten, eeprom und vom Bus
|
138 | * Schreiben der Daten
|
139 | * Nächstes ListenElement
|
140 | *
|
141 | */
|
142 | unsigned char zeile=0;
|
143 | unsigned char bar_count;
|
144 | unsigned int y=0, i, x=0;
|
145 | unsigned int item=0;
|
146 | static char init=1;
|
147 | static unsigned int first_last=0;
|
148 |
|
149 | static unsigned char vsoll_last[7];
|
150 | static unsigned char vist_last[7];
|
151 | static unsigned char dir_last;
|
152 |
|
153 | // nur beim ersten aufruf und wenn sich wirklich etwas geändert hat neu aufbauen oder wenn mode == 1
|
154 | if (init==1 || first_last != Anzeige_LokListe.FirstItem || mode == 1 ) {
|
155 | init = 0;
|
156 | first_last = Anzeige_LokListe.FirstItem;
|
157 | Anzeige_LokListe.FirstItem = 0;
|
158 | Anzeige_LokListe.LastItem = 6;
|
159 |
|
160 | zeile = 0;
|
161 | for(item=Anzeige_LokListe.FirstItem; item<=Anzeige_LokListe.LastItem; item++){
|
162 |
|
163 | Daten_GetLokData(0x01, LokIDListe[item], item);
|
164 |
|
165 | y = zeile*10+15;
|
166 |
|
167 | // Nummer schreiben, 3 Stellen mit führenden Nullen füllen
|
168 | LCD_DrawNumber(7, y, LokIDListe[item], 3, '0', PIXEL_ON);
|
169 |
|
170 | // Loknamen schreiben
|
171 | LCD_DrawRectangle(30, y, 155,(y+9),PIXEL_OFF,1); // rectangle löschen
|
172 | LCD_DrawString(30, y, &LokName[0], PIXEL_ON);
|
173 |
|
174 |
|
175 | //if (item==0) LCD_DrawSymbol(0,y, SYM_ARROW_FULL, PIXEL_ON );
|
176 |
|
177 | y += 10 ;
|
178 | //if (item==0) LCD_DrawSymbol(5,y, SYM_ARROW_LITE, PIXEL_ON );
|
179 |
|
180 | zeile ++;
|
181 | zeile ++;
|
182 |
|
183 |
|
184 |
|
185 | }
|
186 | mode |= 0x02;
|
187 |
|
188 | }
|
189 |
|
190 | /* Nur Daten aktualisieren */
|
191 | if (mode&0x02) {
|
192 | zeile = 0;
|
193 | for(item=Anzeige_LokListe.FirstItem; item<=Anzeige_LokListe.LastItem; item++){
|
194 |
|
195 | Daten_GetLokData(0x01, LokIDListe[item], item);
|
196 |
|
197 | y = zeile*10+15;
|
198 | y += 10; // zweite zeile jeder lok ist die zeile mit den daten
|
199 |
|
200 |
|
201 | if ( (LokVistListe[item] != vist_last[item-Anzeige_LokListe.FirstItem]) || (mode&0x01) ) {
|
202 | // Balken für Ist Geschwindigkeit oben
|
203 | LCD_DrawRectangle(BARGRAPH_START, y+1, (BARGRAPH_START+10*(BARGRAPH_BREITE+2)), y+1, PIXEL_OFF, 1);
|
204 |
|
205 | bar_count = 0;
|
206 | if ( LokVistListe[item] > 180) {
|
207 | bar_count = 10;
|
208 | } else if ( LokVistListe[item] > 160) {
|
209 | bar_count = 9;
|
210 | } else if ( LokVistListe[item] > 140) {
|
211 | bar_count = 8;
|
212 | } else if ( LokVistListe[item] > 120) {
|
213 | bar_count = 7;
|
214 | } else if ( LokVistListe[item] > 100) {
|
215 | bar_count = 6;
|
216 | } else if ( LokVistListe[item] > 80) {
|
217 | bar_count = 5;
|
218 | } else if ( LokVistListe[item] > 60) {
|
219 | bar_count = 4;
|
220 | } else if ( LokVistListe[item] > 40) {
|
221 | bar_count = 3;
|
222 | } else if ( LokVistListe[item] > 20) {
|
223 | bar_count = 2;
|
224 | } else if ( LokVistListe[item] > 1) {
|
225 | bar_count = 1;
|
226 | } else {
|
227 | bar_count = 0;
|
228 | }
|
229 |
|
230 | Delay1ms(1);
|
231 |
|
232 | for (i=0; i<bar_count; i++) {
|
233 | x = (BARGRAPH_START + i * (BARGRAPH_BREITE+2) );
|
234 | LCD_DrawRectangle(x, y+1, x+BARGRAPH_BREITE, y+1, PIXEL_ON, 1);
|
235 | }
|
236 | }
|
237 |
|
238 | if ( (LokVsollListe[item] != vsoll_last[item-Anzeige_LokListe.FirstItem]) || (mode&0x01) ) {
|
239 | // Linien für Sollgeschwindigkeit unten
|
240 | LCD_DrawRectangle(BARGRAPH_START, y+4, (BARGRAPH_START+10*(BARGRAPH_BREITE+2)), y+4, PIXEL_OFF, 1);
|
241 |
|
242 | bar_count = 0;
|
243 | if ( LokVsollListe[item] > 180) {
|
244 | bar_count = 10;
|
245 | } else if ( LokVsollListe[item] > 160) {
|
246 | bar_count = 9;
|
247 | } else if ( LokVsollListe[item] > 140) {
|
248 | bar_count = 8;
|
249 | } else if ( LokVsollListe[item] > 120) {
|
250 | bar_count = 7;
|
251 | } else if ( LokVsollListe[item] > 100) {
|
252 | bar_count = 6;
|
253 | } else if ( LokVsollListe[item] > 80) {
|
254 | bar_count = 5;
|
255 | } else if ( LokVsollListe[item] > 60) {
|
256 | bar_count = 4;
|
257 | } else if ( LokVsollListe[item] > 40) {
|
258 | bar_count = 3;
|
259 | } else if ( LokVsollListe[item] > 20) {
|
260 | bar_count = 2;
|
261 | } else if ( LokVsollListe[item] > 1) {
|
262 | bar_count = 1;
|
263 | } else {
|
264 | bar_count = 0;
|
265 | }
|
266 |
|
267 | Delay1ms(1);
|
268 |
|
269 | for (i=0; i<bar_count; i++) {
|
270 | x = (BARGRAPH_START + i * (BARGRAPH_BREITE+2) );
|
271 | LCD_DrawRectangle(x, y+4, x+BARGRAPH_BREITE, y+4, PIXEL_ON, 1);
|
272 | }
|
273 |
|
274 | LCD_DrawRectangle(80, y, 105, y+7, PIXEL_OFF, 1);
|
275 | LCD_DrawPercentage(80, y, LokVsollListe[item], PIXEL_ON);
|
276 | //LCD_DrawPercentage(80, y, item, PIXEL_ON);
|
277 | }
|
278 |
|
279 |
|
280 |
|
281 | // Richtungspfeil
|
282 | if ((1 && !1) || mode&0x01) {
|
283 | LCD_DrawRectangle(125, y, 135, y+7, PIXEL_OFF, 1);
|
284 | LCD_DrawSymbol(125,y+1, SYM_ARROW_SMALL_LEFT, PIXEL_ON);
|
285 | LCD_DrawLine(125,y+4,133,y+4,PIXEL_ON);
|
286 | } else if ((1 && !1) || mode&0x01) {
|
287 | LCD_DrawRectangle(125, y, 135, y+7, PIXEL_OFF, 1);
|
288 | LCD_DrawSymbol(133,y+1, SYM_ARROW_SMALL_RIGHT, PIXEL_ON);
|
289 | LCD_DrawLine(125,y+4,133,y+4,PIXEL_ON);
|
290 | } else if ((1 && !1) || mode&0x01) {
|
291 | LCD_DrawRectangle(125, y, 135, y+7, PIXEL_OFF, 1);
|
292 | LCD_DrawRectangle(125,y+1,130,y+6,PIXEL_ON,0);
|
293 | }
|
294 |
|
295 |
|
296 | vist_last[item-Anzeige_LokListe.FirstItem] = LokVistListe[item];
|
297 | vsoll_last[item-Anzeige_LokListe.FirstItem] = LokVsollListe[item];
|
298 |
|
299 | zeile += 2;
|
300 |
|
301 | }
|
302 | }
|
303 |
|
304 |
|
305 |
|
306 |
|
307 |
|
308 | return;
|
309 | }
|
310 |
|
311 |
|
312 | /*********************************************************************
|
313 | * Function: void Anzeige_UpdateCursor(void);
|
314 | *
|
315 | * Overview: Zeichnen einen Cursor Anzeige_LokListe.Cursor an Position
|
316 | * Anzeige_LokListe.CursorPosition
|
317 | *
|
318 | * PreCondition: None
|
319 | *
|
320 | * Input: None
|
321 | *
|
322 | * Output: None
|
323 | *
|
324 | * Side Effects:
|
325 | ********************************************************************/
|
326 | void Anzeige_UpdateCursor(unsigned char mode){
|
327 | unsigned char zeile=0;
|
328 | unsigned int y = 0;
|
329 | static unsigned char zeile_alt=0;
|
330 | static char init = 0;
|
331 |
|
332 | //Anzeige_LokListe.CursorPosition geht von 0 bis 200 und definiert den Listenindex
|
333 | zeile = Anzeige_LokListe.CursorPosition - Anzeige_LokListe.FirstItem;
|
334 |
|
335 | if (zeile != zeile_alt || init==0 || mode == 1) { // alten cursor löschen
|
336 | y = zeile_alt*10+15;
|
337 | LCD_DrawRectangle(0, y, 6, (y+7), PIXEL_OFF, 1);
|
338 |
|
339 |
|
340 | init = 1;
|
341 | zeile_alt = zeile;
|
342 | // neuen cursor setzen
|
343 | y = zeile*10+15;
|
344 | LCD_DrawSymbol(0, y, Anzeige_LokListe.Cursor ,PIXEL_ON);
|
345 | } else if (mode == 2) {
|
346 |
|
347 |
|
348 |
|
349 | }
|
350 |
|
351 |
|
352 | return;
|
353 | }
|
354 |
|
355 |
|
356 | /*********************************************************************
|
357 | * Function: void Anzeige_CalcPos(int zaehler);
|
358 | *
|
359 | * Overview: Berechnet Anzeige_LokListe.CursorPosition
|
360 | * Anzeige_LokListe.FirstItem und .LastItem
|
361 | *
|
362 | *
|
363 | * PreCondition: None
|
364 | *
|
365 | * Input: zaehler - relative Änderung der Cursorposition
|
366 | *
|
367 | * Output: None
|
368 | *
|
369 | * Side Effects:
|
370 | ********************************************************************/
|
371 | void Anzeige_CalcPos(int zaehler){
|
372 |
|
373 |
|
374 | if (zaehler < 0) {
|
375 | zaehler *= -1;
|
376 |
|
377 | if (Anzeige_LokListe.CursorPosition<zaehler) Anzeige_LokListe.CursorPosition = 0;
|
378 | else Anzeige_LokListe.CursorPosition -= zaehler;
|
379 |
|
380 | if (Lokanzahl>13){
|
381 | while (Anzeige_LokListe.FirstItem > Anzeige_LokListe.CursorPosition) {
|
382 | Anzeige_LokListe.FirstItem--;
|
383 | }
|
384 | Anzeige_LokListe.LastItem = Anzeige_LokListe.FirstItem+13;
|
385 | } else {
|
386 | Anzeige_LokListe.FirstItem = 0;
|
387 | Anzeige_LokListe.LastItem = Lokanzahl-1;
|
388 | }
|
389 |
|
390 | } else if (zaehler>=0) {
|
391 | Anzeige_LokListe.CursorPosition += zaehler;
|
392 | if (Anzeige_LokListe.CursorPosition > Lokanzahl-1) Anzeige_LokListe.CursorPosition = Lokanzahl-1;
|
393 |
|
394 | if (Lokanzahl>13){
|
395 | while (Anzeige_LokListe.LastItem < Anzeige_LokListe.CursorPosition) {
|
396 | Anzeige_LokListe.LastItem++;
|
397 | }
|
398 | Anzeige_LokListe.FirstItem = Anzeige_LokListe.LastItem-13;
|
399 | } else {
|
400 | Anzeige_LokListe.FirstItem = 0;
|
401 | Anzeige_LokListe.LastItem = Lokanzahl-1;
|
402 | }
|
403 | }
|
404 |
|
405 | return;
|
406 | }
|
407 |
|
408 |
|
409 |
|
410 |
|
411 |
|
412 |
|
413 |
|
414 |
|
415 |
|
416 |
|
417 |
|
418 |
|
419 | /*********************************************************************
|
420 | * Function:
|
421 | *
|
422 | * Overview:
|
423 | *
|
424 | *
|
425 | *
|
426 | * PreCondition: None
|
427 | *
|
428 | * Input: None
|
429 | *
|
430 | * Output: None
|
431 | *
|
432 | * Side Effects: None
|
433 | ********************************************************************/
|
434 | void Anzeige_LokDetailsAnzeigen(unsigned char complete_new){
|
435 |
|
436 | if(complete_new){
|
437 | LCD_DrawRectangle(0,11,159,159,PIXEL_OFF,1);
|
438 | LCD_DrawRectangle(5,MENU_ROWSTART_0,154,MENU_ROWSTART_0+12, PIXEL_ON, 1);
|
439 | LCD_DrawConstString(33,MENU_ROWSTART_0+3, "Detailansicht Lok", PIXEL_OFF);
|
440 | }
|
441 |
|
442 |
|
443 |
|
444 | return;
|
445 | }
|