intial test version
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* 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
|
||||
Reference in New Issue
Block a user