Subversion Repositories FlightCtrl

Rev

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

Rev 1053 Rev 1054
1
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2
// + Copyright (c) 04.2007 Holger Buss
2
// + Copyright (c) 04.2007 Holger Buss
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
 
-
 
12
 
-
 
13
#define FC_ADDRESS 1
-
 
14
#define NC_ADDRESS 2
-
 
15
#define MK3MAG_ADDRESS 3
11
 
16
 
12
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0;
17
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0;
13
unsigned char DisplayLine = 0;
18
unsigned char DisplayLine = 0;
14
unsigned volatile char SioTmp = 0;
19
unsigned volatile char SioTmp = 0;
15
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF];
20
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF];
16
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF];
21
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF];
17
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF];
22
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF];
18
unsigned volatile char NeuerDatensatzEmpfangen = 0;
23
unsigned volatile char NeuerDatensatzEmpfangen = 0;
19
unsigned volatile char NeueKoordinateEmpfangen = 0;
24
unsigned volatile char NeueKoordinateEmpfangen = 0;
20
unsigned volatile char UebertragungAbgeschlossen = 1;
25
unsigned volatile char UebertragungAbgeschlossen = 1;
21
unsigned volatile char CntCrcError = 0;
26
unsigned volatile char CntCrcError = 0;
22
unsigned volatile char AnzahlEmpfangsBytes = 0;
27
unsigned volatile char AnzahlEmpfangsBytes = 0;
23
unsigned char *pRxData = 0;
28
unsigned char *pRxData = 0;
24
unsigned char RxDataLen = 0;
29
unsigned char RxDataLen = 0;
25
unsigned volatile char PC_DebugTimeout = 0;
30
unsigned volatile char PC_DebugTimeout = 0;
26
 
31
 
27
unsigned char DebugTextAnforderung = 255;
32
unsigned char DebugTextAnforderung = 255;
28
unsigned char PcZugriff = 100;
33
unsigned char PcZugriff = 100;
29
unsigned char MotorTest[4] = {0,0,0,0};
34
unsigned char MotorTest[4] = {0,0,0,0};
30
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl
35
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl
31
unsigned char ConfirmFrame;
36
unsigned char ConfirmFrame;
32
struct str_DebugOut    DebugOut;
37
struct str_DebugOut    DebugOut;
33
struct str_ExternControl  ExternControl;
38
struct str_ExternControl  ExternControl;
34
struct str_VersionInfo VersionInfo;
39
struct str_VersionInfo VersionInfo;
35
struct str_WinkelOut WinkelOut;
40
struct str_WinkelOut WinkelOut;
36
 
41
 
37
int Debug_Timer,Kompass_Timer;
42
int Debug_Timer,Kompass_Timer;
38
unsigned int DebugDataIntervall = 200;
43
unsigned int DebugDataIntervall = 200;
39
 
44
 
40
const unsigned char ANALOG_TEXT[32][16] =
45
const unsigned char ANALOG_TEXT[32][16] =
41
{
46
{
42
   //1234567890123456
47
   //1234567890123456
43
    "IntegralNick    ", //0
48
    "IntegralNick    ", //0
44
    "IntegralRoll    ",
49
    "IntegralRoll    ",
45
    "AccNick         ",
50
    "AccNick         ",
46
    "AccRoll         ",
51
    "AccRoll         ",
47
    "GyroGier        ",
52
    "GyroGier        ",
48
    "HoehenWert      ", //5
53
    "HoehenWert      ", //5
49
    "AccZ            ",
54
    "AccZ            ",
50
    "Gas             ",
55
    "Gas             ",
51
    "KompassValue    ",
56
    "KompassValue    ",
52
    "Spannung        ",
57
    "Spannung        ",
53
    "Empfang         ", //10
58
    "Empfang         ", //10
54
    "Ersatzkompass   ",
59
    "Ersatzkompass   ",
55
    "Motor_Vorne     ",
60
    "Motor_Vorne     ",
56
    "Motor_Hinten    ",
61
    "Motor_Hinten    ",
57
    "Motor_Links     ",
62
    "Motor_Links     ",
58
    "Motor_Rechts    ", //15
63
    "Motor_Rechts    ", //15
59
    "                ",
64
    "                ",
60
    "Distance        ",
65
    "Distance        ",
61
    "OsdBar          ",
66
    "OsdBar          ",
62
    "MK3Mag CalState ",
67
    "MK3Mag CalState ",
63
    "Servo           ", //20
68
    "Servo           ", //20
64
    "Nick            ",
69
    "Nick            ",
65
    "Roll            ",
70
    "Roll            ",
66
    "                ",
71
    "                ",
67
    "                ",
72
    "                ",
68
    "                ", //25
73
    "                ", //25
69
    "                ",
74
    "                ",
70
    "Kalman_MaxDrift ",
75
    "Kalman_MaxDrift ",
71
    "                ",
76
    "                ",
72
    "Kalman K        ",
77
    "Kalman K        ",
73
    "GPS_Nick        ", //30
78
    "GPS_Nick        ", //30
74
    "GPS_Roll        "
79
    "GPS_Roll        "
75
};
80
};
76
 
