Daten.c


1
/*********************************************************************
2
 *              General Procedures Libary Source Code
3
 *********************************************************************
4
 * FileName:        GenProcs.c
5
 * Dependencies:    GenProcs.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
#include "Daten.h"
16
17
18
/*********************************************************************
19
 * Function:    
20
 *
21
 * Overview:            
22
 *                  
23
 *
24
 * PreCondition:  None
25
 *
26
 * Input:      None
27
 *
28
 * Output:      None
29
 *
30
 * Side Effects:  
31
 ********************************************************************/
32
char Daten_Init(void){
33
  unsigned int i=0;
34
  unsigned char buffer=0;
35
  unsigned int address=0;
36
  
37
38
  // Initialwert geben
39
  Anzeige_LokListe.FirstItem = 0;
40
  Anzeige_LokListe.LastItem = 0;
41
  Anzeige_LokListe.Cursor = 0;
42
  Anzeige_LokListe.CursorPosition = 0;
43
44
  Lokanzahl = 0;
45
  for(i=0; i<MAX_LOKS_IN_LISTE; i++){
46
    LokIDListe[i] = 0;
47
    LokVsollListe[i] = 0;
48
    LokVistListe[i] = 0;
49
  }
50
51
  
52
  for(i=0; i<(LOKNAME_ANZAHL_ZEICHEN); i++) LokName[i] = '\0';  // zuerst alles auf 0 setzen
53
    
54
55
    
56
    
57
    
58
  /* Laden der Loks, die verwaltet werden sollen aus i2c eeprom */
59
#if 0
60
    // Hier richtiges auslesen
61
    // zuerst die Anzahl der zu verwaltenden Loks auslesen
62
    EEprom_RandomRead(I2C_MAIN_EEPROM, 0x000, &buffer);    // high byte laden
63
    Lokanzahl = (unsigned int)buffer << 8;
64
    EEprom_RandomRead(I2C_MAIN_EEPROM, 0x001, &buffer);    // low byte laden
65
    Lokanzahl += (unsigned int)buffer;
66
67
    // dann die ersten Lokanzahl Lok IDs auslesen
68
    address = 16;
69
    for(i=0; i<Lokanzahl; i++){
70
      EEprom_RandomRead(I2C_MAIN_EEPROM, address, &buffer);    // high byte laden
71
      LokIDListe[i] = (unsigned int)buffer << 8;
72
      EEprom_RandomRead(I2C_MAIN_EEPROM, address+1, &buffer);    // high byte laden
73
      LokIDListe[i] += (unsigned int)buffer;
74
      address += 32;
75
      
76
      LokVsollListe[i] = 0;
77
    }  
78
79
#else
80
    // so tun als ob
81
  Lokanzahl = 0;
82
  for(i=0; i<MAX_LOKS_IN_LISTE; i++){  // die ersten 400byte aus eeprom gehören lok ids
83
    LokIDListe[i] = i+1;
84
  }  
85
  Lokanzahl = MAX_LOKS_IN_LISTE;
86
  
87
#endif
88
89
  
90
  // für die Liste die erste Lok on screen, und letzte lok on screen
91
  Anzeige_LokListe.FirstItem = 0;
92
  if(Lokanzahl>14){
93
    Anzeige_LokListe.LastItem = 13;
94
  } else {
95
    Anzeige_LokListe.LastItem = Lokanzahl;
96
  }  
97
  Anzeige_LokListe.CursorPosition = 0;
98
  Anzeige_LokListe.Cursor = SYM_ARROW_LITE;
99
  
100
  return 0;
101
}  
102
103
104
/*********************************************************************
105
 * Function:    
106
 *          
107
 *
108
 * Overview:    
109
 *          
110
 *                  
111
 * PreCondition:  None
112
 *
113
 * Input:      mode    -  01: namen aus eeprom laden
114
 *                  02: details aus eeprom laden
115
 *                  04: momentanwerte über can bus holen
116
 *
117
 * Output:      None
118
 *
119
 * Side Effects:  None
120
 ********************************************************************/
