Subversion Repositories FlightCtrl

Rev

Rev 1215 | Rev 1253 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1215 Rev 1232
1
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2
// + Copyright (c) 04.2007 Holger Buss
2
// + Copyright (c) 04.2007 Holger Buss
3
// + only for non-profit use
3
// + only for non-profit use
4
// + www.MikroKopter.com
4
// + www.MikroKopter.com
5
// + see the File "License.txt" for further Informations
5
// + see the File "License.txt" for further Informations
6
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7
#include <stdarg.h>
7
#include <stdarg.h>
8
#include <string.h>
8
#include <string.h>
9
#include "main.h"
9
#include "main.h"
10
#include "uart.h"
10
#include "uart.h"
11
 
11
 
12
 
12
 
13
#define FC_ADDRESS 1
13
#define FC_ADDRESS 1
14
#define NC_ADDRESS 2
14
#define NC_ADDRESS 2
15
#define MK3MAG_ADDRESS 3
15
#define MK3MAG_ADDRESS 3
16
 
16
 
17
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0;
17
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0;
18
unsigned char DisplayLine = 0;
18
unsigned char DisplayLine = 0;
19
unsigned volatile char SioTmp = 0;
19
unsigned volatile char SioTmp = 0;
20
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF];
20
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF];
21
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF];
21
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF];
22
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF];
22
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF];
23
unsigned volatile char NeuerDatensatzEmpfangen = 0;
23
unsigned volatile char NeuerDatensatzEmpfangen = 0;
24
unsigned volatile char NeueKoordinateEmpfangen = 0;
24
unsigned volatile char NeueKoordinateEmpfangen = 0;
25
unsigned volatile char UebertragungAbgeschlossen = 1;
25
unsigned volatile char UebertragungAbgeschlossen = 1;
26
unsigned volatile char CntCrcError = 0;
26
unsigned volatile char CntCrcError = 0;
27
unsigned volatile char AnzahlEmpfangsBytes = 0;
27
unsigned volatile char AnzahlEmpfangsBytes = 0;
28
unsigned char *pRxData = 0;
28
unsigned char *pRxData = 0;
29
unsigned char RxDataLen = 0;
29
unsigned char RxDataLen = 0;
30
unsigned volatile char PC_DebugTimeout = 0;
30
unsigned volatile char PC_DebugTimeout = 0;
31
unsigned volatile char PC_MotortestActive = 0;
31
unsigned volatile char PC_MotortestActive = 0;
32
 
32
 
33
unsigned char DebugTextAnforderung = 255;
33
unsigned char DebugTextAnforderung = 255;
34
unsigned char PcZugriff = 100;
34
unsigned char PcZugriff = 100;
35
unsigned char MotorTest[16];
35
unsigned char MotorTest[16];
36
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl
36
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl
37
unsigned char ConfirmFrame;
37
unsigned char ConfirmFrame;
38
struct str_DebugOut    DebugOut;
38
struct str_DebugOut    DebugOut;
39
struct str_ExternControl  ExternControl;
39
struct str_ExternControl  ExternControl;
40
struct str_VersionInfo VersionInfo;
40
struct str_VersionInfo VersionInfo;
41
struct str_WinkelOut WinkelOut;
41
struct str_WinkelOut WinkelOut;
42
struct str_Data3D Data3D;
42
struct str_Data3D Data3D;
43
 
43
 
44
int Debug_Timer,Kompass_Timer,Timer3D;
44
int Debug_Timer,Kompass_Timer,Timer3D;
45
unsigned int DebugDataIntervall = 200, Intervall3D = 0;
45
unsigned int DebugDataIntervall = 200, Intervall3D = 0;
46
 
46
 
47
const unsigned char ANALOG_TEXT[32][16] =
47
const unsigned char ANALOG_TEXT[32][16] =
48
{
48
{
49
   //1234567890123456
49
   //1234567890123456
50
    "AngleNick       ", //0
50
    "AngleNick       ", //0
51
    "AngleRoll       ",
51
    "AngleRoll       ",
52
    "AccNick         ",
52
    "AccNick         ",
53
    "AccRoll         ",
53
    "AccRoll         ",
54
    "GyroGier        ",
54
    "GyroGier        ",
55
    "Hight Value     ", //5
55
    "Hight Value     ", //5
56
    "AccZ            ",
56
    "AccZ            ",
57
    "Gas             ",
57
    "Gas             ",
58
    "Compass Value   ",
58
    "Compass Value   ",
59
    "Voltage         ",
59
    "Voltage         ",
60
    "Empfang         ", //10
60
    "Empfang         ", //10
61
    "Gyro Kompass    ",
61
    "Gyro Kompass    ",
62
    "Motor Front     ",
62
    "Motor Front     ",
63
    "Motor Rear      ",
63
    "Motor Rear      ",
64
    "Motor Left      ",
64
    "Motor Left      ",
65
    "Motor Right     ", //15
65
    "Motor Right     ", //15
66
    "                ",
66
    "                ",
67
    "                ",
67
    "                ",
68
    "                ",
68
    "                ",
69
    "MK3Mag CalState ",
69
    "MK3Mag CalState ",
70
    "Servo           ", //20
70
    "Servo           ", //20
71
    "                ",
71
    "                ",
72
    "                ",
72
    "                ",
73
    "                ",
73
    "                ",
74
    "                ",
74
    "                ",
75
    "                ", //25
75
    "                ", //25
76
    "                ",
76
    "                ",
77
    "Kalman_MaxDrift ",
77
    "Kalman_MaxDrift ",
78
    "                ",
78
    "                ",
79
    "Navi Serial Data",
79
    "Navi Serial Data",
80
    "GPS_Nick        ", //30
80
    "GPS_Nick        ", //30
81
    "GPS_Roll        "
81
    "GPS_Roll        "
82
};
82
};
83
 
