Rev 712 | Rev 737 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 712 | Rev 735 | ||
---|---|---|---|
Line 16... | Line 16... | ||
16 | #include "uart.h" |
16 | #include "uart.h" |
17 | #include "fc.h" |
17 | #include "fc.h" |
18 | #include "_Settings.h" |
18 | #include "_Settings.h" |
19 | #include "rc.h" |
19 | #include "rc.h" |
Line -... | Line 20... | ||
- | 20 | ||
- | 21 | #define FALSE 0 |
|
Line 20... | Line 22... | ||
20 | 22 | #define TRUE 1 |
|
21 | - | ||
22 | unsigned char DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0; |
- | |
23 | unsigned volatile char SioTmp = 0; |
- | |
24 | unsigned volatile char txd_buffer[TXD_BUFFER_LEN]; |
- | |
25 | unsigned volatile char rxd_buffer[RXD_BUFFER_LEN]; |
- | |
26 | - | ||
27 | unsigned volatile char NeuerDatensatzEmpfangen = 0; |
- | |
28 | unsigned volatile char NeueKoordinateEmpfangen = 0; |
- | |
29 | unsigned volatile char UebertragungAbgeschlossen = 1; |
- | |
30 | unsigned volatile char CntCrcError = 0; |
- | |
31 | unsigned volatile char AnzahlEmpfangsBytes = 0; |
- | |
32 | unsigned volatile char PC_DebugTimeout = 0; |
- | |
33 | unsigned char RemotePollDisplayLine = 0; |
- | |
34 | unsigned char NurKanalAnforderung = 0; |
- | |
35 | unsigned char DebugTextAnforderung = 255; |
- | |
36 | unsigned char PcAccess = 100; |
- | |
37 | unsigned char MotorTest[4] = {0,0,0,0}; |
- | |
38 | unsigned char DubWiseKeys[4] = {0,0,0,0}; |
- | |
39 | unsigned char MeineSlaveAdresse; |
- | |
40 | unsigned char ConfirmFrame; |
- | |
41 | struct str_DebugOut DebugOut; |
- | |
42 | struct str_ExternControl ExternControl; |
- | |
Line -... | Line 23... | ||
- | 23 | ||
- | 24 | uint8_t DebugGetAnforderung = 0, DebugDisplayAnforderung = 0, DebugDataAnforderung = 0, GetVersionAnforderung = 0; |
|
- | 25 | ||
- | 26 | volatile uint8_t txd_buffer[TXD_BUFFER_LEN]; |
|
- | 27 | volatile uint8_t rxd_buffer[RXD_BUFFER_LEN]; |
|
- | 28 | ||
- | 29 | volatile uint8_t RxDataProcessed = 0; |
|
- | 30 | volatile uint8_t txd_complete = 1; |
|
- | 31 | volatile uint8_t ReceivedBytes = 0; |
|
- | 32 | ||
- | 33 | uint8_t RemotePollDisplayLine = 0; |
|
- | 34 | uint8_t NurKanalAnforderung = 0; |
|
- | 35 | uint8_t DebugTextAnforderung = 255; |
|
- | 36 | uint8_t PcAccess = 100; |
|
- | 37 | uint8_t MotorTest[4] = {0,0,0,0}; |
|
- | 38 | uint8_t DubWiseKeys[4] = {0,0,0,0}; |
|
- | 39 | uint8_t MySlaveAddr; |
|
- | 40 | uint8_t ConfirmFrame; |
|
- | 41 | ||
- | 42 | DebugOut_t DebugOut; |
|
43 | struct str_VersionInfo VersionInfo; |
43 | ExternControl_t ExternControl; |
44 | int Debug_Timer; |
44 | VersionInfo_t VersionInfo; |
45 | 45 | ||
46 | const unsigned char ANALOG_TEXT[32][16] = |
46 | const uint8_t ANALOG_TEXT[32][16] = |
47 | { |
47 | { |
48 | //1234567890123456 |
48 | //1234567890123456 |
Line 146... | Line 146... | ||
146 | /****************************************************************/ |
146 | /****************************************************************/ |
147 | /* USART0 transmitter ISR */ |
147 | /* USART0 transmitter ISR */ |
148 | /****************************************************************/ |
148 | /****************************************************************/ |
149 | ISR(USART0_TX_vect) |
149 | ISR(USART0_TX_vect) |
150 | { |
150 | { |
151 | static uint16_t ptr = 0; |
151 | static uint16_t ptr_txd_buffer = 0; |
152 | uint8_t tmp_tx; |
152 | uint8_t tmp_tx; |
153 | if(!UebertragungAbgeschlossen) |
153 | if(!txd_complete) // transmission not completed |
154 | { |
154 | { |
155 | ptr++; // die [0] wurde schon gesendet |
155 | ptr_txd_buffer++; // die [0] wurde schon gesendet |
156 | tmp_tx = txd_buffer[ptr]; |
156 | tmp_tx = txd_buffer[ptr_txd_buffer]; |
- | 157 | // if terminating character or end of txd buffer was reached |
|
157 | if((tmp_tx == '\r') || (ptr == TXD_BUFFER_LEN)) |
158 | if((tmp_tx == '\r') || (ptr_txd_buffer == TXD_BUFFER_LEN)) |
158 | { |
159 | { |
159 | ptr = 0; |
160 | ptr_txd_buffer = 0; // reset txd pointer |
160 | UebertragungAbgeschlossen = 1; |
161 | txd_complete = 1; // stop transmission |
161 | } |
162 | } |
162 | UDR0 = tmp_tx; // send byte will trigger this ISR again |
163 | UDR0 = tmp_tx; // send current byte will trigger this ISR again |
163 | } |
164 | } |
- | 165 | // transmission completed |
|
164 | else ptr = 0; |
166 | else ptr_txd_buffer = 0; |
165 | } |
167 | } |
Line 166... | Line 168... | ||
166 | 168 | ||
167 | /****************************************************************/ |
169 | /****************************************************************/ |
168 | /* USART0 receiver ISR */ |
170 | /* USART0 receiver ISR */ |
169 | /****************************************************************/ |
171 | /****************************************************************/ |
170 | ISR(USART0_RX_vect) |
172 | ISR(USART0_RX_vect) |
171 | { |
173 | { |
172 | static uint16_t crc; |
174 | static uint16_t crc; |
173 | static uint8_t crc1,crc2,buf_ptr; |
175 | static uint8_t crc1, crc2, ptr_rxd_buffer = 0; |
174 | static uint8_t UartState = 0; |
176 | static uint8_t UartState = 0; |
- | 177 | uint8_t CrcOkay = 0; |
|
175 | uint8_t CrcOkay = 0; |
178 | uint8_t c; |
176 | 179 | ||
177 | SioTmp = UDR0; |
180 | c = UDR0; // catch the received byte |
178 | if(buf_ptr >= RXD_BUFFER_LEN) UartState = 0; |
181 | if(ptr_rxd_buffer >= RXD_BUFFER_LEN) UartState = 0; // rxd buffer overflow -> reset rx uart state |
179 | if(SioTmp == '\r' && UartState == 2) |
182 | if(c == '\r' && UartState == 2) // termination character received during data collection state |
180 | { |
183 | { |
- | 184 | UartState = 0; //reset rxd uart state |
|
- | 185 | // the last 2 bytes are no subject for checksum calculation |
|
181 | UartState = 0; |
186 | // they are the checksum itself |
182 | crc -= rxd_buffer[buf_ptr-2]; |
187 | crc -= rxd_buffer[ptr_rxd_buffer-2]; |
- | 188 | crc -= rxd_buffer[ptr_rxd_buffer-1]; |
|
183 | crc -= rxd_buffer[buf_ptr-1]; |
189 | // calculate checksum from transmitted data |
184 | crc %= 4096; |
190 | crc %= 4096; |
185 | crc1 = '=' + crc / 64; |
191 | crc1 = '=' + crc / 64; |
186 | crc2 = '=' + crc % 64; |
192 | crc2 = '=' + crc % 64; |
- | 193 | CrcOkay = 0; |
|
187 | CrcOkay = 0; |
194 | // compare with transmitted checksum bytes |
- | 195 | if((crc1 == rxd_buffer[ptr_rxd_buffer-2]) && (crc2 == rxd_buffer[ptr_rxd_buffer-1])) CrcOkay = 1; |
|
- | 196 | else CrcOkay = 0; |
|
188 | if((crc1 == rxd_buffer[buf_ptr-2]) && (crc2 == rxd_buffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
197 | |
189 | if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
198 | if(RxDataProcessed && CrcOkay) // data already processed and CRC OK? |
190 | { |
199 | { |
191 | NeuerDatensatzEmpfangen = 1; |
200 | RxDataProcessed = FALSE; // reset flag |
192 | AnzahlEmpfangsBytes = buf_ptr; |
201 | ReceivedBytes = ptr_rxd_buffer; // store number of received bytes |
- | 202 | rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character |
|
193 | rxd_buffer[buf_ptr] = '\r'; |
203 | // if 2nd byte is an 'R' enable watchdog that will result in an reset |
- | 204 | if(rxd_buffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
|
- | 205 | } |
|
- | 206 | } |
|
- | 207 | else |
|
- | 208 | switch(UartState) |
|
- | 209 | { |
|
- | 210 | case 0: // reset rxd buffer |
|
- | 211 | if(c == '#' && RxDataProcessed) UartState = 1; // start character recieved and previous data already processed |
|
- | 212 | ptr_rxd_buffer = 0; // reset buffer pointer |
|
- | 213 | rxd_buffer[ptr_rxd_buffer++] = c; // write character to rxd buffer |
|
- | 214 | crc = c; // initialize crc |
|
- | 215 | break; |
|
- | 216 | case 1: // check address |
|
- | 217 | UartState++; // switch to next state |
|
- | 218 | rxd_buffer[ptr_rxd_buffer++] = c; // write character to rxd buffer |
|
- | 219 | crc += c; // update crc |
|
- | 220 | break; |
|
- | 221 | case 2: // collect received data |
|
- | 222 | rxd_buffer[ptr_rxd_buffer] = c; // write character to rxd buffer |
|
- | 223 | // if buffer overflow -> reset buffer |
|
- | 224 | if(ptr_rxd_buffer < RXD_BUFFER_LEN) ptr_rxd_buffer++; |
|
- | 225 | else UartState = 0; |
|
- | 226 | crc += c; // update checksum |
|
- | 227 | break; |
|
- | 228 | default: |
|
- | 229 | UartState = 0; |
|
194 | if(rxd_buffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
230 | break; |
195 | } |
- | |
196 | } |
- | |
197 | else |
- | |
198 | switch(UartState) |
- | |
199 | { |
- | |
200 | case 0: |
- | |
201 | if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
- | |
202 | buf_ptr = 0; |
- | |
203 | rxd_buffer[buf_ptr++] = SioTmp; |
- | |
204 | crc = SioTmp; |
- | |
205 | break; |
- | |
206 | case 1: // Adresse auswerten |
- | |
207 | UartState++; |
- | |
208 | rxd_buffer[buf_ptr++] = SioTmp; |
- | |
209 | crc += SioTmp; |
- | |
210 | break; |
- | |
211 | case 2: // Eingangsdaten sammeln |
- | |
212 | rxd_buffer[buf_ptr] = SioTmp; |
- | |
213 | if(buf_ptr < RXD_BUFFER_LEN) buf_ptr++; |
- | |
214 | else UartState = 0; |
- | |
215 | crc += SioTmp; |
- | |
216 | break; |
- | |
217 | default: |
- | |
218 | UartState = 0; |
- | |
219 | break; |
- | |
220 | } |
231 | } |
Line 221... | Line 232... | ||
221 | } |
232 | } |
222 | 233 | ||
223 | 234 | ||
224 | 235 | ||
225 | // -------------------------------------------------------------------------- |
236 | // -------------------------------------------------------------------------- |
226 | void AddCRC(unsigned int wieviele) |
237 | void AddCRC(uint16_t datalen) |
227 | { |
238 | { |
228 | uint16_t tmpCRC = 0,i; |
239 | uint16_t tmpCRC = 0,i; |
229 | for(i = 0; i < wieviele;i++) |
240 | for(i = 0; i < datalen;i++) |
230 | { |
241 | { |
231 | tmpCRC += txd_buffer[i]; |
242 | tmpCRC += txd_buffer[i]; |
232 | } |
243 | } |
233 | tmpCRC %= 4096; |
244 | tmpCRC %= 4096; |
234 | txd_buffer[i++] = '=' + tmpCRC / 64; |
245 | txd_buffer[i++] = '=' + tmpCRC / 64; |
235 | txd_buffer[i++] = '=' + tmpCRC % 64; |
246 | txd_buffer[i++] = '=' + tmpCRC % 64; |
Line 236... | Line 247... | ||
236 | txd_buffer[i++] = '\r'; |
247 | txd_buffer[i++] = '\r'; |
237 | UebertragungAbgeschlossen = 0; |
248 | txd_complete = 0; |
238 | UDR0 = txd_buffer[0]; |
249 | UDR0 = txd_buffer[0]; // initiates the transmittion |
239 | } |
250 | } |
240 | 251 | ||
241 | 252 | ||
242 | 253 | ||
243 | // -------------------------------------------------------------------------- |
254 | // -------------------------------------------------------------------------- |
244 | void SendOutData(uint8_t cmd,uint8_t modul, uint8_t *snd, uint8_t len) |
255 | void SendOutData(uint8_t cmd,uint8_t modul, uint8_t *snd, uint8_t len) |
245 | { |
256 | { |
246 | uint16_t pt = 0; |
257 | uint16_t pt = 0; |
247 | uint8_t a,b,c; |
258 | uint8_t a,b,c; |
248 | uint8_t ptr = 0; |
259 | uint8_t ptr = 0; |
249 | 260 | ||
250 | txd_buffer[pt++] = '#'; // Startzeichen |
261 | txd_buffer[pt++] = '#'; // Start character |
251 | txd_buffer[pt++] = modul; // Adresse (a=0; b=1,...) |
262 | txd_buffer[pt++] = modul; // Address (a=0; b=1,...) |
252 | txd_buffer[pt++] = cmd; // Commando |
263 | txd_buffer[pt++] = cmd; // Command |
253 | 264 | ||
254 | while(len) |
265 | while(len) |
255 | { |
266 | { |
256 | if(len) { a = snd[ptr++]; len--;} else a = 0; |
267 | if(len) { a = snd[ptr++]; len--;} else a = 0; |
257 | if(len) { b = snd[ptr++]; len--;} else b = 0; |
268 | if(len) { b = snd[ptr++]; len--;} else b = 0; |
258 | if(len) { c = snd[ptr++]; len--;} else c = 0; |
269 | if(len) { c = snd[ptr++]; len--;} else c = 0; |
Line 259... | Line 270... | ||
259 | txd_buffer[pt++] = '=' + (a >> 2); |
270 | txd_buffer[pt++] = '=' + (a >> 2); |
260 | txd_buffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
271 | txd_buffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
261 | txd_buffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
272 | txd_buffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
262 | txd_buffer[pt++] = '=' + ( c & 0x3f); |
273 | txd_buffer[pt++] = '=' + ( c & 0x3f); |
263 | } |
274 | } |
264 | AddCRC(pt); |
275 | AddCRC(pt); // add checksum after data block and initates the transmission |
265 | } |
276 | } |
266 | 277 | ||
267 | 278 | ||
268 | // -------------------------------------------------------------------------- |
279 | // -------------------------------------------------------------------------- |
269 | void Decode64(uint8_t *ptrOut, uint8_t len, uint8_t ptrIn, uint8_t max) // Wohin mit den Daten; Wie lang; Wo im rxd_buffer |
280 | void Decode64(uint8_t *ptrOut, uint8_t len, uint8_t ptrIn, uint8_t max) // Wohin mit den Daten; Wie lang; Wo im rxd_buffer |
270 | { |
281 | { |
271 | uint8_t a,b,c,d; |
282 | uint8_t a,b,c,d; |
272 | uint8_t ptr = 0; |
283 | uint8_t ptr = 0; |
273 | uint8_t x,y,z; |
284 | uint8_t x,y,z; |
274 | while(len) |
285 | while(len) |
275 | { |
286 | { |
276 | a = rxd_buffer[ptrIn++] - '='; |
287 | a = rxd_buffer[ptrIn++] - '='; |
277 | b = rxd_buffer[ptrIn++] - '='; |
288 | b = rxd_buffer[ptrIn++] - '='; |
278 | c = rxd_buffer[ptrIn++] - '='; |
289 | c = rxd_buffer[ptrIn++] - '='; |
279 | d = rxd_buffer[ptrIn++] - '='; |
290 | d = rxd_buffer[ptrIn++] - '='; |
280 | if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
291 | if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
281 | - | ||
282 | x = (a << 2) | (b >> 4); |
292 | |
Line -... | Line 293... | ||
- | 293 | x = (a << 2) | (b >> 4); |
|
283 | y = ((b & 0x0f) << 4) | (c >> 2); |
294 | y = ((b & 0x0f) << 4) | (c >> 2); |
284 | z = ((c & 0x03) << 6) | d; |
295 | z = ((c & 0x03) << 6) | d; |
285 | 296 | ||
- | 297 | if(len--) ptrOut[ptr++] = x; else break; |
|
286 | if(len--) ptrOut[ptr++] = x; else break; |
298 | if(len--) ptrOut[ptr++] = y; else break; |
Line 287... | Line 299... | ||
287 | if(len--) ptrOut[ptr++] = y; else break; |
299 | if(len--) ptrOut[ptr++] = z; else break; |
Line 288... | Line 300... | ||
288 | if(len--) ptrOut[ptr++] = z; else break; |
300 | } |
289 | } |
301 | } |
290 | 302 | ||
291 | } |
303 | |
292 | 304 | // -------------------------------------------------------------------------- |
|
293 | // -------------------------------------------------------------------------- |
305 | void ProcessRxData(void) |
294 | void BearbeiteRxDaten(void) |
306 | { |
295 | { |
307 | // if data in the rxd buffer are alredy processed immediately return |
296 | if(!NeuerDatensatzEmpfangen) return; |
308 | if(RxDataProcessed) return; |
297 | 309 | ||
298 | uint8_t tmp_char_arr2[2]; |
310 | uint8_t tmp_char_arr2[2]; // local buffer |
299 | 311 | ||
300 | PcAccess = 255; |
312 | PcAccess = 255; |
301 | switch(rxd_buffer[2]) |
313 | switch(rxd_buffer[2]) |
302 | { |
314 | { |
303 | case 'a':// Texte der Analogwerte |
315 | case 'a':// Labels of the Analog Deboug outputs |
304 | Decode64((uint8_t *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
316 | Decode64((uint8_t *) &tmp_char_arr2[0], sizeof(tmp_char_arr2), 3, ReceivedBytes); |
305 | DebugTextAnforderung = tmp_char_arr2[0]; |
317 | DebugTextAnforderung = tmp_char_arr2[0]; |
306 | break; |
318 | break; |
307 | case 'b': |
319 | case 'b': // extern control |
308 | Decode64((uint8_t *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
320 | Decode64((uint8_t *) &ExternControl,sizeof(ExternControl), 3, ReceivedBytes); |
309 | RemoteButtons |= ExternControl.RemoteButtons; |
321 | RemoteButtons |= ExternControl.RemoteButtons; |
- | 322 | ConfirmFrame = ExternControl.Frame; |
|
310 | ConfirmFrame = ExternControl.Frame; |
323 | break; |
311 | break; |
324 | case 'c': // extern control with debug request |
312 | case 'c': |
325 | Decode64((uint8_t *) &ExternControl,sizeof(ExternControl),3,ReceivedBytes); |
313 | Decode64((uint8_t *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
326 | RemoteButtons |= ExternControl.RemoteButtons; |
314 | RemoteButtons |= ExternControl.RemoteButtons; |
327 | ConfirmFrame = ExternControl.Frame; |
315 | ConfirmFrame = ExternControl.Frame; |
328 | DebugDataAnforderung = 1; |
316 | DebugDataAnforderung = 1; |
329 | break; |
317 | break; |
330 | case 'h':// x-1 display columns |
318 | case 'h':// x-1 Displayzeilen |
331 | Decode64((uint8_t *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,ReceivedBytes); |
319 | Decode64((uint8_t *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
332 | RemoteButtons |= tmp_char_arr2[0]; |
320 | RemoteButtons |= tmp_char_arr2[0]; |
333 | if(tmp_char_arr2[1] == 255) NurKanalAnforderung = 1; |
321 | if(tmp_char_arr2[1] == 255) NurKanalAnforderung = 1; else NurKanalAnforderung = 0; // keine Displaydaten |
334 | else NurKanalAnforderung = 0; // keine Displaydaten |
322 | DebugDisplayAnforderung = 1; |
335 | DebugDisplayAnforderung = 1; |
323 | break; |
- | |
324 | case 't':// Motortest |
336 | break; |
325 | Decode64((uint8_t *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
337 | case 't':// motor test |
326 | break; |
338 | Decode64((uint8_t *) &MotorTest[0],sizeof(MotorTest),3,ReceivedBytes); |
327 | case 'k':// Keys von DubWise |
- | |
328 | Decode64((uint8_t *) &DubWiseKeys[0],sizeof(DubWiseKeys),3,AnzahlEmpfangsBytes); |
339 | break; |
329 | ConfirmFrame = DubWiseKeys[3]; |
340 | case 'k':// keys from DubWise |
330 | break; |
341 | Decode64((uint8_t *) &DubWiseKeys[0],sizeof(DubWiseKeys),3,ReceivedBytes); |
331 | case 'v': // Version-Anforderung und Ausbaustufe |
342 | ConfirmFrame = DubWiseKeys[3]; |
- | 343 | break; |
|
332 | GetVersionAnforderung = 1; |
344 | case 'v': // get version and board release |
333 | break; |
345 | GetVersionAnforderung = 1; |
334 | case 'g':// "Get"-Anforderung für Debug-Daten |
346 | break; |
335 | // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
347 | case 'g':// get debug data |
336 | DebugGetAnforderung = 1; |
348 | DebugGetAnforderung = 1; |
337 | break; |
349 | break; |
338 | case 'q':// "Get"-Anforderung für Settings |
350 | case 'q':// get settings |
339 | // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
351 | Decode64((uint8_t *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,ReceivedBytes); |
340 | Decode64((uint8_t *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
352 | if(tmp_char_arr2[0] != 0xff) |
341 | if(tmp_char_arr2[0] != 0xff) |
353 | { |
342 | { |
354 | if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; // limit to 5 |
343 | if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
355 | // load requested parameter set |
344 | ParamSet_ReadFromEEProm(tmp_char_arr2[0]); |
356 | ParamSet_ReadFromEEProm(tmp_char_arr2[0]); |
345 | SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(uint8_t *) &ParamSet.ChannelAssignment[0],PARAMSET_STRUCT_LEN); |
357 | SendOutData('L' + tmp_char_arr2[0] -1,MySlaveAddr,(uint8_t *) &ParamSet.ChannelAssignment[0],PARAMSET_STRUCT_LEN); |
346 | } |
358 | } |
347 | else |
- | |
348 | SendOutData('L' + GetParamByte(PID_ACTIVE_SET)-1,MeineSlaveAdresse,(uint8_t *) &ParamSet.ChannelAssignment[0],PARAMSET_STRUCT_LEN); |
359 | else // send active parameter set |
349 | 360 | SendOutData('L' + GetParamByte(PID_ACTIVE_SET)-1,MySlaveAddr,(uint8_t *) &ParamSet.ChannelAssignment[0],PARAMSET_STRUCT_LEN); |
|
350 | break; |
361 | |
351 | 362 | break; |
|
Line 352... | Line 363... | ||
352 | case 'l': |
363 | |
353 | case 'm': |
- | |
354 | case 'n': |
364 | case 'l': |
355 | case 'o': |
365 | case 'm': |
Line 356... | Line 366... | ||
356 | case 'p': // Parametersatz speichern |
366 | case 'n': |
357 | Decode64((uint8_t *) &ParamSet.ChannelAssignment[0],PARAMSET_STRUCT_LEN,3,AnzahlEmpfangsBytes); |
367 | case 'o': |
358 | ParamSet_WriteToEEProm(rxd_buffer[2] - 'l' + 1); |
368 | case 'p': // save parameterset |
359 | //SetActiveParamSet(rxd_buffer[2] - 'l' + 1); // is alredy done in ParamSet_WriteToEEProm() |
369 | Decode64((uint8_t *) &ParamSet.ChannelAssignment[0],PARAMSET_STRUCT_LEN,3,ReceivedBytes); |
360 | TurnOver180Pitch = (int32_t) ParamSet.AngleTurnOverPitch * 2500L; |
370 | ParamSet_WriteToEEProm(rxd_buffer[2] - 'l' + 1); |
361 | TurnOver180Roll = (int32_t) ParamSet.AngleTurnOverRoll * 2500L; |
371 | TurnOver180Pitch = (int32_t) ParamSet.AngleTurnOverPitch * 2500L; |
362 | Beep(GetActiveParamSet()); |
372 | TurnOver180Roll = (int32_t) ParamSet.AngleTurnOverRoll * 2500L; |
363 | break; |
373 | Beep(GetActiveParamSet()); |
364 | 374 | break; |
|
365 | 375 | ||
366 | } |
376 | |
Line 367... | Line 377... | ||
367 | // DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
377 | } |
368 | NeuerDatensatzEmpfangen = 0; |
378 | RxDataProcessed = TRUE; |
Line 369... | Line -... | ||
369 | } |
- | |
370 | - | ||
371 | //############################################################################ |
- | |
372 | //Routine für die Serielle Ausgabe |
- | |
373 | int16_t uart_putchar (int8_t c) |
- | |
374 | //############################################################################ |
- | |
375 | { |
- | |
376 | if (c == '\n') |
- | |
377 | uart_putchar('\r'); |
- | |
Line 378... | Line 379... | ||
378 | //Warten solange bis Zeichen gesendet wurde |
379 | } |
379 | loop_until_bit_is_set(UCSR0A, UDRE0); |
380 | |
380 | //Ausgabe des Zeichens |
381 | //############################################################################ |
- | 382 | //Routine für die Serielle Ausgabe |
|
381 | UDR0 = c; |
383 | int16_t uart_putchar (int8_t c) |
Line 382... | Line 384... | ||
382 | 384 | //############################################################################ |
|
383 | return (0); |
385 | { |
384 | } |
386 | if (c == '\n') |
385 | 387 | uart_putchar('\r'); |
|
386 | // -------------------------------------------------------------------------- |
388 | // wait until previous character was send |
Line 387... | Line 389... | ||
387 | void WriteProgramData(unsigned int pos, unsigned char wert) |
389 | loop_until_bit_is_set(UCSR0A, UDRE0); |
388 | { |
390 | //Ausgabe des Zeichens |
389 | //if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
391 | UDR0 = c; |
390 | // else eeprom_write_byte(&EE_Buffer[pos], wert); |
392 | |
391 | // Buffer[pos] = wert; |
393 | return (0); |
392 | } |
394 | } |
393 | 395 | ||
394 | 396 | ||
395 | 397 | //--------------------------------------------------------------------------------------------- |
|
396 | //--------------------------------------------------------------------------------------------- |
398 | void TransmitTxData(void) |
397 | void DatenUebertragung(void) |
399 | { |
398 | { |
400 | static int16_t Debug_Timer = 0; |
399 | if(!UebertragungAbgeschlossen) return; |
401 | if(!txd_complete) return; |
400 | 402 | ||
401 | if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
403 | if(DebugGetAnforderung && txd_complete) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
402 | { |
404 | { |
403 | SendOutData('G',MeineSlaveAdresse,(uint8_t *) &ExternControl,sizeof(ExternControl)); |
405 | SendOutData('G',MySlaveAddr,(uint8_t *) &ExternControl,sizeof(ExternControl)); |
404 | DebugGetAnforderung = 0; |
406 | DebugGetAnforderung = 0; |
405 | } |
407 | } |
406 | 408 | ||
407 | if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
409 | if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && txd_complete) |
408 | { |
410 | { |
409 | SendOutData('D',MeineSlaveAdresse,(uint8_t *) &DebugOut,sizeof(DebugOut)); |
411 | SendOutData('D',MySlaveAddr,(uint8_t *) &DebugOut,sizeof(DebugOut)); |
410 | DebugDataAnforderung = 0; |
412 | DebugDataAnforderung = 0; |
411 | Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
413 | Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
412 | } |
414 | } |
413 | if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
415 | if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
414 | { |
416 | { |
415 | SendOutData('A',DebugTextAnforderung + '0',(uint8_t *) ANALOG_TEXT[DebugTextAnforderung],16); |
417 | SendOutData('A',DebugTextAnforderung + '0',(uint8_t *) ANALOG_TEXT[DebugTextAnforderung],16); |
416 | DebugTextAnforderung = 255; |
418 | DebugTextAnforderung = 255; |
417 | } |
419 | } |
418 | if(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz ohne CRC bestätigen |
420 | if(ConfirmFrame && txd_complete) // Datensatz ohne CRC bestätigen |
419 | { |
421 | { |
420 | txd_buffer[0] = '#'; |
422 | txd_buffer[0] = '#'; |
421 | txd_buffer[1] = ConfirmFrame; |
423 | txd_buffer[1] = ConfirmFrame; |
422 | txd_buffer[2] = '\r'; |
424 | txd_buffer[2] = '\r'; |
Line 423... | Line 425... | ||
423 | UebertragungAbgeschlossen = 0; |
425 | txd_complete = 0; |