Subversion Repositories Projects

Rev

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

Rev 440 Rev 449
1
#include <Parser.h>
1
#include <Parser.h>
-
 
2
 
-
 
3
/**
-
 
4
 * create a frame that can be send to the MK using the
-
 
5
 * connection class.
-
 
6
 * see http://www.mikrokopter.com/ucwiki/en/SerialProtocol
-
 
7
 * how the protocol is encoded and
-
 
8
 * see http://www.mikrokopter.com/ucwiki/en/SerialCommands
-
 
9
 * to look at the possible commands that are already coded
-
 
10
 * in data
-
 
11
 */
-
 
12
void Parser::create_frame(char cmd, int address, char * data, unsigned int length) {
-
 
13
        //if # is cmd we do not touch anything, because
-
 
14
        // the command is already encoded in data
-
 
15
        if (cmd != '#') {
-
 
16
            /*
-
 
17
            //calculate buffer length
-
 
18
            //(4 Bytes for 1-byte '#', 1-byte address, and 2-byte crc)
-
 
19
            //(the rest for the data length - see encode how this is calculated)
-
 
20
            int buff_len = 4+(length/3 + (length%3==0?0:1) )*4;
-
 
21
 
-
 
22
            //allociate memory for the data we want to send
-
 
23
            char * send_data = (char *)malloc(buf_len);
-
 
24
            */
-
 
25
            char send_data[150];
-
 
26
            send_data[0]='#';
-
 
27
            send_data[1]=(char)address;
-
 
28
            send_data[2]=cmd;
-
 
29
            for (int i = 0; i < length; i++)
-
 
30
                send_data[i+3] = data[i];
-
 
31
            //TODO: abgleich mit MKCommunication::send_command
-
 
32
            Parser::encode64(send_data, length);
-
 
33
            address = 'a' + address;
-
 
34
           
-
 
35
        }
-
 
36
}
-
 
37
 
-
 
38
 
2
 
39
/**
3
// Base64 Decoder
40
 * Base64 Decoder
-
 
41
 * see Parser.h for details about sRxData
-
 
42
 * data = data that will be decoded
-
 
43
 * len = length of data
4
// see Parser.h for details about sRxData
44
 * ptrOut = pointer to decoded data
-
 
45
 * offset = offset in data
-
 
46
 */
5
bool Parser::decode64(sRxData &rx)
47
int Parser::decode64(char * data, int len, unsigned char *ptrOut, int offset)
6
{
-
 
7
    int length = rx.str.size();
48
{
8
    unsigned char a,b,c,d;
49
    unsigned char a,b,c,d;
9
    unsigned char ptr = 0;
50
    unsigned char ptr = 0;
10
    unsigned char x,y,z;
51
    unsigned char x,y,z;
11
    int ptrOut[150];
-
 
12
 
-
 
13
    int ptrIn = 3;
-
 
14
    int max = length;
-
 
15
    int len = length;
52
 
16
    int decLen = 0;
53
    int decLen = 0;
-
 
54
/*
17
 
55
    //FIXME: dies wieder einklammern!
18
    if (rx.input[ptrIn] == 0) {
56
    if (data[ptrIn] == 0) {
19
        return false;
57
        return -1;
20
        //TODO: catch error to show that something went wrong during the decode process
58
        //TODO: catch error to show that something went wrong during the decode process
21
        //throw "Nothing received";
59
        //throw "Nothing received";
22
    }
60
    }
-
 
61
*/
-
 
62
    //decode data
-
 
63
    while(len) {
-
 
64
        a = data[offset++] - '=';
-
 
65
        b = data[offset++] - '=';
-
 
66
        c = data[offset++] - '=';
-
 
67
        d = data[offset++] - '=';
23
 
-
 
24
    while(len != 0) {
-
 
25
        a = rx.input[ptrIn++] - '=';
-
 
26
        b = rx.input[ptrIn++] - '=';
-
 
27
        c = rx.input[ptrIn++] - '=';
-
 
28
        d = rx.input[ptrIn++] - '=';
-
 
29
 
68
 
30
        if(ptrIn > max - 2) break;
69
        //if(offset > max - 2) break;
31
 
70
 
32
        x = (a << 2) | (b >> 4);
71
        x = (a << 2) | (b >> 4);
33
        y = ((b & 0x0f) << 4) | (c >> 2);
72
        y = ((b & 0x0f) << 4) | (c >> 2);
34
        z = ((c & 0x03) << 6) | d;
73
        z = ((c & 0x03) << 6) | d;
35
 
74
 
36
        if(len--) ptrOut[ptr++] = x; else break;
75
        if(len--) ptrOut[ptr++] = x; else break;
37
        if(len--) ptrOut[ptr++] = y; else break;
76
        if(len--) ptrOut[ptr++] = y; else break;
38
        if(len--) ptrOut[ptr++] = z; else break;
77
        if(len--) ptrOut[ptr++] = z; else break;
39
    }
78
    }
40
 
-
 
-
 
79
    //decoded data
-
 
80
    unsigned char * decData;
41
    for (int a=0; a<ptr; a++) {
81
    for (int a=0; a<ptr; a++) {
42
        if (length == false) {
82
        if (len) {
-
 
83
            decData[decLen] = ptrOut[a];
-
 
84
            decLen++;
-
 
85
        } else {
43
            int b1, b2, b3;
86
            int b1, b2, b3;
44
 
87
 
45
            b1 = ptrOut[a++];
88
            b1 = ptrOut[a++];
46
            b2 = ptrOut[a];
89
            b2 = ptrOut[a];
47
 
90
 
48
            b3 = (b2 << 8) | b1;
91
            b3 = (b2 << 8) | b1;
49
 
92
 
50
            if (b3 > 32767)
93
            if (b3 > 32767)
51
                b3 = b3 - 65536;
94
                b3 = b3 - 65536;
52
 
95
 
53
            rx.decode[decLen] = b3;
-
 
54
            decLen++;
-
 
55
        } else {
-
 
56
            rx.decode[decLen] = ptrOut[a];
96
            decData[decLen] = b3;
57
            decLen++;
97
            decLen++;
58
        }
-
 
59
        rx.decLen = decLen;
98
        }
-
 
99
    }
60
    }
100
    ptrOut = decData;
61
    return true;
101
    return decLen;
-
 
102
}
62
}
103
 
