Complete and tested CRC32 calcs for pages

This commit is contained in:
Josh Stewart 2019-03-18 16:44:29 +11:00
parent fe11bbde1e
commit 49a6744e36
4 changed files with 38 additions and 20 deletions

View File

@ -51,5 +51,6 @@ void receiveCalibration(byte);
void sendToothLog(bool); void sendToothLog(bool);
void testComm(); void testComm();
void commandButtons(); void commandButtons();
byte getPageValue(byte, uint16_t);
#endif // COMMS_H #endif // COMMS_H

View File

@ -136,10 +136,10 @@ class FastCRC32
{ {
public: public:
FastCRC32(); FastCRC32();
uint32_t crc32(const uint8_t *data, const uint16_t datalen); // Alias CRC-32/ADCCP, PKZIP, Ethernet, 802.3 uint32_t crc32(const uint8_t *data, const uint16_t datalen, bool reflect=true); // Alias CRC-32/ADCCP, PKZIP, Ethernet, 802.3
uint32_t cksum(const uint8_t *data, const uint16_t datalen); // Alias CRC-32/POSIX uint32_t cksum(const uint8_t *data, const uint16_t datalen); // Alias CRC-32/POSIX
uint32_t crc32_upd(const uint8_t *data, uint16_t len); // Call for subsequent calculations with previous seed uint32_t crc32_upd(const uint8_t *data, uint16_t len, bool reflect=true); // Call for subsequent calculations with previous seed
uint32_t cksum_upd(const uint8_t *data, uint16_t len); // Call for subsequent calculations with previous seed uint32_t cksum_upd(const uint8_t *data, uint16_t len); // Call for subsequent calculations with previous seed
#if !CRC_SW #if !CRC_SW
uint32_t generic(const uint32_t polyom, const uint32_t seed, const uint32_t flags, const uint8_t *data, const uint16_t datalen); //Not available in non-hw-variant (not T3.x) uint32_t generic(const uint32_t polyom, const uint32_t seed, const uint32_t flags, const uint8_t *data, const uint16_t datalen); //Not available in non-hw-variant (not T3.x)

View File

@ -410,7 +410,7 @@ FastCRC32::FastCRC32(){}
#define CRC_TABLE_CRC32 crc_table_crc32 #define CRC_TABLE_CRC32 crc_table_crc32
#endif #endif
uint32_t FastCRC32::crc32_upd(const uint8_t *data, uint16_t len) uint32_t FastCRC32::crc32_upd(const uint8_t *data, uint16_t len, bool reflect)
{ {
uint32_t crc = seed; uint32_t crc = seed;
@ -440,17 +440,18 @@ uint32_t FastCRC32::crc32_upd(const uint8_t *data, uint16_t len)
crc = (crc >> 8) ^ pgm_read_dword(&CRC_TABLE_CRC32[(crc & 0xff) ^ *data++]); crc = (crc >> 8) ^ pgm_read_dword(&CRC_TABLE_CRC32[(crc & 0xff) ^ *data++]);
} }
crc = ~crc; if(reflect) { crc = ~crc; }
seed = crc; seed = crc;
return crc; return crc;
} }
uint32_t FastCRC32::crc32(const uint8_t *data, const uint16_t datalen) uint32_t FastCRC32::crc32(const uint8_t *data, const uint16_t datalen, bool reflect)
{ {
// poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xcbf43926 // poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xcbf43926
seed = 0xffffffff; seed = 0xffffffff;
return crc32_upd(data, datalen); return crc32_upd(data, datalen, reflect);
} }
/** CKSUM /** CKSUM

View File

@ -69,13 +69,17 @@ uint32_t calculateCRC32(byte pageNo)
switch(pageNo) switch(pageNo)
{ {
case veMapPage: case veMapPage:
//Confirmed working
raw_value = getPageValue(veMapPage, 0); raw_value = getPageValue(veMapPage, 0);
CRC32_val = CRC32.crc32(&raw_value, 1); CRC32_val = CRC32.crc32(&raw_value, 1, false);
for(uint16_t x=1; x< npage_size[veMapPage]; x++) for(uint16_t x=1; x< npage_size[veMapPage]; x++)
//for(uint16_t x=1; x< 288; x++)
{ {
raw_value = getPageValue(veMapPage, x); raw_value = getPageValue(veMapPage, x);
CRC32_val = CRC32.crc32_upd(&raw_value, 1); CRC32_val = CRC32.crc32_upd(&raw_value, 1, false);
} }
//Do a manual reflection of the CRC32 value
CRC32_val = ~CRC32_val;
break; break;
case veSetPage: case veSetPage:
@ -85,13 +89,16 @@ uint32_t calculateCRC32(byte pageNo)
break; break;
case ignMapPage: case ignMapPage:
//Confirmed working
raw_value = getPageValue(ignMapPage, 0); raw_value = getPageValue(ignMapPage, 0);
CRC32_val = CRC32.crc32(&raw_value, 1); CRC32_val = CRC32.crc32(&raw_value, 1, false);
for(uint16_t x=1; x< sizeof(ignitionTable); x++) for(uint16_t x=1; x< npage_size[ignMapPage]; x++)
{ {
raw_value = getPageValue(ignMapPage, x); raw_value = getPageValue(ignMapPage, x);
CRC32_val = CRC32.crc32_upd(&raw_value, 1); CRC32_val = CRC32.crc32_upd(&raw_value, 1, false);
} }
//Do a manual reflection of the CRC32 value
CRC32_val = ~CRC32_val;
break; break;
case ignSetPage: case ignSetPage:
@ -101,13 +108,16 @@ uint32_t calculateCRC32(byte pageNo)
break; break;
case afrMapPage: case afrMapPage:
//Confirmed working
raw_value = getPageValue(afrMapPage, 0); raw_value = getPageValue(afrMapPage, 0);
CRC32_val = CRC32.crc32(&raw_value, 1); CRC32_val = CRC32.crc32(&raw_value, 1, false);
for(uint16_t x=1; x< sizeof(afrTable); x++) for(uint16_t x=1; x< npage_size[afrMapPage]; x++)
{ {
raw_value = getPageValue(afrMapPage, x); raw_value = getPageValue(afrMapPage, x);
CRC32_val = CRC32.crc32_upd(&raw_value, 1); CRC32_val = CRC32.crc32_upd(&raw_value, 1, false);
} }
//Do a manual reflection of the CRC32 value
CRC32_val = ~CRC32_val;
break; break;
case afrSetPage: case afrSetPage:
@ -117,23 +127,29 @@ uint32_t calculateCRC32(byte pageNo)
break; break;
case boostvvtPage: case boostvvtPage:
raw_value = getPageValue(afrMapPage, 0); //Confirmed working
CRC32_val = CRC32.crc32(&raw_value, 1); raw_value = getPageValue(boostvvtPage, 0);
CRC32_val = CRC32.crc32(&raw_value, 1, false);
for(uint16_t x=1; x< npage_size[boostvvtPage]; x++) for(uint16_t x=1; x< npage_size[boostvvtPage]; x++)
{ {
raw_value = getPageValue(afrMapPage, x); raw_value = getPageValue(boostvvtPage, x);
CRC32_val = CRC32.crc32_upd(&raw_value, 1); CRC32_val = CRC32.crc32_upd(&raw_value, 1, false);
} }
//Do a manual reflection of the CRC32 value
CRC32_val = ~CRC32_val;
break; break;
case seqFuelPage: case seqFuelPage:
//Confirmed working
raw_value = getPageValue(seqFuelPage, 0); raw_value = getPageValue(seqFuelPage, 0);
CRC32_val = CRC32.crc32(&raw_value, 1); CRC32_val = CRC32.crc32(&raw_value, 1, false);
for(uint16_t x=1; x< npage_size[seqFuelPage]; x++) for(uint16_t x=1; x< npage_size[seqFuelPage]; x++)
{ {
raw_value = getPageValue(seqFuelPage, x); raw_value = getPageValue(seqFuelPage, x);
CRC32_val = CRC32.crc32_upd(&raw_value, 1); CRC32_val = CRC32.crc32_upd(&raw_value, 1, false);
} }
//Do a manual reflection of the CRC32 value
CRC32_val = ~CRC32_val;
break; break;
case canbusPage: case canbusPage: