Originally posted by spacelime
I've made a tweak to x360ce2vigem in order to auto-calibrate game controllers upon connecting. In case anyone has any use for it here's the code:
int LXOffset[] = { 0,0,0,0 };
int LYOffset[] = { 0,0,0,0 };
int RXOffset[] = { 0,0,0,0 };
int RYOffset[] = { 0,0,0,0 };
bool calibrated[] = { false,false,false,false };
printf("Starting translation, close window to exit...\n");
while (true)
{
auto begin = high_resolution_clock::now();
for (int i = 0; i < XUSER_MAX_COUNT; i++)
{
ZeroMemory(&state, sizeof(XINPUT_STATE));
// The Mayflash WiiUPro adapter assigns the first connected controller to bus 4, the second to bus 0 etc.. This is to sort them properly.
if (i == 0) result = XInputGetState(3, &state);
if (i == 1) result = XInputGetState(0, &state);
if (i == 2) result = XInputGetState(1, &state);
if (i == 3) result = XInputGetState(2, &state);
if (result == ERROR_SUCCESS)
{
vigem_target_set_vid(&targets[i], 0x1234);
vigem_target_set_pid(&targets[i], 0x0001);
if (VIGEM_SUCCESS(vigem_target_plugin(Xbox360Wired, &targets[i])))
{
printf("Plugged in controller %d\t\t\t\t\n", targets[i].SerialNo);
}
// Calibrate controller
if (state.Gamepad.sThumbRX != 0 && state.Gamepad.sThumbRX != 1 && !calibrated[i])
{
LXOffset[i] = state.Gamepad.sThumbLX;
LYOffset[i] = state.Gamepad.sThumbLY;
RXOffset[i] = state.Gamepad.sThumbRX;
RYOffset[i] = state.Gamepad.sThumbRY;
calibrated[i] = true;
}
if (state.Gamepad.sThumbRX == 0 && state.Gamepad.sThumbRY == -1) calibrated[i] = false;
// Assign the proper offsets
if (calibrated[i])
{
//LX
if (LXOffset[i] < 0)
{
if (state.Gamepad.sThumbLX - LXOffset[i] < 32767 + LXOffset[i]) state.Gamepad.sThumbLX = state.Gamepad.sThumbLX - LXOffset[i];
else state.Gamepad.sThumbLX = 32767 + LXOffset[i];
state.Gamepad.sThumbLX = state.Gamepad.sThumbLX * (32767.0f / (32767.0f + LXOffset[i]));
}
if (LXOffset[i] > 0)
{
if (state.Gamepad.sThumbLX - LXOffset[i] > -32767 + LXOffset[i]) state.Gamepad.sThumbLX = state.Gamepad.sThumbLX - LXOffset[i];
else state.Gamepad.sThumbLX = -32767 + LXOffset[i];
state.Gamepad.sThumbLX = state.Gamepad.sThumbLX * (32767.0f / (32767.0f - LXOffset[i]));
}
//LY
if (LYOffset[i] < 0)
{
if (state.Gamepad.sThumbLY - LYOffset[i] < 32767 + LYOffset[i]) state.Gamepad.sThumbLY = state.Gamepad.sThumbLY - LYOffset[i];
else state.Gamepad.sThumbLY = 32767 + LYOffset[i];
state.Gamepad.sThumbLY = state.Gamepad.sThumbLY * (32767.0f / (32767.0f + LYOffset[i]));
}
if (LYOffset[i] > 0)
{
if (state.Gamepad.sThumbLY - LYOffset[i] > -32767 + LYOffset[i]) state.Gamepad.sThumbLY = state.Gamepad.sThumbLY - LYOffset[i];
else state.Gamepad.sThumbLY = -32767 + LYOffset[i];
state.Gamepad.sThumbLY = state.Gamepad.sThumbLY * (32767.0f / (32767.0f - LYOffset[i]));
}
//RX
if (RXOffset[i] < 0)
{
if (state.Gamepad.sThumbRX - RXOffset[i] < 32767 + RXOffset[i]) state.Gamepad.sThumbRX = state.Gamepad.sThumbRX - RXOffset[i];
else state.Gamepad.sThumbRX = 32767 + RXOffset[i];
state.Gamepad.sThumbRX = state.Gamepad.sThumbRX * (32767.0f / (32767.0f + RXOffset[i]));
}
if (RXOffset[i] > 0)
{
if (state.Gamepad.sThumbRX - RXOffset[i] > -32767 + RXOffset[i]) state.Gamepad.sThumbRX = state.Gamepad.sThumbRX - RXOffset[i];
else state.Gamepad.sThumbRX = -32767 + RXOffset[i];
state.Gamepad.sThumbRX = state.Gamepad.sThumbRX * (32767.0f / (32767.0f - RXOffset[i]));
}
//RY
if (RYOffset[i] < 0)
{
if (state.Gamepad.sThumbRY - RYOffset[i] < 32767 + RYOffset[i]) state.Gamepad.sThumbRY = state.Gamepad.sThumbRY - RYOffset[i];
else state.Gamepad.sThumbRY = 32767 + RYOffset[i];
state.Gamepad.sThumbRY = state.Gamepad.sThumbRY * (32767.0f / (32767.0f + RYOffset[i]));
}
if (RYOffset[i] > 0)
{
if (state.Gamepad.sThumbRY - RYOffset[i] > -32767 + RYOffset[i]) state.Gamepad.sThumbRY = state.Gamepad.sThumbRY - RYOffset[i];
else state.Gamepad.sThumbRY = -32767 + RYOffset[i];
state.Gamepad.sThumbRY = state.Gamepad.sThumbRY * (32767.0f / (32767.0f - RYOffset[i]));
}
}
vigem_xusb_submit_report(targets[i], *reinterpret_cast<XUSB_REPORT*>(&state.Gamepad));
}
else
{
if (VIGEM_SUCCESS(vigem_target_unplug(&targets[i])))
{
printf("Unplugged controller %d\t\t\t\t\n", targets[i].SerialNo);
}
}
}`