Subversion Repositories FlightCtrl

Rev

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

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