Beispiel #1
0
        public void Update(byte[] data)
        {
            // Buttons
            A     = (data[1] & 0x01) != 0;
            B     = (data[1] & 0x02) != 0;
            X     = (data[1] & 0x04) != 0;
            Y     = (data[1] & 0x08) != 0;
            Z     = (data[2] & 0x02) != 0;
            Start = (data[2] & 0x01) != 0;

            // D-Pad
            Up    = (data[1] & 0x80) != 0;
            Down  = (data[1] & 0x40) != 0;
            Left  = (data[1] & 0x10) != 0;
            Right = (data[1] & 0x20) != 0;

            // Joysticks
            joystick.rawX = data[3];
            joystick.rawY = data[4];
            cStick.rawX   = data[5];
            cStick.rawY   = data[6];

            // Triggers
            L.rawValue = data[7];
            R.rawValue = data[8];
            L.full     = (data[2] & 0x08) != 0;
            R.full     = (data[2] & 0x04) != 0;

            // Normalize
            joystick.Normalize();
            cStick.Normalize();
            L.Normalize();
            R.Normalize();
        }
Beispiel #2
0
        public void Update(byte[] data)
        {
            int offset = Utils.GetExtensionOffset((InputReport)data[0]);

            if (offset > 0)
            {
                // Buttons
                A      = (data[offset + 9] & 0x10) == 0;
                B      = (data[offset + 9] & 0x40) == 0;
                X      = (data[offset + 9] & 0x08) == 0;
                Y      = (data[offset + 9] & 0x20) == 0;
                L      = (data[offset + 8] & 0x20) == 0;
                R      = (data[offset + 8] & 0x02) == 0;
                ZL     = (data[offset + 9] & 0x80) == 0;
                ZR     = (data[offset + 9] & 0x04) == 0;
                Plus   = (data[offset + 8] & 0x04) == 0;
                Minus  = (data[offset + 8] & 0x10) == 0;
                Home   = (data[offset + 8] & 0x08) == 0;
                LStick = (data[offset + 10] & 0x02) == 0;
                RStick = (data[offset + 10] & 0x01) == 0;

                // DPad
                Up    = (data[offset + 9] & 0x01) == 0;
                Down  = (data[offset + 8] & 0x40) == 0;
                Left  = (data[offset + 9] & 0x02) == 0;
                Right = (data[offset + 8] & 0x80) == 0;

                // Joysticks
                LJoy.rawX = BitConverter.ToInt16(data, offset);
                LJoy.rawY = BitConverter.ToInt16(data, offset + 4);
                RJoy.rawX = BitConverter.ToInt16(data, offset + 2);
                RJoy.rawY = BitConverter.ToInt16(data, offset + 6);

                // Other
                charging     = (data[offset + 10] & 0x04) == 0;
                usbConnected = (data[offset + 10] & 0x08) == 0;

                // Normalize
                LJoy.Normalize();
                RJoy.Normalize();
            }
            else if (Utils.ReportContainsCoreButtons((InputReport)data[0]))
            {
                Plus  = (data[1] & 0x04) == 0;
                Home  = (data[1] & 0x08) == 0;
                Minus = (data[1] & 0x10) == 0;
                Down  = (data[1] & 0x40) == 0;
                Right = (data[1] & 0x80) == 0;
                Up    = (data[2] & 0x01) == 0;
                Left  = (data[2] & 0x02) == 0;
                A     = (data[2] & 0x10) == 0;
                B     = (data[2] & 0x40) == 0;
            }
        }
