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) {
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;
   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>
}
</syntaxhighlight>
----<br />
----<br />