-
 
104
/**
63
 
105
 * base64 encoder
64
// base64 encoder
106
 */
65
string Parser::encode64(char data[150],unsigned int length)
107
void Parser::encode64(char data[150],unsigned int length)
66
{
108
{
67
    unsigned int pt = 0;
109
    unsigned int pt = 0;
68
    unsigned char a,b,c;
110
    unsigned char a,b,c;
69
    unsigned char ptr = 0;
111
    unsigned char ptr = 0;
70
 
112
 
71
    char tx_buff[150];
113
    char tx_buff[150];
72
 
114
 
73
    while(length > 0)
115
    while(length > 0)
74
    {
116
    {
75
        if(length) { a = data[ptr++]; length--;} else a = 0;
117
        if(length) { a = data[ptr++]; length--;} else a = 0;
76
        if(length) { b = data[ptr++]; length--;} else b = 0;
118
        if(length) { b = data[ptr++]; length--;} else b = 0;
77
        if(length) { c = data[ptr++]; length--;} else c = 0;
119
        if(length) { c = data[ptr++]; length--;} else c = 0;
78
 
120
 
79
        tx_buff[pt++] = '=' + (a >> 2);
121
        tx_buff[pt++] = '=' + (a >> 2);
80
        tx_buff[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
122
        tx_buff[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
81
        tx_buff[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
123
        tx_buff[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
82
        tx_buff[pt++] = '=' + ( c & 0x3f);
124
        tx_buff[pt++] = '=' + ( c & 0x3f);
83
    }
125
    }
84
    tx_buff[pt] = 0;
126
    tx_buff[pt] = 0;
-
 
127
 
85
 
128
    //move pointer of tx_buff to data
86
    return string(tx_buff);
129
    data = tx_buff;
87
}
130
}
88
 
131
 
89
// Datensatz nach 8bit Integer
132
// Datensatz nach 8bit Integer
90
int Parser::dataToChar(int *data , int start, bool is_signed) {
133
int Parser::dataToChar(int *data , int start, bool is_signed) {
91
    int out = (data[start]);
134
    int out = (data[start]);
92
 
135
 
93
    if ((out > 128) && (is_signed))
136
    if ((out > 128) && (is_signed))
94
      out = out - 256;
137
      out = out - 256;
95
 
138
 
96
    return out;
139
    return out;
97
}
140
}
-
 
141
 
98
 
142
/**
-
 
143
 * received char to 8 bit integer
99
// received char to 8 bit integer
144
 */
100
int Parser::charToData(int data) {
145
int Parser::charToData(int data) {
101
    if (data < 0)
146
    if (data < 0)
102
        return data + 256;
147
        return data + 256;
103
    return data;
148
    return data;
104
}
149
}
-
 
150
 
105
 
151
/**
-
 
152
 * convert data to 16bit Integer
106
// convert data to 16bit Integer
153
 */
107
int Parser::dataToInt(int *Data , int Start, bool is_signed)
154
int Parser::dataToInt(int *Data , int Start, bool is_signed)
108
{
155
{
109
    int Out = (Data[Start+1]<<8) | (Data[Start+0]);
156
    int Out = (Data[Start+1]<<8) | (Data[Start+0]);
110
 
157
 
111
    if ((Out > 32767) && (is_signed))
158
    if ((Out > 32767) && (is_signed))
112
      Out = Out - 65536;
159
      Out = Out - 65536;
113
 
160
 
114
    return Out;
161
    return Out;
115
 
162
 
116
}
163
}
-
 
164
 
117
 
165
/**
-
 
166
 * convert data to 32bit Long
118
// convert data to 32bit Long
167
 */
119
long Parser::dataToLong(int *Data , int Start, bool is_signed)
168
long Parser::dataToLong(int *Data , int Start, bool is_signed)
120
{
169
{
121
    long Out = (Data[Start+3]<<24) | (Data[Start+2]<<16) | (Data[Start+1]<<8) | (Data[Start+0]);
170
    long Out = (Data[Start+3]<<24) | (Data[Start+2]<<16) | (Data[Start+1]<<8) | (Data[Start+0]);
122
 
171
 
123
    if ((Out > 32767) && (is_signed))
172
    if ((Out > 32767) && (is_signed))
124
      Out = Out;
173
      Out = Out;
125
 
174
 
126
    return Out;
175
    return Out;
127
}
176
}
128
 
177
 
129
float Parser::getFloat(long value, int count)
178
float Parser::getFloat(long value, int count)
130
{
179
{
131
    long num = pow(10, count);
180
    long num = pow(10, count);
132
 
181
 
133
    float temp = value;
182
    float temp = value;
134
 
183
 
135
    return temp / num;
184
    return temp / num;
136
}
185
}
137
 
-
 
138
string Parser::dataToString(int Data[150], int Start, int End)
186
 
139
{
-
 
140
    char String[150];
-
 
141
    for (int a = Start; a < End; a++)
187
/**
142
    {
-
 
143
        String[a - Start] = Data[a];
188
 * check CRC
144
    }
-
 
145
    String[End - Start] = '\0';
-
 
146
 
-
 
147
    return string(String);
-
 
148
}
-
 
149
 
-
 
150
// check CRC
189
 */
151
bool Parser::check_CRC(string RXstr)
190
bool Parser::check_CRC(char * rx, int length)
152
{
-
 
153
    int length = RXstr.size();
191
{
154
    int CRC = 0;
-
 
155
    char *RX = (char *)RXstr.c_str();
192
    int CRC = 0;
156
 
193
 
157
    if (RX[1] == 127)
194
    if (rx[1] == 127)
158
    {
195
    {
159
        RX[1] = 0;
196
        rx[1] = 0;
160
    }
197
    }
161
 
198
 
162
    for(int i=0; i < length-2; i++)
199
    for(int i=0; i < length-2; i++)
163
    {
200
    {
164
            CRC+=RX[i];
201
            CRC+=rx[i];
165
    }
202
    }
166
 
203
 
167
    CRC = CRC % 4096;
204
    CRC = CRC % 4096;
168
 
205
 
169
    if(RX[length - 2] != ('=' + (CRC / 64)))
206
    if(rx[length - 2] != ('=' + (CRC / 64)))
170
    {
207
    {
171
        return false;
208
        return false;
172
    }
209
    }
173
 
210
 
174
    if(RX[length - 1] != ('=' + CRC % 64))
211
    if(rx[length - 1] != ('=' + CRC % 64))
175
    {
212
    {
176
        return false;
213
        return false;
177
    }
214
    }
178
 
215
 
179
    return true;
216
    return true;
180
}
217
}
-
 
218
 
-
 
219
/**
181
 
220
 * create CRC and add it to tx
182
// add CRC
221
 */
183
string Parser::add_CRC(string TX)
222
void Parser::add_CRC(char * tx, int length)
184
{
-
 
185
    int length = TX.size();
223
{
186
    unsigned int tmpCRC = 0;
-
 
187
 
-
 
188
    char CRC[2];
224
    unsigned int tmpCRC = 0;
189
 
225
 
190
    for(int i = 0; i < length; i++)
226
    for(int i = 0; i < length; i++)
191
    {
227
    {
192
        tmpCRC += TX[i];
228
        tmpCRC += tx[i];
193
    }
229
    }
194
 
230
 
195
    tmpCRC %= 4096;
231
    tmpCRC %= 4096;
196
 
232
 
197
    CRC[0] = '=' + tmpCRC / 64;
233
    tx[length-2] = '=' + tmpCRC / 64;
198
    CRC[1] = '=' + tmpCRC % 64;
234
    tx[length-1] = '=' + tmpCRC % 64;
199
    CRC[2] = '\0';
-
 
200
 
-
 
201
    return string(TX) + string(CRC);
235
    tx[length] = '\0';
202
}
236
}
203
 
237
 
204
 
238