Subversion Repositories FlightCtrl

Rev

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

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