Subversion Repositories FlightCtrl

Rev

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

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