Subversion Repositories FlightCtrl

Rev

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

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