Subversion Repositories Projects

Rev

Rev 159 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
158 KeyOz 1
/***************************************************************************
2
 *   Copyright (C) 2008 by Manuel Schrape                                  *
3
 *   manuel.schrape@gmx.de                                                 *
4
 *                                                                         *
5
 *   This program is free software; you can redistribute it and/or modify  *
6
 *   it under the terms of the GNU General Public License as published by  *
7
 *   the Free Software Foundation; either version 2 of the License.        *
8
 *                                                                         *
9
 *   This program is distributed in the hope that it will be useful,       *
10
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12
 *   GNU General Public License for more details.                          *
13
 *                                                                         *
14
 *   You should have received a copy of the GNU General Public License     *
15
 *   along with this program; if not, write to the                         *
16
 *   Free Software Foundation, Inc.,                                       *
17
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
18
 ***************************************************************************/
19
 
20
#include "ToolBox.h"
21
 
22
ToolBox::ToolBox()
23
{
24
}
25
 
26
bool ToolBox::Decode64(sRxData &RX, bool Long)
27
{
28
    unsigned char a,b,c,d;
29
    unsigned char ptr = 0;
30
    unsigned char x,y,z;
31
    int ptrOut[150];
32
 
33
    int ptrIn = 3;
34
    int max = RX.String.length();
35
    int len = RX.String.length();
36
    int DecLen = 0;
37
 
38
    if (RX.Input[ptrIn] == 0)
39
    {
40
        qDebug("QString to Char ERROR...!!!!");
41
        return false;
42
    }
43
 
44
    while(len != 0)
45
    {
46
        a = RX.Input[ptrIn++] - '=';
47
        b = RX.Input[ptrIn++] - '=';
48
        c = RX.Input[ptrIn++] - '=';
49
        d = RX.Input[ptrIn++] - '=';
50
 
51
        if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden
52
 
53
        x = (a << 2) | (b >> 4);
54
        y = ((b & 0x0f) << 4) | (c >> 2);
55
        z = ((c & 0x03) << 6) | d;
56
 
57
        if(len--) ptrOut[ptr++] = x; else break;
58
        if(len--) ptrOut[ptr++] = y; else break;
59
        if(len--) ptrOut[ptr++] = z; else break;
60
    }
61
 
62
    for (int a=0; a<ptr; a++)
63
    {
64
        if (Long == false)
65
        {
66
            int b1, b2, b3;
67
 
68
            b1 = ptrOut[a++];
69
            b2 = ptrOut[a];
70
 
71
            b3 = (b2 << 8) | b1;
72
 
73
            if (b3 > 32767)
74
                b3 = b3 - 65536;
75
 
76
            RX.Decode[DecLen] = b3;
77
            DecLen++;
78
        }
79
        else
80
        {
81
            RX.Decode[DecLen] = ptrOut[a];
82
            DecLen++;
83
        }
84
    }
85
    return true;
86
}
87
 
88
int ToolBox::Data2Int(int *Data , int Start, bool is_signed)
89
{
90
    int Out = (Data[Start+1]<<8) | (Data[Start+0]);
91
 
92
    if ((Out > 32767) && (is_signed))
93
      Out = Out - 65536;
94
 
95
    return Out;
96
 
97
}
98
 
99
long ToolBox::Data2Long(int *Data , int Start, bool is_signed)
100
{
101
    long Out = (Data[Start+3]<<24) | (Data[Start+2]<<16) | (Data[Start+1]<<8) | (Data[Start+0]);
102
 
162 KeyOz 103
    if ((Out > 32767) && (is_signed))
104
      Out = Out;
105
 
158 KeyOz 106
    return Out;
107
}
108
 
159 KeyOz 109
QString ToolBox::Data2QString(int Data[150], int Start, int End)
110
{
111
    char String[150];
112
    for (int a = Start; a < End; a++)
113
    {
114
        String[a - Start] = Data[a];
115
    }
116
    String[End - Start] = '\0';
117
 
118
    return QString(String);
119
}
120
 
158 KeyOz 121
bool ToolBox::check_CRC(QString RXString)
122
{
123
    int CRC = 0;
124
    char *RX;
125
 
126
    int Length = RXString.length();
127
 
128
    RX = RXString.toLatin1().data();
129
 
130
    if (RX[1] == 127)
131
    {
132
        RX[1] = 0;
133
    }
134
 
135
    for(int i=0; i < Length-2; i++)
136
    {
137
            CRC+=RX[i];
138
    }
139
 
140
    CRC = CRC % 4096;
141
 
142
    if(RX[Length - 2] != ('=' + (CRC / 64)))
143
    {
144
        return false;
145
    }
146
 
147
    if(RX[Length - 1] != ('=' + CRC % 64))
148
    {
149
        return false;
150
    }
151
 
152
    return true;
153
}
154
 
155
QString ToolBox::add_CRC(QString TXString)
156
{
157
    unsigned int tmpCRC = 0;
158
 
159
    char *TXBuff;
160
    char CRC[2];
161
 
162
    TXBuff = TXString.toLatin1().data();
163
 
164
    for(int i = 0; i < TXString.length(); i++)
165
    {
166
        tmpCRC += TXBuff[i];
167
    }
168
 
169
    tmpCRC %= 4096;
170
 
171
    CRC[0] = '=' + tmpCRC / 64;
172
    CRC[1] = '=' + tmpCRC % 64;
173
    CRC[2] = '\0';
174
 
175
    QString Return = TXString + QString(CRC);
176
 
177
    return Return;
178
}
179
 
180
QString ToolBox::Encode64(char Data[150],unsigned int Length)
181
{
182
    unsigned int pt = 0;
183
    unsigned char a,b,c;
184
    unsigned char ptr = 0;
185
 
186
    char TX_Buff[150];
187
 
188
    while(Length > 0)
189
    {
190
        if(Length) { a = Data[ptr++]; Length--;} else a = 0;
191
        if(Length) { b = Data[ptr++]; Length--;} else b = 0;
192
        if(Length) { c = Data[ptr++]; Length--;} else c = 0;
193
 
194
        TX_Buff[pt++] = '=' + (a >> 2);
195
        TX_Buff[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
196
        TX_Buff[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
197
        TX_Buff[pt++] = '=' + ( c & 0x3f);
198
    }
199
    TX_Buff[pt] = 0;
200
 
201
    return QString(TX_Buff);
202
}
203
 
204
QString ToolBox::DataToString(int Data[150])
205
{
206
    char String[100];
207
    for (int a = 0; a < 100; a++)
208
    {
209
        String[a] = Data[a];
210
    }
211
 
212
    return QString(String).trimmed();
213
}