81
 
77
 
82
 
78
 
83
 
79
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
84
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
80
//++ Sende-Part der Datenübertragung
85
//++ Sende-Part der Datenübertragung
81
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
86
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82
SIGNAL(INT_VEC_TX)
87
SIGNAL(INT_VEC_TX)
83
{
88
{
84
 static unsigned int ptr = 0;
89
 static unsigned int ptr = 0;
85
 unsigned char tmp_tx;
90
 unsigned char tmp_tx;
86
 if(!UebertragungAbgeschlossen)
91
 if(!UebertragungAbgeschlossen)
87
  {
92
  {
88
   ptr++;                    // die [0] wurde schon gesendet
93
   ptr++;                    // die [0] wurde schon gesendet
89
   tmp_tx = SendeBuffer[ptr];
94
   tmp_tx = SendeBuffer[ptr];
90
   if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF))
95
   if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF))
91
    {
96
    {
92
     ptr = 0;
97
     ptr = 0;
93
     UebertragungAbgeschlossen = 1;
98
     UebertragungAbgeschlossen = 1;
94
    }
99
    }
95
   UDR = tmp_tx;
100
   UDR = tmp_tx;
96
  }
101
  }
97
  else ptr = 0;
102
  else ptr = 0;
98
}
103
}
99
 
104
 
100
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
105
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
101
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung
106
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung
102
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
107
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
103
SIGNAL(INT_VEC_RX)
108
SIGNAL(INT_VEC_RX)
104
{
109
{
105
 static unsigned int crc;
110
 static unsigned int crc;
106
 static unsigned char crc1,crc2,buf_ptr;
111
 static unsigned char crc1,crc2,buf_ptr;
107
 static unsigned char UartState = 0;
112
 static unsigned char UartState = 0;
108
 unsigned char CrcOkay = 0;
113
 unsigned char CrcOkay = 0;
109
 
114
 
110
 SioTmp = UDR;
115
 SioTmp = UDR;
111
 if(buf_ptr >= MAX_EMPFANGS_BUFF)    UartState = 0;
116
 if(buf_ptr >= MAX_EMPFANGS_BUFF)    UartState = 0;
112
 if(SioTmp == '\r' && UartState == 2)
117
 if(SioTmp == '\r' && UartState == 2)
113
  {
118
  {
114
   UartState = 0;
119
   UartState = 0;
115
   crc -= RxdBuffer[buf_ptr-2];
120
   crc -= RxdBuffer[buf_ptr-2];
116
   crc -= RxdBuffer[buf_ptr-1];
121
   crc -= RxdBuffer[buf_ptr-1];
117
   crc %= 4096;
122
   crc %= 4096;
118
   crc1 = '=' + crc / 64;
123
   crc1 = '=' + crc / 64;
119
   crc2 = '=' + crc % 64;
124
   crc2 = '=' + crc % 64;
120
   CrcOkay = 0;
125
   CrcOkay = 0;
121
   if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;};
126
   if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;};
122
   if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet
127
   if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet
123
    {
128
    {
124
     NeuerDatensatzEmpfangen = 1;
129
     NeuerDatensatzEmpfangen = 1;
125
         AnzahlEmpfangsBytes = buf_ptr + 1;
130
         AnzahlEmpfangsBytes = buf_ptr + 1;
126
     RxdBuffer[buf_ptr] = '\r';
131
     RxdBuffer[buf_ptr] = '\r';
127
         if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando
132
         if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando
128
        }
133
        }
129
  }
134
  }
130
  else
135
  else
131
  switch(UartState)
136
  switch(UartState)
132
  {
137
  {
133
   case 0:
138
   case 0:
134
          if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1;  // Startzeichen und Daten schon verarbeitet
139
          if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1;  // Startzeichen und Daten schon verarbeitet
135
                  buf_ptr = 0;
140
                  buf_ptr = 0;
136
                  RxdBuffer[buf_ptr++] = SioTmp;
141
                  RxdBuffer[buf_ptr++] = SioTmp;
137
                  crc = SioTmp;
142
                  crc = SioTmp;
138
          break;
143
          break;
139
   case 1: // Adresse auswerten
144
   case 1: // Adresse auswerten
140
                  UartState++;
145
                  UartState++;
141
                  RxdBuffer[buf_ptr++] = SioTmp;
146
                  RxdBuffer[buf_ptr++] = SioTmp;
142
                  crc += SioTmp;
147
                  crc += SioTmp;
143
                  break;
148
                  break;
144
   case 2: //  Eingangsdaten sammeln
149
   case 2: //  Eingangsdaten sammeln
145
                  RxdBuffer[buf_ptr] = SioTmp;
150
                  RxdBuffer[buf_ptr] = SioTmp;
146
                  if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++;
151
                  if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++;
147
                  else UartState = 0;
152
                  else UartState = 0;
148
                  crc += SioTmp;
153
                  crc += SioTmp;
149
                  break;
154
                  break;
150
   default:
155
   default:
151
          UartState = 0;
156
          UartState = 0;
152
          break;
157
          break;
153
  }
158
  }
