Subversion Repositories Projects

Rev

Details | 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
 
103
    return Out;
104
}
105
 
106
bool ToolBox::check_CRC(QString RXString)
107
{
108
    int CRC = 0;
109
    char *RX;
110
 
111
    int Length = RXString.length();
112
 
113
    RX = RXString.toLatin1().data();
114
 
115
    if (RX[1] == 127)
116
    {
117
        RX[1] = 0;
118
    }
119
 
120
    for(int i=0; i < Length-2; i++)
121
    {
122
            CRC+=RX[i];
123
    }
124
 
125
    CRC = CRC % 4096;
126
 
127
    if(RX[Length - 2] != ('=' + (CRC / 64)))
128
    {
129
        return false;
130
    }
131
 
132
    if(RX[Length - 1] != ('=' + CRC % 64))
133
    {
134
        return false;
135
    }
136
 
137
    return true;
138
}
139
 
140
QString ToolBox::add_CRC(QString TXString)
141
{
142
    unsigned int tmpCRC = 0;
143
 
144
    char *TXBuff;
145
    char CRC[2];
146
 
147
    TXBuff = TXString.toLatin1().data();
148
 
149
    for(int i = 0; i < TXString.length(); i++)
150
    {
151
        tmpCRC += TXBuff[i];
152
    }
153
 
154
    tmpCRC %= 4096;
155
 
156
    CRC[0] = '=' + tmpCRC / 64;
157
    CRC[1] = '=' + tmpCRC % 64;
158
    CRC[2] = '\0';
159
 
160
    QString Return = TXString + QString(CRC);
161
 
162
    return Return;
163
}
164
 
165
QString ToolBox::Encode64(char Data[150],unsigned int Length)
166
{
167
    unsigned int pt = 0;
168
    unsigned char a,b,c;
169
    unsigned char ptr = 0;
170
 
171
    char TX_Buff[150];
172
 
173
    while(Length > 0)
174
    {
175
        if(Length) { a = Data[ptr++]; Length--;} else a = 0;
176
        if(Length) { b = Data[ptr++]; Length--;} else b = 0;
177
        if(Length) { c = Data[ptr++]; Length--;} else c = 0;
178
 
179
        TX_Buff[pt++] = '=' + (a >> 2);
180
        TX_Buff[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
181
        TX_Buff[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
182
        TX_Buff[pt++] = '=' + ( c & 0x3f);
183
    }
184
    TX_Buff[pt] = 0;
185
 
186
    return QString(TX_Buff);
187
}
188
 
189
QString ToolBox::DataToString(int Data[150])
190
{
191
    char String[100];
192
    for (int a = 0; a < 100; a++)
193
    {
194
        String[a] = Data[a];
195
    }
196
 
197
    return QString(String).trimmed();
198
}