diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp index f89df5333..31c214e3b 100644 --- a/firmware/common/crc.hpp +++ b/firmware/common/crc.hpp @@ -145,4 +145,42 @@ private: } }; +class Adler32 { +public: + void feed(const uint8_t v) { + feed_one(v); + } + + void feed(const uint8_t* const p, const size_t n) { + for(size_t i=0; i + void feed(const T& a) { + feed(a.data(), a.size()); + } + + std::array bytes() const { + return { + static_cast((b >> 8) & 0xff), + static_cast((b >> 0) & 0xff), + static_cast((a >> 8) & 0xff), + static_cast((a >> 0) & 0xff) + }; + } + +private: + static constexpr uint32_t mod = 65521; + + uint32_t a { 1 }; + uint32_t b { 0 }; + + void feed_one(const uint8_t c) { + a = (a + c) % mod; + b = (b + a) % mod; + } +}; + #endif/*__CRC_H__*/