Landis+Gyr GridStream Protocol: Difference between revisions
| Line 127: | Line 127: | ||
====Checksum==== | ====Checksum==== | ||
---- | ---- | ||
<pre>uint16_t Landis_crc16 (uint16_t crc, const std::vector<uint8_t> &data, size_t size) { | <pre>uint16_t Landis_crc16 (uint16_t crc, const std::vector<uint8_t> &data, size_t size) { | ||
// CoServ CRC = 0x45F8 | // CoServ CRC = 0x45F8 | ||
// Oncor CRC = 0x5FD6 | // Oncor CRC = 0x5FD6 | ||
// Hard coded Poly 0x1021 | // Hard coded Poly 0x1021 | ||
uint16_t i = 0; | uint16_t i = 0; | ||
while (size--) { | while (size--) { | ||
crc ^= data[i] << 8; | crc ^= data[i] << 8; | ||
i++; | i++; | ||
for (unsigned k = 0; k < 8; k++) | for (unsigned k = 0; k < 8; k++) | ||
crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1; | crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1; | ||
} | } | ||
return crc; | return crc; | ||
}</pre> | }</pre> | ||
----<br /> | ----<br /> | ||