83
 
84
 
84
 
85
 
85
 
86
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
86
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
87
//++ Sende-Part der Datenübertragung
87
//++ Sende-Part der Datenübertragung
88
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
88
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
89
SIGNAL(INT_VEC_TX)
89
SIGNAL(INT_VEC_TX)
90
{
90
{
91
 static unsigned int ptr = 0;
91
 static unsigned int ptr = 0;
92
 unsigned char tmp_tx;
92
 unsigned char tmp_tx;
93
 if(!UebertragungAbgeschlossen)
93
 if(!UebertragungAbgeschlossen)
94
  {
94
  {
95
   ptr++;                    // die [0] wurde schon gesendet
95
   ptr++;                    // die [0] wurde schon gesendet
96
   tmp_tx = SendeBuffer[ptr];
96
   tmp_tx = SendeBuffer[ptr];
97
   if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF))
97
   if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF))
98
    {
98
    {
99
     ptr = 0;
99
     ptr = 0;
100
     UebertragungAbgeschlossen = 1;
100
     UebertragungAbgeschlossen = 1;
101
    }
101
    }
102
   UDR = tmp_tx;
102
   UDR = tmp_tx;
103
  }
103
  }
104
  else ptr = 0;
104
  else ptr = 0;
105
}
105
}
106
 
106
 
107
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
107
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
108
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung
108
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung
109
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
109
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
110
SIGNAL(INT_VEC_RX)
110
SIGNAL(INT_VEC_RX)
111
{
111
{
112
 static unsigned int crc;
112
 static unsigned int crc;
113
 static unsigned char crc1,crc2,buf_ptr;
113
 static unsigned char crc1,crc2,buf_ptr;
114
 static unsigned char UartState = 0;
114
 static unsigned char UartState = 0;
115
 unsigned char CrcOkay = 0;
115
 unsigned char CrcOkay = 0;
116
 
116
 
117
 SioTmp = UDR;
117
 SioTmp = UDR;
118
 if(buf_ptr >= MAX_EMPFANGS_BUFF)    UartState = 0;
118
 if(buf_ptr >= MAX_EMPFANGS_BUFF)    UartState = 0;
119
 if(SioTmp == '\r' && UartState == 2)
119
 if(SioTmp == '\r' && UartState == 2)
120
  {
120
  {
121
   UartState = 0;
121
   UartState = 0;
122
   crc -= RxdBuffer[buf_ptr-2];
122
   crc -= RxdBuffer[buf_ptr-2];
123
   crc -= RxdBuffer[buf_ptr-1];
123
   crc -= RxdBuffer[buf_ptr-1];
124
   crc %= 4096;
124
   crc %= 4096;
125
   crc1 = '=' + crc / 64;
125
   crc1 = '=' + crc / 64;
126
   crc2 = '=' + crc % 64;
126
   crc2 = '=' + crc % 64;
127
   CrcOkay = 0;
127
   CrcOkay = 0;
128
   if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;};
128
   if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;};
129
   if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet
129
   if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet
130
    {
130
    {
131
     NeuerDatensatzEmpfangen = 1;
131
     NeuerDatensatzEmpfangen = 1;
132
         AnzahlEmpfangsBytes = buf_ptr + 1;
132
         AnzahlEmpfangsBytes = buf_ptr + 1;
133
     RxdBuffer[buf_ptr] = '\r';
133
     RxdBuffer[buf_ptr] = '\r';
-
 
134
         if(RxdBuffer[2] == 'R')
-
 
135
          {
134
         if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando
136
           wdt_enable(WDTO_250MS); // Reset-Commando
-
 
137
           ServoActive = 0;
-
 
138
          }
135
        }
139
        }
136
  }
140
  }
137
  else
141
  else
138
  switch(UartState)
142
  switch(UartState)
139
  {
143
  {
140
   case 0:
144
   case 0:
141
          if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1;  // Startzeichen und Daten schon verarbeitet
145
          if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1;  // Startzeichen und Daten schon verarbeitet
142
                  buf_ptr = 0;
146
                  buf_ptr = 0;
143
                  RxdBuffer[buf_ptr++] = SioTmp;
147
                  RxdBuffer[buf_ptr++] = SioTmp;
144
                  crc = SioTmp;
148
                  crc = SioTmp;
145
          break;
149
          break;
146
   case 1: // Adresse auswerten
150
   case 1: // Adresse auswerten
147
                  UartState++;
151
                  UartState++;
148
                  RxdBuffer[buf_ptr++] = SioTmp;
152
                  RxdBuffer[buf_ptr++] = SioTmp;
149
                  crc += SioTmp;
153
                  crc += SioTmp;
150
                  break;
154
                  break;
151
   case 2: //  Eingangsdaten sammeln
155
   case 2: //  Eingangsdaten sammeln
152
                  RxdBuffer[buf_ptr] = SioTmp;
156
                  RxdBuffer[buf_ptr] = SioTmp;
153
                  if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++;
157
                  if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++;
154
                  else UartState = 0;
158
                  else UartState = 0;
155
                  crc += SioTmp;
159
                  crc += SioTmp;
156
                  break;
160
                  break;
157
   default:
161
   default:
158
          UartState = 0;
162
          UartState = 0;
159
          break;
163
          break;
160
  }
164
  }
