private Buttons.DPad GetDPadButtons(ControllerState state) { Buttons.DPad pressed = Buttons.DPad.None; switch (state.GetPointOfViewControllers()[0]) { case 0: pressed = Buttons.DPad.Up; break; case 4500: pressed = Buttons.DPad.Up | Buttons.DPad.Right; break; case 9000: pressed = Buttons.DPad.Right; break; case 13500: pressed = Buttons.DPad.Down | Buttons.DPad.Right; break; case 18000: pressed = Buttons.DPad.Down; break; case 22500: pressed = Buttons.DPad.Down | Buttons.DPad.Left; break; case 27000: pressed = Buttons.DPad.Left; break; case 31500: pressed = Buttons.DPad.Up | Buttons.DPad.Left; break; } return(pressed); }
/// <summary> /// Convert joystick + trackIR state to Xbox controller state. /// Conventions: /// Z and RotZ: right stick, replace with TrackIR input /// X and Y: left stick /// </summary> /// <param name="state"></param> /// <param name="output"></param> private void ParseState(ControllerState state, ref byte[] output) { byte serial = 1; for (int index = 0; index < 28; index++) { output[index] = 0x00; } output[0] = 0x1C; output[4] = serial; output[9] = 0x14; bool[] buttons = state.GetButtons(); Buttons mappings = Controller.GetButtonMappings(); if (mappings == null) { return; } if (buttons[mappings.GetButton(Buttons.ButtonName.Back)]) { output[10] |= (byte)(1 << 5); // Back } if (buttons[mappings.GetButton(Buttons.ButtonName.LS)]) { output[10] |= (byte)(1 << 6); // Left Thumb } if (buttons[mappings.GetButton(Buttons.ButtonName.RS)]) { output[10] |= (byte)(1 << 7); // Right Thumb } if (buttons[mappings.GetButton(Buttons.ButtonName.Start)]) { output[10] |= (byte)(1 << 4); // Start } Buttons.DPad dpad = GetDPadButtons(state); if ((dpad & Buttons.DPad.Up) > 0) { output[10] |= (byte)(1 << 0); // Up } if ((dpad & Buttons.DPad.Right) > 0) { output[10] |= (byte)(1 << 3); // Right } if ((dpad & Buttons.DPad.Down) > 0) { output[10] |= (byte)(1 << 1); // Down } if ((dpad & Buttons.DPad.Left) > 0) { output[10] |= (byte)(1 << 2); // Left } if (buttons[mappings.GetButton(Buttons.ButtonName.LB)]) { output[11] |= (byte)(1 << 0); // Left Shoulder } if (buttons[mappings.GetButton(Buttons.ButtonName.RB)]) { output[11] |= (byte)(1 << 1); // Right Shoulder } if (buttons[mappings.GetButton(Buttons.ButtonName.Y)]) { output[11] |= (byte)(1 << 7); // Y } if (buttons[mappings.GetButton(Buttons.ButtonName.B)]) { output[11] |= (byte)(1 << 5); // B } if (buttons[mappings.GetButton(Buttons.ButtonName.A)]) { output[11] |= (byte)(1 << 4); // A } if (buttons[mappings.GetButton(Buttons.ButtonName.X)]) { output[11] |= (byte)(1 << 6); // X } if (buttons[mappings.GetButton(Buttons.ButtonName.Guide)]) { output[11] |= (byte)(1 << 2); // Guide } output[12] = (byte)(state.RotationX >> 8); // Left Trigger output[13] = (byte)(state.RotationY >> 8); // Right Trigger int ThumbLX = state.X - short.MinValue; int ThumbLY = -state.Y + short.MaxValue; int ThumbRX = state.Z; int ThumbRY = state.RotationZ + short.MaxValue; output[14] = (byte)((ThumbLX >> 0) & 0xFF); // LX output[15] = (byte)((ThumbLX >> 8) & 0xFF); output[16] = (byte)((ThumbLY >> 0) & 0xFF); // LY output[17] = (byte)((ThumbLY >> 8) & 0xFF); output[18] = (byte)((ThumbRX >> 0) & 0xFF); // RX output[19] = (byte)((ThumbRX >> 8) & 0xFF); output[20] = (byte)((ThumbRY >> 0) & 0xFF); // RY output[21] = (byte)((ThumbRY >> 8) & 0xFF); }