mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-08-04 07:09:03 +00:00
Use zlib crc32
This wasn't possible until DolphinLib was unified due to zlib not being present for input devices.
This commit is contained in:
parent
590f42dce4
commit
c0e315e3a1
1 changed files with 11 additions and 54 deletions
|
@ -8,6 +8,8 @@
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
#include "Common/BitUtils.h"
|
#include "Common/BitUtils.h"
|
||||||
#include "Common/Common.h"
|
#include "Common/Common.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
@ -167,60 +169,15 @@ double BalanceBoardExt::ConvertToKilograms(u16 sensor_weight)
|
||||||
|
|
||||||
void BalanceBoardExt::ComputeCalibrationChecksum()
|
void BalanceBoardExt::ComputeCalibrationChecksum()
|
||||||
{
|
{
|
||||||
std::array<u8, 0x1c> data;
|
u32 crc = crc32(0L, Z_NULL, 0);
|
||||||
|
crc = crc32(crc, &m_reg.calibration[4], 0xc); // Skip the first 4 bytes
|
||||||
|
crc = crc32(crc, &m_reg.calibration2[0], 0xc); // Skip the last 4 bytes (the CRC itself)
|
||||||
|
crc = crc32(crc, &m_reg.calibration[0], 2); // Hash 2 of the bytes skipped earlier
|
||||||
|
crc = crc32(crc, &m_reg.calibration3[0], 2);
|
||||||
|
|
||||||
data[0x00] = m_reg.calibration[0x4];
|
m_reg.calibration2[0x0c] = u8(crc >> 24);
|
||||||
data[0x01] = m_reg.calibration[0x5];
|
m_reg.calibration2[0x0d] = u8(crc >> 16);
|
||||||
data[0x02] = m_reg.calibration[0x6];
|
m_reg.calibration2[0x0e] = u8(crc >> 8);
|
||||||
data[0x03] = m_reg.calibration[0x7];
|
m_reg.calibration2[0x0f] = u8(crc);
|
||||||
data[0x04] = m_reg.calibration[0x8];
|
|
||||||
data[0x05] = m_reg.calibration[0x9];
|
|
||||||
data[0x06] = m_reg.calibration[0xa];
|
|
||||||
data[0x07] = m_reg.calibration[0xb];
|
|
||||||
data[0x08] = m_reg.calibration[0xc];
|
|
||||||
data[0x09] = m_reg.calibration[0xd];
|
|
||||||
data[0x0a] = m_reg.calibration[0xe];
|
|
||||||
data[0x0b] = m_reg.calibration[0xf];
|
|
||||||
data[0x0c] = m_reg.calibration2[0x0];
|
|
||||||
data[0x0d] = m_reg.calibration2[0x1];
|
|
||||||
data[0x0e] = m_reg.calibration2[0x2];
|
|
||||||
data[0x0f] = m_reg.calibration2[0x3];
|
|
||||||
data[0x10] = m_reg.calibration2[0x4];
|
|
||||||
data[0x11] = m_reg.calibration2[0x5];
|
|
||||||
data[0x12] = m_reg.calibration2[0x6];
|
|
||||||
data[0x13] = m_reg.calibration2[0x7];
|
|
||||||
data[0x14] = m_reg.calibration2[0x8];
|
|
||||||
data[0x15] = m_reg.calibration2[0x9];
|
|
||||||
data[0x16] = m_reg.calibration2[0xa];
|
|
||||||
data[0x17] = m_reg.calibration2[0xb];
|
|
||||||
data[0x18] = m_reg.calibration[0];
|
|
||||||
data[0x19] = m_reg.calibration[1];
|
|
||||||
data[0x1a] = m_reg.calibration3[0];
|
|
||||||
data[0x1b] = m_reg.calibration3[1];
|
|
||||||
|
|
||||||
constexpr u32 CRC_POLYNOMIAL = 0xEDB88320; // Reversed
|
|
||||||
|
|
||||||
u32 result = 0xffffffff;
|
|
||||||
for (auto byte : data)
|
|
||||||
{
|
|
||||||
// This could be cached into a table (and usually is), but since this is called infrequently and
|
|
||||||
// on a small number of bytes, don't bother.
|
|
||||||
u32 remainder = (byte ^ (result & 0xff));
|
|
||||||
for (auto bit = 0; bit < 8; bit++)
|
|
||||||
{
|
|
||||||
if (remainder & 1)
|
|
||||||
remainder = (remainder >> 1) ^ CRC_POLYNOMIAL;
|
|
||||||
else
|
|
||||||
remainder = remainder >> 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = (result >> 8) ^ remainder;
|
|
||||||
}
|
|
||||||
result ^= 0xffffffff;
|
|
||||||
|
|
||||||
m_reg.calibration2[0x0c] = u8(result >> 24);
|
|
||||||
m_reg.calibration2[0x0d] = u8(result >> 16);
|
|
||||||
m_reg.calibration2[0x0e] = u8(result >> 8);
|
|
||||||
m_reg.calibration2[0x0f] = u8(result);
|
|
||||||
}
|
}
|
||||||
} // namespace WiimoteEmu
|
} // namespace WiimoteEmu
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue