/** * BluettiCRC - CRC-16/MODBUS helpers for the Bluetti BLE protocol * * Ported from the Bluetti_ESP32_Bridge project (crc16.h / utils.cpp). * Polynomial 0xA001 (reversed 0x8005), initial value 0xFFFF. * * Copyright (c) 2026 Scott Penrose * License: MIT */ #ifndef BLUETTI_CRC_H #define BLUETTI_CRC_H #include #include // Update a running CRC-16/MODBUS with one byte. static inline uint16_t bluettiCrc16Update(uint16_t crc, uint8_t a) { crc ^= a; for (int i = 0; i < 8; ++i) { if (crc & 1) crc = (crc >> 1) ^ 0xA001; else crc = (crc >> 1); } return crc; } // CRC-16/MODBUS over a buffer (init 0xFFFF). static inline uint16_t bluettiModbusCrc(const uint8_t* buf, size_t len) { uint16_t crc = 0xFFFF; for (size_t i = 0; i < len; i++) { crc = bluettiCrc16Update(crc, buf[i]); } return crc; } // Swap the two bytes of a 16-bit value (used to place write values big-endian). static inline uint16_t bluettiSwapBytes(uint16_t v) { return (uint16_t)((v << 8) | (v >> 8)); } #endif // BLUETTI_CRC_H