Files
BluettiBLE/src/BluettiCRC.h
T
2026-06-04 21:35:07 +10:00

44 lines
1.1 KiB
C

/**
* 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 <stdint.h>
#include <stddef.h>
// 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