Subversion Repositories FlightCtrl

Rev

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

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