public static byte CalculateSWThrottleXinput(XInputButton button, State state)
        {
            if (button.IsButton)
            {
                var btnPress = DigitalHelper.GetButtonPressXinput(button, state, 0);
                if (btnPress == true)
                {
                    return(0xFF);
                }
                return(0x00);
            }

            if (button.IsLeftThumbY)
            {
                return(JvsHelper.CalculateGasPos(state.Gamepad.LeftThumbY, false, false));
            }

            if (button.IsRightThumbY)
            {
                return(JvsHelper.CalculateGasPos(state.Gamepad.RightThumbY, false, false));
            }

            if (button.IsLeftTrigger)
            {
                return(state.Gamepad.LeftTrigger);
            }

            if (button.IsRightTrigger)
            {
                return(state.Gamepad.RightTrigger);
            }
            return(0);
        }
Exemple #2
0
        public byte HandleGasBrakeForJvs(int value, bool?isAxisMinus, bool isReverseAxis, bool isFullAxis, bool isGas)
        {
            if (isFullAxis)
            {
                return(JvsHelper.CalculateGasPos(value, true, isReverseAxis));
            }

            // Dual Axis
            if (isAxisMinus.HasValue && isAxisMinus.Value)
            {
                if (value <= 32767)
                {
                    if (isGas)
                    {
                        return(JvsHelper.CalculateGasPos(-value + 32767, false, isReverseAxis));
                    }
                    return(JvsHelper.CalculateGasPos(-value + 32767, false, isReverseAxis));
                }
                return(0);
            }

            if (value <= 32767)
            {
                return(0);
            }

            return(JvsHelper.CalculateGasPos(value + 32767, false, isReverseAxis));
        }
        public void RequestJvsInformation()
        {
            while (!JvsClient.send_init_to_master())
            {
                // wait until finished
            }
            var ioId = JvsClient.GetJvsReply(1, new byte[] { 0x10 });

            JvsInformation.JvsIdentifier    = System.Text.Encoding.Default.GetString(ioId.ToArray()).Replace("\0", " ");
            JvsInformation.CmdFormatVersion = JvsClient.GetJvsReply(1, new byte[] { 0x11 }).Single();
            JvsInformation.JvsVersion       = JvsClient.GetJvsReply(1, new byte[] { 0x12 }).Single();
            JvsInformation.CommVersion      = JvsClient.GetJvsReply(1, new byte[] { 0x13 }).Single();
            var slaveFeatures = JvsClient.GetJvsReply(1, new byte[] { 0x14 });

            JvsInformation.Features = JvsHelper.ParseSlaveFeatures(slaveFeatures);

            JvsInformation.DigitalBytes   = new BitArray((JvsInformation.Features.DigitalPlayerCount * (JvsInformation.Features.DigitalSwitchesPerPlayer / 7) * 8) + 8);
            JvsInformation.AnalogChannels = new ushort[JvsInformation.Features.AnalogChannels];
            JvsInformation.SyncOk         = true;
            while (!KillMe)
            {
                var digitalBytes = new BitArray(JvsClient.GetJvsReply(1, new byte[] { 0x20, JvsInformation.Features.DigitalPlayerCount, (byte)(JvsInformation.Features.DigitalSwitchesPerPlayer / 7) }).ToArray());
                for (var i = 0; i < digitalBytes.Count; i++)
                {
                    JvsInformation.DigitalBytes[i] = digitalBytes[i];
                }

                var analogBytes = JvsClient.GetJvsReply(1, new byte[] { 0x22, JvsInformation.Features.AnalogChannels });
                for (var i = 0; i < JvsInformation.AnalogChannels.Length; i++)
                {
                    JvsInformation.AnalogChannels[i] = (ushort)(analogBytes[i * 2] + analogBytes[(i * 2) + 1] * 0x1000);
                }
                Thread.Sleep(10);
            }
        }
        public static byte CalculateAxisOrTriggerGasBrakeXinput(XInputButton button, State state, byte minVal = 0, byte maxVal = 255)
        {
            if (button.IsButton)
            {
                var btnPress = DigitalHelper.GetButtonPressXinput(button, state, 0);
                if (btnPress == true)
                {
                    return(0xFF);
                }
                return(0x00);
            }

            if (button.IsLeftThumbX)
            {
                return(JvsHelper.CalculateGasPos(state.Gamepad.LeftThumbX, true, false, minVal, maxVal));
            }

            if (button.IsLeftThumbY)
            {
                return(JvsHelper.CalculateGasPos(state.Gamepad.LeftThumbY, true, false, minVal, maxVal));
            }

            if (button.IsRightThumbX)
            {
                return(JvsHelper.CalculateGasPos(state.Gamepad.RightThumbX, true, false, minVal, maxVal));
            }

            if (button.IsRightThumbY)
            {
                return(JvsHelper.CalculateGasPos(state.Gamepad.RightThumbY, true, false, minVal, maxVal));
            }

            byte result = 0;

            if (button.IsLeftTrigger)
            {
                result = state.Gamepad.LeftTrigger;
            }

            if (button.IsRightTrigger)
            {
                result = state.Gamepad.RightTrigger;
            }

            if (result < minVal)
            {
                result = minVal;
            }
            if (result > maxVal)
            {
                result = maxVal;
            }
            return(result);
        }
        public void JVS_RESET_ShouldReturnNothing()
        {
            // Arrange
            var requestBytes = JvsHelper.CraftJvsPackage((byte)JVSPacket.BROADCAST, new byte[] { (byte)JVSPacket.OP_RESET, 0xD9 });

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Empty(reply);
        }
        public void JVS_GET_COMMUNICATIONVERSION_ShouldReturnVersionTwoPointZero()
        {
            // Arrange
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new byte[] { 0x13 });
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, new byte[] { 0x10 }); // Version 1.0

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
        public void JVS_ADDRESS_2_ShouldReturnPackage()
        {
            // Arrange
            var requestBytes  = JvsHelper.CraftJvsPackage((byte)JVSPacket.BROADCAST, new byte[] { (byte)JVSPacket.OP_ADDRESS, 0x02 }); // 0x01 = Bus address
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, new byte[] { });

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
Exemple #8
0
        public static byte CalculateWheelPosXinput(XInputButton button, State state, bool useSto0Z, int stoozPercent,
                                                   GameProfile gameProfile)
        {
            int minVal = 0;
            int maxVal = 255;

            switch (gameProfile.EmulationProfile)
            {
            case EmulationProfile.SegaInitialD:
                minVal = 0x1F;
                maxVal = 0xE1;
                break;

            case EmulationProfile.SegaInitialDLindbergh:
                minVal = 0x1F;
                maxVal = 0xE1;
                break;

            case EmulationProfile.SegaSonicAllStarsRacing:
                minVal = 0x1D;
                maxVal = 0xED;
                break;

            default:
                minVal = 0;
                maxVal = 255;
                break;
            }

            if (button.IsLeftThumbX)
            {
                return(useSto0Z ? JvsHelper.CalculateSto0ZWheelPos(state.Gamepad.LeftThumbX, stoozPercent, true) : JvsHelper.CalculateWheelPos(state.Gamepad.LeftThumbX, true, false, minVal, maxVal));
            }

            if (button.IsLeftThumbY)
            {
                return(useSto0Z ? JvsHelper.CalculateSto0ZWheelPos(state.Gamepad.LeftThumbY, stoozPercent, true) : JvsHelper.CalculateWheelPos(state.Gamepad.LeftThumbY, true, false, minVal, maxVal));
            }

            if (button.IsRightThumbX)
            {
                return(useSto0Z ? JvsHelper.CalculateSto0ZWheelPos(state.Gamepad.RightThumbX, stoozPercent, true) : JvsHelper.CalculateWheelPos(state.Gamepad.RightThumbX, true, false, minVal, maxVal));
            }

            if (button.IsRightThumbY)
            {
                return(useSto0Z ? JvsHelper.CalculateSto0ZWheelPos(state.Gamepad.RightThumbY, stoozPercent, true) : JvsHelper.CalculateWheelPos(state.Gamepad.RightThumbY, true, false, minVal, maxVal));
            }
            return(0x7F);
        }
        public void JVS_GET_IDENTIFIER_ShouldReturnIdentifier()
        {
            // Arrange
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new byte[] { (byte)JVSRead.ID_DATA });
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, Encoding.ASCII.GetBytes(JVSIdentifiers.Sega2005Jvs14572));

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
        public void JVS_GET_COMMUNICATIONVERSION_JVSVERSION_COMMANDREV_ShouldReturnRightValues()
        {
            // Arrange
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new byte[] { 0x13, 0x12, 0x11 });
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, new byte[] { 0x10, 0x01, 0x20, 0x01, 0x13 });

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
        public void JVS_GENERALPURPOSEOUTPUT2_ShouldReturnJVSOK_REPORTOK()
        {
            // Arrange
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new byte[] { 0x32, 0x03, 0x00, 0x00, 0x00 });
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, new byte[] { });

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
        public void JVS_GET_COMMANDREV_ShouldReturnVersionOnePointThree()
        {
            // Arrange
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new byte[] { 0x11 });
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, new byte[] { 0x13 }); // Revision 1.3

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
        public void JVS_READ_COIN_ShouldReturnOneCoinSlotWithOkStatus(byte slots, byte[] expected)
        {
            // Arrange
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new[] { (byte)JVSRead.COIN, slots }); // 22 = Request coin slots, 1 slot
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, expected);         // Coin Normal Operation, 0 coins inserted.

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
        public void JVS_GETMULTIPLEPACKAGES_ShouldReturnJVSOK_REPORTOK()
        {
            // Arrange
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new byte[] { 0x20, 0x02, 0x02, 0x32, 0x03, 0x00, 0x00, 0x00, 0x30, 0x01, 0xf0, 0x0d, 0x21, 0x02, 0x22, 0x08 });
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, new byte[] { });

            // Act
            var    reply = JvsPackageEmulator.GetReply(requestBytes);
            string str   = "";

            foreach (var b in reply)
            {
                str += b.ToString("X2") + " ";
            }
            Console.WriteLine(reply);
        }
        public void JVS_READ_DIGINAL_ShouldReturnPlayerOne()
        {
            // Arrange
            InputCode.PlayerDigitalButtons[0].Button1 = true;
            InputCode.PlayerDigitalButtons[0].Test    = true;
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new byte[] { (byte)JVSRead.DIGITAL, 0x01, 0x01 }); // 22 = REQUEST DIGITAL, 1 = Player Count, 1 Bytes Per Player
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, new byte[] { 0x80, 0x02 });     // Special Switches, P1

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
        public void JVS_GET_ANALOG_ShouldReturnThreeChannels()
        {
            // Arrange
            InputCode.AnalogBytes[0] = 0xBA;
            InputCode.AnalogBytes[2] = 0xBE;
            InputCode.AnalogBytes[4] = 0xBE;
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new byte[] { (byte)JVSRead.ANALOG, 0x03 }); // 22 = REQUEST ANALOG, 3 = 3 Channels
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, new byte[] { (byte)InputCode.AnalogBytes[0], 0x00, (byte)InputCode.AnalogBytes[2], 0x00, (byte)InputCode.AnalogBytes[4], 0x00 });

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
        public void JVS_READ_DIGINAL_READ_ANALOG_ShouldReturnPlayerOneAndPlayerTwoButtonsAndExtAndThreeAnalogChannels()
        {
            // Arrange
            InputCode.PlayerDigitalButtons[0].Button1 = true;
            InputCode.PlayerDigitalButtons[0].Button4 = true;
            InputCode.PlayerDigitalButtons[1].Button1 = true;
            InputCode.PlayerDigitalButtons[1].Button4 = true;
            InputCode.PlayerDigitalButtons[0].Test    = true;
            InputCode.AnalogBytes[0] = 0xBA;
            InputCode.AnalogBytes[2] = 0xBE;
            InputCode.AnalogBytes[4] = 0xBE;
            var requestBytes  = JvsHelper.CraftJvsPackage(1, new byte[] { (byte)JVSRead.DIGITAL, 0x02, 0x02, (byte)JVSRead.ANALOG, 0x03 });                                                                                                           // 22 = REQUEST DIGITAL, 2 = Player Count, 2 Bytes Per Player, 22 = REQUEST ANALOG, 3 = 3 Channels
            var espectedBytes = JvsHelper.CraftJvsPackageWithStatusAndReport(0, new byte[] { 0x80, 0x02, 0x40, 0x02, 0x40, 0x01, (byte)InputCode.AnalogBytes[0], 0x00, (byte)InputCode.AnalogBytes[2], 0x00, (byte)InputCode.AnalogBytes[4], 0x00 }); // Special Switches, P1, P1Ext, P2, P2Ext

            // Act
            var reply = JvsPackageEmulator.GetReply(requestBytes);

            // Assert
            Assert.NotNull(reply);
            Assert.Equal(reply.Length, espectedBytes.Length);
            Assert.True(reply.SequenceEqual(espectedBytes));
        }
        public void JVS_Test_Analog_Sonic_Range(int wheelValue, int expectedResult, int minJvs, int maxJvs, bool isXInput)
        {
            var result = JvsHelper.CalculateWheelPos(wheelValue, isXInput, false, minJvs, maxJvs);

            Assert.Equal(expectedResult, result);
        }
