Subversion Repositories FlightCtrl

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1199 killagreg 1
#include "dsl.h"
2
 
3
/*
4
1. GND (at channel 4 side)
5
2. TxD
6
3. RxD
7
4. 5V
8
*/
9
 
10
// dsl protocol parser state machine
11
#define DSLSTATE_IDLE   0
12
#define DLSSTATE_SYNC   1
13
#define DSLSTATE_HDR    2
14
#define DSLSTATE_DATA   3
15
 
16
#define DSL_SYNC1_CHAR 0xFF
17
#define DSL_SYNC2_CHAR 0xFF
18
 
19
 
20
volatile uint8_t rcdsl_RSSI = 0;
21
uint8_t dsl_battery = 0;
22
uint8_t dsl_allocation = 0;
23
uint8_t data[6];
24
 
25
typedef union {
26
        uint16_t pos[2];
27
        uint8_t dat[4];
28
} servos_t;
29
 
30
 
31
// This function is called, when a new servo signal is properly received.
32
// Parameters: servo  - servo number (0-9)
33
//             signal - servo signal between 7373 (1ms) and 14745 (2ms)
34
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
38
 
39
 
40
    // Signal vom  ACTDSL-Empfänger liegt zwischen
41
    // 7373 (1ms) und 14745 (2ms).
42
    signal-= 11059;     // Neutralstellung zur Null verschieben
43
    signal/= 24;        // Auf MK Skalierung umrechnen
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;
53
    PPM_in[index] = tmp;
54
    //NewPpmData = 0;
55
    //NewActData = 1;
56
    if(index == 4)  {
57
        //NewActData = 1;
58
        NewPpmData = 0;
59
        //PORTC = (PORTC&(~(1<<PC4))) | ((~PORTC)&(1<<PC4));
60
        //PINC = (1<<PC4);
61
    }
62
    //PPM_in[index] = signal;
63
 
64
}
65
 
66
// This function is called within dsl_parser(), when a complete
67
// data packet with valid checksum has been received.
68
void dsl_incoming_paket(void)
69
{
70
    uint8_t  i;
71
    static servos_t servos;
72
    // Look for status headers
73
    if ((data[0])==0x1F) {
74
        // Get frequency allocation
75
        dsl_allocation = data[0+1];
76
        // Get signal quality
77
        dsl_RSSI = data[2+1];
78
        // Get voltage of battery supply
79
        dsl_battery = data[3+1];
80
    }
81
 
82
    // Look for signal headers
83
    if ((data[0]&0xF0)==0x10) {
84
 
85
        i = data[0]&0x0F;   // Last 4 bits of the header indicates servo pair
86
 
87
        if (i<10) {
88
            // Convert byte array to two uint16
89
            servos.dat[1] = data[1];
90
            servos.dat[0] = data[2];
91
            servos.dat[3] = data[3];
92
            servos.dat[2] = data[4];
93
 
94
            rcdsl_new_signal(i  ,  (int16_t)servos.pos[0]);
95
            rcdsl_new_signal(i+1,  (int16_t)servos.pos[1]);
96
        }
97
    }
98
}
99
 
100
 
101
// Status Frame: |0xFF|0xFF|0x1F|FREQALLOC|??|RSSI|VBAT|CRC
102
// FREQ ALLOC = 35, 40, 72
103
// RSSI = 0.. 255                               // Received signal strength indicator
104
// VBAT = 0...255                               // supply voltage (0.0V.. 8.2V)
105
//
106
//|0xFF|0xFF|CMD|D0|D1|D2|D3
107
 
108
// this function should be called within the UART RX ISR
109
void dsl_parser(uint8_t c)
110
{
111
        static uint8_t crc      = 0;
112
        static uint8_t packet_len       = 0;
113
        static uint8_t data_counter = 0;
114
 
115
        static uint8_t dslstate = DSLSTATE_IDLE;
116
 
117
        switch(dslstate)
118
        {
119
                case DSLSTATE_IDLE: // check 1st sync byte
120
                        if (c == DSL_SYNC1_CHAR) dslstate = DSLSTATE_SYNC;
121
                        else dslstate = UBXSTATE_IDLE; // out of synchronization
122
                        break;
123
 
124
                case DSLSTATE_SYNC: // check 2nd sync byte
125
                        if (c == DSL_SYNC2_CHAR) dslstate = DSLSTATE_CMD; // snchrinization complete trigger to cmd
126
                        else dslstate = DSLSTATE_IDLE; // out of synchronization
127
                        break;
128
 
129
                case DSLSTATE_HDR: // check cmd byte
130
                        if (c == 0x1F) packet_len = 5;
131
                        else           packet_len = 4;
132
                        dcnt = 1;
133
                crc = 0;
134
                dslstate = DSLSTATE_DATA;
135
                        break;
136
 
137
                case DSLSTATE_DATA:
138
                        data[dcnt++] = c;
139
                        crc += c;
140
                        if(dcnt > packetlen) dslstate = DSLSTATE_CRC;
141
                        break;
142
 
143
                case DSLSTATE_CRC:
144
                        // Calculate checksum
145
                        crc = ~crc;
146
                        if (crc == 0xFF) crc = 0xFE;
147
                        // If it match the received one, then apply data
148
                if (c == crc) rcdsl_incoming_paket();
149
                dslstate = DSLSTATE_IDLE;
150
                        break;
151
 
152
                default: // unknown ubx state
153
                        dslstate = DSLSTATE_IDLE;
154
                        break;
155
        }
156
}