forked from g4klx/MMDVMHost
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCRC.cpp
114 lines (90 loc) · 2.37 KB
/
CRC.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
* Copyright (C) 2015 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "CRC.h"
#include "Utils.h"
#include <cstdio>
#include <cassert>
#include <cmath>
bool CCRC::checkFiveBit(bool* in, unsigned int tcrc)
{
assert(in != NULL);
unsigned int crc;
encodeFiveBit(in, crc);
return crc == tcrc;
}
void CCRC::encodeFiveBit(const bool* in, unsigned int& tcrc)
{
assert(in != NULL);
unsigned short total = 0U;
for (unsigned int i = 0U; i < 72U; i += 8U) {
unsigned char c;
CUtils::bitsToByteBE(in + i, c);
total += c;
}
total %= 31U;
tcrc = total;
}
unsigned char CCRC::encodeEightBit(const unsigned char *in, unsigned int length)
{
assert(in != NULL);
unsigned char crc = 0x00U;
for (unsigned int i = 0U; i < length; i++) {
crc ^= in[i];
for (unsigned int j = 0U; j < 8U; j++) {
if ((crc & 0x80U) == 0x80U) {
crc <<= 1;
crc ^= 0x07U;
} else {
crc <<= 1;
}
}
}
return crc;
}
bool CCRC::checkCSBK(const unsigned char *in)
{
unsigned short crc16 = 0U;
// Run through all 12 bits
for (unsigned int a = 0; a < 12U; a++) {
unsigned char val = in[a];
// Allow for the CSBK CRC mask
if (a > 9U)
val ^= 0xA5U;
for (unsigned int i = 0U; i < 8U; i++) {
bool c15 = (crc16 >> 15 & 0x01U) == 0x01U;
bool bit = (val >> (7 - i) & 0x01U) == 0x01U;
crc16 <<= 1;
if (c15 ^ bit)
crc16 ^= 0x1021U;
}
}
return crc16 == 0x1D0FU;
}
unsigned char CCRC::crc8(const unsigned char *in, unsigned int length)
{
unsigned int crc = 0U;
for (unsigned int j = 0U; j < length; j++, in++) {
crc ^= (*in << 8);
for (unsigned int i = 0U; i < 8U; i++) {
if (crc & 0x8000U)
crc ^= (0x1070U << 3);
crc <<= 1;
}
}
return crc >> 8;
}