Subversion Repositories FlightCtrl

Rev

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

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