M5Utility 0.0.2 git rev:5c1a751
Loading...
Searching...
No Matches
crc.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UTILITY_CRC_HPP
11#define M5_UTILITY_CRC_HPP
12
13#include <cstdint>
14#include <cstddef>
15#include "misc.hpp"
16
17namespace m5 {
18namespace utility {
19
24class CRC8 {
25public:
26 CRC8() = delete;
34 CRC8(const uint8_t init, const uint8_t polynomial, const bool refIn, const bool refOut, const uint8_t xorout)
35 : _crc{init}, _init(init), _polynomial{polynomial}, _xorout{xorout}, _refIn{refIn}, _refOut{refOut}
36 {
37 }
44 inline uint8_t range(const uint8_t* data, size_t len)
45 {
46 auto crc = calculate(data, len, _init, _polynomial, _refIn, _refOut, _xorout, false);
47 return finalize(crc, _refOut, _xorout);
48 }
58 inline uint8_t update(const uint8_t* data, size_t len)
59 {
60 _crc = calculate(data, len, _crc, _polynomial, _refIn, _refOut, _xorout, false);
61 return finalize(_crc, _refOut, _xorout);
62 }
67 inline uint8_t value() const
68 {
69 return finalize(_crc, _refOut, _xorout);
70 }
82 static uint8_t calculate(const uint8_t* data, size_t len, const uint8_t init, const uint8_t polynomial,
83 const bool refIn, const bool refOut, const uint8_t xorout, bool do_finalize = true)
84 {
85 uint8_t crc{init};
86 while (len--) {
87 uint8_t e = refIn ? reverseBitOrder(*data) : *data;
88 ++data;
89 crc ^= e;
90 uint_fast8_t cnt{8};
91 while (cnt--) {
92 if (crc & 0x80) {
93 crc = (crc << 1) ^ polynomial;
94 } else {
95 crc <<= 1;
96 }
97 }
98 }
99 return do_finalize ? finalize(crc, refOut, xorout) : crc;
100 }
101
102protected:
103 static inline uint8_t finalize(const uint8_t value, const bool refOut, const uint8_t xorout)
104 {
105 return (refOut ? reverseBitOrder(value) : value) ^ xorout;
106 }
107
108private:
109 uint8_t _crc{}, _init{}, _polynomial{}, _xorout{};
110 bool _refIn{}, _refOut{};
111};
112
117class CRC16 {
118public:
119 CRC16() = delete;
127 CRC16(const uint16_t init, const uint16_t polynomial, const bool refIn, const bool refOut, const uint16_t xorout)
128 : _crc{init}, _init{init}, _polynomial{polynomial}, _xorout{xorout}, _refIn{refIn}, _refOut{refOut}
129 {
130 }
137 inline uint16_t range(const uint8_t* data, size_t len)
138 {
139 auto crc = calculate(data, len, _init, _polynomial, _refIn, _refOut, _xorout, false);
140 return finalize(crc, _refOut, _xorout);
141 }
151 inline uint16_t update(const uint8_t* data, size_t len)
152 {
153 _crc = calculate(data, len, _crc, _polynomial, _refIn, _refOut, _xorout, false);
154 return finalize(_crc, _refOut, _xorout);
155 }
160 inline uint16_t value() const
161 {
162 return finalize(_crc, _refOut, _xorout);
163 }
175 static uint16_t calculate(const uint8_t* data, size_t len, const uint16_t init, const uint16_t polynomial,
176 const bool refIn, const bool refOut, const uint16_t xorout, bool do_finalize = true)
177 {
178 uint16_t crc{init};
179 while (len--) {
180 uint8_t e{refIn ? reverseBitOrder(*data) : *data};
181 ++data;
182 crc ^= (e << 8);
183 uint_fast8_t cnt{8};
184 while (cnt--) {
185 if (crc & 0x8000) {
186 crc = (crc << 1) ^ polynomial;
187 } else {
188 crc <<= 1;
189 }
190 }
191 }
192 return do_finalize ? finalize(crc, refOut, xorout) : crc;
193 }
194
195protected:
196 static inline uint16_t finalize(const uint16_t value, const bool refOut, const uint16_t xorout)
197 {
198 return (refOut ? reverseBitOrder(value) : value) ^ xorout;
199 }
200
201private:
202 uint16_t _crc{}, _init{}, _polynomial{}, _xorout{};
203 bool _refIn{}, _refOut{};
204};
205
210class CRC8_Checksum : public CRC8 {
211public:
212 CRC8_Checksum() : CRC8(0xFF, 0x31, false, false, 0x00)
213 {
214 }
215};
216
217} // namespace utility
218} // namespace m5
219
220#endif
Base class of the CRC16 calculator.
Definition crc.hpp:117
static uint16_t calculate(const uint8_t *data, size_t len, const uint16_t init, const uint16_t polynomial, const bool refIn, const bool refOut, const uint16_t xorout, bool do_finalize=true)
Calculate CRC16.
Definition crc.hpp:175
CRC16(const uint16_t init, const uint16_t polynomial, const bool refIn, const bool refOut, const uint16_t xorout)
Definition crc.hpp:127
uint16_t value() const
CRC value at the time of the call.
Definition crc.hpp:160
uint16_t range(const uint8_t *data, size_t len)
Calculate the CRC of the specified range.
Definition crc.hpp:137
uint16_t update(const uint8_t *data, size_t len)
Stores the CRC of the specified array using the current internal information.
Definition crc.hpp:151
Definition crc.hpp:210
Base class of the CRC8 calculator.
Definition crc.hpp:24
CRC8(const uint8_t init, const uint8_t polynomial, const bool refIn, const bool refOut, const uint8_t xorout)
Definition crc.hpp:34
uint8_t update(const uint8_t *data, size_t len)
Stores the CRC of the specified array using the current internal information.
Definition crc.hpp:58
uint8_t range(const uint8_t *data, size_t len)
Calculate the CRC of the specified range.
Definition crc.hpp:44
uint8_t value() const
CRC value at the time of the call.
Definition crc.hpp:67
static uint8_t calculate(const uint8_t *data, size_t len, const uint8_t init, const uint8_t polynomial, const bool refIn, const bool refOut, const uint8_t xorout, bool do_finalize=true)
Calculate CRC8.
Definition crc.hpp:82
Miscellaneous features.
uint8_t reverseBitOrder(const uint8_t u8)
Reversing the bit order.
Definition misc.hpp:28
Top level namespace of M5.
Definition bit_segment.hpp:17
For utilities.