154
}
159
}
155
 
160
 
156
 
161
 
157
// --------------------------------------------------------------------------
162
// --------------------------------------------------------------------------
158
void AddCRC(unsigned int wieviele)
163
void AddCRC(unsigned int wieviele)
159
{
164
{
160
 unsigned int tmpCRC = 0,i;
165
 unsigned int tmpCRC = 0,i;
161
 for(i = 0; i < wieviele;i++)
166
 for(i = 0; i < wieviele;i++)
162
  {
167
  {
163
   tmpCRC += SendeBuffer[i];
168
   tmpCRC += SendeBuffer[i];
164
  }
169
  }
165
   tmpCRC %= 4096;
170
   tmpCRC %= 4096;
166
   SendeBuffer[i++] = '=' + tmpCRC / 64;
171
   SendeBuffer[i++] = '=' + tmpCRC / 64;
167
   SendeBuffer[i++] = '=' + tmpCRC % 64;
172
   SendeBuffer[i++] = '=' + tmpCRC % 64;
168
   SendeBuffer[i++] = '\r';
173
   SendeBuffer[i++] = '\r';
169
  UebertragungAbgeschlossen = 0;
174
  UebertragungAbgeschlossen = 0;
170
  UDR = SendeBuffer[0];
175
  UDR = SendeBuffer[0];
171
}
176
}
172
 
177
 
173
 
178
 
174
 
179
 
175
// --------------------------------------------------------------------------
180
// --------------------------------------------------------------------------
176
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len)
181
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len)
177
{
182
{
178
 va_list ap;
183
 va_list ap;
179
 unsigned int pt = 0;
184
 unsigned int pt = 0;
180
 unsigned char a,b,c;
185
 unsigned char a,b,c;
181
 unsigned char ptr = 0;
186
 unsigned char ptr = 0;
182
 
187
 
183
 unsigned char *snd = 0;
188
 unsigned char *snd = 0;
184
 int len = 0;
189
 int len = 0;
185
 
190
 
186
 SendeBuffer[pt++] = '#';               // Startzeichen
191
 SendeBuffer[pt++] = '#';               // Startzeichen
187
 SendeBuffer[pt++] = modul;             // Adresse (a=0; b=1,...)
192
 SendeBuffer[pt++] = modul;             // Adresse (a=0; b=1,...)
188
 SendeBuffer[pt++] = cmd;                       // Commando
193
 SendeBuffer[pt++] = cmd;                       // Commando
189
 
194
 
190
 va_start(ap, BufferAnzahl);
195
 va_start(ap, BufferAnzahl);
191
 if(BufferAnzahl)
196
 if(BufferAnzahl)
192
 {
197
 {
193
                snd = va_arg(ap, unsigned char*);
198
                snd = va_arg(ap, unsigned char*);
194
                len = va_arg(ap, int);
199
                len = va_arg(ap, int);
195
                ptr = 0;
200
                ptr = 0;
196
                BufferAnzahl--;
201
                BufferAnzahl--;
197
 }
202
 }
198
 while(len)
203
 while(len)
199
  {
204
  {
200
        if(len)
205
        if(len)
201
        {
206
        {
202
           a = snd[ptr++];
207
           a = snd[ptr++];
203
           len--;
208
           len--;
204
           if((!len) && BufferAnzahl)
209
           if((!len) && BufferAnzahl)
205
                {
210
                {
206
                        snd = va_arg(ap, unsigned char*);
211
                        snd = va_arg(ap, unsigned char*);
207
                        len = va_arg(ap, int);
212
                        len = va_arg(ap, int);
208
                        ptr = 0;
213
                        ptr = 0;
209
                        BufferAnzahl--;
214
                        BufferAnzahl--;
210
                }
215
                }
211
        }
216
        }
212
        else a = 0;
217
        else a = 0;
213
        if(len)
218
        if(len)
214
        {
219
        {
215
                b = snd[ptr++];
220
                b = snd[ptr++];
216
                len--;
221
                len--;
217
                if((!len) && BufferAnzahl)
222
                if((!len) && BufferAnzahl)
218
                {
223
                {
219
                        snd = va_arg(ap, unsigned char*);
224
                        snd = va_arg(ap, unsigned char*);
220
                        len = va_arg(ap, int);
225
                        len = va_arg(ap, int);
221
                        ptr = 0;
226
                        ptr = 0;
222
                        BufferAnzahl--;
227
                        BufferAnzahl--;
223
                }
228
                }
224
        }
229
        }
225
        else b = 0;
230
        else b = 0;
226
        if(len)
231
        if(len)
227
        {
232
        {
228
                c = snd[ptr++];
233
                c = snd[ptr++];
229
                len--;
234
                len--;
230
                if((!len) && BufferAnzahl)
235
                if((!len) && BufferAnzahl)
231
                {
236
                {
232
                        snd = va_arg(ap, unsigned char*);
237
                        snd = va_arg(ap, unsigned char*);
233
                        len = va_arg(ap, int);
238
                        len = va_arg(ap, int);
234
                        ptr = 0;
239
                        ptr = 0;
235
                        BufferAnzahl--;
240
                        BufferAnzahl--;
236
                }
241
                }
237
        }
242
        }
238
        else c = 0;
243
        else c = 0;
239
   SendeBuffer[pt++] = '=' + (a >> 2);
244
   SendeBuffer[pt++] = '=' + (a >> 2);
240
   SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
245
   SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
241
   SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
246
   SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
242
   SendeBuffer[pt++] = '=' + ( c & 0x3f);
247
   SendeBuffer[pt++] = '=' + ( c & 0x3f);
243
  }
248
  }
244
 va_end(ap);
249
 va_end(ap);
245
 AddCRC(pt);
250
 AddCRC(pt);
246
}
251
}
247
 
