Subversion Repositories FlightCtrl

Rev

Rev 2011 | Rev 2309 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2011 Rev 2185
Line 2... Line 2...
2
Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit
2
Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit
3
#######################################################################################*/
3
#######################################################################################*/
Line 4... Line 4...
4
 
4
 
5
#include "Spektrum.h"
5
#include "Spektrum.h"
6
#include "main.h"
-
 
Line 7... Line 6...
7
// Achtung: RECEIVER_SPEKTRUM_DX7EXP oder RECEIVER_SPEKTRUM_DX8EXP wird in der Main.h gesetzt
6
#include "main.h"
Line -... Line 7...
-
 
7
 
8
 
8
unsigned char SpektrumTimer = 0;
9
unsigned char SpektrumTimer = 0;
9
 
10
 
10
// Achtung: RECEIVER_SPEKTRUM_DX7EXP oder RECEIVER_SPEKTRUM_DX8EXP wird in der main.h gesetzt
11
#if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP)
11
#if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP)
-
 
12
unsigned char s_excnt = 0;                   // Bitcounter for Spektrum-Expander
-
 
13
unsigned char s_exparity = 0;                // Parity Bit for Spektrum-Expander
-
 
14
signed char s_exdata[11];                    // Data for Spektrum-Expander
-
 
15
 
-
 
16
void s_update(unsigned char channel, signed int value)  // Channel-Diff numbercrunching and finally assign new stickvalue to PPM_in
-
 
17
{
-
 
18
        if(SenderOkay >= 180) PPM_diff[channel] = ((value - PPM_in[channel]) / 3) * 3;
12
unsigned char s_excnt = 0;                   // Counter for Spektrum-Expander
19
        else PPM_diff[channel] = 0;
-
 
20
        PPM_in[channel] = value;
13
unsigned char s_exparity = 0;                // Parity Bit for Spektrum-Expander
21
}
14
signed char s_exdata[11];         // Data for Spektrum-Expander
22
#endif
15
#endif
23
 
16
//--------------------------------------------------------------//
24
//--------------------------------------------------------------//
17
//--------------------------------------------------------------//
25
//--------------------------------------------------------------//
Line 308... Line 316...
308
                index++;
316
                index++;
309
                if(index < 13)
317
                if(index < 13)