121
void Daten_GetLokData(char mode, unsigned int LokID, unsigned int ListenIndex){
122
  unsigned int address;
123
  unsigned int i;
124
  
125
  if(mode & 0x01) {  
126
    for(i=0; i<17; i++) LokName[i] = '\0';  // zuerst alles auf 0 setzen
127
  #define SIMULIERE_EEPROM_READ
128
129
  #ifndef SIMULIERE_EEPROM_READ
130
    // zuerst den Loknamen aus dem EEPROM laden
131
    address = 32+ListenIndex*32 ;
132
  
133
    for(i=0; i<(LOKNAME_ANZAHL_ZEICHEN+1); i++) LokName[i] = '\0';    // zuerst alles auf 0 setzen
134
    EEprom_RandomReadSequence(I2C_MAIN_EEPROM, address, &LokName, 16);  // dann die 16 zeichen aus eeprom laden
135
  
136
  #else
137
    LokName[0] = 'L';
138
    LokName[1] = 'u';
139
    LokName[2] = 'g';
140
    LokName[3] = 'm';
141
    LokName[4] = 'i';
142
    LokName[5] = 'l';
143
    LokName[6] = 'l';
144
    LokName[7] = 'a';
145
    LokName[8] = ' ';
146
    LokName[9] = 'G';
147
    LokName[10] = 'ü';  
148
    LokName[11] = 't';  
149
    LokName[12] = 'e';    
150
    LokName[13] = 'r';
151
    LokName[14] = 'z';
152
    LokName[15] = 'u';
153
    LokName[16] = 'g';
154
    LokName[17] = ' ';
155
    LokName[18] = '0';
156
    LokName[19] = '1';
157
    LokName[20] = '2';
158
    LokName[21] = '\0';
159
  #endif
160
  }
161
  if (mode & 0x02) {  // Details aus eeprom laden
162
  #ifndef SIMULIERE_EEPROM_READ
163
    address = ListenIndex * 32 + 18;
164
    EEprom_RandomRead(I2C_MAIN_EEPROM, address, &LokTemp.Anfahrspannung);
165
    EEprom_RandomRead(I2C_MAIN_EEPROM, address+1, &LokTemp.Maximalspannung);
166
    EEprom_RandomRead(I2C_MAIN_EEPROM, address+2, &LokTemp.PWM_Amplitude);
167
    EEprom_RandomRead(I2C_MAIN_EEPROM, address+3, &LokTemp.PWM_Frequenze);
168
    EEprom_RandomRead(I2C_MAIN_EEPROM, address+4, &LokTemp.Maximalstrom);
169
    EEprom_RandomRead(I2C_MAIN_EEPROM, address+5, &LokTemp.Anfahrkoeff);
170
    EEprom_RandomRead(I2C_MAIN_EEPROM, address+6, &LokTemp.Bremskoeff);
171
    EEprom_RandomRead(I2C_MAIN_EEPROM, address+7, &LokTemp.Laenge);    
172
  #else
173
    LokTemp.Anfahrspannung = 40;
174
    LokTemp.Maximalspannung = 160;
175
    LokTemp.PWM_Amplitude = 130;
176
    LokTemp.PWM_Frequenz = 1;
177
    LokTemp.Maximalstrom = 150;
178
    LokTemp.Anfahrkoeff = 35;
179
    LokTemp.Bremskoeff = 50;
180
    LokTemp.Laenge = 88;
181
  #endif    
182
  }
183
  if (mode & 0x04) {
184
  #ifndef SIMULIERE_EEPROM_READ
185
    // Über Bus die Anfrage an FR mit LokID LokID senden, damit mir dieser die Daten sendet  
186
    // SendBus(LokID, ID_Anfragen_Momentane_Details);
187
188
  #else
189
    LokTemp.v_ist = 165;
190
    LokTemp.dir_ist = 0;
191
    LokTemp.dir_soll = 0;
192
  
193
  #endif
194
  }
195
196
  //LokVsollListe[ListenIndex] = 165; // Kenne ich eigentlich schon, brauche ich also nicht nochmal abfragen
197
  
198
  
199
  
200
    
201
  
202
  return;
203
}