252
 
248
 
253
 
249
// --------------------------------------------------------------------------
254
// --------------------------------------------------------------------------
250
void Decode64(void)  // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden.
255
void Decode64(void)  // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden.
251
{
256
{
252
 unsigned char a,b,c,d;
257
 unsigned char a,b,c,d;
253
 unsigned char x,y,z;
258
 unsigned char x,y,z;
254
 unsigned char ptrIn = 3; // start at begin of data block
259
 unsigned char ptrIn = 3; // start at begin of data block
255
 unsigned char ptrOut = 3;
260
 unsigned char ptrOut = 3;
256
 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.
261
 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.
257
 
262
 
258
 while(len)
263
 while(len)
259
  {
264
  {
260
   a = RxdBuffer[ptrIn++] - '=';
265
   a = RxdBuffer[ptrIn++] - '=';
261
   b = RxdBuffer[ptrIn++] - '=';
266
   b = RxdBuffer[ptrIn++] - '=';
262
   c = RxdBuffer[ptrIn++] - '=';
267
   c = RxdBuffer[ptrIn++] - '=';
263
   d = RxdBuffer[ptrIn++] - '=';
268
   d = RxdBuffer[ptrIn++] - '=';
264
 
269
 
265
   x = (a << 2) | (b >> 4);
270
   x = (a << 2) | (b >> 4);
266
   y = ((b & 0x0f) << 4) | (c >> 2);
271
   y = ((b & 0x0f) << 4) | (c >> 2);
267
   z = ((c & 0x03) << 6) | d;
272
   z = ((c & 0x03) << 6) | d;
268
 
273
 
269
   if(len--) RxdBuffer[ptrOut++] = x; else break;
274
   if(len--) RxdBuffer[ptrOut++] = x; else break;
270
   if(len--) RxdBuffer[ptrOut++] = y; else break;
275
   if(len--) RxdBuffer[ptrOut++] = y; else break;
271
   if(len--) RxdBuffer[ptrOut++] = z;   else break;
276
   if(len--) RxdBuffer[ptrOut++] = z;   else break;
272
  }
277
  }
273
        pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte
278
        pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte
274
        RxDataLen = ptrOut - 3;  // wie viele Bytes wurden dekodiert?
279
        RxDataLen = ptrOut - 3;  // wie viele Bytes wurden dekodiert?
275
 
280
 
276
}
281
}
277
 
282
 
278
// --------------------------------------------------------------------------
283
// --------------------------------------------------------------------------
279
void BearbeiteRxDaten(void)
284
void BearbeiteRxDaten(void)
280
{
285
{
281
 if(!NeuerDatensatzEmpfangen) return;
286
 if(!NeuerDatensatzEmpfangen) return;
-
 
287
 
-
 
288
        switch(RxdBuffer[1]) // check for Slave Address
-
 
289
        {
282
 
290
                case FC_ADDRESS: // FC special commands
-
 
291
                Decode64(); // dekodiere datenblock im Empfangsbuffer
-
 
292
                switch(RxdBuffer[2])
-
 
293
                {
-
 
294
                        case 'K':// Kompasswert
-
 
295
                                        memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue));
-
 
296
                                        KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
-
 
297
                                        break;
-
 
298
 
-
 
299
                        case 't':// Motortest
-
 
300
                                        memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest));
-
 
301
                                        while(!UebertragungAbgeschlossen);
-
 
302
                                        SendOutData('T', MeineSlaveAdresse, 0);
-
 
303
                                        PcZugriff = 255;
-
 
304
                                        break;
-
 
305
 
-
 
306
                        case 'p': // get PPM Channels
-
 
307
                                        GetPPMChannelAnforderung = 1;
-
 
308
                                        break;
-
 