161
}
165
}
162
 
166
 
163
 
167
 
164
// --------------------------------------------------------------------------
168
// --------------------------------------------------------------------------
165
void AddCRC(unsigned int wieviele)
169
void AddCRC(unsigned int wieviele)
166
{
170
{
167
 unsigned int tmpCRC = 0,i;
171
 unsigned int tmpCRC = 0,i;
168
 for(i = 0; i < wieviele;i++)
172
 for(i = 0; i < wieviele;i++)
169
  {
173
  {
170
   tmpCRC += SendeBuffer[i];
174
   tmpCRC += SendeBuffer[i];
171
  }
175
  }
172
   tmpCRC %= 4096;
176
   tmpCRC %= 4096;
173
   SendeBuffer[i++] = '=' + tmpCRC / 64;
177
   SendeBuffer[i++] = '=' + tmpCRC / 64;
174
   SendeBuffer[i++] = '=' + tmpCRC % 64;
178
   SendeBuffer[i++] = '=' + tmpCRC % 64;
175
   SendeBuffer[i++] = '\r';
179
   SendeBuffer[i++] = '\r';
176
  UebertragungAbgeschlossen = 0;
180
  UebertragungAbgeschlossen = 0;
177
  UDR = SendeBuffer[0];
181
  UDR = SendeBuffer[0];
178
}
182
}
179
 
183
 
180
 
184
 
181
 
185
 
182
// --------------------------------------------------------------------------
186
// --------------------------------------------------------------------------
183
void SendOutData(unsigned char cmd,unsigned char address, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len)
187
void SendOutData(unsigned char cmd,unsigned char address, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len)
184
{
188
{
185
 va_list ap;
189
 va_list ap;
186
 unsigned int pt = 0;
190
 unsigned int pt = 0;
187
 unsigned char a,b,c;
191
 unsigned char a,b,c;
188
 unsigned char ptr = 0;
192
 unsigned char ptr = 0;
189
 
193
 
190
 unsigned char *snd = 0;
194
 unsigned char *snd = 0;
191
 int len = 0;
195
 int len = 0;
192
 
196
 
193
 SendeBuffer[pt++] = '#';                               // Startzeichen
197
 SendeBuffer[pt++] = '#';                               // Startzeichen
194
 SendeBuffer[pt++] = 'a' + address;             // Adresse (a=0; b=1,...)
198
 SendeBuffer[pt++] = 'a' + address;             // Adresse (a=0; b=1,...)
195
 SendeBuffer[pt++] = cmd;                               // Commando
199
 SendeBuffer[pt++] = cmd;                               // Commando
196
 
200
 
197
 va_start(ap, BufferAnzahl);
201
 va_start(ap, BufferAnzahl);
198
 if(BufferAnzahl)
202
 if(BufferAnzahl)
199
 {
203
 {
200
                snd = va_arg(ap, unsigned char*);
204
                snd = va_arg(ap, unsigned char*);
201
                len = va_arg(ap, int);
205
                len = va_arg(ap, int);
202
                ptr = 0;
206
                ptr = 0;
203
                BufferAnzahl--;
207
                BufferAnzahl--;
204
 }
208
 }
205
 while(len)
209
 while(len)
206
  {
210
  {
207
        if(len)
211
        if(len)
208
        {
212
        {
209
           a = snd[ptr++];
213
           a = snd[ptr++];
210
           len--;
214
           len--;
211
           if((!len) && BufferAnzahl)
215
           if((!len) && BufferAnzahl)
212
                {
216
                {
213
                        snd = va_arg(ap, unsigned char*);
217
                        snd = va_arg(ap, unsigned char*);
214
                        len = va_arg(ap, int);
218
                        len = va_arg(ap, int);
215
                        ptr = 0;
219
                        ptr = 0;
216
                        BufferAnzahl--;
220
                        BufferAnzahl--;
217
                }
221
                }
218
        }
222
        }
219
        else a = 0;
223
        else a = 0;
220
        if(len)
224
        if(len)
221
        {
225
        {
222
                b = snd[ptr++];
226
                b = snd[ptr++];
223
                len--;
227
                len--;
224
                if((!len) && BufferAnzahl)
228
                if((!len) && BufferAnzahl)
225
                {
229
                {
226
                        snd = va_arg(ap, unsigned char*);
230
                        snd = va_arg(ap, unsigned char*);
227
                        len = va_arg(ap, int);
231
                        len = va_arg(ap, int);
228
                        ptr = 0;
232
                        ptr = 0;
229
                        BufferAnzahl--;
233
                        BufferAnzahl--;
230
                }
234
                }
231
        }
235
        }
232
        else b = 0;
236
        else b = 0;
233
        if(len)
237
        if(len)
234
        {
238
        {
235
                c = snd[ptr++];
239
                c = snd[ptr++];
236
                len--;
240
                len--;
237
                if((!len) && BufferAnzahl)
241
                if((!len) && BufferAnzahl)
238
                {
242
                {
239
                        snd = va_arg(ap, unsigned char*);
243
                        snd = va_arg(ap, unsigned char*);
240
                        len = va_arg(ap, int);
244
                        len = va_arg(ap, int);
241
                        ptr = 0;
245
                        ptr = 0;
242
                        BufferAnzahl--;
246
                        BufferAnzahl--;
243
                }
247
                }
244
        }
248
        }
245
        else c = 0;
249
        else c = 0;
246
   SendeBuffer[pt++] = '=' + (a >> 2);
250
   SendeBuffer[pt++] = '=' + (a >> 2);
247
   SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
251
   SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
248
   SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
252
   SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
249
   SendeBuffer[pt++] = '=' + ( c & 0x3f);
253
   SendeBuffer[pt++] = '=' + ( c & 0x3f);
250
  }
254
  }
251
 va_end(ap);
255
 va_end(ap);
252
 AddCRC(pt);
256
 AddCRC(pt);
253
}
257
}
254
 
