Subversion Repositories FlightCtrl

Rev

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;