Use valid IR calibration data

Previously, IR calibration data with an invalid checksum was used, because the calibration produced a strange offset.  I've replaced it with calibration data that encodes the same values as the data Nintendo falls back to when the checksum is bad.
This commit is contained in:
Pokechu22 2019-08-04 17:35:47 -07:00
parent 7f6abfb0bf
commit 7c892c0c6e
2 changed files with 27 additions and 6 deletions

View File

@ -76,14 +76,30 @@ void Wiimote::Reset()
// EEPROM
m_eeprom = {};
// IR calibration and maybe more unknown purposes:
// The meaning of this data needs more investigation.
// Last byte is a checksum.
// IR calibration:
std::array<u8, 11> ir_calibration = {
0xA1, 0xAA, 0x8B, 0x99, 0xAE, 0x9E, 0x78, 0x30, 0xA7, 0x74, 0x00,
// Point 1
IR_LOW_X & 0xFF,
IR_LOW_Y & 0xFF,
// Mix
((IR_LOW_Y & 0x300) >> 2) | ((IR_LOW_X & 0x300) >> 4) | ((IR_LOW_Y & 0x300) >> 6) |
((IR_HIGH_X & 0x300) >> 8),
// Point 2
IR_HIGH_X & 0xFF,
IR_LOW_Y & 0xFF,
// Point 3
IR_HIGH_X & 0xFF,
IR_HIGH_Y & 0xFF,
// Mix
((IR_HIGH_Y & 0x300) >> 2) | ((IR_HIGH_X & 0x300) >> 4) | ((IR_HIGH_Y & 0x300) >> 6) |
((IR_LOW_X & 0x300) >> 8),
// Point 4
IR_LOW_X & 0xFF,
IR_HIGH_Y & 0xFF,
// Checksum
0x00,
};
// Purposely not updating checksum because using this data results in a weird IR offset..
// UpdateCalibrationDataChecksum(ir_calibration, 1);
UpdateCalibrationDataChecksum(ir_calibration, 1);
m_eeprom.ir_calibration_1 = ir_calibration;
m_eeprom.ir_calibration_2 = ir_calibration;

View File

@ -83,6 +83,11 @@ void UpdateCalibrationDataChecksum(T& data, int cksum_bytes)
class Wiimote : public ControllerEmu::EmulatedController
{
public:
static constexpr u16 IR_LOW_X = 0x7F;
static constexpr u16 IR_LOW_Y = 0x5D;
static constexpr u16 IR_HIGH_X = 0x380;
static constexpr u16 IR_HIGH_Y = 0x2A2;
static constexpr u8 ACCEL_ZERO_G = 0x80;
static constexpr u8 ACCEL_ONE_G = 0x9A;