Beispiel #3
0
        public void Update(byte[] data)
        {
            int offset = Utils.GetExtensionOffset((InputReport)data[0]);

            if (offset > 0)
            {
                // Buttons
                A     = (data[offset + 5] & 0x10) == 0;
                B     = (data[offset + 5] & 0x40) == 0;
                X     = (data[offset + 5] & 0x08) == 0;
                Y     = (data[offset + 5] & 0x20) == 0;
                LFull = (data[offset + 4] & 0x20) == 0;  // Until the Click
                RFull = (data[offset + 4] & 0x02) == 0;  // Until the Click
                ZL    = (data[offset + 5] & 0x80) == 0;
                ZR    = (data[offset + 5] & 0x04) == 0;
                Plus  = (data[offset + 4] & 0x04) == 0;
                Minus = (data[offset + 4] & 0x10) == 0;
                Home  = (data[offset + 4] & 0x08) == 0;

                // Dpad
                Up    = (data[offset + 5] & 0x01) == 0;
                Down  = (data[offset + 4] & 0x40) == 0;
                Left  = (data[offset + 5] & 0x02) == 0;
                Right = (data[offset + 4] & 0x80) == 0;

                // Joysticks
                LJoy.rawX = (byte)(data[offset] & 0x3F);
                LJoy.rawY = (byte)(data[offset + 1] & 0x3F);
                RJoy.rawX = (byte)(data[offset + 2] >> 7 | (data[offset + 1] & 0xC0) >> 5 | (data[offset] & 0xC0) >> 3);
                RJoy.rawY = (byte)(data[offset + 2] & 0x1F);

                // Triggers
                L.rawValue = (byte)(((data[offset + 2] & 0x60) >> 2) | (data[offset + 3] >> 5));
                R.rawValue = (byte)(data[offset + 3] & 0x1F);
                L.full     = LFull;
                R.full     = RFull;

                // Normalize
                LJoy.Normalize();
                RJoy.Normalize();
                L.Normalize();
                R.Normalize();
            }

            wiimote = new Wiimote(data, wiimote);
        }
        public void Update(byte[] data)
        {
            int offset = Utils.GetExtensionOffset((InputReport)data[0]);

            if (offset > 0)
            {
                // Buttons
                A     = (data[offset + 5] & 0x10) == 0;
                B     = (data[offset + 5] & 0x40) == 0;
                X     = (data[offset + 5] & 0x08) == 0;
                Y     = (data[offset + 5] & 0x20) == 0;
                L     = (data[offset + 4] & 0x20) == 0;
                R     = (data[offset + 4] & 0x02) == 0;
                ZL    = (data[offset + 5] & 0x80) == 0;
                ZR    = (data[offset + 5] & 0x04) == 0;
                Plus  = (data[offset + 4] & 0x04) == 0;
                Minus = (data[offset + 4] & 0x10) == 0;
                Home  = (data[offset + 4] & 0x08) == 0;

                // Dpad
                Up    = (data[offset + 5] & 0x01) == 0;
                Down  = (data[offset + 4] & 0x40) == 0;
                Left  = (data[offset + 5] & 0x02) == 0;
                Right = (data[offset + 4] & 0x80) == 0;

                // Joysticks
                LJoy.rawX = (byte)(data[offset] & 0x3F);
                LJoy.rawY = (byte)(data[offset + 1] & 0x3F);
                RJoy.rawX = (byte)(data[offset + 2] >> 7 | (data[offset + 1] & 0xC0) >> 5 | (data[offset] & 0xC0) >> 3);
                RJoy.rawY = (byte)(data[offset + 2] & 0x1F);

                // Normalize
                LJoy.Normalize();
                RJoy.Normalize();
            }

            // Simply calling the Update(data) method doesn't seem to be working.
            // the button data will get updated correctly but when stepping over this
            // statement in debug mode the button data is all set to its default values.
            wiimote = new Wiimote(data, wiimote);
        }
Beispiel #5
0
        public void Update(byte[] data)
        {
            int offset = Utils.GetExtensionOffset((InputReport)data[0]);

            if (offset > 0)
            {
                // Buttons
                C = (data[offset + 5] & 0x02) == 0;
                Z = (data[offset + 5] & 0x01) == 0;

                // Joystick
                joystick.rawX = data[offset];
                joystick.rawY = data[offset + 1];

                // Accelerometer
                accelerometer.Parse(data, offset + 2);

                // Normalize
                joystick.Normalize();
                accelerometer.Normalize();
            }

            wiimote = new Wiimote(data, wiimote);
        }
