Subversion Repositories FlightCtrl

Rev

Rev 1400 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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