Subversion Repositories FlightCtrl

Rev

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

Rev 1199 Rev 1200
Line 1... Line 1...
1
#include "dsl.h"
1
#include "dsl.h"
-
 
2
#include "rc.h"
Line 2... Line 3...
2
 
3
 
3
/*
4
/*
4
1. GND (at channel 4 side)
5
1. GND (at channel 4 side)
5
2. TxD
6
2. TxD
6
3. RxD
7
3. RxD
7
4. 5V
8
4. 5V
Line 8... Line 9...
8
*/
9
*/
9
 
10
 
10
// dsl protocol parser state machine
11
// dsl protocol parser state machine
11
#define DSLSTATE_IDLE   0
12
#define DSLSTATE_SYNC1  0
12
#define DLSSTATE_SYNC   1
13
#define DSLSTATE_SYNC2  1
-
 
14
#define DSLSTATE_HDR    2
Line 13... Line 15...
13
#define DSLSTATE_HDR    2
15
#define DSLSTATE_DATA   3
14
#define DSLSTATE_DATA   3
16
#define DSLSTATE_CRC    4
Line 15... Line 17...
15
 
17
 
16
#define DSL_SYNC1_CHAR 0xFF
18
#define DSL_SYNC1_CHAR 0xFF
17
#define DSL_SYNC2_CHAR 0xFF
19
#define DSL_SYNC2_CHAR 0xFF
18
 
20
 
19
 
21
 
20
volatile uint8_t rcdsl_RSSI = 0;
22
uint8_t dsl_RSSI = 0;
-
 
23
uint8_t dsl_Battery = 0;
21
uint8_t dsl_battery = 0;
24
uint8_t dsl_Allocation = 0;
22
uint8_t dsl_allocation = 0;
25
uint8_t PacketBuffer[6];
23
uint8_t data[6];
26
 
-
 
27
typedef union
-
 
28
{
Line 24... Line 29...
24
 
29
        int16_t Servo[2];
25
typedef union {
30
        uint8_t  byte[4];
26
        uint16_t pos[2];
31
} ServoPair_t;
27
        uint8_t dat[4];
32
 
28
} servos_t;
33
ServoPair_t ServoPair;
29
 
34
 
30
 
35
 
Line 31... Line 36...
31
// This function is called, when a new servo signal is properly received.
36
// This function is called, when a new servo signal is properly received.
32
// Parameters: servo  - servo number (0-9)
37
// Parameters: servo  - servo number (0-9)
33
//             signal - servo signal between 7373 (1ms) and 14745 (2ms)
38
//             signal - servo signal between 7373 (1ms) and 14745 (2ms)
34
void dsl_new_signal(uint8_t channel, int16_t signal)
39
void dsl_new_signal(uint8_t channel, int16_t signal)
35
{
-
 
36
    volatile signed int tmp;
-
 
37
    uint8_t index = channel+1; // Der MK fängt bei 1 an zu zählen
-
 
Line -... Line 40...
-
 
40
{
38
 
41
    int16_t tmp;
39
 
42
    uint8_t index = channel + 1; // mk channels start with 1
40
    // Signal vom  ACTDSL-Empfänger liegt zwischen
43
 
-
 
44
 
41
    // 7373 (1ms) und 14745 (2ms).
45
    // Signal vom  ACTDSL-Empfänger liegt zwischen
42
    signal-= 11059;     // Neutralstellung zur Null verschieben
46
    // 7373 (1ms) und 14745 (2ms).
43
    signal/= 24;        // Auf MK Skalierung umrechnen
47
    signal-= 11059;     // shift to neutral
44
 
-
 
45
    // Stabiles Signal
-
 
46
    //if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;}
-
 
47
 
-
 
48
    tmp = (3 * (PPM_in[index]) + signal) / 4;
-
 
49
    if(tmp > signal+1) tmp--; else
-
 
50
    if(tmp < signal-1) tmp++;
-
 
51
    if(SenderOkay >= 105)  PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3;
-
 
52
    else PPM_diff[index] = 0;
-
 
Line -... Line 48...
-
 
48
    signal/= 24;        // scale to mk rc resolution
53
    PPM_in[index] = tmp;
49
 
Line 54... Line 50...
54
    //NewPpmData = 0;
50
        // calculate exponential history for signal
55
    //NewActData = 1;
51
        tmp = (3 * (PPM_in[index]) + signal) / 4;
56
    if(index == 4)  {
52
        if(tmp > signal+1) tmp--; else
57
        //NewActData = 1;
53
        if(tmp < signal-1) tmp++;
58
        NewPpmData = 0;
54
        // calculate signal difference on good signal level
59
        //PORTC = (PORTC&(~(1<<PC4))) | ((~PORTC)&(1<<PC4));
-
 
-
 
55
        if(RC_Quality >= 195)  PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for noise reduction
60
        //PINC = (1<<PC4);
56
        else PPM_diff[index] = 0;
61
    }
57
        PPM_in[index] = tmp; // update channel value
62
    //PPM_in[index] = signal;
58
 
63
 
59
    if(index == 4) NewPpmData = 0;
64
}
60
}
65
 