258
 
255
 
259
 
256
// --------------------------------------------------------------------------
260
// --------------------------------------------------------------------------
257
void Decode64(void)  // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden.
261
void Decode64(void)  // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden.
258
{
262
{
259
 unsigned char a,b,c,d;
263
 unsigned char a,b,c,d;
260
 unsigned char x,y,z;
264
 unsigned char x,y,z;
261
 unsigned char ptrIn = 3; // start at begin of data block
265
 unsigned char ptrIn = 3; // start at begin of data block
262
 unsigned char ptrOut = 3;
266
 unsigned char ptrOut = 3;
263
 unsigned char len = AnzahlEmpfangsBytes - 6; // von der Gesamtbytezahl eines Frames gehen 3 Bytes des Headers  ('#',Addr, Cmd) und 3 Bytes des Footers (CRC1, CRC2, '\r') ab.
267
 unsigned char len = AnzahlEmpfangsBytes - 6; // von der Gesamtbytezahl eines Frames gehen 3 Bytes des Headers  ('#',Addr, Cmd) und 3 Bytes des Footers (CRC1, CRC2, '\r') ab.
264
 
268
 
265
 while(len)
269
 while(len)
266
  {
270
  {
267
   a = RxdBuffer[ptrIn++] - '=';
271
   a = RxdBuffer[ptrIn++] - '=';
268
   b = RxdBuffer[ptrIn++] - '=';
272
   b = RxdBuffer[ptrIn++] - '=';
269
   c = RxdBuffer[ptrIn++] - '=';
273
   c = RxdBuffer[ptrIn++] - '=';
270
   d = RxdBuffer[ptrIn++] - '=';
274
   d = RxdBuffer[ptrIn++] - '=';
271
 
275
 
272
   x = (a << 2) | (b >> 4);
276
   x = (a << 2) | (b >> 4);
273
   y = ((b & 0x0f) << 4) | (c >> 2);
277
   y = ((b & 0x0f) << 4) | (c >> 2);
274
   z = ((c & 0x03) << 6) | d;
278
   z = ((c & 0x03) << 6) | d;
275
 
279
 
276
   if(len--) RxdBuffer[ptrOut++] = x; else break;
280
   if(len--) RxdBuffer[ptrOut++] = x; else break;
277
   if(len--) RxdBuffer[ptrOut++] = y; else break;
281
   if(len--) RxdBuffer[ptrOut++] = y; else break;
278
   if(len--) RxdBuffer[ptrOut++] = z;   else break;
282
   if(len--) RxdBuffer[ptrOut++] = z;   else break;
279
  }
283
  }
280
        pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte
284
        pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte
281
        RxDataLen = ptrOut - 3;  // wie viele Bytes wurden dekodiert?
285
        RxDataLen = ptrOut - 3;  // wie viele Bytes wurden dekodiert?
282
 
286
 
283
}
287
}
284
 
288
 
285
// --------------------------------------------------------------------------
289
// --------------------------------------------------------------------------
286
void BearbeiteRxDaten(void)
290
void BearbeiteRxDaten(void)
287
{
291
{
288
 if(!NeuerDatensatzEmpfangen) return;
292
 if(!NeuerDatensatzEmpfangen) return;
289
 
293
 
290
        unsigned char tempchar1, tempchar2;
294
        unsigned char tempchar1, tempchar2;
291
        Decode64(); // dekodiere datenblock im Empfangsbuffer
295
        Decode64(); // dekodiere datenblock im Empfangsbuffer
292
        switch(RxdBuffer[1]-'a') // check for Slave Address
296
        switch(RxdBuffer[1]-'a') // check for Slave Address
293
        {
297
        {
294
                case FC_ADDRESS: // FC special commands
298
                case FC_ADDRESS: // FC special commands
295
 
299
 
296
                switch(RxdBuffer[2])
300
                switch(RxdBuffer[2])
297
                {
301
                {
298
                        case 'K':// Kompasswert
302
                        case 'K':// Kompasswert
299
                                        memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue));
303
                                        memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue));
300
                                        KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
304
                                        KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
301
                                        break;
305
                                        break;
302
                        case 't':// Motortest
306
                        case 't':// Motortest
303
                                if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest));
307
                                if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest));
304
                                else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4);
308
                                else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4);
305
                                        PC_MotortestActive = 240;
309
                                        PC_MotortestActive = 240;
306
                                        //while(!UebertragungAbgeschlossen);
310
                                        //while(!UebertragungAbgeschlossen);
307
                                        //SendOutData('T', MeineSlaveAdresse, 0);
311
                                        //SendOutData('T', MeineSlaveAdresse, 0);
308
                                        PcZugriff = 255;
312
                                        PcZugriff = 255;
309
                                        break;
313
                                        break;
310
 
314
 
311
                        case 'n':// "Get Mixer
315
                        case 'n':// "Get Mixer
312
                                        while(!UebertragungAbgeschlossen);
316
                                        while(!UebertragungAbgeschlossen);
