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