Subversion Repositories FlightCtrl

Rev

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

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