313
                    SendOutData('N', FC_ADDRESS, 1, (unsigned char *) &Mixer,sizeof(Mixer));
317
                    SendOutData('N', FC_ADDRESS, 1, (unsigned char *) &Mixer,sizeof(Mixer));
314
                                        break;
318
                                        break;
315
 
319
 
316
                        case 'm':// "Write Mixer
320
                        case 'm':// "Write Mixer
317
                                        while(!UebertragungAbgeschlossen);
321
                                        while(!UebertragungAbgeschlossen);
318
                    if(pRxData[0] == MIXER_REVISION)
322
                    if(pRxData[0] == MIXER_REVISION)
319
                                         {
323
                                         {
320
                       memcpy(&Mixer, (unsigned char *)pRxData, sizeof(Mixer));
324
                       memcpy(&Mixer, (unsigned char *)pRxData, sizeof(Mixer));
321
                       eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer));
325
                       eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer));
322
                                           tempchar1 = 1;
326
                                           tempchar1 = 1;
323
                                         }
327
                                         }
324
                     else  tempchar1 = 0;
328
                     else  tempchar1 = 0;
325
                                        SendOutData('M', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1));
329
                                        SendOutData('M', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1));
326
                                        break;
330
                                        break;
327
 
331
 
328
                        case 'p': // get PPM Channels
332
                        case 'p': // get PPM Channels
329
                                        GetPPMChannelAnforderung = 1;
333
                                        GetPPMChannelAnforderung = 1;
330
                                        break;
334
                                        break;
331
 
335
 
332
                        case 'q':// "Get"-Anforderung für Settings
336
                        case 'q':// "Get"-Anforderung für Settings
333
                                        // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
337
                                        // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
334
                                        if(pRxData[0] == 0xFF)
338
                                        if(pRxData[0] == 0xFF)
335
                                        {
339
                                        {
336
                                                pRxData[0] = GetActiveParamSetNumber();
340
                                                pRxData[0] = GetActiveParamSetNumber();
337
                                        }
341
                                        }
338
                                        // limit settings range
342
                                        // limit settings range
339
                                        if(pRxData[0] < 1) pRxData[0] = 1; // limit to 5
343
                                        if(pRxData[0] < 1) pRxData[0] = 1; // limit to 5
340
                                        else if(pRxData[0] > 5) pRxData[0] = 5; // limit to 5
344
                                        else if(pRxData[0] > 5) pRxData[0] = 5; // limit to 5
341
                                        // load requested parameter set
345
                                        // load requested parameter set
342
                                        ReadParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
346
                                        ReadParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
343
 
347
 
344
                                        while(!UebertragungAbgeschlossen);
348
                                        while(!UebertragungAbgeschlossen);
345
                                        tempchar1 = pRxData[0];
349
                                        tempchar1 = pRxData[0];
346
                                        tempchar2 = EE_DATENREVISION;
350
                                        tempchar2 = EE_DATENREVISION;
347
                                        SendOutData('Q', FC_ADDRESS, 3, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
351
                                        SendOutData('Q', FC_ADDRESS, 3, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
348
                                        break;
352
                                        break;
349
 
353
 
350
                        case 's': // Parametersatz speichern
354
                        case 's': // Parametersatz speichern
351
                                        if((1 <= pRxData[0]) && (pRxData[0] <= 5) && (pRxData[1] == EE_DATENREVISION)) // check for setting to be in range
355
                                        if((1 <= pRxData[0]) && (pRxData[0] <= 5) && (pRxData[1] == EE_DATENREVISION)) // check for setting to be in range
352
                                        {
356
                                        {
353
                                                memcpy((unsigned char *) &EE_Parameter.Kanalbelegung[0], (unsigned char *)&pRxData[2], STRUCT_PARAM_LAENGE);
357
                                                memcpy((unsigned char *) &EE_Parameter.Kanalbelegung[0], (unsigned char *)&pRxData[2], STRUCT_PARAM_LAENGE);
354
                                                WriteParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
358
                                                WriteParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
355
                                                Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L;
359
                                                Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L;
356
                                                Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L;
360
                                                Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L;
357
                                                SetActiveParamSetNumber(pRxData[0]);
361
                                                SetActiveParamSetNumber(pRxData[0]);
358
                                                tempchar1 = GetActiveParamSetNumber();
362
                                                tempchar1 = GetActiveParamSetNumber();
359
                                                Piep(tempchar1);
363
                                                Piep(tempchar1,110);
360
                                        }
364
                                        }
361
                                        else
365
                                        else
362
                                        {
366
                                        {
363
                                                tempchar1 = 0; // mark in response an invlid setting
367
                                                tempchar1 = 0; // mark in response an invlid setting
364
                                        }
368
                                        }
365
                                        while(!UebertragungAbgeschlossen);
369
                                        while(!UebertragungAbgeschlossen);
366
                                        SendOutData('S', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1));
370
                                        SendOutData('S', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1));
367
                                        break;
371
                                        break;
368
 
372
 
369
                } // case FC_ADDRESS:
373
                } // case FC_ADDRESS:
370
 
374
 
371
                default: // any Slave Address
375
                default: // any Slave Address
372
 
376
 
373
                switch(RxdBuffer[2])
377
                switch(RxdBuffer[2])
374
                {
378
                {
375
                        // 't' comand placed here only for compatibility to BL
379
                        // 't' comand placed here only for compatibility to BL
376
                        case 't':// Motortest
380
                        case 't':// Motortest
377
                                if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest));
381
                                if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest));
378
                                else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4);
382
                                else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4);
