Subversion Repositories FlightCtrl

Rev

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

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