310
                {
318
                {
311
                // Stabiles Signal
319
                // Stabiles Signal
312
#if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP)
320
#if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP)
313
                                        if (index == 2) index = 4;                                                      // Analog channel reassigment (2 <-> 4) for logical numbering (1,2,3,4)
321
                                        if (index == 2) index = 4;                                                              // Analog channel reassigment (2 <-> 4) for logical numbering (1,2,3,4)
314
                                        else if (index == 4) index = 2;
322
                                        else if (index == 4) index = 2;
315
#endif
323
#endif
316
                                if(abs(signal - PPM_in[index]) < 6)
324
                                if(abs(signal - PPM_in[index]) < 6)
317
                                   {
325
                                   {
318
                                                                         if(EE_Parameter.FailsafeChannel == 0 || PPM_in[EE_Parameter.FailsafeChannel] < 100)  // forces Failsafe if the receiver doesn't have 'signal loss' on Failsafe
326
                                                                         if(EE_Parameter.FailsafeChannel == 0 || PPM_in[EE_Parameter.FailsafeChannel] < 100)  // forces Failsafe if the receiver doesn't have 'signal loss' on Failsafe
319
                                                                         {
-
 
-
 
327
                                                                         {
320
                                        if(SenderOkay < 200) SenderOkay += 10;
328
                                        if(SenderOkay < 200) SenderOkay += 10;
321
                                         else
329
                                         else
322
                                         {
330
                                         {
323
                                                SenderOkay = 200;
331
                                                SenderOkay = 200;
324
                                                TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input
332
                                                TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input
325
                                         }
333
                                         }
326
                                                                         }     
-
 
-
 
334
                                                                         }    
327
                                                                   }
335
                                                                   }
328
                                tmp = (3 * (PPM_in[index]) + signal) / 4;
336
                                tmp = (3 * (PPM_in[index]) + signal) / 4;
329
                                if(tmp > signal+1) tmp--; else
337
                                if(tmp > signal+1) tmp--; else
330
                                if(tmp < signal-1) tmp++;
338
                                if(tmp < signal-1) tmp++;
Line 331... Line 339...
331
                               
339
                               
332
#ifdef RECEIVER_SPEKTRUM_DX7EXP
340
#ifdef RECEIVER_SPEKTRUM_DX7EXP
333
                                if(index == 6)                                                                                                  // FLIGHT-MODE - The channel used for our data uplink
341
                                if(index == 6)                                                                                  // FLIGHT-MODE - The channel used for our data uplink
334
                                {
342
                                {
335
                                        if (signal > 100)                                                                                       // SYNC received
343
                                        if (signal > 100)                                                                       // SYNC received
336
                                        {
344
                                        {
337
                                                if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit
345
                                                if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity;                         // Bit = 1 -> Re-Invert parity bit
338
                                                if ((s_excnt == 6 && ((s_exparity != 0 && s_exdata[s_excnt] == -125) || (s_exparity == 0 && s_exdata[s_excnt] == 125))) || (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125)))) // Parity check
346
                                                if ((s_excnt == 6 && ((s_exparity != 0 && s_exdata[s_excnt] == -125) || (s_exparity == 0 && s_exdata[s_excnt] == 125))) || (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125)))) // Parity check
339
                                                {
347
                                                {
340
                                                        if (s_exdata[1] == 125 && s_exdata[2] == -125) PPM_in[5] = -125;                // Reconstruct tripole Flight-Mode value (CH5)
348
                                                        if (s_exdata[1] == 125 && s_exdata[2] == -125) s_update(5,-125);        // Reconstruct tripole Flight-Mode value (CH5)
341
                                                        else if (s_exdata[1] == -125 && s_exdata[2] == -125) PPM_in[5] = 0;     // Reconstruct tripole Flight-Mode value (CH5)
349
                                                        else if (s_exdata[1] == -125 && s_exdata[2] == -125) s_update(5,0);     // Reconstruct tripole Flight-Mode value (CH5)
342
                                                        else if (s_exdata[1] == -125 && s_exdata[2] == 125) PPM_in[5] = 125;    // Reconstruct tripole Flight-Mode value (CH5)
350
                                                        else if (s_exdata[1] == -125 && s_exdata[2] == 125) s_update(5,125);    // Reconstruct tripole Flight-Mode value (CH5)
343
                                                        PPM_in[6] = s_exdata[3];                                                        // Elevator (CH6)
351
                                                        s_update(6,s_exdata[3]);                                                // Elevator (CH6)
344
                                                        PPM_in[11] = s_exdata[4];                                                       // Aileron (CH11)
352
                                                        s_update(11,s_exdata[4]);                                               // Aileron (CH11)
Line 345... Line 353...
345
                                                        PPM_in[12] = s_exdata[5];                                                       // Rudder (CH12)
353
                                                        s_update(12,s_exdata[5]);                                               // Rudder (CH12)
346
 
354
 
347
                                                        if (s_excnt == 9)                                                                       // New Mode (12 Channels)
355
                                                        if (s_excnt == 9)                                                       // New Mode (12 Channels)
348
                                                        {
356
                                                        {
349
                                                                if (s_exdata[7] == 125) PPM_in[8] += 5;                 // Hover Pitch UP (CH8)
357
                                                                if (s_exdata[7] == 125) s_update(8,PPM_in[8]+5);                // Hover Pitch UP (CH8)
350
                                                                if (s_exdata[8] == 125) PPM_in[8] -= 5;                 // Hover Pitch DN (CH8)
358
                                                                if (s_exdata[8] == 125) s_update(8,PPM_in[8]-5);                // Hover Pitch DN (CH8)
351
                                                                if (PPM_in[8] < -125) PPM_in[8] = -125;         // Range-Limit
359
                                                                if (PPM_in[8] < -125) PPM_in[8] = -125;                         // Range-Limit
352
                                                                else if (PPM_in[8] > 125) PPM_in[8] = 125;      // Range-Limit
360
                                                                else if (PPM_in[8] > 125) PPM_in[8] = 125;                      // Range-Limit
353
                                                                PPM_in[10] = s_exdata[6];                                               // AUX2 (CH10)
361
                                                                s_update(10,s_exdata[6]);                                       // AUX2 (CH10)
Line 354... Line 362...
354
                                                        }
362
                                                        }
355
                                                }
363
                                                }
356
 
364
 
Line 357... Line 365...
357
                                                s_excnt = 0;                                                                                            // Reset bitcounter
365
                                                s_excnt = 0;                                                                    // Reset bitcounter
358
                                                s_exparity = 0;                                                                                 // Reset parity bit
366
                                                s_exparity = 0;                                                                 // Reset parity bit
359
                                        }
367
                                        }