379
                                        while(!UebertragungAbgeschlossen);
383
                                        while(!UebertragungAbgeschlossen);
380
                                        SendOutData('T', MeineSlaveAdresse, 0);
384
                                        SendOutData('T', MeineSlaveAdresse, 0);
381
                                        PC_MotortestActive = 250;
385
                                        PC_MotortestActive = 250;
382
                                        PcZugriff = 255;
386
                                        PcZugriff = 255;
383
                                        break;
387
                                        break;
384
                        // 'K' comand placed here only for compatibility to old MK3MAG software, that does not send the right Slave Address
388
                        // 'K' comand placed here only for compatibility to old MK3MAG software, that does not send the right Slave Address
385
                        case 'K':// Kompasswert
389
                        case 'K':// Kompasswert
386
                                        memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue));
390
                                        memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue));
387
                                        KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
391
                                        KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
388
                                        break;
392
                                        break;
389
                        case 'a':// Texte der Analogwerte
393
                        case 'a':// Texte der Analogwerte
390
                                        DebugTextAnforderung = pRxData[0];
394
                                        DebugTextAnforderung = pRxData[0];
391
                                        if (DebugTextAnforderung > 31) DebugTextAnforderung = 31;
395
                                        if (DebugTextAnforderung > 31) DebugTextAnforderung = 31;
392
                                        PcZugriff = 255;
396
                                        PcZugriff = 255;
393
                                        break;
397
                                        break;
394
                        case 'b':
398
                        case 'b':
395
                                        memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl));
399
                                        memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl));
396
                                        ConfirmFrame = ExternControl.Frame;
400
                                        ConfirmFrame = ExternControl.Frame;
397
                                        PcZugriff = 255;
401
                                        PcZugriff = 255;
398
                                        break;
402
                                        break;
399
                        case 'c': // Poll the 3D-Data
403
                        case 'c': // Poll the 3D-Data
400
                    if(!Intervall3D) { if(pRxData[0]) Timer3D = SetDelay(pRxData[0] * 10);}
404
                    if(!Intervall3D) { if(pRxData[0]) Timer3D = SetDelay(pRxData[0] * 10);}
401
                                        Intervall3D = pRxData[0] * 10;
405
                                        Intervall3D = pRxData[0] * 10;
402
                                        break;
406
                                        break;
403
                        case 'd': // Poll the debug data
407
                        case 'd': // Poll the debug data
404
                                        DebugDataIntervall = pRxData[0] * 10;
408
                                        DebugDataIntervall = pRxData[0] * 10;
405
                                        if(DebugDataIntervall > 0) DebugDataAnforderung = 1;
409
                                        if(DebugDataIntervall > 0) DebugDataAnforderung = 1;
406
                                        break;
410
                                        break;
407
 
411
 
408
                        case 'h':// x-1 Displayzeilen
412
                        case 'h':// x-1 Displayzeilen
409
                                PcZugriff = 255;
413
                                PcZugriff = 255;
410
                                        RemoteKeys |= pRxData[0];
414
                                        RemoteKeys |= pRxData[0];
411
                                        if(RemoteKeys) DisplayLine = 0;
415
                                        if(RemoteKeys) DisplayLine = 0;
412
                                        DebugDisplayAnforderung = 1;
416
                                        DebugDisplayAnforderung = 1;
413
                                        break;
417
                                        break;
414
 
418
 
415
                        case 'l':// x-1 Displayzeilen
419
                        case 'l':// x-1 Displayzeilen
416
                                PcZugriff = 255;
420
                                PcZugriff = 255;
417
                                        MenuePunkt = pRxData[0];
421
                                        MenuePunkt = pRxData[0];
418
                                        DebugDisplayAnforderung1 = 1;
422
                                        DebugDisplayAnforderung1 = 1;
419
                                        break;
423
                                        break;
420
                        case 'v': // Version-Anforderung und Ausbaustufe
424
                        case 'v': // Version-Anforderung und Ausbaustufe
421
                                        GetVersionAnforderung = 1;
425
                                        GetVersionAnforderung = 1;
422
                                        break;
426
                                        break;
423
 
427
 
424
                        case 'g'://
428
                        case 'g'://
425
                                        GetExternalControl = 1;
429
                                        GetExternalControl = 1;
426
                                        break;
430
                                        break;
427
                }
431
                }
428
                break; // default:
432
                break; // default:
429
        }
433
        }
430
        NeuerDatensatzEmpfangen = 0;
434
        NeuerDatensatzEmpfangen = 0;
431
        pRxData = 0;
435
        pRxData = 0;
432
        RxDataLen = 0;
436
        RxDataLen = 0;
433
}
437
}
434
 
438
 
435
//############################################################################
439
//############################################################################
436
//Routine für die Serielle Ausgabe
440
//Routine für die Serielle Ausgabe
437
int uart_putchar (char c)
441
int uart_putchar (char c)
438
//############################################################################
442
//############################################################################
439
{
443
{
440
        if (c == '\n')
444
        if (c == '\n')
441
                uart_putchar('\r');
445
                uart_putchar('\r');
442
        //Warten solange bis Zeichen gesendet wurde
446
        //Warten solange bis Zeichen gesendet wurde
443
        loop_until_bit_is_set(USR, UDRE);
447
        loop_until_bit_is_set(USR, UDRE);
444
        //Ausgabe des Zeichens
448
        //Ausgabe des Zeichens
445
        UDR = c;
449
        UDR = c;
446
 
450
 
447
        return (0);
451
        return (0);
448
}
452
}
449
 
