private void rumble_thread(HidDevice device) { byte[] localVibration = { 0x20, 0x00, 0x00 }; while (true) { RumbleMutex.WaitOne(); if (localVibration[2] != Vibration[2] || Vibration[1] != localVibration[1]) { localVibration[2] = Vibration[2]; localVibration[1] = Vibration[1]; RumbleMutex.ReleaseMutex(); device.WriteFeatureData(localVibration); Debug.WriteLine("Big Motor: {0}, Small Motor: {1}", Vibration[2], Vibration[1]); } else { RumbleMutex.ReleaseMutex(); } Thread.Sleep(20); } }
private void input_thread(HidDevice device, ScpBus scpBus, int index) { scpBus.PlugIn(index); X360Controller controller = new X360Controller(); int timeout = 30; long lastChanged = 0; long lastMiButton = 0; while (true) { HidDeviceData data = device.Read(timeout); var currentState = data.Data; bool changed = false; if (data.Status == HidDeviceData.ReadStatus.Success && currentState.Length >= 21 && currentState[0] == 4) { Debug.WriteLine(ByteArrayToHexString(currentState)); X360Buttons buttons = X360Buttons.None; if ((currentState[1] & 1) != 0) { buttons |= X360Buttons.A; } if ((currentState[1] & 2) != 0) { buttons |= X360Buttons.B; } if ((currentState[1] & 8) != 0) { buttons |= X360Buttons.X; } if ((currentState[1] & 16) != 0) { buttons |= X360Buttons.Y; } if ((currentState[1] & 64) != 0) { buttons |= X360Buttons.LeftBumper; } if ((currentState[1] & 128) != 0) { buttons |= X360Buttons.RightBumper; } if ((currentState[2] & 32) != 0) { buttons |= X360Buttons.LeftStick; } if ((currentState[2] & 64) != 0) { buttons |= X360Buttons.RightStick; } if (currentState[4] != 15) { if (currentState[4] == 0 || currentState[4] == 1 || currentState[4] == 7) { buttons |= X360Buttons.Up; } if (currentState[4] == 4 || currentState[4] == 3 || currentState[4] == 5) { buttons |= X360Buttons.Down; } if (currentState[4] == 6 || currentState[4] == 5 || currentState[4] == 7) { buttons |= X360Buttons.Left; } if (currentState[4] == 2 || currentState[4] == 1 || currentState[4] == 3) { buttons |= X360Buttons.Right; } } if ((currentState[2] & 8) != 0) { buttons |= X360Buttons.Start; } if ((currentState[2] & 4) != 0) { buttons |= X360Buttons.Back; } if (currentState[19] != 0 && BatteryLevel != currentState[19]) { BatteryLevel = currentState[19]; } if ((currentState[20] & 1) != 0) { lastMiButton = (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond); buttons |= X360Buttons.Logo; } if (lastMiButton != 0) { buttons |= X360Buttons.Logo; } if (controller.Buttons != buttons) { changed = true; controller.Buttons = buttons; } short leftStickX = (short)((Math.Max(-127.0, currentState[5] - 128) / 127) * 32767); if (leftStickX == -32767) { leftStickX = -32768; } if (leftStickX != controller.LeftStickX) { changed = true; controller.LeftStickX = leftStickX; } short leftStickY = (short)((Math.Max(-127.0, currentState[6] - 128) / 127) * -32767); if (leftStickY == -32767) { leftStickY = -32768; } if (leftStickY != controller.LeftStickY) { changed = true; controller.LeftStickY = leftStickY; } short rightStickX = (short)((Math.Max(-127.0, currentState[7] - 128) / 127) * 32767); if (rightStickX == -32767) { rightStickX = -32768; } if (rightStickX != controller.RightStickX) { changed = true; controller.RightStickX = rightStickX; } short rightStickY = (short)((Math.Max(-127.0, currentState[8] - 128) / 127) * -32767); if (rightStickY == -32767) { rightStickY = -32768; } if (rightStickY != controller.RightStickY) { changed = true; controller.RightStickY = rightStickY; } if (controller.LeftTrigger != currentState[11]) { changed = true; controller.LeftTrigger = currentState[11]; } if (controller.RightTrigger != currentState[12]) { changed = true; controller.RightTrigger = currentState[12]; } } if (data.Status == HidDeviceData.ReadStatus.WaitTimedOut || (!changed && ((lastChanged + timeout) < (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond)))) { changed = true; } if (changed) { //Debug.WriteLine("changed"); //Debug.WriteLine((DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond)); byte[] outputReport = new byte[8]; scpBus.Report(index, controller.GetReport(), outputReport); if (outputReport[1] == 0x08) { byte bigMotor = outputReport[3]; byte smallMotor = outputReport[4]; RumbleMutex.WaitOne(); if (bigMotor != Vibration[2] || Vibration[1] != smallMotor) { Vibration[1] = smallMotor; Vibration[2] = bigMotor; } RumbleMutex.ReleaseMutex(); } if (lastMiButton != 0) { if ((lastMiButton + 100) < (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond)) { lastMiButton = 0; controller.Buttons ^= X360Buttons.Logo; } } lastChanged = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; } } }