Fix horribly broken accelerometer emulation.

It now emulates the least significant bits.
And it no longer treats maximum acceleration in one direction as being in the opposite direction.
This commit is contained in:
CarlKenner 2015-01-30 12:38:21 +10:30
parent b92eb03d26
commit fb370110dc
2 changed files with 32 additions and 18 deletions

View File

@ -87,23 +87,30 @@ void Nunchuk::GetState(u8* const data)
// flip the button bits :/
ncdata->bt.hex ^= 0x03;
u16 accel_x = (u16)(accel.x * ACCEL_RANGE + ACCEL_ZERO_G);
u16 accel_y = (u16)(accel.y * ACCEL_RANGE + ACCEL_ZERO_G);
u16 accel_z = (u16)(accel.z * ACCEL_RANGE + ACCEL_ZERO_G);
// We now use 2 bits more precision, so multiply by 4 before converting to int
s16 accel_x = (s16)(4 * (accel.x * ACCEL_RANGE + ACCEL_ZERO_G));
s16 accel_y = (s16)(4 * (accel.y * ACCEL_RANGE + ACCEL_ZERO_G));
s16 accel_z = (s16)(4 * (accel.z * ACCEL_RANGE + ACCEL_ZERO_G));
if (accel_x > 1024)
accel_x = 1024;
else if (accel_x < 0)
accel_x = 0;
if (accel_y > 1024)
accel_y = 1024;
else if (accel_y < 0)
accel_y = 0;
if (accel_z > 1024)
accel_z = 1024;
else if (accel_z < 0)
accel_z = 0;
ncdata->ax = accel_x & 0xFF;
ncdata->ay = accel_y & 0xFF;
ncdata->az = accel_z & 0xFF;
ncdata->passthrough_data.acc_x_lsb = accel_x >> 8 & 0x3;
ncdata->passthrough_data.acc_y_lsb = accel_y >> 8 & 0x3;
ncdata->passthrough_data.acc_z_lsb = accel_z >> 8 & 0x3;
ncdata->ax = (accel_x >> 2) & 0xFF;
ncdata->ay = (accel_y >> 2) & 0xFF;
ncdata->az = (accel_z >> 2) & 0xFF;
ncdata->bt.acc_x_lsb = accel_x & 0x3;
ncdata->bt.acc_y_lsb = accel_y & 0x3;
ncdata->bt.acc_z_lsb = accel_z & 0x3;
}
void Nunchuk::LoadDefaults(const ControllerInterface& ciface)

View File

@ -396,24 +396,31 @@ void Wiimote::GetAccelData(u8* const data, const ReportFeatures& rptf)
wm_accel& accel = *(wm_accel*)(data + rptf.accel);
wm_buttons& core = *(wm_buttons*)(data + rptf.core);
u16 x = (u16)(m_accel.x * ACCEL_RANGE + ACCEL_ZERO_G);
u16 y = (u16)(m_accel.y * ACCEL_RANGE + ACCEL_ZERO_G);
u16 z = (u16)(m_accel.z * ACCEL_RANGE + ACCEL_ZERO_G);
// We now use 2 bits more precision, so multiply by 4 before converting to int
s16 x = (s16)(4 * (m_accel.x * ACCEL_RANGE + ACCEL_ZERO_G));
s16 y = (s16)(4 * (m_accel.y * ACCEL_RANGE + ACCEL_ZERO_G));
s16 z = (s16)(4 * (m_accel.z * ACCEL_RANGE + ACCEL_ZERO_G));
if (x > 1024)
x = 1024;
else if (x < 0)
x = 0;
if (y > 1024)
y = 1024;
else if (y < 0)
y = 0;
if (z > 1024)
z = 1024;
else if (z < 0)
z = 0;
accel.x = x & 0xFF;
accel.y = y & 0xFF;
accel.z = z & 0xFF;
accel.x = (x >> 2) & 0xFF;
accel.y = (y >> 2) & 0xFF;
accel.z = (z >> 2) & 0xFF;
core.acc_x_lsb = x >> 8 & 0x3;
core.acc_y_lsb = y >> 8 & 0x1;
core.acc_z_lsb = z >> 8 & 0x1;
core.acc_x_lsb = x & 0x3;
core.acc_y_lsb = (y >> 1) & 0x1;
core.acc_z_lsb = (z >> 1) & 0x1;
}
#define kCutoffFreq 5.0
inline void LowPassFilter(double & var, double newval, double period)