61
 
66
// This function is called within dsl_parser(), when a complete
62
// This function is called within dsl_parser(), when a complete
67
// data packet with valid checksum has been received.
63
// data packet with valid checksum has been received.
68
void dsl_incoming_paket(void)
-
 
69
{
64
void dsl_decode_packet(void)
70
    uint8_t  i;
65
{
71
    static servos_t servos;
-
 
72
    // Look for status headers
66
    uint8_t  i;
73
    if ((data[0])==0x1F) {
67
 
-
 
68
    if(PacketBuffer[0] == 0x1F) // separate status frame
74
        // Get frequency allocation
69
    {
75
        dsl_allocation = data[0+1];
70
        dsl_Allocation  = PacketBuffer[1]; // Get frequency allocation
76
        // Get signal quality
-
 
77
        dsl_RSSI = data[2+1];
71
        // ??                   = PacketBuffer[2];
78
        // Get voltage of battery supply
72
        dsl_RSSI                = PacketBuffer[3]; // Get signal quality
79
        dsl_battery = data[3+1];
73
        RC_Quality              = dsl_RSSI; // have to be scaled
80
    }
74
        dsl_Battery     = PacketBuffer[4]; // Get voltage of battery supply
81
 
-
 
82
    // Look for signal headers
75
        // ??                   = PacketBuffer[5];
83
    if ((data[0]&0xF0)==0x10) {
76
        }
84
 
77
    else // analyze servo pair frame
85
        i = data[0]&0x0F;   // Last 4 bits of the header indicates servo pair
78
    {
86
 
79
                i = PacketBuffer[0] & 0x0F;   // last 4 bits of the header indicates servo pair
Line 87... Line 80...
87
        if (i<10) {
80
                if(i < 10)
88
            // Convert byte array to two uint16
81
                {
89
            servos.dat[1] = data[1];
82
                        // big to little endian
90
            servos.dat[0] = data[2];
83
                        ServoPair.byte[1] = PacketBuffer[1];
91
            servos.dat[3] = data[3];
84
                        ServoPair.byte[0] = PacketBuffer[2];
92
            servos.dat[2] = data[4];
85
                        ServoPair.byte[3] = PacketBuffer[3];
-
 
86
            ServoPair.byte[2] = PacketBuffer[4];
-
 
87
                        dsl_new_signal(i,  ServoPair.Servo[0]);
-
 
88
                        dsl_new_signal(i+1,ServoPair.Servo[0]);
Line 93... Line 89...
93
 
89
                }
94
            rcdsl_new_signal(i  ,  (int16_t)servos.pos[0]);
90
        }
95
            rcdsl_new_signal(i+1,  (int16_t)servos.pos[1]);
91
}
96
        }
92
 
97
    }
93
 
98
}
94
// Status Frame: |0xFF|0xFF|0x1F|FREQALLOC|??|RSSI|VBAT|??|CRC|
Line 99... Line 95...
99
 
