diff --git a/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.cpp b/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.cpp index 6bd4bd6c1f..4cced8be4d 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Attachment/Nunchuk.cpp @@ -69,6 +69,35 @@ Nunchuk::Nunchuk(ExtensionReg& reg) : Attachment(_trans("Nunchuk"), reg) m_shake_hard->controls.emplace_back(new ControllerEmu::Input(ControllerEmu::DoNotTranslate, "Z")); m_id = nunchuk_id; + + // Build calibration data: + m_calibration = {{ + // Accel Zero X,Y,Z: + ACCEL_ZERO_G, + ACCEL_ZERO_G, + ACCEL_ZERO_G, + // Possibly LSBs of zero values: + 0x00, + // Accel 1G X,Y,Z: + ACCEL_ONE_G, + ACCEL_ONE_G, + ACCEL_ONE_G, + // Possibly LSBs of 1G values: + 0x00, + // Stick X max,min,center: + STICK_CENTER + STICK_RADIUS, + STICK_CENTER - STICK_RADIUS, + STICK_CENTER, + // Stick Y max,min,center: + STICK_CENTER + STICK_RADIUS, + STICK_CENTER - STICK_RADIUS, + STICK_CENTER, + // 2 checksum bytes calculated below: + 0x00, + 0x00, + }}; + + UpdateCalibrationDataChecksum(m_calibration); } void Nunchuk::GetState(u8* const data) @@ -186,4 +215,4 @@ void Nunchuk::LoadDefaults(const ControllerInterface& ciface) m_buttons->SetControlExpression(1, "Shift_L"); // Z #endif } -} +} // namespace WiimoteEmu diff --git a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp index adff30830c..7e33d2492d 100644 --- a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "Common/ChunkFile.h" #include "Common/CommonTypes.h" @@ -101,6 +102,15 @@ static const ReportFeatures reporting_mode_features[] = { {0, 0, 0, 0, 23}, }; +// Used for extension calibration data: +// Last two bytes are the sum of the previous bytes plus 0x55 and 0xaa +void UpdateCalibrationDataChecksum(std::array& data) +{ + const u8 ck1 = std::accumulate(std::begin(data), std::end(data) - 2, (u8)0x55); + data[0xe] = ck1; + data[0xf] = ck1 + 0x55; +} + void EmulateShake(AccelData* const accel, ControllerEmu::Buttons* const buttons_group, const double intensity, u8* const shake_step) { @@ -1028,8 +1038,8 @@ void Wiimote::LoadDefaults(const ControllerInterface& ciface) m_buttons->SetControlExpression(0, "Click 1"); // A m_buttons->SetControlExpression(1, "Click 3"); // B #else - m_buttons->SetControlExpression(0, "Click 0"); // A - m_buttons->SetControlExpression(1, "Click 1"); // B + m_buttons->SetControlExpression(0, "Click 0"); // A + m_buttons->SetControlExpression(1, "Click 1"); // B #endif m_buttons->SetControlExpression(2, "1"); // 1 m_buttons->SetControlExpression(3, "2"); // 2 diff --git a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h index 4a1bca6d9a..6b50dc1296 100644 --- a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h +++ b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h @@ -34,7 +34,7 @@ class ModifySettingsButton; class NumericSetting; class Output; class Tilt; -} +} // namespace ControllerEmu namespace WiimoteReal { @@ -181,6 +181,8 @@ struct ExtensionReg }; #pragma pack(pop) +void UpdateCalibrationDataChecksum(std::array& data); + void EmulateShake(AccelData* accel, ControllerEmu::Buttons* buttons_group, double intensity, u8* shake_step); @@ -377,4 +379,4 @@ private: #pragma pack(pop) }; -} +} // namespace WiimoteEmu