1 | /*******************************************************
|
2 | Funktion : Hole Packet / Reagiere auf Befehlscode
|
3 | Eigenschaften: Gib Befehlsnummer zurück
|
4 | Übergabewert: -
|
5 | Rückgabewert: 1 Byte Befehlsnummer (0xFF = Fehler)
|
6 | ********************************************************/
|
7 | uint8_t usart_recieve_packet(void)
|
8 | {
|
9 | uint8_t data;
|
10 | length = 0;
|
11 |
|
12 | data = usart_get(); // Hole Start-Signal
|
13 | if (data == COMMAND_START) // Wurde Start übermittelt?
|
14 | {
|
15 | data = usart_get(); // Hole Seq Nr
|
16 | if(data == seq_nr) // Stimmen Seq Nummern überein?
|
17 | {
|
18 | length = usart_get(); // Hole Länge
|
19 | data = usart_get(); // Hole Befehlsnr.
|
20 | switch(data)
|
21 | {
|
22 | case COMMAND_SEND_ALL_DATA: //Schicke alle Daten
|
23 | {
|
24 | data = usart_get(); // Hole Pruefsumme
|
25 | checksum = length + COMMAND_SEND_ALL_DATA; // Berechne Pruefsumme
|
26 |
|
27 | if (data == checksum)
|
28 | {
|
29 | usart_seq_plus(); // Erhöhe Sequenz nr.
|
30 | return COMMAND_SEND_ALL_DATA; // Return Befehlsnr.
|
31 | }
|
32 | else
|
33 | {
|
34 | usart_error(EC_USART_SEND_ALL_DATA);
|
35 | return 0xFF; // Fehler
|
36 | }
|
37 | } break;
|
38 |
|
39 | case COMMAND_LIVE_MODUS: //Live Übertragung
|
40 | {
|
41 | data = usart_get(); // Hole Pruefsumme
|
42 | checksum = length + COMMAND_LIVE_MODUS; // Berechne Pruefsumme
|
43 |
|
44 | if (data == checksum)
|
45 | {
|
46 | usart_seq_plus(); // Erhöhe Sequenz nr.
|
47 | return COMMAND_LIVE_MODUS; // Return Befehlsnr.
|
48 | }
|
49 | else
|
50 | {
|
51 | usart_error(EC_USART_LIVE_MODUS);
|
52 | return 0xFF; // Fehler
|
53 | }
|
54 | } break;
|
55 |
|
56 | case COMMAND_LIVE_MODUS_STOP: // Live Stopp
|
57 | {
|
58 | data = usart_get(); // Hole Pruefsumme
|
59 | checksum = length + COMMAND_LIVE_MODUS_STOP; // Berechne Pruefsumme
|
60 |
|
61 | if (data == checksum)
|
62 | {
|
63 | usart_seq_plus(); // Erhöhe Sequenz nr.
|
64 | return COMMAND_LIVE_MODUS_STOP; // Return Befehlsnr.
|
65 | }
|
66 | else
|
67 | {
|
68 | usart_error(EC_USART_LIVE_MODUS_STOP);
|
69 | return 0xFF; // Fehler
|
70 | }
|
71 | } break;
|
72 |
|
73 | case COMMAND_RECEIVE_TIME: //Uhrzeit empfangen
|
74 | {
|
75 | //Hole Uhrzeit-Daten
|
76 | pc.year = usart_get();
|
77 | pc.month = usart_get();
|
78 | pc.date = usart_get();
|
79 | pc.hours = usart_get();
|
80 | pc.minutes = usart_get();
|
81 | pc.seconds = usart_get();
|
82 |
|
83 | data = usart_get(); // Hole Pruefsumme
|
84 | checksum = length + COMMAND_RECEIVE_TIME + pc.year + pc.month + pc.date + pc.hours
|
85 | + pc.minutes + pc.seconds; // Berechne Pruefsumme
|
86 |
|
87 | if (data == checksum)
|
88 | {
|
89 | usart_seq_plus(); // Erhöhe Sequenz nr.
|
90 | flag.right_values = 1; // Werte waren richtig (wegen Prüfsumme)
|
91 | return COMMAND_RECEIVE_TIME; // Return Befehlsnr.
|
92 | }
|
93 | else
|
94 | {
|
95 | flag.right_values = 0; // Werte waren falsch (wegen Prüfsumme)
|
96 | usart_error(EC_USART_RECEIVE_TIME);
|
97 | return 0xFF; // Fehler
|
98 | }
|
99 | } break;
|
100 |
|
101 | case COMMAND_RECEIVE_ACK: // ACK empfangen
|
102 | {
|
103 | pc_seq_nr = usart_get(); // Hole Seq Nr
|
104 | data = usart_get(); // Hole Pruefsumme
|
105 | checksum = length + COMMAND_RECEIVE_ACK + pc_seq_nr; // Berechne Pruefsumme
|
106 |
|
107 | if(data == checksum)
|
108 | {
|
109 | usart_seq_plus(); // Erhöhe Sequenz nr.
|
110 | return COMMAND_RECEIVE_ACK; // Return Befehlsnummer
|
111 | }
|
112 | else
|
113 | {
|
114 | usart_error(EC_USART_RECEIVE_ACK);
|
115 | return 0xFF; // Fehler
|
116 | }
|
117 | } break;
|
118 |
|
119 | case COMMAND_PARAMETERS: //Paramters
|
120 | {
|
121 |
|
122 | // Hole Startzeit
|
123 | start.year = usart_get();
|
124 | start.month = usart_get();
|
125 | start.date = usart_get();
|
126 | start.hours = usart_get();
|
127 | start.minutes = usart_get();
|
128 | start.seconds = usart_get();
|
129 |
|
130 | //Hole Endzeit
|
131 | end.year = usart_get();
|
132 | end.month = usart_get();
|
133 | end.date = usart_get();
|
134 | end.hours = usart_get();
|
135 | end.minutes = usart_get();
|
136 | end.seconds = usart_get();
|
137 |
|
138 | // Hole Sampling Rate
|
139 | // Speichere in Zwischenvariablen für Pruefsumme
|
140 | sampling_rate_array[0] = usart_get();
|
141 | sampling_rate_array[1] = usart_get();
|
142 | sampling_rate_array[2] = usart_get();
|
143 |
|
144 | sampling_rate = sampling_rate_array[0]; // Schreibe 1tes Byte
|
145 | sampling_rate = (sampling_rate << 8); // Verschiebe 1tes Byte
|
146 | sampling_rate |= sampling_rate_array[1]; // Schreibe 2tes Byte
|
147 | sampling_rate = (sampling_rate << 8); // Verschiebe 2tes Byte
|
148 | sampling_rate |= sampling_rate_array[2]; // Schreibe 3tes Byte
|
149 |
|
150 | // Hole Messwertemaske
|
151 | // Speichere in Zwischenvariablen für Pruefsumme
|
152 | measurement_mask_array[0] = usart_get();
|
153 | measurement_mask_array[1] = usart_get();
|
154 | measurement_mask_array[2] = usart_get();
|
155 | measurement_mask_array[3] = usart_get();
|
156 | measurement_mask_array[4] = usart_get();
|
157 | measurement_mask_array[5] = usart_get();
|
158 |
|
159 | measurement_mask_high = measurement_mask_array[0]; // Wie bei sampling rate (oben)
|
160 | measurement_mask_high = (measurement_mask_high << 8);
|
161 | measurement_mask_high |= measurement_mask_array[1];
|
162 |
|
163 | measurement_mask_low = measurement_mask_array[2];
|
164 | measurement_mask_low = (measurement_mask_low << 8);
|
165 | measurement_mask_low |= measurement_mask_array[3];
|
166 | measurement_mask_low = (measurement_mask_low << 8);
|
167 | measurement_mask_low |= measurement_mask_array[4];
|
168 | measurement_mask_low = (measurement_mask_low << 8);
|
169 | measurement_mask_low |= measurement_mask_array[5];
|
170 |
|
171 | data = usart_get(); // Hole Pruefsumme
|
172 |
|
173 | // Berechne die Pruefsumme
|
174 | checksum = length + COMMAND_PARAMETERS + start.year + start.month + start.date + start.hours + start.minutes + start.seconds
|
175 | + end.year + end.month + end.date + end.hours + end.minutes + end.seconds + sampling_rate_array[0]
|
176 | + sampling_rate_array[1] + sampling_rate_array[2] + measurement_mask_array[0]
|
177 | + measurement_mask_array[1] + measurement_mask_array[2] + measurement_mask_array[3]
|
178 | + measurement_mask_array[4] + measurement_mask_array[5];
|
179 |
|
180 | if(data == checksum)
|
181 | {
|
182 | usart_seq_plus(); // Erhöhe Sequenz nr.
|
183 | flag.right_values = 1; // Werte richtig (wegen Prüfsumme)
|
184 | return COMMAND_PARAMETERS; // Return Befehlsnr.
|
185 | }
|
186 | else
|
187 | {
|
188 | flag.right_values = 0; // Werte falsch (wegen Prüfsumme)
|
189 | usart_error(EC_USART_COMMAND_PARAMETERS);
|
190 | return 0xFF; // Fehler
|
191 | }
|
192 | } break;
|
193 |
|
194 | case COMMAND_STATUS_REQUEST: // Status-senden Aufforderung
|
195 | {
|
196 | data = usart_get(); // Hole Pruefsumme
|
197 | checksum = length + COMMAND_STATUS_REQUEST; // Berechne Pruefsumme
|
198 |
|
199 | if (data == checksum)
|
200 | {
|
201 | usart_seq_plus(); // Erhöhe Sequenz nr.
|
202 | return COMMAND_STATUS_REQUEST; // Return Befehlsnr.
|
203 | }
|
204 | else
|
205 | {
|
206 | usart_error(EC_USART_STATUS_REQUEST);
|
207 | return 0xFF; // Fehler
|
208 | }
|
209 | } break;
|
210 |
|
211 | case COMMAND_RESET:
|
212 | {
|
213 | goto packet_reset;
|
214 | }
|
215 | default: // Falscher Befehlscode
|
216 | {
|
217 | usart_error(EC_USART_WRONG_CODE);
|
218 | return 0xFF; // Fehler
|
219 | }
|
220 | }
|
221 | }
|
222 | else
|
223 | {
|
224 | length = usart_get(); // Hole Länge
|
225 | data = usart_get();
|
226 |
|
227 | if(data == COMMAND_RESET)
|
228 | {
|
229 | packet_reset:
|
230 | data = usart_get(); // Hole Pruefsumme
|
231 | checksum = length + COMMAND_RESET; // Berechne Pruefsumme
|
232 |
|
233 | if (data == checksum)
|
234 | {
|
235 | usart_seq_plus(); // Erhöhe Sequenz nr.
|
236 | return COMMAND_RESET; // Return Befehlsnr.
|
237 | }
|
238 | else
|
239 | {
|
240 | usart_error(EC_USART_RESET);
|
241 | return 0xFF; // Fehler
|
242 | }
|
243 |
|
244 | }
|
245 | else
|
246 | {
|
247 | usart_error(EC_USART_WRONG_SEQ); // Falsche Seq Nr. ==> Error
|
248 | return 0xFF; // FEHLER
|
249 | }
|
250 | }
|
251 | }
|
252 | else
|
253 | {
|
254 | usart_error(EC_USART_NO_START); // Kein Start erhalten ==> Error
|
255 | return 0xFF; // FEHLER
|
256 | }
|
257 | }
|