From a366b3ac4f5c3e64987adf2b6ef8db6dfae9faef Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 6 Nov 2015 13:49:59 -0800 Subject: [PATCH] CRC class. Has some more efficient code, commented out because I was having trouble getting it to work. However, it may have been due to the particular data I was trying to decode and CRC-validate. --- firmware/common/crc.hpp | 104 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 firmware/common/crc.hpp diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp new file mode 100644 index 000000000..0b825dc22 --- /dev/null +++ b/firmware/common/crc.hpp @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __CRC_H__ +#define __CRC_H__ + +#include +#include + +template +class CRC { +public: + constexpr CRC( + const T polynomial/*, + const T initial*/ + ) : polynomial { polynomial }/*, + initial { initial }*/ + { + // CRC LSB must always be 1 + } +/* + template + T calculate(const U& bits, const size_t length) { + if( length > bits.size() ) { + // Exception. + return 0; + } + + T crc = 0; + + for(size_t i=0; i0; --bit) { + if( remainder & top_bit() ) { + remainder = (remainder << 1) ^ polynomial; + } else { + remainder = (remainder << 1); + } + } + return remainder; + } +/* + T calculate(const uint8_t* const data, const size_t length) { + T remainder = initial; + for(size_t byte=0; byte