360
 
368
 
361
                                        if (signal < 10) s_exdata[++s_excnt] = -125;                                    // Bit = 0 -> value = -125 (min)
369
                                        if (signal < 10) s_exdata[++s_excnt] = -125;                                            // Bit = 0 -> value = -125 (min)
362
                                        if (s_excnt == 10) s_excnt = 0;                                                         // Overflow protection
370
                                        if (s_excnt == 10) s_excnt = 0;                                                         // Overflow protection
363
                                        if (signal < -100)
371
                                        if (signal < -100)
Line 364... Line 372...
364
                                        {
372
                                        {
Line -... Line 373...
-
 
373
                                                s_exdata[s_excnt] = 125;                                                        // Bit = 1 -> value = 125 (max)
-
 
374
                                                s_exparity = ~s_exparity;                                                       // Bit = 1 -> Invert parity bit
-
 
375
                                        }
-
 
376
 
365
                                                s_exdata[s_excnt] = 125;                                                                        // Bit = 1 -> value = 125 (max)
377
                                }
366
                                                s_exparity = ~s_exparity;                                                                       // Bit = 1 -> Invert parity bit
378
 
367
                                        }
379
                                if (index < 5 ) s_update(index,tmp);                                                            // Update normal potis (CH1-4)
368
 
380
                                else if (index == 5) s_update(7,signal);                                                        // Gear (CH7)
369
                                }
381
                                else if (index == 7) s_update(9,signal);                                                        // Hover Throttle (CH9)
370
 
382
 
371
#elif defined RECEIVER_SPEKTRUM_DX8EXP
383
#elif defined RECEIVER_SPEKTRUM_DX8EXP
372
                                if(index == 6)                                                                                                  // FLIGHT-MODE - The channel used for our data uplink
384
                                if(index == 6)                                                                                  // FLIGHT-MODE - The channel used for our data uplink
373
                                {
385
                                {
374
                                        if (signal > 100)                                                                                       // SYNC received
386
                                        if (signal > 100)                                                                       // SYNC received
375
                                        {
387
                                        {
Line 376... Line 388...
376
                                                if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit
388
                                                if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit
377
                                                if (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125)))  // Parity check
389
                                                if (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125)))  // Parity check