309
 
-
 
310
                        case 'q':// "Get"-Anforderung für Settings
-
 
311
                                        // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
-
 
312
                                        if(pRxData[0] == 0xFF)
-
 
313
                                        {
-
 
314
                                                pRxData[0] = GetActiveParamSetNumber();
-
 
315
                                        }
-
 
316
                                        else // request active parameter set
-
 
317
                                        {
-
 
318
                                                if(pRxData[0] < 1) pRxData[0] = 1; // limit to 5
-
 
319
                                                else if(pRxData[0] > 5) pRxData[0] = 5; // limit to 5
-
 
320
                                                // load requested parameter set
-
 
321
                                                ReadParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
-
 
322
                                        }
-
 
323
                                        while(!UebertragungAbgeschlossen);
-
 
324
                                        SendOutData('Q', FC_ADDRESS, 2, &pRxData[0], sizeof(unsigned char), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
-
 
325
                                        break;
-
 
326
 
-
 
327
                        case 's': // Parametersatz speichern
-
 
328
                                        if((1 <= pRxData[0]) && (pRxData[0] <= 5)) // check for setting to be in range
-
 
329
                                        {
-
 
330
                                                memcpy((unsigned char *) &EE_Parameter.Kanalbelegung[0], (unsigned char *)&pRxData[1], STRUCT_PARAM_LAENGE);
-
 
331
                                                WriteParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
-
 
332
                                                eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1);  // aktiven Datensatz merken
-
 
333
                                                Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L;
-
 
334
                                                Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L;
-
 
335
                                                Piep(GetActiveParamSetNumber());
-
 
336
                                                while(!UebertragungAbgeschlossen);
-
 
337
                                                SendOutData('S', FC_ADDRESS, 1, &pRxData[0], sizeof(unsigned char));
-
 
338
                                        }
283
  Decode64(); // dekodiere datenblock im Empfangsbuffer
-
 
284
 
-
 
285
  switch(RxdBuffer[2])
-
 
286
  {
-
 
287
   case 'K':// Kompasswert
-
 
288
            memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue));
-
 
289
            KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
-
 
290
                        break;
-
 
291
   case 'a':// Texte der Analogwerte
-
 
292
            DebugTextAnforderung = pRxData[0];
-
 
293
            if (DebugTextAnforderung > 31) DebugTextAnforderung = 31;
-
 
294
            PcZugriff = 255;
-
 
295
                        break;
-
 
296
   case 'b':
-
 
297
                        memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl));
-
 
298
            ConfirmFrame = ExternControl.Frame;
-
 
299
            PcZugriff = 255;
-
 
300
            break;
-
 
301
   case 'd': // Poll the debug data
-
 
302
                        DebugDataIntervall = pRxData[0] * 10;
-
 
303
            if (DebugDataIntervall) DebugDataAnforderung = 1;
-
 
304
            break;
-
 
305
 
-
 
306
   case 'h':// x-1 Displayzeilen
-
 
307
                RemoteKeys |= pRxData[0];
-
 
308
                if(RemoteKeys) DisplayLine = 0;
-
 
309
                        DebugDisplayAnforderung = 1;
-
 
310
                        break;
-
 
311
 
-
 
312
   case 'l':// x-1 Displayzeilen
-
 
313
            MenuePunkt = pRxData[0];
-
 
314
                        DebugDisplayAnforderung1 = 1;
-
 
315
                        break;
-
 
316
   case 't':// Motortest
-
 
317
            memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest));
-
 
318
            while(!UebertragungAbgeschlossen);
-
 
319
            SendOutData('T', MeineSlaveAdresse, 0);
-
 
320
            PcZugriff = 255;
-
 
321
                        break;
-
 
322
   case 'v': // Version-Anforderung     und Ausbaustufe
-
 
323
            GetVersionAnforderung = 1;
-
 
324
            break;
-
 
325
   case 'g'://
-
 
326
                        GetExternalControl = 1;
-
 
327
            break;
-
 
328
   case 'p': // get PPM Channels
-
 
329
                        GetPPMChannelAnforderung = 1;
-
 
330
                        break;
-
 
331
   case 'q':// "Get"-Anforderung für Settings
-
 
332
            // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
-
 
333
            if(pRxData[0] == 0xFF)
-
 
334
                        {
339
                                        break;
335
                                pRxData[0] = GetActiveParamSetNumber();
340
 
336
                        }
-
 
337
                        else // request active parameter set
-
 
338
                        {
-
 
339
                                if(pRxData[0] < 1) pRxData[0] = 1; // limit to 5
-
 
340
                                else if(pRxData[0] > 5) pRxData[0] = 5; // limit to 5
-
 
341
                                // load requested parameter set
-
 
342
                                ReadParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
-
 
343
                        }
-
 
344
            while(!UebertragungAbgeschlossen);
-
 
