//-----------------------------------------------------------------------------
// 2022 Ahoy, https://github.com/lumpapu/ahoy
// Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
//-----------------------------------------------------------------------------

#include "crc.h"

namespace ah {
    uint8_t crc8(uint8_t buf[], uint8_t len) {
        uint8_t crc = CRC8_INIT;
        for(uint8_t i = 0; i < len; i++) {
            crc ^= buf[i];
            for(uint8_t b = 0; b < 8; b ++) {
                crc = (crc << 1) ^ ((crc & 0x80) ? CRC8_POLY : 0x00);
            }
        }
        return crc;
    }

    uint16_t crc16(uint8_t buf[], uint8_t len, uint16_t start) {
        uint16_t crc = start;
        uint8_t shift = 0;

        for(uint8_t i = 0; i < len; i ++) {
            crc = crc ^ buf[i];
            for(uint8_t bit = 0; bit < 8; bit ++) {
                shift = (crc & 0x0001);
                crc = crc >> 1;
                if(shift != 0)
                    crc = crc ^ CRC16_MODBUS_POLYNOM;
            }
        }
        return crc;
    }
}