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);
        }