345
            SendOutData('Q', MeineSlaveAdresse, 2, &pRxData[0], sizeof(unsigned char), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
-
 
346
            break;
-
 
347
   case 's': // Parametersatz speichern
-
 
348
                        if((1 <= pRxData[0]) && (pRxData[0] <= 5)) // check for setting to be in range
-
 
349
                        {
-
 
350
                                memcpy((unsigned char *) &EE_Parameter.Kanalbelegung[0], (unsigned char *)&pRxData[1], STRUCT_PARAM_LAENGE);
-
 
351
                                WriteParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
-
 
352
                                eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1);  // aktiven Datensatz merken
-
 
353
                                Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L;
-
 
354
                                Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L;
-
 
355
                                Piep(GetActiveParamSetNumber());
-
 
356
                                while(!UebertragungAbgeschlossen);
-
 
357
                SendOutData('S', MeineSlaveAdresse, 1, &pRxData[0], sizeof(unsigned char));
-
 
-
 
341
                }
-
 
342
                break; // case FC_ADDRESS:
-
 
343
 
358
                        }
344
                default: // any Slave Address
-
 
345
                Decode64();
-
 
346
                switch(RxdBuffer[2])
-
 
347
                {
-
 
348
                        // 't' comand placed here only for compatibility to BL
-
 
349
                        case 't':// Motortest
-
 
350
                                        memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest));
-
 
351
                                        while(!UebertragungAbgeschlossen);
-
 
352
                                        SendOutData('T', MeineSlaveAdresse, 0);
-
 
353
                                        PcZugriff = 255;
-
 
354
                                        break;
-
 
355
                        // 'K' comand placed here only for compatibility to old MK3MAG software, that does not send the right Slave Address
-
 
356
                        case 'K':// Kompasswert
-
 
357
                                        memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue));
-
 
358
                                        KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
-
 
359
                                        break;
359
                        break;
360
 
-
 
361
                        case 'a':// Texte der Analogwerte
-
 
362
                                        DebugTextAnforderung = pRxData[0];
-
 
363
                                        if (DebugTextAnforderung > 31) DebugTextAnforderung = 31;
-
 
364
                                        PcZugriff = 255;
-
 
365
                                        break;
-
 
366
 
-
 
367
                        case 'b':
-
 
368
                                        memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl));
-
 
369
                                        ConfirmFrame = ExternControl.Frame;
-
 
370
                                        PcZugriff = 255;
-
 
371
                                        break;
-
 
372
                        case 'd': // Poll the debug data
-
 
373
                                        DebugDataIntervall = pRxData[0] * 10;
-
 
374
                                        if (DebugDataIntervall) DebugDataAnforderung = 1;
-
 
375
                                        break;
-
 
376
 
-
 
377
                        case 'h':// x-1 Displayzeilen
-
 
378
                                        RemoteKeys |= pRxData[0];
-
 
379
                                        if(RemoteKeys) DisplayLine = 0;
-
 
380
                                        DebugDisplayAnforderung = 1;
-
 
381
                                        break;
-
 
382
 
-
 
383
                        case 'l':// x-1 Displayzeilen
-
 
384
                                        MenuePunkt = pRxData[0];
-
 
385
                                        DebugDisplayAnforderung1 = 1;
-
 
386
                                        break;
-
 
387
                        case 'v': // Version-Anforderung und Ausbaustufe
-
 
388
                                        GetVersionAnforderung = 1;
-
 
389
                                        break;
-
 
390
 
-
 
391
                        case 'g'://
-
 
392
                                        GetExternalControl = 1;
-
 
393
                                        break;
360
 
394
                }
361
  }
395
                break; // default:
362
// DebugOut.AnzahlZyklen =  Debug_Timer_Intervall;
396
        }
363
        NeuerDatensatzEmpfangen = 0;
397
        NeuerDatensatzEmpfangen = 0;
364
        pRxData = 0;
398
        pRxData = 0;
365
        RxDataLen = 0;
399
        RxDataLen = 0;
366
}
400
}
367
 
401
 
368
//############################################################################
402
//############################################################################
369
//Routine für die Serielle Ausgabe
403
//Routine für die Serielle Ausgabe
370
int uart_putchar (char c)
404
int uart_putchar (char c)
371
//############################################################################
405
//############################################################################
372
{
406
{
373
        if (c == '\n')
407
        if (c == '\n')
374
                uart_putchar('\r');
408
                uart_putchar('\r');
375
        //Warten solange bis Zeichen gesendet wurde
409
        //Warten solange bis Zeichen gesendet wurde
376
        loop_until_bit_is_set(USR, UDRE);
410
        loop_until_bit_is_set(USR, UDRE);
377
        //Ausgabe des Zeichens
411
        //Ausgabe des Zeichens
378
        UDR = c;
412
        UDR = c;
379
 
413
 
380
        return (0);
414
        return (0);
381
}
415
}
382
 
416
 