453
 
450
// --------------------------------------------------------------------------
454
// --------------------------------------------------------------------------
451
void WriteProgramData(unsigned int pos, unsigned char wert)
455
void WriteProgramData(unsigned int pos, unsigned char wert)
452
{
456
{
453
  //if (ProgramLocation == IN_RAM) Buffer[pos] = wert;
457
  //if (ProgramLocation == IN_RAM) Buffer[pos] = wert;
454
  // else eeprom_write_byte(&EE_Buffer[pos], wert);
458
  // else eeprom_write_byte(&EE_Buffer[pos], wert);
455
  // Buffer[pos] = wert;
459
  // Buffer[pos] = wert;
456
}
460
}
457
 
461
 
458
//############################################################################
462
//############################################################################
459
//INstallation der Seriellen Schnittstelle
463
//INstallation der Seriellen Schnittstelle
460
void UART_Init (void)
464
void UART_Init (void)
461
//############################################################################
465
//############################################################################
462
{
466
{
463
        //Enable TXEN im Register UCR TX-Data Enable & RX Enable
467
        //Enable TXEN im Register UCR TX-Data Enable & RX Enable
464
 
468
 
465
        UCR=(1 << TXEN) | (1 << RXEN);
469
        UCR=(1 << TXEN) | (1 << RXEN);
466
    // UART Double Speed (U2X)
470
    // UART Double Speed (U2X)
467
        USR   |= (1<<U2X);
471
        USR   |= (1<<U2X);
468
        // RX-Interrupt Freigabe
472
        // RX-Interrupt Freigabe
469
        UCSRB |= (1<<RXCIE);
473
        UCSRB |= (1<<RXCIE);
470
        // TX-Interrupt Freigabe
474
        // TX-Interrupt Freigabe
471
        UCSRB |= (1<<TXCIE);
475
        UCSRB |= (1<<TXCIE);
472
 
476
 
473
        //Teiler wird gesetzt
477
        //Teiler wird gesetzt
474
        UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1);
478
        UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1);
475
        //UBRR = 33;
479
        //UBRR = 33;
476
        //öffnet einen Kanal für printf (STDOUT)
480
        //öffnet einen Kanal für printf (STDOUT)
477
        //fdevopen (uart_putchar, 0);
481
        //fdevopen (uart_putchar, 0);
478
        //sbi(PORTD,4);
482
        //sbi(PORTD,4);
479
        Debug_Timer = SetDelay(DebugDataIntervall);
483
        Debug_Timer = SetDelay(DebugDataIntervall);
480
        Kompass_Timer = SetDelay(220);
484
        Kompass_Timer = SetDelay(220);
481
 
485
 
482
        VersionInfo.SWMajor = VERSION_MAJOR;
486
        VersionInfo.SWMajor = VERSION_MAJOR;
483
        VersionInfo.SWMinor = VERSION_MINOR;
487
        VersionInfo.SWMinor = VERSION_MINOR;
484
        VersionInfo.SWPatch = VERSION_PATCH;
488
        VersionInfo.SWPatch = VERSION_PATCH;
485
        VersionInfo.ProtoMajor  = VERSION_SERIAL_MAJOR;
489
        VersionInfo.ProtoMajor  = VERSION_SERIAL_MAJOR;
486
        VersionInfo.ProtoMinor  = VERSION_SERIAL_MINOR;
490
        VersionInfo.ProtoMinor  = VERSION_SERIAL_MINOR;
487
 
491
 
488
        pRxData = 0;
492
        pRxData = 0;
489
        RxDataLen = 0;
493
        RxDataLen = 0;
490
}
494
}
491
 
495
 
492
//---------------------------------------------------------------------------------------------
496
//---------------------------------------------------------------------------------------------
493
void DatenUebertragung(void)
497
void DatenUebertragung(void)
494
{
498
{
495
 if(!UebertragungAbgeschlossen) return;
499
 if(!UebertragungAbgeschlossen) return;
496
 
500
 
497
        if(DebugDisplayAnforderung && UebertragungAbgeschlossen)
501
        if(DebugDisplayAnforderung && UebertragungAbgeschlossen)
498
        {
502
        {
499
                Menu();
503
                Menu();
500
                SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), &DisplayBuff[DisplayLine * 20], 20);
504
                SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), &DisplayBuff[DisplayLine * 20], 20);
501
                DisplayLine++;
505
                DisplayLine++;
502
                if(DisplayLine >= 4) DisplayLine = 0;
506
                if(DisplayLine >= 4) DisplayLine = 0;
503
                DebugDisplayAnforderung = 0;
507
                DebugDisplayAnforderung = 0;
504
        }
508
        }
505
        if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen)
509
        if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen)
506
        {
510
        {
507
                Menu();
511
                Menu();
508
                SendOutData('L', FC_ADDRESS, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff));
512
                SendOutData('L', FC_ADDRESS, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff));
509
                DebugDisplayAnforderung1 = 0;
513
                DebugDisplayAnforderung1 = 0;
510
        }
514
        }
511
        if(GetVersionAnforderung && UebertragungAbgeschlossen)
515
        if(GetVersionAnforderung && UebertragungAbgeschlossen)
512
        {
516
        {
513
                SendOutData('V', FC_ADDRESS, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo));
517
                SendOutData('V', FC_ADDRESS, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo));
514
                GetVersionAnforderung = 0;
518
                GetVersionAnforderung = 0;
515
        }
519
        }
516
 
520
 
