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