Beispiel #6
0
        public void Update(byte[] data)
        {
#if DEBUG
            //DebugLastData = new byte[data.Length];

            //for (int i = 0; i < data.Length; i++)
            //{
            //    DebugLastData[i] = data[i];
            //}

            DebugLastData = data;
#endif

            int offset = 0;
            switch ((InputReport)data[0])
            {
            case InputReport.BtnsExt:
            case InputReport.BtnsExtB:
                offset = 3;
                break;

            case InputReport.BtnsAccExt:
                offset = 6;
                break;

            case InputReport.BtnsIRExt:
                offset = 13;
                break;

            case InputReport.BtnsAccIRExt:
                offset = 16;
                break;

            case InputReport.ExtOnly:
                offset = 1;
                break;

            default:
                return;
            }

            if (offset > 0)
            {
                bool whichBit1 = (data[offset + 2] & 0x20) == 0;
                bool whichBit2 = (data[offset + 2] & 0x10) == 0;
                bool whichBit3 = (data[offset + 2] & 0x08) == 0;
                bool whichBit4 = (data[offset + 2] & 0x04) == 0;
                bool whichBit5 = (data[offset + 2] & 0x02) == 0;

                //Only registering when there is velocity information, if not the game doesn't recognize when you do fast inputs.
                G    = !whichBit1 && whichBit2 && whichBit3 && !whichBit4 && whichBit5;   // && (data[offset + 5] & 0x10) == 0;
                R    = !whichBit1 && !whichBit2 && whichBit3 && whichBit4 && !whichBit5;  // && (data[offset + 5] & 0x40) == 0;
                Y    = !whichBit1 && whichBit2 && whichBit3 && whichBit4 && !whichBit5;   // && (data[offset + 5] & 0x20) == 0;
                B    = whichBit1 && !whichBit2 && !whichBit3 && !whichBit4 && !whichBit5; // && (data[offset + 5] & 0x08) == 0;
                O    = whichBit1 && !whichBit2 && !whichBit3 && !whichBit4 && whichBit5;  // && (data[offset + 5] & 0x80) == 0;
                Bass = !whichBit1 && !whichBit2 && whichBit3 && !whichBit4 && !whichBit5; // && (data[offset + 5] & 0x04) == 0;

                /*if(whichBit1 || whichBit2 || whichBit3 || whichBit4 || whichBit5) {
                 * Console.WriteLine("RAW: "
                 + (!whichBit1 && !whichBit2 && whichBit3 && whichBit4 && !whichBit5 ? "R" : "")
                 + (!whichBit1 && whichBit2 && whichBit3 && whichBit4 && !whichBit5 ? "Y" : "")
                 + (whichBit1 && !whichBit2 && !whichBit3 && !whichBit4 && !whichBit5 ? "B" : "")
                 + (whichBit1 && !whichBit2 && !whichBit3 && !whichBit4 && whichBit5 ? "O" : "")
                 + (!whichBit1 && whichBit2 && whichBit3 && !whichBit4 && whichBit5 ? "G" : "")
                 + (!whichBit1 && !whichBit2 && whichBit3 && !whichBit4 && !whichBit5 ? "BASS" : "")
                 +
                 +  //Softness are 3 bits which contains a number from 0 - 7 including the force of the hit.
                 +  //0 is max force, and 7 is no hit at all.
                 + " | Softness: "
                 + ((data[offset + 3] & 0x80) == 0)
                 + "." + ((data[offset + 3] & 0x40) == 0)
                 + "." + ((data[offset + 3] & 0x20) == 0)
                 + );
                 + }*/

                //ZR = (data[offset + 5] & 0x04) == 0;
                Plus  = (data[offset + 4] & 0x04) == 0;
                Minus = (data[offset + 4] & 0x10) == 0;
                //Home = (data[offset + 4] & 0x08) == 0;

                // Dpad
                Up   = (data[offset + 5] & 0x01) == 0;
                Down = (data[offset + 4] & 0x40) == 0;
                //Left = (data[offset + 5] & 0x02) == 0;
                //Right = (data[offset + 4] & 0x80) == 0;

                //Up = false;
                //Down = false;
                Left  = false;
                Right = false;

                if (data[offset] != 0 || data[offset + 1] != 0)
                {
                    // Joysticks
                    Joy.rawX = (byte)(data[offset] & 0x3F);
                    Joy.rawY = (byte)(data[offset + 1] & 0x03F);

                    if (Joy.rawX > Joy.maxX)
                    {
                        Joy.maxX = Joy.rawX;
                    }
                    else if (Joy.rawX < Joy.minX)
                    {
                        Joy.minX = Joy.rawX;
                    }


                    if (Joy.rawY > Joy.maxY)
                    {
                        Joy.maxY = Joy.rawY;
                    }
                    else if (Joy.rawY < Joy.minY)
                    {
                        Joy.minY = Joy.rawY;
                    }


                    Joy.Normalize();

                    bool   isJoyPressed = (((Joy.X * Joy.X) + (Joy.Y * Joy.Y)) >= (WGT_JOY_DIGITAL_THRESH * WGT_JOY_DIGITAL_THRESH));
                    double joyDirection = (int)((Math.Atan2(Joy.Y, Joy.X) + (Math.PI / 2)) / (Math.PI / 8));
                    int    joyDirStep   = (int)(Math.Abs(joyDirection));

                    if (isJoyPressed)
                    {
                        if (joyDirection < 0)
                        {
                            switch (joyDirStep)
                            {
                            case 0:     //N
                                Down = true;
                                break;

                            case 1:     //NE
                            case 2:     //NE
                                Down = true;
                                Left = true;
                                break;

                            case 3:     //E
                            case 4:     //E
                                Left = true;
                                break;

                            case 5:     //SE
                            case 6:     //SE
                                Left = true;
                                Up   = true;
                                break;

                            case 7:     //S
                            case 8:     //S
                                Up = true;
                                break;

                            case 9:     //SW
                            case 10:    //SW
                                Up    = true;
                                Right = true;
                                break;

                            case 11:     //W
                            case 12:     //W
                                Right = true;
                                break;
                            }
                        }
                        else
                        {
                            switch (joyDirStep)
                            {
                            case 0:     //N
                                Down = true;
                                break;

                            case 1:     //NW
                            case 2:     //NW
                                Down  = true;
                                Right = true;
                                break;

                            case 3:     //W
                            case 4:     //W
                                Right = true;
                                break;

                            case 5:     //SW
                            case 6:     //SW
                                Right = true;
                                Up    = true;
                                break;

                            case 7:     //S
                            case 8:     //S
                                Up = true;
                                break;

                            case 9:     //SE
                            case 10:    //SE
                                Up   = true;
                                Left = true;
                                break;

                            case 11:     //E
                            case 12:     //E
                                Left = true;
                                break;
                            }
                        }
                    }
                }
            }

#if LOW_BANDWIDTH
#else
            wiimote.Update(data);

            // Wiimote is sideways so these are weird
            if (wiimote.buttons.Up)
            {
                Left = true;
            }
            else if (wiimote.buttons.Down)
            {
                Right = true;
            }

            if (wiimote.buttons.Right)
            {
                Down = true;
            }
            else if (wiimote.buttons.Left)
            {
                Up = true;
            }

            // A on the actual wiimote
            if (SpecialButtonSelect)
            {
                Select = true;
            }
#endif



#if DEBUG
            if (offset > 0)
            {
                if (SpecialButtonDebugDump)
                {
                    if (!DebugButton_Dump)
                    {
                        DebugButton_Dump = true;

                        //var sb = new StringBuilder();

                        //sb.AppendLine("Wii Guitar data packet dump:");

                        //for (int i = 0; i < data.Length; i++)
                        //{
                        //    sb.Append(data[i].ToString("X2") + " ");
                        //}

                        //MessageBox.Show(sb.ToString(), "DEBUG: WII GUITAR DUMP", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        DebugViewActive = true;
                    }
                }
                else
                {
                    DebugButton_Dump = false;
                }
            }
#endif
        }