378
                                                {
390
                                                {
Line 379... Line 391...
379
                                                        if (s_exdata[1] == 125 && s_exdata[2] == -125) PPM_in[5] = -125;        // Reconstruct tripole Flight-Mode value (CH5)
391
                                                        if (s_exdata[1] == 125 && s_exdata[2] == -125) s_update(5,-125);        // Reconstruct tripole Flight-Mode value (CH5)
380
                                                        else if (s_exdata[1] == -125 && s_exdata[2] == -125) PPM_in[5] = 0;     // Reconstruct tripole Flight-Mode value (CH5)
392
                                                        else if (s_exdata[1] == -125 && s_exdata[2] == -125) s_update(5,0);     // Reconstruct tripole Flight-Mode value (CH5)
381
                                                        else if (s_exdata[1] == -125 && s_exdata[2] == 125) PPM_in[5] = 125;    // Reconstruct tripole Flight-Mode value (CH5)
393
                                                        else if (s_exdata[1] == -125 && s_exdata[2] == 125) s_update(5,125);    // Reconstruct tripole Flight-Mode value (CH5)
Line 382... Line 394...
382
 
394
 
383
                                                        if (s_exdata[3] == 125 && s_exdata[6] == -125) PPM_in[6] = 125;         // Reconstruct tripole Elev D/R value (CH6)
395
                                                        if (s_exdata[3] == 125 && s_exdata[6] == -125) s_update(6,125);         // Reconstruct tripole Elev D/R value (CH6)
384
                                                        else if (s_exdata[3] == -125 && s_exdata[6] == -125) PPM_in[6] = 0;     // Reconstruct tripole Elev D/R value (CH6)
396
                                                        else if (s_exdata[3] == -125 && s_exdata[6] == -125) s_update(6,0);     // Reconstruct tripole Elev D/R value (CH6)
Line 385... Line 397...
385
                                                        else if (s_exdata[3] == -125 && s_exdata[6] == 125) PPM_in[6] = -125;   // Reconstruct tripole Elev D/R value (CH6)
397
                                                        else if (s_exdata[3] == -125 && s_exdata[6] == 125) s_update(6,-125);   // Reconstruct tripole Elev D/R value (CH6)
386
 
398
 
387
 
399
 
Line 404... Line 416...
404
                                                s_exdata[s_excnt] = 125;                                                        // Bit = 1 -> value = 125 (max)
416
                                                s_exdata[s_excnt] = 125;                                                        // Bit = 1 -> value = 125 (max)
405
                                                s_exparity = ~s_exparity;                                                       // Bit = 1 -> Invert parity bit
417
                                                s_exparity = ~s_exparity;                                                       // Bit = 1 -> Invert parity bit
406
                                        }
418
                                        }
Line 407... Line 419...
407
 
419
 
408
                                }
-
 
409
#endif
-
 
410
                                if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3;
-
 
Line 411... Line -...
411
                                else PPM_diff[index] = 0;
-
 
412
 
420
                                }
413
#ifdef RECEIVER_SPEKTRUM_DX7EXP
-
 
414
                                if (index < 5 ) PPM_in[index] = tmp;                                                            // Update normal potis (CH1-4)
-
 
415
                                else if (index == 5) PPM_in[7] = signal;                                                        // Gear (CH7)
-
 
416
                                else if (index == 7) PPM_in[9] = signal;                                                        // Hover Throttle (CH9)
-
 
417
#elif defined RECEIVER_SPEKTRUM_DX8EXP
421
 
418
                                if (index < 5 ) PPM_in[index] = tmp;                                                            // Update normal potis (CH1-4)
422
                                if (index < 5 ) s_update(index,tmp);                                                            // Update normal potis (CH1-4)
419
                                else if (index == 7) PPM_in[7] = signal;                                                        // R Trim (CH7)
423
                                else if (index == 7) s_update(7,signal);                                                        // R Trim (CH7)
-
 
424
                                else if (index == 5) s_update(8,signal);                                                        // AUX2 (CH8)
420
                                else if (index == 5) PPM_in[8] = signal;                                                        // AUX2 (CH8)
425
                                else if (index == 8) s_update(11,signal);                                                       // AUX3 (CH11)
-
 
426
 
-
 
427
#else
421
                                else if (index == 8) PPM_in[11] = signal;                                                       // AUX3 (CH11)
428
                                if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3;
422
#else
429
                                else PPM_diff[index] = 0;
423
                                PPM_in[index] = tmp;
430
                                PPM_in[index] = tmp;
424
#endif
431
#endif
425
                        }
432
                        }
Line 451... Line 458...
451
                SpektrumTimer = MIN_FRAMEGAP;
458
                SpektrumTimer = MIN_FRAMEGAP;
452
                }
459
                }
453
   }
460
   }
454
}
461
}
Line -... Line 462...
-
 
462