Exemple #19
0
        private byte?ModifyAnalog(JoystickButtons joystickButtons, JoystickUpdate state)
        {
            if (joystickButtons.DirectInputButton == null)
            {
                return(null);
            }
            if ((JoystickOffset)joystickButtons.DirectInputButton.Button != state.Offset)
            {
                return(null);
            }

            switch (joystickButtons.AnalogType)
            {
            case AnalogType.None:
                break;

            case AnalogType.AnalogJoystick:
            {
                return(JvsHelper.CalculateWheelPos(state.Value));
            }

            case AnalogType.AnalogJoystickReverse:
            {
                return((byte)~JvsHelper.CalculateWheelPos(state.Value));
            }

            case AnalogType.Gas:
            {
                var gas = HandleGasBrakeForJvs(state.Value, joystickButtons.DirectInputButton?.IsAxisMinus, Lazydata.ParrotData.ReverseAxisGas, Lazydata.ParrotData.FullAxisGas, true);
                //Console.WriteLine("Gas: " + gas.ToString("X2"));
                if (InputCode.ButtonMode == EmulationProfile.NamcoWmmt5)
                {
                    gas /= 3;
                }
                return(gas);
            }
            break;

            case AnalogType.Brake:
            {
                var brake = HandleGasBrakeForJvs(state.Value, joystickButtons.DirectInputButton?.IsAxisMinus, Lazydata.ParrotData.ReverseAxisGas, Lazydata.ParrotData.FullAxisGas, false);
                if (InputCode.ButtonMode == EmulationProfile.NamcoWmmt5)
                {
                    brake /= 3;
                }
                //Console.WriteLine("Brake: " + brake.ToString("X2"));
                return(brake);
            }
            break;

            case AnalogType.Wheel:
            {
                int minVal = 0;
                int maxVal = 255;
                switch (_gameProfile.EmulationProfile)
                {
                case EmulationProfile.SegaInitialD:
                    minVal = 0x1F;
                    maxVal = 0xE1;
                    break;

                case EmulationProfile.SegaInitialDLindbergh:
                    minVal = 0x1F;
                    maxVal = 0xE1;
                    break;

                case EmulationProfile.SegaSonicAllStarsRacing:
                    minVal = 0x1D;
                    maxVal = 0xED;
                    break;

                default:
                    minVal = 0;
                    maxVal = 0xFF;
                    break;
                }
                var wheelPos = Lazydata.ParrotData.UseSto0ZDrivingHack
                        ? JvsHelper.CalculateSto0ZWheelPos(state.Value, Lazydata.ParrotData.StoozPercent)
                        : JvsHelper.CalculateWheelPos(state.Value, false, false, minVal, maxVal);

                if (_gameProfile.EmulationProfile == EmulationProfile.TaitoTypeXBattleGear ||
                    _gameProfile.EmulationProfile == EmulationProfile.VirtuaRLimit)
                {
                    JvsHelper.StateView.Write(4, wheelPos);
                }

                return(wheelPos);
            }

            case AnalogType.Minimum:
                if (state.Value == 0x80)
                {
                    return(0x00);
                }
                else
                {
                    return(0x7F);
                }

            case AnalogType.Maximum:
                if (state.Value == 0x80)
                {
                    return(0xFF);
                }
                else
                {
                    return(0x7F);
                }

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(null);
        }