383
// --------------------------------------------------------------------------
417
// --------------------------------------------------------------------------
384
void WriteProgramData(unsigned int pos, unsigned char wert)
418
void WriteProgramData(unsigned int pos, unsigned char wert)
385
{
419
{
386
  //if (ProgramLocation == IN_RAM) Buffer[pos] = wert;
420
  //if (ProgramLocation == IN_RAM) Buffer[pos] = wert;
387
  // else eeprom_write_byte(&EE_Buffer[pos], wert);
421
  // else eeprom_write_byte(&EE_Buffer[pos], wert);
388
  // Buffer[pos] = wert;
422
  // Buffer[pos] = wert;
389
}
423
}
390
 
424
 
391
//############################################################################
425
//############################################################################
392
//INstallation der Seriellen Schnittstelle
426
//INstallation der Seriellen Schnittstelle
393
void UART_Init (void)
427
void UART_Init (void)
394
//############################################################################
428
//############################################################################
395
{
429
{
396
        //Enable TXEN im Register UCR TX-Data Enable & RX Enable
430
        //Enable TXEN im Register UCR TX-Data Enable & RX Enable
397
 
431
 
398
        UCR=(1 << TXEN) | (1 << RXEN);
432
        UCR=(1 << TXEN) | (1 << RXEN);
399
    // UART Double Speed (U2X)
433
    // UART Double Speed (U2X)
400
        USR   |= (1<<U2X);
434
        USR   |= (1<<U2X);
401
        // RX-Interrupt Freigabe
435
        // RX-Interrupt Freigabe
402
        UCSRB |= (1<<RXCIE);
436
        UCSRB |= (1<<RXCIE);
403
        // TX-Interrupt Freigabe
437
        // TX-Interrupt Freigabe
404
        UCSRB |= (1<<TXCIE);
438
        UCSRB |= (1<<TXCIE);
405
 
439
 
406
        //Teiler wird gesetzt
440
        //Teiler wird gesetzt
407
        UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1);
441
        UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1);
408
        //UBRR = 33;
442
        //UBRR = 33;
409
        //öffnet einen Kanal für printf (STDOUT)
443
        //öffnet einen Kanal für printf (STDOUT)
410
        //fdevopen (uart_putchar, 0);
444
        //fdevopen (uart_putchar, 0);
411
        //sbi(PORTD,4);
445
        //sbi(PORTD,4);
412
        Debug_Timer = SetDelay(DebugDataIntervall);
446
        Debug_Timer = SetDelay(DebugDataIntervall);
413
        Kompass_Timer = SetDelay(220);
447
        Kompass_Timer = SetDelay(220);
414
        MeineSlaveAdresse = 1; // Flight-Ctrl
-
 
415
 
448
 
416
        VersionInfo.Major = VERSION_MAJOR;
449
        VersionInfo.Major = VERSION_MAJOR;
417
        VersionInfo.Minor = VERSION_MINOR;
450
        VersionInfo.Minor = VERSION_MINOR;
418
        VersionInfo.Patch = VERSION_PATCH;
451
        VersionInfo.Patch = VERSION_PATCH;
419
        VersionInfo.Compatible  = VERSION_SERIAL_COMPATIBLE;
452
        VersionInfo.Compatible  = VERSION_SERIAL_COMPATIBLE;
420
 
453
 
421
        pRxData = 0;
454
        pRxData = 0;
422
        RxDataLen = 0;
455
        RxDataLen = 0;
423
}
456
}
424
 
457
 
425
//---------------------------------------------------------------------------------------------
458
//---------------------------------------------------------------------------------------------
426
void DatenUebertragung(void)
459
void DatenUebertragung(void)
427
{
460
{
428
 if(!UebertragungAbgeschlossen) return;
461
 if(!UebertragungAbgeschlossen) return;
429
 
462
 
430
   if(GetExternalControl && UebertragungAbgeschlossen)        // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
463
   if(GetExternalControl && UebertragungAbgeschlossen)        // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
431
   {
464
   {
432
      SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl));
465
      SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl));
433
          GetExternalControl = 0;
466
          GetExternalControl = 0;
434
   }
467
   }
435
 
468
 
436
    if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen)
469
    if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen)
437
         {
470
         {
438
                  WinkelOut.Winkel[0] = (int) (IntegralNick / 108);  // etwa in 0,1 Grad
471
                  WinkelOut.Winkel[0] = (int) (IntegralNick / 108);  // etwa in 0,1 Grad
439
                  WinkelOut.Winkel[1] = (int) (IntegralRoll / 108);  // etwa in 0,1 Grad
472
                  WinkelOut.Winkel[1] = (int) (IntegralRoll / 108);  // etwa in 0,1 Grad
440
                  WinkelOut.UserParameter[0] = Parameter_UserParam1;
473
                  WinkelOut.UserParameter[0] = Parameter_UserParam1;
441
                  WinkelOut.UserParameter[1] = Parameter_UserParam2;
474
                  WinkelOut.UserParameter[1] = Parameter_UserParam2;
442
          SendOutData('k',MeineSlaveAdresse, 1, (unsigned char *) &WinkelOut,sizeof(WinkelOut));
475
          SendOutData('w', MK3MAG_ADDRESS, 1, (unsigned char *) &WinkelOut,sizeof(WinkelOut));
443
          if(WinkelOut.CalcState > 4)  WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt
476
          if(WinkelOut.CalcState > 4)  WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt
444
          Kompass_Timer = SetDelay(99);
477
          Kompass_Timer = SetDelay(99);
445
         }
478
         }