517
        if(GetExternalControl && UebertragungAbgeschlossen)           // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
521
        if(GetExternalControl && UebertragungAbgeschlossen)           // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
518
        {
522
        {
519
                SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl));
523
                SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl));
520
                GetExternalControl = 0;
524
                GetExternalControl = 0;
521
        }
525
        }
522
    if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen)
526
    if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen)
523
         {
527
         {
524
                  WinkelOut.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4));  // etwa in 0.1 Grad
528
                  WinkelOut.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4));  // etwa in 0.1 Grad
525
                  WinkelOut.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4));  // etwa in 0.1 Grad
529
                  WinkelOut.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4));  // etwa in 0.1 Grad
526
                  WinkelOut.UserParameter[0] = Parameter_UserParam1;
530
                  WinkelOut.UserParameter[0] = Parameter_UserParam1;
527
                  WinkelOut.UserParameter[1] = Parameter_UserParam2;
531
                  WinkelOut.UserParameter[1] = Parameter_UserParam2;
528
          SendOutData('w', MK3MAG_ADDRESS, 1, (unsigned char *) &WinkelOut,sizeof(WinkelOut));
532
          SendOutData('w', MK3MAG_ADDRESS, 1, (unsigned char *) &WinkelOut,sizeof(WinkelOut));
529
          if(WinkelOut.CalcState > 4)  WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt
533
          if(WinkelOut.CalcState > 4)  WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt
530
          Kompass_Timer = SetDelay(99);
534
          Kompass_Timer = SetDelay(99);
531
         }
535
         }
532
    if(((DebugDataIntervall>0 && CheckDelay(Debug_Timer)) || DebugDataAnforderung) && UebertragungAbgeschlossen)
536
    if(((DebugDataIntervall>0 && CheckDelay(Debug_Timer)) || DebugDataAnforderung) && UebertragungAbgeschlossen)
533
         {
537
         {
534
          SendOutData('D', FC_ADDRESS, 1, (unsigned char *) &DebugOut,sizeof(DebugOut));
538
          SendOutData('D', FC_ADDRESS, 1, (unsigned char *) &DebugOut,sizeof(DebugOut));
535
          DebugDataAnforderung = 0;
539
          DebugDataAnforderung = 0;
536
          if(DebugDataIntervall>0) Debug_Timer = SetDelay(DebugDataIntervall);
540
          if(DebugDataIntervall>0) Debug_Timer = SetDelay(DebugDataIntervall);
537
         }
541
         }
538
    if(Intervall3D > 0 && CheckDelay(Timer3D) && UebertragungAbgeschlossen)
542
    if(Intervall3D > 0 && CheckDelay(Timer3D) && UebertragungAbgeschlossen)
539
         {
543
         {
540
                  Data3D.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4));  // etwa in 0.1 Grad
544
                  Data3D.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4));  // etwa in 0.1 Grad
541
                  Data3D.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4));  // etwa in 0.1 Grad
545
                  Data3D.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4));  // etwa in 0.1 Grad
542
          Data3D.Winkel[2] = (int) ((10 * ErsatzKompass) / GIER_GRAD_FAKTOR);
546
          Data3D.Winkel[2] = (int) ((10 * ErsatzKompass) / GIER_GRAD_FAKTOR);
543
          SendOutData('C', FC_ADDRESS, 1, (unsigned char *) &Data3D,sizeof(Data3D));
547
          SendOutData('C', FC_ADDRESS, 1, (unsigned char *) &Data3D,sizeof(Data3D));
544
          Timer3D = SetDelay(Intervall3D);
548
          Timer3D = SetDelay(Intervall3D);
545
         }
549
         }
546
    if(DebugTextAnforderung != 255) // Texte für die Analogdaten
550
    if(DebugTextAnforderung != 255) // Texte für die Analogdaten
547
     {
551
     {
548
      SendOutData('A', FC_ADDRESS, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),(unsigned char *) ANALOG_TEXT[DebugTextAnforderung], 16);
552
      SendOutData('A', FC_ADDRESS, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),(unsigned char *) ANALOG_TEXT[DebugTextAnforderung], 16);
549
      DebugTextAnforderung = 255;
553
      DebugTextAnforderung = 255;
550
         }
554
         }
551
     if(ConfirmFrame && UebertragungAbgeschlossen)   // Datensatz bestätigen
555
     if(ConfirmFrame && UebertragungAbgeschlossen)   // Datensatz bestätigen
552
         {
556
         {
553
                SendOutData('B', FC_ADDRESS, 1, (uint8_t*)&ConfirmFrame, sizeof(ConfirmFrame));
557
                SendOutData('B', FC_ADDRESS, 1, (uint8_t*)&ConfirmFrame, sizeof(ConfirmFrame));
554
        ConfirmFrame = 0;
558
        ConfirmFrame = 0;
555
     }
559
     }
556
 
560
 
557
     if(GetPPMChannelAnforderung && UebertragungAbgeschlossen)
561
     if(GetPPMChannelAnforderung && UebertragungAbgeschlossen)
558
     {
562
     {
559
                 SendOutData('P', FC_ADDRESS, 1, (unsigned char *) &PPM_in, sizeof(PPM_in));
563
                 SendOutData('P', FC_ADDRESS, 1, (unsigned char *) &PPM_in, sizeof(PPM_in));
560
                 GetPPMChannelAnforderung = 0;
564
                 GetPPMChannelAnforderung = 0;
561
         }
565
         }
562
 
566
 
563
}
567
}
564
 
568
 
565
 
569