Anzeige.c


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
}