446
    if((( DebugDataIntervall && CheckDelay(Debug_Timer)) || DebugDataAnforderung) && UebertragungAbgeschlossen)
479
    if((( DebugDataIntervall && CheckDelay(Debug_Timer)) || DebugDataAnforderung) && UebertragungAbgeschlossen)
447
         {
480
         {
448
          SendOutData('D',MeineSlaveAdresse, 1, (unsigned char *) &DebugOut,sizeof(DebugOut));
481
          SendOutData('D', FC_ADDRESS, 1, (unsigned char *) &DebugOut,sizeof(DebugOut));
449
          DebugDataAnforderung = 0;
482
          DebugDataAnforderung = 0;
450
          if(DebugDataIntervall) Debug_Timer = SetDelay(DebugDataIntervall);
483
          if(DebugDataIntervall) Debug_Timer = SetDelay(DebugDataIntervall);
451
         }
484
         }
452
    if(DebugTextAnforderung != 255) // Texte für die Analogdaten
485
    if(DebugTextAnforderung != 255) // Texte für die Analogdaten
453
     {
486
     {
454
      SendOutData('A', MeineSlaveAdresse, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),(unsigned char *) ANALOG_TEXT[DebugTextAnforderung], 16);
487
      SendOutData('A', FC_ADDRESS, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),(unsigned char *) ANALOG_TEXT[DebugTextAnforderung], 16);
455
      DebugTextAnforderung = 255;
488
      DebugTextAnforderung = 255;
456
         }
489
         }
457
     if(ConfirmFrame && UebertragungAbgeschlossen)   // Datensatz bestätigen
490
     if(ConfirmFrame && UebertragungAbgeschlossen)   // Datensatz bestätigen
458
         {
491
         {
459
                SendOutData('B', MeineSlaveAdresse, 1, (uint8_t*)&ConfirmFrame, sizeof(ConfirmFrame));
492
                SendOutData('B', FC_ADDRESS, 1, (uint8_t*)&ConfirmFrame, sizeof(ConfirmFrame));
460
        ConfirmFrame = 0;
493
        ConfirmFrame = 0;
461
     }
494
     }
462
 
495
 
463
     if(DebugDisplayAnforderung && UebertragungAbgeschlossen)
496
     if(DebugDisplayAnforderung && UebertragungAbgeschlossen)
464
         {
497
         {
465
             Menu();
498
             Menu();
466
             SendOutData('H',MeineSlaveAdresse, 2, &DisplayLine, sizeof(DisplayLine), &DisplayBuff[DisplayLine * 20], 20);
499
             SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), &DisplayBuff[DisplayLine * 20], 20);
467
             DisplayLine++;
500
             DisplayLine++;
468
             if(DisplayLine >= 4) DisplayLine = 0;
501
             if(DisplayLine >= 4) DisplayLine = 0;
469
                 DebugDisplayAnforderung = 0;
502
                 DebugDisplayAnforderung = 0;
470
         }
503
         }
471
     if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen)
504
     if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen)
472
         {
505
         {
473
        Menu();
506
        Menu();
474
        SendOutData('L',MeineSlaveAdresse, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff));
507
        SendOutData('L', FC_ADDRESS, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff));
475
                DebugDisplayAnforderung1 = 0;
508
                DebugDisplayAnforderung1 = 0;
476
         }
509
         }
477
    if(GetVersionAnforderung && UebertragungAbgeschlossen)
510
    if(GetVersionAnforderung && UebertragungAbgeschlossen)
478
     {
511
     {
479
      SendOutData('V',MeineSlaveAdresse, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo));
512
      SendOutData('V', FC_ADDRESS, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo));
480
          GetVersionAnforderung = 0;
513
          GetVersionAnforderung = 0;
481
     }
514
     }
482
     if(GetPPMChannelAnforderung && UebertragungAbgeschlossen)
515
     if(GetPPMChannelAnforderung && UebertragungAbgeschlossen)
483
     {
516
     {
484
                 SendOutData('P',MeineSlaveAdresse, 1, (unsigned char *) &PPM_in, sizeof(PPM_in));
517
                 SendOutData('P', FC_ADDRESS, 1, (unsigned char *) &PPM_in, sizeof(PPM_in));
485
                 GetPPMChannelAnforderung = 0;
518
                 GetPPMChannelAnforderung = 0;
486
         }
519
         }
487
 
520
 
488
}
521
}
489
 
522
 
490
 
523