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:
parent
b92eb03d26
commit
fb370110dc
|
@ -87,23 +87,30 @@ void Nunchuk::GetState(u8* const data)
|
||||||
// flip the button bits :/
|
// flip the button bits :/
|
||||||
ncdata->bt.hex ^= 0x03;
|
ncdata->bt.hex ^= 0x03;
|
||||||
|
|
||||||
u16 accel_x = (u16)(accel.x * ACCEL_RANGE + ACCEL_ZERO_G);
|
// We now use 2 bits more precision, so multiply by 4 before converting to int
|
||||||
u16 accel_y = (u16)(accel.y * ACCEL_RANGE + ACCEL_ZERO_G);
|
s16 accel_x = (s16)(4 * (accel.x * ACCEL_RANGE + ACCEL_ZERO_G));
|
||||||
u16 accel_z = (u16)(accel.z * 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)
|
if (accel_x > 1024)
|
||||||
accel_x = 1024;
|
accel_x = 1024;
|
||||||
|
else if (accel_x < 0)
|
||||||
|
accel_x = 0;
|
||||||
if (accel_y > 1024)
|
if (accel_y > 1024)
|
||||||
accel_y = 1024;
|
accel_y = 1024;
|
||||||
|
else if (accel_y < 0)
|
||||||
|
accel_y = 0;
|
||||||
if (accel_z > 1024)
|
if (accel_z > 1024)
|
||||||
accel_z = 1024;
|
accel_z = 1024;
|
||||||
|
else if (accel_z < 0)
|
||||||
|
accel_z = 0;
|
||||||
|
|
||||||
ncdata->ax = accel_x & 0xFF;
|
ncdata->ax = (accel_x >> 2) & 0xFF;
|
||||||
ncdata->ay = accel_y & 0xFF;
|
ncdata->ay = (accel_y >> 2) & 0xFF;
|
||||||
ncdata->az = accel_z & 0xFF;
|
ncdata->az = (accel_z >> 2) & 0xFF;
|
||||||
ncdata->passthrough_data.acc_x_lsb = accel_x >> 8 & 0x3;
|
ncdata->bt.acc_x_lsb = accel_x & 0x3;
|
||||||
ncdata->passthrough_data.acc_y_lsb = accel_y >> 8 & 0x3;
|
ncdata->bt.acc_y_lsb = accel_y & 0x3;
|
||||||
ncdata->passthrough_data.acc_z_lsb = accel_z >> 8 & 0x3;
|
ncdata->bt.acc_z_lsb = accel_z & 0x3;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Nunchuk::LoadDefaults(const ControllerInterface& ciface)
|
void Nunchuk::LoadDefaults(const ControllerInterface& ciface)
|
||||||
|
|
|
@ -396,24 +396,31 @@ void Wiimote::GetAccelData(u8* const data, const ReportFeatures& rptf)
|
||||||
wm_accel& accel = *(wm_accel*)(data + rptf.accel);
|
wm_accel& accel = *(wm_accel*)(data + rptf.accel);
|
||||||
wm_buttons& core = *(wm_buttons*)(data + rptf.core);
|
wm_buttons& core = *(wm_buttons*)(data + rptf.core);
|
||||||
|
|
||||||
u16 x = (u16)(m_accel.x * ACCEL_RANGE + ACCEL_ZERO_G);
|
// We now use 2 bits more precision, so multiply by 4 before converting to int
|
||||||
u16 y = (u16)(m_accel.y * ACCEL_RANGE + ACCEL_ZERO_G);
|
s16 x = (s16)(4 * (m_accel.x * ACCEL_RANGE + ACCEL_ZERO_G));
|
||||||
u16 z = (u16)(m_accel.z * 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)
|
if (x > 1024)
|
||||||
x = 1024;
|
x = 1024;
|
||||||
|
else if (x < 0)
|
||||||
|
x = 0;
|
||||||
if (y > 1024)
|
if (y > 1024)
|
||||||
y = 1024;
|
y = 1024;
|
||||||
|
else if (y < 0)
|
||||||
|
y = 0;
|
||||||
if (z > 1024)
|
if (z > 1024)
|
||||||
z = 1024;
|
z = 1024;
|
||||||
|
else if (z < 0)
|
||||||
|
z = 0;
|
||||||
|
|
||||||
accel.x = x & 0xFF;
|
accel.x = (x >> 2) & 0xFF;
|
||||||
accel.y = y & 0xFF;
|
accel.y = (y >> 2) & 0xFF;
|
||||||
accel.z = z & 0xFF;
|
accel.z = (z >> 2) & 0xFF;
|
||||||
|
|
||||||
core.acc_x_lsb = x >> 8 & 0x3;
|
core.acc_x_lsb = x & 0x3;
|
||||||
core.acc_y_lsb = y >> 8 & 0x1;
|
core.acc_y_lsb = (y >> 1) & 0x1;
|
||||||
core.acc_z_lsb = z >> 8 & 0x1;
|
core.acc_z_lsb = (z >> 1) & 0x1;
|
||||||
}
|
}
|
||||||
#define kCutoffFreq 5.0
|
#define kCutoffFreq 5.0
|
||||||
inline void LowPassFilter(double & var, double newval, double period)
|
inline void LowPassFilter(double & var, double newval, double period)
|
||||||
|
|
Loading…
Reference in New Issue