Beispiel #7
0
        public void Update(byte[] data)
        {
#if DEBUG
            //DebugLastData = new byte[data.Length];

            //for (int i = 0; i < data.Length; i++)
            //{
            //    DebugLastData[i] = data[i];
            //}

            DebugLastData = data;
#endif

            int offset = 0;
            switch ((InputReport)data[0])
            {
            case InputReport.BtnsExt:
            case InputReport.BtnsExtB:
                offset = 3;
                break;

            case InputReport.BtnsAccExt:
                offset = 6;
                break;

            case InputReport.BtnsIRExt:
                offset = 13;
                break;

            case InputReport.BtnsAccIRExt:
                offset = 16;
                break;

            case InputReport.ExtOnly:
                offset = 1;
                break;

            default:
                return;
            }

            if (offset > 0)
            {
                if (!IsGH3SetYet)
                {
                    IsGH3       = (data[offset] & 0x80) == 0x80; //0b10000000
                    IsGH3SetYet = true;
                }

                //Console.Write("WII GUITAR DATA: ");
                //for (int i = offset; i < data.Length; i++)
                //    Console.Write(data[i].ToString("X2") + " ");

                //Console.WriteLine();

                // Buttons
                G = (data[offset + 5] & 0x10) == 0;
                R = (data[offset + 5] & 0x40) == 0;
                Y = (data[offset + 5] & 0x08) == 0;
                B = (data[offset + 5] & 0x20) == 0;
                //L = (data[offset + 4] & 0x20) == 0;
                //R = (data[offset + 4] & 0x02) == 0;
                O = (data[offset + 5] & 0x80) == 0;
                //ZR = (data[offset + 5] & 0x04) == 0;
                Plus   = (data[offset + 4] & 0x04) == 0;
                Minus  = (data[offset + 4] & 0x10) == 0;
                Minus |= (data[offset + 5] & 0x04) == 0; // Foot pedal jack
                //Home = (data[offset + 4] & 0x08) == 0;

                // Dpad
                Up   = (data[offset + 5] & 0x01) == 0;
                Down = (data[offset + 4] & 0x40) == 0;
                //Left = (data[offset + 5] & 0x02) == 0;
                //Right = (data[offset + 4] & 0x80) == 0;

                //Up = false;
                //Down = false;
                Left  = false;
                Right = false;

                if (data[offset] != 0 || data[offset + 1] != 0)
                {
                    // Joysticks
                    Joy.rawX = (byte)(data[offset] & 0x3F);
                    Joy.rawY = (byte)(data[offset + 1] & 0x03F);

                    if (Joy.rawX > Joy.maxX)
                    {
                        Joy.maxX = Joy.rawX;
                    }
                    else if (Joy.rawX < Joy.minX)
                    {
                        Joy.minX = Joy.rawX;
                    }


                    if (Joy.rawY > Joy.maxY)
                    {
                        Joy.maxY = Joy.rawY;
                    }
                    else if (Joy.rawY < Joy.minY)
                    {
                        Joy.minY = Joy.rawY;
                    }


                    Joy.Normalize();

                    bool   isJoyPressed = (((Joy.X * Joy.X) + (Joy.Y * Joy.Y)) >= (WGT_JOY_DIGITAL_THRESH * WGT_JOY_DIGITAL_THRESH));
                    double joyDirection = (int)((Math.Atan2(Joy.Y, Joy.X) + (Math.PI / 2)) / (Math.PI / 8));
                    int    joyDirStep   = (int)(Math.Abs(joyDirection));

                    if (isJoyPressed)
                    {
                        if (joyDirection < 0)
                        {
                            switch (joyDirStep)
                            {
                            case 0:     //N
                                Down = true;
                                break;

                            case 1:     //NE
                            case 2:     //NE
                                Down = true;
                                Left = true;
                                break;

                            case 3:     //E
                            case 4:     //E
                                Left = true;
                                break;

                            case 5:     //SE
                            case 6:     //SE
                                Left = true;
                                Up   = true;
                                break;

                            case 7:     //S
                            case 8:     //S
                                Up = true;
                                break;

                            case 9:     //SW
                            case 10:    //SW
                                Up    = true;
                                Right = true;
                                break;

                            case 11:     //W
                            case 12:     //W
                                Right = true;
                                break;
                            }
                        }
                        else
                        {
                            switch (joyDirStep)
                            {
                            case 0:     //N
                                Down = true;
                                break;

                            case 1:     //NW
                            case 2:     //NW
                                Down  = true;
                                Right = true;
                                break;

                            case 3:     //W
                            case 4:     //W
                                Right = true;
                                break;

                            case 5:     //SW
                            case 6:     //SW
                                Right = true;
                                Up    = true;
                                break;

                            case 7:     //S
                            case 8:     //S
                                Up = true;
                                break;

                            case 9:     //SE
                            case 10:    //SE
                                Up   = true;
                                Left = true;
                                break;

                            case 11:     //E
                            case 12:     //E
                                Left = true;
                                break;
                            }
                        }
                    }
                }



                if ((!IsGH3) && CALIB_Enable_TouchStrip)
                {
                    if (G || R || Y || B || O)
                    {
                        if (data[offset + 2] != WGT_TOUCH_STRIP_None && oldTouchStripValue == WGT_TOUCH_STRIP_None)
                        {
                            Down = true;
                        }
                    }
                    else
                    {
                        switch (data[offset + 2] & 0x1F)
                        {
                        case WGT_TOUCH_STRIP_Green:
                        case WGT_TOUCH_STRIP_Green2:
                            G = true;
                            break;

                        case WGT_TOUCH_STRIP_GreenToRed:
                        case WGT_TOUCH_STRIP_GreenToRed2:
                        case WGT_TOUCH_STRIP_GreenToRed3:
                        case WGT_TOUCH_STRIP_GreenToRed4:
                            G = true;
                            R = true;
                            break;

                        case WGT_TOUCH_STRIP_Red:
                        case WGT_TOUCH_STRIP_Red2:
                        case WGT_TOUCH_STRIP_Red3:
                            R = true;
                            break;

                        case WGT_TOUCH_STRIP_RedToYellow:
                        case WGT_TOUCH_STRIP_RedToYellow2:
                        //case WGT_TOUCH_STRIP_RedToYellow3: //conflicts with None
                        case WGT_TOUCH_STRIP_RedToYellow4:
                        case WGT_TOUCH_STRIP_RedToYellow5:
                            R = true;
                            Y = true;
                            break;

                        case WGT_TOUCH_STRIP_Yellow:
                        case WGT_TOUCH_STRIP_Yellow2:
                            Y = true;
                            break;

                        case WGT_TOUCH_STRIP_YellowToBlue:
                        case WGT_TOUCH_STRIP_YellowToBlue2:
                        case WGT_TOUCH_STRIP_YellowToBlue3:
                            Y = true;
                            B = true;
                            break;

                        case WGT_TOUCH_STRIP_Blue:
                        case WGT_TOUCH_STRIP_Blue2:
                        case WGT_TOUCH_STRIP_Blue3:
                            B = true;
                            break;

                        case WGT_TOUCH_STRIP_BlueToOrange:
                        case WGT_TOUCH_STRIP_BlueToOrange2:
                        case WGT_TOUCH_STRIP_BlueToOrange3:
                        case WGT_TOUCH_STRIP_BlueToOrange4:
                        case WGT_TOUCH_STRIP_BlueToOrange5:
                            B = true;
                            O = true;
                            break;

                        case WGT_TOUCH_STRIP_Orange:
                            O = true;
                            break;
                        }
                    }

                    oldTouchStripValue = data[offset + 2];
                }

                //// Normalize
                //Joy.Normalize();

                //if (Joy.Y > 0.7f)
                //    Up = true;
                //else if (Joy.Y < -0.7f)
                //    Down = true;

                //Left = Joy.X < -0.7f;
                //Right = Joy.X > 0.7f;

                byte currentWhammyValue = (byte)(data[offset + 3] & 0x1F);

                if (currentWhammyValue < CALIB_Whammy_Min)
                {
                    CALIB_Whammy_Min = currentWhammyValue;
                }

                if (currentWhammyValue > CALIB_Whammy_Max)
                {
                    CALIB_Whammy_Max = currentWhammyValue;
                }

                float whammy = (2.0f * (1.0f * (currentWhammyValue - CALIB_Whammy_Min) / (CALIB_Whammy_Max - CALIB_Whammy_Min)) - 1);

                WhammyHigh = Math.Max(whammy, 0);
                WhammyLow  = Math.Min(whammy, 0);


                //Console.Write("WII GUITAR:");
                //Console.Write($"Frets:{(A ? "_" : "-")}{(B ? "_" : "-")}{(X ? "_" : "-")}{(Y ? "_" : "-")}{(ZL ? "_" : "-")}");

                //Console.Write($"    Joy1=[{LJoy.X},{LJoy.Y}]    ");
                //Console.Write($"Joy2=[{RJoy.X},{RJoy.Y}]    ");

                //Console.WriteLine();
            }

#if LOW_BANDWIDTH
#else
            wiimote.Update(data);

            // Wiimote is sideways so these are weird
            if (wiimote.buttons.Up)
            {
                Left = true;
            }
            else if (wiimote.buttons.Down)
            {
                Right = true;
            }

            if (wiimote.buttons.Right)
            {
                Down = true;
            }
            else if (wiimote.buttons.Left)
            {
                Up = true;
            }

            // A on the actual wiimote
            if (SpecialButtonSelect)
            {
                Select = true;
            }

            // Tilt calibration min / resting pose (+ initialize)
            if (SpecialButtonTiltCalibMin)
            {
                wiimote.accelerometer.centerX = wiimote.accelerometer.rawX;
                wiimote.accelerometer.centerY = wiimote.accelerometer.rawY;
                wiimote.accelerometer.centerZ = wiimote.accelerometer.rawZ - 32;

                wiimote.accelerometer.minX = wiimote.accelerometer.centerX - 32;
                wiimote.accelerometer.maxX = wiimote.accelerometer.centerX + 32;

                wiimote.accelerometer.minY = wiimote.accelerometer.centerY - 32;
                wiimote.accelerometer.maxY = wiimote.accelerometer.centerY + 32;

                wiimote.accelerometer.minZ = wiimote.accelerometer.centerZ - 32;
                wiimote.accelerometer.maxZ = wiimote.accelerometer.centerZ + 32;

                wiimote.accelerometer.deadX = 0;
                wiimote.accelerometer.deadY = 0;
                wiimote.accelerometer.deadZ = 0;

                wiimote.accelerometer.Normalize();

                CALIB_Tilt_StartingZ = 0;

                CALIB_Tilt_Neutral = 0;// (float)Math.Atan2(Math.Abs(wiimote.accelerometer.Y), Math.Abs(wiimote.accelerometer.X)) * Math.Max(Math.Min(1 - Math.Abs(wiimote.accelerometer.Z - CALIB_Tilt_StartingZ), 1), 0);

                CALIB_Tilt_TiltedREEEE = (float)(CALIB_Tilt_Neutral + Math.PI / 2);
            }

            float tiltAngle = (float)Math.Atan2(Math.Abs(wiimote.accelerometer.Y),
                                                Math.Abs(wiimote.accelerometer.X)) *
                              Math.Max(Math.Min(1 - Math.Abs(wiimote.accelerometer.Z - CALIB_Tilt_StartingZ), 1), 0);

            // Tilt calibration max
            if (SpecialButtonTiltCalibMax)
            {
                CALIB_Tilt_TiltedREEEE = tiltAngle;
            }


            float tilt = _MapRange(tiltAngle, CALIB_Tilt_Neutral, CALIB_Tilt_TiltedREEEE, 0, 1);

            TiltHigh = Math.Min(Math.Max(tilt, 0), 1);
            TiltLow  = Math.Max(Math.Min(tilt, 0), -1);

            if (!IsGH3)
            {
                if (SpecialButtonTouchOn && !CALIB_Enable_TouchStrip)
                {
                    CALIB_Enable_TouchStrip = true;
                }
                else if (SpecialButtonTouchOff && CALIB_Enable_TouchStrip)
                {
                    CALIB_Enable_TouchStrip = false;
                }
            }
#endif



#if DEBUG
            if (offset > 0)
            {
                if (SpecialButtonDebugDump)
                {
                    if (!DebugButton_Dump)
                    {
                        DebugButton_Dump = true;

                        //var sb = new StringBuilder();

                        //sb.AppendLine("Wii Guitar data packet dump:");

                        //for (int i = 0; i < data.Length; i++)
                        //{
                        //    sb.Append(data[i].ToString("X2") + " ");
                        //}

                        //MessageBox.Show(sb.ToString(), "DEBUG: WII GUITAR DUMP", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        DebugViewActive = true;
                    }
                }
                else
                {
                    DebugButton_Dump = false;
                }
            }
#endif
        }