95
// FREQ ALLOC = 35, 40, 72
Line 100... Line 96...
100
 
96
// RSSI = 0.. 255                               // Received signal strength indicator
101
// Status Frame: |0xFF|0xFF|0x1F|FREQALLOC|??|RSSI|VBAT|CRC
97
// VBAT = 0...255                               // supply voltage (0.0V.. 8.2V)
102
// FREQ ALLOC = 35, 40, 72
98
//
103
// RSSI = 0.. 255                               // Received signal strength indicator
99
// Servo Pair:   |0xFF|0xFF|0x1X|D0|D1|D2|D3|CRC|
104
// VBAT = 0...255                               // supply voltage (0.0V.. 8.2V)
100
// X is channel index of 1 servo value
105
//
101
// D0, D1 is servo channel X
106
//|0xFF|0xFF|CMD|D0|D1|D2|D3
102
// D2, D3 is servo channel X+1
107
 
103
 
108
// this function should be called within the UART RX ISR
104
// this function should be called within the UART RX ISR
109
void dsl_parser(uint8_t c)
105
void dsl_parser(uint8_t c)
110
{
106
{
111
        static uint8_t crc      = 0;
107
        static uint8_t crc      = 0;
112
        static uint8_t packet_len       = 0;
108
        static uint8_t cnt = 0;
113
        static uint8_t data_counter = 0;
109
        static uint8_t packet_len = 0;
-
 
110
 
114
 
111
        static uint8_t dslstate = DSLSTATE_SYNC1;
-
 
112
 
-
 
113
        switch(dslstate)
-
 
114
        {
115
        static uint8_t dslstate = DSLSTATE_IDLE;
115
                case DSLSTATE_SYNC1: // check 1st sync byte
-
 
116
                        if (c == DSL_SYNC1_CHAR) dslstate = DSLSTATE_SYNC2;
116
 
117
                        else dslstate = DSLSTATE_SYNC1; // out of synchronization
-
 
118
                        break;
-
 
119
 
117
        switch(dslstate)
120
                case DSLSTATE_SYNC2: // check 2nd sync byte
-
 
121
                        if (c == DSL_SYNC2_CHAR) dslstate = DSLSTATE_HDR; // snchrinization complete trigger to cmd
118
        {
122
                        else dslstate = DSLSTATE_SYNC1; // out of synchronization
Line 119... Line 123...
119
                case DSLSTATE_IDLE: // check 1st sync byte
123
                        break;
120
                        if (c == DSL_SYNC1_CHAR) dslstate = DSLSTATE_SYNC;
124
 
121
                        else dslstate = UBXSTATE_IDLE; // out of synchronization
125
                case DSLSTATE_HDR: // check header byte
122
                        break;
126
                        if ((c & 0xF0) != 0x10)
123
 
127
                        {
Line 124... Line 128...
124
                case DSLSTATE_SYNC: // check 2nd sync byte
128
                                dslstate = DSLSTATE_SYNC1;
125
                        if (c == DSL_SYNC2_CHAR) dslstate = DSLSTATE_CMD; // snchrinization complete trigger to cmd
129
                        }
126
                        else dslstate = DSLSTATE_IDLE; // out of synchronization
130
                        else
127
                        break;
131
                        {
128
 
132
                                cnt = 0;
129
                case DSLSTATE_HDR: // check cmd byte
133
                                PacketBuffer[cnt++] = c;
130
                        if (c == 0x1F) packet_len = 5;
134
                                crc = c;
131
                        else           packet_len = 4;
135
                                if(c == 0x1F)  packet_len = 5;
Line 132... Line 136...
132
                        dcnt = 1;
136
                                else           packet_len = 4;
133
                crc = 0;
137
                                dslstate = DSLSTATE_DATA;
134
                dslstate = DSLSTATE_DATA;
138
                        }
135
                        break;
139
                        break;
136
 
-
 
137
                case DSLSTATE_DATA:
140
 
-
 
141
                case DSLSTATE_DATA: