Prusa3d Marlin fork
mmu2_crc.h
Go to the documentation of this file.
1 #pragma once
3 #include <stdint.h>
4 
5 namespace modules {
6 
7 // clang-format off
8 // prevent silly indenting of the whole file
9 
11 namespace crc {
12 
13 class CRC8 {
14 public:
17  static uint8_t CCITT_update(uint8_t crc, uint8_t b);
18 
19  static constexpr uint8_t CCITT_updateCX(uint8_t crc, uint8_t b) {
20  uint8_t data = crc ^ b;
21  for (uint8_t i = 0; i < 8; i++) {
22  if ((data & 0x80U) != 0) {
23  data <<= 1U;
24  data ^= 0x07U;
25  } else {
26  data <<= 1U;
27  }
28  }
29  return data;
30  }
31 
33  static constexpr uint8_t CCITT_updateW(uint8_t crc, uint16_t w) {
34  union U {
35  uint8_t b[2];
36  uint16_t w;
37  explicit constexpr inline U(uint16_t w)
38  : w(w) {}
39  } u(w);
40  return CCITT_updateCX(CCITT_updateCX(crc, u.b[0]), u.b[1]);
41  }
42 };
43 
44 } // namespace crc
45 
46 // clang-format on
47 
48 } // namespace modules
Definition: mmu2_crc.h:13
static uint8_t CCITT_update(uint8_t crc, uint8_t b)
Definition: mmu2_crc.cpp:12
static constexpr uint8_t CCITT_updateW(uint8_t crc, uint16_t w)
Compute/update CRC8 CCIIT from 16bits (convenience wrapper)
Definition: mmu2_crc.h:33