Beispiel #8
0
        public bool     T1, T2, T3, T4, T5; // Touch Frets

        public void Update(byte[] data)
        {
            // http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Guitar_Hero_(Wii)_Guitars
            // Byte 0: bits 0-5 = joy X
            // Byte 1: bits 0-5 = joy Y
            // Byte 2: bits 0-4 = touch
            // Byte 3: bits 0-4 = whammy
            // Byte 4: bit 2 = Plus, bit 4 = Minus, bit 6 = Strum Down
            // Byte 5: bit 0 = Strum Up, bit 3 = yellow
            //         bit 4 = green, bit 5 = blue
            //         bit 6 = red, bit 7 = orange

            int offset = Utils.GetExtensionOffset((InputReport)data[0]);

            if (offset > 0)
            {
                joystick.rawX      = data[offset] & 0x3F;
                joystick.rawY      = data[offset + 1] & 0x3F;
                touchBar           = (byte)(data[offset + 2] & 0x1F);
                whammyBar.rawValue = (byte)(data[offset + 3] & 0x1F);

                Plus      = (data[offset + 4] & 0x04) == 0;
                Minus     = (data[offset + 4] & 0x10) == 0;
                StrumDown = (data[offset + 4] & 0x40) == 0;
                StrumUp   = (data[offset + 5] & 0x01) == 0;
                Yellow    = (data[offset + 5] & 0x08) == 0;
                Green     = (data[offset + 5] & 0x10) == 0;
                Blue      = (data[offset + 5] & 0x20) == 0;
                Red       = (data[offset + 5] & 0x40) == 0;
                Orange    = (data[offset + 5] & 0x80) == 0;

                switch (touchBar)
                {
                default:
                case 0x0F:
                    T1 = T2 = T3 = T4 = T5 = false;
                    break;

                case 0x04:
                    T1 = true;
                    T2 = T3 = T4 = T5 = false;
                    break;

                case 0x07:
                    T1 = T2 = true;
                    T3 = T4 = T5 = false;
                    break;

                case 0x0A:
                    T2 = true;
                    T1 = T3 = T4 = T5 = false;
                    break;

                case 0x0C:
                case 0x0D:
                    T2 = T3 = true;
                    T1 = T4 = T5 = false;
                    break;

                case 0x12:
                case 0x13:
                    T3 = true;
                    T1 = T2 = T4 = T5 = false;
                    break;

                case 0x14:
                case 0x15:
                    T3 = T4 = true;
                    T1 = T2 = T5 = false;
                    break;

                case 0x17:
                case 0x18:
                    T4 = true;
                    T1 = T2 = T3 = T5 = false;
                    break;

                case 0x1A:
                    T4 = T5 = true;
                    T1 = T2 = T3 = false;
                    break;

                case 0x1F:
                    T5 = true;
                    T1 = T2 = T3 = T4 = false;
                    break;
                }

                joystick.Normalize();
                whammyBar.Normalize();
                whammyBar.full = whammyBar.rawValue >= whammyBar.max;
            }

            wiimote = new Wiimote(data, wiimote);
        }