├── .github └── workflows │ ├── dotnetYML │ └── dotnetlinux.yml ├── .gitignore ├── .idea └── .idea.ForzaDSX │ └── .idea │ ├── .gitignore │ ├── discord.xml │ ├── encodings.xml │ ├── indexLayout.xml │ └── vcs.xml ├── .vs ├── ForzaDSX │ ├── DesignTimeBuild │ │ └── .dtbcache.v2 │ ├── FileContentIndex │ │ └── read.lock │ └── v17 │ │ ├── .futdcache.v2 │ │ └── .suo ├── VSWorkspaceState.json └── slnx.sqlite ├── App.config ├── AppCheckThread.cs ├── Config ├── BrakeSettings.cs ├── Config.cs ├── ConfigHandler.cs ├── Profile.cs ├── ThrottleSettings.cs ├── TriggerMode.cs └── VerboseLevel.cs ├── CsvData.cs ├── DataPacket.cs ├── FMData.cs ├── GameParsers ├── DirtParser.cs ├── ForzaParser.cs ├── GameTypes.cs ├── NullParser.cs ├── Parser.cs └── ReportableInstruction.cs ├── LICENSE ├── NameForm.Designer.cs ├── NameForm.cs ├── NameForm.resx ├── PacketParse.cs ├── Program.cs ├── Properties ├── PublishProfiles │ ├── FolderProfile.pubxml │ └── FolderProfile.pubxml.user ├── Resources.Designer.cs ├── Resources.resx ├── Settings.Designer.cs ├── Settings.settings └── launchSettings.json ├── RacingDSX.csproj ├── RacingDSX.csproj.user ├── RacingDSX.sln ├── RacingDSX.sln.DotSettings.user ├── RacingDSXWorker.cs ├── Readme.md ├── Resources ├── SpinnerGif.gif ├── greenBtn.png └── redBtn.png ├── Settings.cs ├── UI.Designer.cs ├── UI.cs ├── UI.resx ├── appsettings.ini ├── global.json └── obj ├── Debug ├── net6.0-windows │ └── win-x64 │ │ ├── .NETCoreApp,Version=v6.0.AssemblyAttributes.cs │ │ ├── ForzaDSX.AssemblyInfo.cs │ │ ├── ForzaDSX.AssemblyInfoInputs.cache │ │ ├── ForzaDSX.GeneratedMSBuildEditorConfig.editorconfig │ │ ├── ForzaDSX.Properties.Resources.resources │ │ ├── ForzaDSX.UI.resources │ │ ├── ForzaDSX.assets.cache │ │ ├── ForzaDSX.csproj.AssemblyReference.cache │ │ ├── ForzaDSX.csproj.BuildWithSkipAnalyzers │ │ ├── ForzaDSX.csproj.CopyComplete │ │ ├── ForzaDSX.csproj.CoreCompileInputs.cache │ │ ├── ForzaDSX.csproj.FileListAbsolute.txt │ │ ├── ForzaDSX.csproj.GenerateResource.cache │ │ ├── ForzaDSX.dll │ │ ├── ForzaDSX.genruntimeconfig.cache │ │ ├── ref │ │ └── ForzaDSX.dll │ │ ├── refint │ │ └── ForzaDSX.dll │ │ └── singlefilehost.exe └── net6.0-windows10.0.22621.0 │ └── win-x64 │ ├── .NETCoreApp,Version=v6.0.AssemblyAttributes.cs │ ├── ForzaDSX.AssemblyInfo.cs │ ├── ForzaDSX.AssemblyInfoInputs.cache │ ├── ForzaDSX.GeneratedMSBuildEditorConfig.editorconfig │ ├── ForzaDSX.Properties.Resources.resources │ ├── ForzaDSX.UI.resources │ ├── ForzaDSX.assets.cache │ ├── ForzaDSX.csproj.AssemblyReference.cache │ ├── ForzaDSX.csproj.CopyComplete │ ├── ForzaDSX.csproj.CoreCompileInputs.cache │ ├── ForzaDSX.csproj.FileListAbsolute.txt │ ├── ForzaDSX.csproj.GenerateResource.cache │ ├── ForzaDSX.dll │ ├── ForzaDSX.genruntimeconfig.cache │ ├── PublishOutputs.cab13ce0e0.txt │ ├── R2R │ ├── CsvHelper.dll │ ├── ForzaDSX.dll │ ├── Microsoft.Extensions.Configuration.Abstractions.dll │ ├── Microsoft.Extensions.Configuration.Binder.dll │ ├── Microsoft.Extensions.Configuration.EnvironmentVariables.dll │ ├── Microsoft.Extensions.Configuration.FileExtensions.dll │ ├── Microsoft.Extensions.Configuration.Ini.dll │ ├── Microsoft.Extensions.Configuration.dll │ ├── Microsoft.Extensions.FileProviders.Abstractions.dll │ ├── Microsoft.Extensions.FileProviders.Physical.dll │ ├── Microsoft.Extensions.FileSystemGlobbing.dll │ ├── Microsoft.Extensions.Primitives.dll │ └── Newtonsoft.Json.dll │ ├── apphost.exe │ ├── ref │ └── ForzaDSX.dll │ ├── refint │ └── ForzaDSX.dll │ └── singlefilehost.exe ├── ForzaDSX.csproj.nuget.dgspec.json ├── ForzaDSX.csproj.nuget.g.props ├── ForzaDSX.csproj.nuget.g.targets ├── Release ├── net6.0-windows │ └── win-x64 │ │ ├── .NETCoreApp,Version=v6.0.AssemblyAttributes.cs │ │ ├── ForzaDSX.AssemblyInfo.cs │ │ ├── ForzaDSX.AssemblyInfoInputs.cache │ │ ├── ForzaDSX.GeneratedMSBuildEditorConfig.editorconfig │ │ ├── ForzaDSX.Properties.Resources.resources │ │ ├── ForzaDSX.UI.resources │ │ ├── ForzaDSX.assets.cache │ │ ├── ForzaDSX.csproj.AssemblyReference.cache │ │ ├── ForzaDSX.csproj.BuildWithSkipAnalyzers │ │ ├── ForzaDSX.csproj.CopyComplete │ │ ├── ForzaDSX.csproj.CoreCompileInputs.cache │ │ ├── ForzaDSX.csproj.FileListAbsolute.txt │ │ ├── ForzaDSX.csproj.GenerateResource.cache │ │ ├── ForzaDSX.designer.deps.json │ │ ├── ForzaDSX.designer.runtimeconfig.json │ │ ├── ForzaDSX.dll │ │ ├── ForzaDSX.genruntimeconfig.cache │ │ ├── ref │ │ └── ForzaDSX.dll │ │ ├── refint │ │ └── ForzaDSX.dll │ │ └── singlefilehost.exe └── net6.0-windows10.0.22621.0 │ └── win-x64 │ ├── .NETCoreApp,Version=v6.0.AssemblyAttributes.cs │ ├── ForzaDSX.AssemblyInfo.cs │ ├── ForzaDSX.AssemblyInfoInputs.cache │ ├── ForzaDSX.GeneratedMSBuildEditorConfig.editorconfig │ ├── ForzaDSX.assets.cache │ ├── ForzaDSX.csproj.AssemblyReference.cache │ ├── ForzaDSX.designer.deps.json │ ├── ForzaDSX.designer.runtimeconfig.json │ ├── ForzaDSX_MarkupCompile.i.cache │ ├── ForzaDSX_MarkupCompile.i.lref │ └── Window1.g.i.cs ├── project.assets.json ├── project.nuget.cache ├── project.packagespec.json └── rider.project.restore.info /.github/workflows/dotnetYML: -------------------------------------------------------------------------------- 1 | name: Release Candidate 2 | 3 | on: 4 | push: 5 | #branches: [ "main" ] 6 | pull_request: 7 | #branches: [ "main" ] 8 | 9 | jobs: 10 | package: 11 | runs-on: windows-latest 12 | steps: 13 | - uses: actions/checkout@v3 14 | - name: Setup .NET 15 | uses: actions/setup-dotnet@v2 16 | with: 17 | dotnet-version: 7.0.x 18 | - name: Restore dependencies 19 | run: dotnet restore 20 | - name: Package 21 | run: dotnet dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained false -c Release --output ./forza/devrel 22 | - name: Compress Artifact 23 | run: Compress-Archive -Path ./forza/devrel -DestinationPath ./forza/devrel/RacingDSX-RC.zip 24 | - name: Upload Release 25 | uses: ncipollo/release-action@v1 26 | with: 27 | name: RacingDSX-RC 28 | artifacts: ./forza/devrel/RacingDSX-RC.zip 29 | tag: latest-candidate 30 | prerelease: true 31 | allowUpdates: true 32 | env: 33 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 34 | continue-on-error: true 35 | -------------------------------------------------------------------------------- /.github/workflows/dotnetlinux.yml: -------------------------------------------------------------------------------- 1 | name: Release Candidate 2 | 3 | on: 4 | push: 5 | # branches: [ "main" ] 6 | pull_request: 7 | # branches: [ "main" ] 8 | 9 | jobs: 10 | package: 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | dotnet-version: ["8.0.x"] 15 | 16 | steps: 17 | - uses: actions/checkout@v3 18 | 19 | - name: Setup .NET 20 | uses: actions/setup-dotnet@v2 21 | with: 22 | dotnet-version: ${{ matrix.dotnet-version }} 23 | 24 | - name: Set EnableWindowsTargeting 25 | run: dotnet new tool-manifest 26 | 27 | - name: Restore dependencies 28 | run: dotnet restore 29 | 30 | - name: Package 31 | run: dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained true -c Release --output ./forza/devrel 32 | 33 | - name: Compress Artifact 34 | run: zip -r ./forza/devrel/RacingDSX-RC.zip ./forza/devrel 35 | 36 | - name: Generate Date 37 | id: get-date 38 | run: echo "CURRENT_DATE=$(date +'%m/%d')" >> $GITHUB_ENV 39 | 40 | - name: Upload Release 41 | uses: ncipollo/release-action@v1 42 | with: 43 | name: RacingDSX-RC-${{ env.CURRENT_DATE }} 44 | artifacts: ./forza/devrel/RacingDSX-RC.zip 45 | tag: latest-candidate-${{ env.CURRENT_DATE }} 46 | prerelease: true 47 | allowUpdates: true 48 | description: THIS IS A PRE-RELEASE VERSION, it may contain more functionality but it's not tested yet 49 | env: 50 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 51 | continue-on-error: true 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vs/ 2 | .vscode 3 | .idea 4 | /bin 5 | /obj 6 | -------------------------------------------------------------------------------- /.idea/.idea.ForzaDSX/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Rider ignored files 5 | /contentModel.xml 6 | /projectSettingsUpdater.xml 7 | /modules.xml 8 | /.idea.ForzaDSX.iml 9 | # Editor-based HTTP Client requests 10 | /httpRequests/ 11 | # Datasource local storage ignored files 12 | /dataSources/ 13 | /dataSources.local.xml 14 | -------------------------------------------------------------------------------- /.idea/.idea.ForzaDSX/.idea/discord.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /.idea/.idea.ForzaDSX/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/.idea.ForzaDSX/.idea/indexLayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/.idea.ForzaDSX/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/.vs/ForzaDSX/DesignTimeBuild/.dtbcache.v2 -------------------------------------------------------------------------------- /.vs/ForzaDSX/FileContentIndex/read.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/.vs/ForzaDSX/FileContentIndex/read.lock -------------------------------------------------------------------------------- /.vs/ForzaDSX/v17/.futdcache.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/.vs/ForzaDSX/v17/.futdcache.v2 -------------------------------------------------------------------------------- /.vs/ForzaDSX/v17/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/.vs/ForzaDSX/v17/.suo -------------------------------------------------------------------------------- /.vs/VSWorkspaceState.json: -------------------------------------------------------------------------------- 1 | { 2 | "ExpandedNodes": [ 3 | "" 4 | ], 5 | "PreviewInSolutionExplorer": false 6 | } -------------------------------------------------------------------------------- /.vs/slnx.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/.vs/slnx.sqlite -------------------------------------------------------------------------------- /App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 0.05 15 | 16 | 17 | 0.6 18 | 19 | 20 | 35 21 | 22 | 23 | 3 24 | 25 | 26 | 0.5 27 | 28 | 29 | 0.01 30 | 31 | 32 | 1 33 | 34 | 35 | 1 36 | 37 | 38 | 0.5 39 | 40 | 41 | 1 42 | 43 | 44 | 35 45 | 46 | 47 | 3 48 | 49 | 50 | 200 51 | 52 | 53 | 75 54 | 55 | 56 | 200 57 | 58 | 59 | 1 60 | 61 | 62 | 20 63 | 64 | 65 | 10 66 | 67 | 68 | 5 69 | 70 | 71 | 6 72 | 73 | 74 | 6 75 | 76 | 77 | 1 78 | 79 | 80 | 1 81 | 82 | 83 | 10 84 | 85 | 86 | 0.9 87 | 88 | 89 | False 90 | 91 | 92 | 6969 93 | 94 | 95 | 5300 96 | 97 | 98 | 0.7 99 | 100 | 101 | 0.7 102 | 103 | 104 | 0 105 | 106 | 107 | 2 108 | 109 | 110 | 2 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /AppCheckThread.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Linq; 5 | 6 | namespace RacingDSX 7 | { 8 | public struct AppCheckReportStruct 9 | { 10 | public enum AppType : ushort 11 | { 12 | NONE = 0, 13 | DSX = 1, 14 | GAME = 2 15 | } 16 | 17 | public AppCheckReportStruct(AppType type, string msg, bool val = false) 18 | { 19 | this.type = type; 20 | this.message = msg; 21 | this.value = val; 22 | } 23 | 24 | public AppCheckReportStruct(AppType type, bool val, string msg = null) 25 | { 26 | this.type = type; 27 | this.message = msg; 28 | this.value = val; 29 | } 30 | 31 | public AppCheckReportStruct(AppType type) 32 | { 33 | this.type = type; 34 | this.message = String.Empty; 35 | this.value = false; 36 | } 37 | 38 | public AppType type = 0; 39 | public string message = string.Empty; 40 | public bool value = false; 41 | } 42 | 43 | internal class AppCheckThread 44 | { 45 | readonly RacingDSX.Config.Config settings; 46 | private Dictionary processProfilePairs = new Dictionary(); 47 | 48 | readonly IProgress progressReporter; 49 | 50 | protected bool bRunning = false; 51 | 52 | public AppCheckThread(ref RacingDSX.Config.Config currentSettings, IProgress progressReporter) 53 | { 54 | 55 | settings = currentSettings; 56 | 57 | this.progressReporter = progressReporter; 58 | 59 | bRunning = false; 60 | } 61 | 62 | public void updateExecutables() 63 | { 64 | lock (this) 65 | { 66 | processProfilePairs.Clear(); 67 | 68 | foreach (var profile in settings.Profiles) 69 | { 70 | if (!profile.Value.IsEnabled) { continue; } 71 | profile.Value.executableNames.ForEach((name) => 72 | { 73 | if (!processProfilePairs.ContainsKey(name)) 74 | { 75 | processProfilePairs.Add(name, profile.Key); 76 | } 77 | }); 78 | } 79 | // settings = currentSettings; 80 | } 81 | } 82 | 83 | public void Run() 84 | { 85 | processProfilePairs.Clear(); 86 | 87 | foreach (var profile in settings.Profiles) 88 | { 89 | if (!profile.Value.IsEnabled) { continue; } 90 | profile.Value.executableNames.ForEach((name) => 91 | { 92 | if (!processProfilePairs.ContainsKey(name)) 93 | { 94 | processProfilePairs.Add(name, profile.Key); 95 | } 96 | }); 97 | } 98 | bRunning = true; 99 | try 100 | { 101 | if (progressReporter != null) 102 | { 103 | progressReporter.Report(new AppCheckReportStruct(0, "Connecting to Forza and DSX")); 104 | } 105 | 106 | //int forzaProcesses = 0; 107 | Process[] DSX, DSX_2; 108 | 109 | AppCheckReportStruct dsxReport = new AppCheckReportStruct(AppCheckReportStruct.AppType.DSX); 110 | AppCheckReportStruct forzaReport = new AppCheckReportStruct(AppCheckReportStruct.AppType.GAME); 111 | 112 | while (bRunning/*forzaProcesses == 0 || DSX.Length + DSX_2.Length == 0*/) 113 | { 114 | System.Threading.Thread.Sleep(1000); 115 | lock (this) { 116 | if (!bRunning) { break; } 117 | forzaReport.value = false; 118 | forzaReport.message = ""; 119 | foreach (var processName in processProfilePairs.Keys.AsEnumerable()) 120 | { 121 | 122 | if (Process.GetProcessesByName(processName).Length > 0) 123 | { 124 | forzaReport.value = true; 125 | forzaReport.message = processProfilePairs[processName]; 126 | break; 127 | } 128 | } 129 | /* forzaProcesses = Process.GetProcessesByName("ForzaHorizon5").Length; 130 | forzaProcesses += Process.GetProcessesByName("ForzaHorizon4").Length; //Guess at name 131 | forzaProcesses += Process.GetProcessesByName("ForzaMotorsport7").Length; //Guess at name 132 | forzaProcesses += Process.GetProcessesByName("forza_gaming.desktop.x64_release_final").Length; //Guess at name 133 | forzaProcesses += Process.GetProcessesByName("forza_steamworks_release_final").Length; //Guess at name*/ 134 | 135 | // DSX = "DSX" or "DualSenseX" 136 | DSX = Process.GetProcessesByName("DSX"); 137 | DSX_2 = Process.GetProcessesByName("DualsenseX"); 138 | 139 | dsxReport.value = (DSX.Length + DSX_2.Length) > 0; 140 | //forzaReport.value = forzaProcesses > 0; 141 | 142 | //forzaReport.value = true; 143 | //TODO: CHANGE 144 | if (!bRunning) { break; } 145 | if (progressReporter != null) 146 | { 147 | progressReporter.Report(dsxReport); 148 | progressReporter.Report(forzaReport); 149 | } 150 | } 151 | } 152 | } 153 | catch (Exception e) 154 | { 155 | if (progressReporter != null) 156 | { 157 | progressReporter.Report(new AppCheckReportStruct(0, "Application encountered an exception: " + e.Message)); 158 | } 159 | } 160 | } 161 | 162 | public void Stop() 163 | { 164 | bRunning = false; 165 | } 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /Config/BrakeSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace RacingDSX.Config 8 | { 9 | public class BrakeSettings 10 | { 11 | public TriggerMode TriggerMode { get; set; } = TriggerMode.Vibration; 12 | 13 | public float EffectIntensity { get; set; } = 1.0f; 14 | 15 | public float GripLossValue { get; set; } = 0.05f; 16 | public int VibrationStart { get; set; } = 0; 17 | public int VibrationModeStart { get; set; } = 30; 18 | public int MinVibration { get; set; } = 15; 19 | public int MaxVibration { get; set; } = 20; 20 | public float VibrationSmoothing { get; set; } = 1.0f; 21 | public int MinStiffness { get; set; } = 150; 22 | public int MaxStiffness { get; set; } = 5; 23 | public int MinResistance { get; set; } = 0; 24 | public int MaxResistance { get; set; } = 7; 25 | public float ResistanceSmoothing { get; set; } = 0.4f; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Config/Config.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Text.Json.Serialization; 6 | using System.Threading.Tasks; 7 | 8 | namespace RacingDSX.Config 9 | { 10 | public class Config 11 | { 12 | public bool DisableAppCheck { get; set; } 13 | public VerboseLevel VerboseLevel { get; set; } = VerboseLevel.Off; 14 | public Dictionary Profiles { get; set; } = new Dictionary(); 15 | [JsonIgnore] 16 | public Profile ActiveProfile { get; set; } = null; 17 | 18 | public int DSXPort { get; set; } = 6969; // This sets the default dsx port 19 | 20 | public String DefaultProfile { get; set; } = "Forza"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Config/ConfigHandler.cs: -------------------------------------------------------------------------------- 1 | using RacingDSX.GameParsers; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Text.Json; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | 11 | namespace RacingDSX.Config 12 | { 13 | public class ConfigHandler 14 | { 15 | //Methods to read config file 16 | //Method to initialize config file (Using default values), need to account for the different default profiles 17 | //Method to write config file 18 | //Singleton access to config data 19 | private static readonly String configFilePath = "RacingDSX.json"; 20 | private static Config configData; 21 | 22 | private static void InitializeConfig() 23 | { 24 | configData ??= ReadConfigFromDisk(); 25 | configData ??= new Config(); 26 | configData = AddDefaultProfiles(configData); 27 | SaveConfig(); 28 | } 29 | 30 | 31 | 32 | 33 | private static Config AddDefaultProfiles(Config config) 34 | { 35 | config.Profiles ??= new Dictionary(); 36 | if (!config.Profiles.ContainsKey("Forza")) 37 | { 38 | Profile profile = new Profile 39 | { 40 | Name = "Forza", 41 | gameUDPPort = 5300, 42 | GameType = GameTypes.Forza, 43 | }; 44 | profile.executableNames.AddRange(new string[] { "ForzaHorizon5", "ForzaHorizon4", "ForzaMotorsport7", "forza_gaming.desktop.x64_release_final", "forza_steamworks_release_final" }); 45 | config.Profiles.Add("Forza", profile); 46 | } 47 | if (!config.Profiles.ContainsKey("Dirt")) 48 | { 49 | Profile profile = new Profile 50 | { 51 | Name = "Dirt", 52 | gameUDPPort = 5300, 53 | GameType = GameTypes.Dirt 54 | }; 55 | profile.throttleSettings.GripLossValue = 0.4f; 56 | profile.executableNames.AddRange(new string[] { "drt", "dirtrally2"}); 57 | config.Profiles.Add("Dirt", profile); 58 | } 59 | 60 | return config; 61 | } 62 | 63 | private static Config ReadConfigFromDisk() 64 | { 65 | 66 | try 67 | { 68 | if (!File.Exists(configFilePath)) { 69 | return null; 70 | } 71 | string jsonString = File.ReadAllText(configFilePath); 72 | 73 | Config config = JsonSerializer.Deserialize(jsonString); 74 | return config; 75 | } 76 | catch (Exception) 77 | { 78 | return null; 79 | } 80 | 81 | } 82 | private static void WriteConfigToDisk() 83 | { 84 | try 85 | { 86 | string jsonString = JsonSerializer.Serialize(configData); 87 | File.WriteAllText(configFilePath, jsonString); 88 | } catch (Exception) 89 | { 90 | 91 | } 92 | } 93 | 94 | public static void SaveConfig() 95 | { 96 | WriteConfigToDisk(); 97 | 98 | } 99 | 100 | public static Config GetConfig() 101 | { 102 | if (configData == null) 103 | { 104 | InitializeConfig(); 105 | } 106 | return configData; 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /Config/Profile.cs: -------------------------------------------------------------------------------- 1 | using RacingDSX.GameParsers; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace RacingDSX.Config 9 | { 10 | public class Profile 11 | { 12 | public GameTypes GameType { get; set; } = GameTypes.None; 13 | public bool IsEnabled { get; set; } = true; 14 | public string Name { get; set; } 15 | public int gameUDPPort { get; set; } 16 | public List executableNames { get; set; } = new List(); 17 | public ThrottleSettings throttleSettings { get; set; } = new ThrottleSettings(); 18 | public BrakeSettings brakeSettings { get; set; } = new BrakeSettings(); 19 | 20 | public float RPMRedlineRatio { get; set; } = 0.9f; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Config/ThrottleSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace RacingDSX.Config 8 | { 9 | public class ThrottleSettings 10 | { 11 | public TriggerMode TriggerMode { get; set; } = TriggerMode.Vibration; 12 | public float GripLossValue { get; set; } = 0.6f; 13 | public float EffectIntensity { get; set; } = 1.0f; 14 | public float TurnAccelerationScale { get; set; } = 0.25f; 15 | public float ForwardAccelerationScale { get; set; } = 1.0f; 16 | public int AccelerationLimit { get; set; } = 10; 17 | public int VibrationModeStart { get; set; } = 5; 18 | public int MinVibration { get; set; } = 5; 19 | public int MaxVibration { get; set; } = 55; 20 | public float VibrationSmoothing { get; set; } = 1f; 21 | public int MinStiffness { get; set; } = 255; 22 | public int MaxStiffness { get; set; } = 175; 23 | public int MinResistance { get; set; } = 0; 24 | public int MaxResistance { get; set; } = 3; 25 | public float ResistanceSmoothing { get; set; } = 0.9f; 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Config/TriggerMode.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace RacingDSX.Config 8 | { 9 | public enum TriggerMode : sbyte 10 | { 11 | Off, 12 | Resistance, 13 | Vibration 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Config/VerboseLevel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace RacingDSX.Config 8 | { 9 | public enum VerboseLevel 10 | { 11 | Off = 0, 12 | Limited, 13 | Full 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /CsvData.cs: -------------------------------------------------------------------------------- 1 | namespace RacingDSX 2 | { 3 | public class CsvData 4 | { 5 | public uint time { get; set; } 6 | public float AccelerationX { get; set; } 7 | public float AccelerationY { get; set; } 8 | public float AccelerationZ { get; set; } 9 | public float Brake { get; set; } 10 | public float TireCombinedSlipFrontLeft { get; set; } 11 | public float TireCombinedSlipFrontRight { get; set; } 12 | public float TireCombinedSlipRearLeft { get; set; } 13 | public float TireCombinedSlipRearRight { get; set; } 14 | public float combinedTireSlip { get; set; } 15 | public float AverageAcceleration { get; set; } 16 | public float CurrentEngineRpm { get; set; } 17 | public int ThrottleResistance { get; set; } 18 | public int ThrottleResistance_filtered { get; set; } 19 | public int BrakeResistance { get; set; } 20 | public int BrakeResistance_filtered { get; set; } 21 | public int BrakeVibrationFrequency { get; set; } 22 | public int BrakeVibrationFrequency_freq { get; set; } 23 | } 24 | } -------------------------------------------------------------------------------- /DataPacket.cs: -------------------------------------------------------------------------------- 1 | namespace RacingDSX 2 | { 3 | public class DataPacket 4 | { 5 | // Sled 6 | 7 | public float frontLeftContactPatchV { get; set; } 8 | public bool IsRaceOn { get; set; } 9 | public uint Accelerator { get; set; } 10 | public uint Brake { get; set; } 11 | 12 | public float EngineMaxRpm { get; set; } 13 | public float EngineIdleRpm { get; set; } 14 | public float CurrentEngineRpm { get; set; } 15 | public float AccelerationX { get; set; } // In the car's local space; X = right, Y = up, Z = forward 16 | // public float AccelerationY { get; set; } 17 | public float AccelerationZ { get; set; } 18 | 19 | public float TireCombinedSlipFrontLeft { get; set; } // Tire normalized combined slip, = 0 means 100% grip and |slip| > 1.0 means loss of grip. 20 | public float TireCombinedSlipFrontRight { get; set; } 21 | public float TireCombinedSlipRearLeft { get; set; } 22 | public float TireCombinedSlipRearRight { get; set; } 23 | 24 | public uint CarClass { get; set; } // Between 0 (D -- worst cars) and 7 (X class -- best cars) inclusive 25 | public uint CarPerformanceIndex { get; set; } // Between 100 (slowest car) and 999 (fastest car) inclusive 26 | 27 | public float Speed { get; set; } 28 | public float Power { get; set; } 29 | 30 | public float FourWheelCombinedTireSlip { get; set; } // Combined slip for all wheels where 0 means 100% grip and |slip| > 1.0 means loss of grip. 31 | public float FrontWheelsCombinedTireSlip { get; set; } 32 | public float RearWheelsCombinedTireSlip { get; set; } 33 | 34 | 35 | // public uint TimestampMS { get; set; } // Can overflow to 0 eventually 36 | 37 | // public float VelocityX { get; set; } // In the car's local space; X = right, Y = up, Z = forward 38 | // public float VelocityY { get; set; } 39 | // public float VelocityZ { get; set; } 40 | // public float AngularVelocityX { get; set; } // In the car's local space; X = pitch, Y = yaw, Z = roll 41 | // public float AngularVelocityY { get; set; } 42 | // public float AngularVelocityZ { get; set; } 43 | // public float Yaw { get; set; } 44 | // public float Pitch { get; set; } 45 | // public float Roll { get; set; } 46 | // public float NormalizedSuspensionTravelFrontLeft { get; set; } // Suspension travel normalized: 0.0f = max stretch; 1.0 = max compression 47 | /* public float NormalizedSuspensionTravelFrontRight { get; set; } 48 | public float NormalizedSuspensionTravelRearLeft { get; set; } 49 | public float NormalizedSuspensionTravelRearRight { get; set; } 50 | public float TireSlipRatioFrontLeft { get; set; } // Tire normalized slip ratio, = 0 means 100% grip and |ratio| > 1.0 means loss of grip. 51 | public float TireSlipRatioFrontRight { get; set; } 52 | public float TireSlipRatioRearLeft { get; set; } 53 | public float TireSlipRatioRearRight { get; set; } 54 | public float WheelRotationSpeedFrontLeft { get; set; } // Wheel rotation speed radians/sec. 55 | public float WheelRotationSpeedFrontRight { get; set; } 56 | public float WheelRotationSpeedRearLeft { get; set; } 57 | public float WheelRotationSpeedRearRight { get; set; } 58 | public float WheelOnRumbleStripFrontLeft { get; set; } // = 1 when wheel is on rumble strip, = 0 when off. 59 | public float WheelOnRumbleStripFrontRight { get; set; } 60 | public float WheelOnRumbleStripRearLeft { get; set; } 61 | public float WheelOnRumbleStripRearRight { get; set; } 62 | public float WheelInPuddleDepthFrontLeft { get; set; } // = from 0 to 1, where 1 is the deepest puddle 63 | public float WheelInPuddleDepthFrontRight { get; set; } 64 | public float WheelInPuddleDepthRearLeft { get; set; } 65 | public float WheelInPuddleDepthRearRight { get; set; } 66 | public float SurfaceRumbleFrontLeft { get; set; } // Non-dimensional surface rumble values passed to controller force feedback 67 | public float SurfaceRumbleFrontRight { get; set; } 68 | public float SurfaceRumbleRearLeft { get; set; } 69 | public float SurfaceRumbleRearRight { get; set; } 70 | public float TireSlipAngleFrontLeft { get; set; } // Tire normalized slip angle, = 0 means 100% grip and |angle| > 1.0 means loss of grip. 71 | public float TireSlipAngleFrontRight { get; set; } 72 | public float TireSlipAngleRearLeft { get; set; } 73 | public float TireSlipAngleRearRight { get; set; }*/ 74 | 75 | /* public float SuspensionTravelMetersFrontLeft { get; set; } // Actual suspension travel in meters 76 | public float SuspensionTravelMetersFrontRight { get; set; } 77 | public float SuspensionTravelMetersRearLeft { get; set; } 78 | public float SuspensionTravelMetersRearRight { get; set; } 79 | public uint CarOrdinal { get; set; } // Unique ID of the car make/model*/ 80 | 81 | /* public uint DrivetrainType { get; set; } // Corresponds to EDrivetrainType; 0 = FWD, 1 = RWD, 2 = AWD 82 | public uint NumCylinders { get; set; } // Number of cylinders in the engine 83 | 84 | // Dash 85 | public float PositionX { get; set; } 86 | public float PositionY { get; set; } 87 | public float PositionZ { get; set; }*/ 88 | 89 | /* public float Torque { get; set; } 90 | public float TireTempFl { get; set; } 91 | public float TireTempFr { get; set; } 92 | public float TireTempRl { get; set; } 93 | public float TireTempRr { get; set; } 94 | public float Boost { get; set; } 95 | public float Fuel { get; set; } 96 | public float Distance { get; set; } 97 | public float BestLapTime { get; set; } 98 | public float LastLapTime { get; set; } 99 | public float CurrentLapTime { get; set; } 100 | public float CurrentRaceTime { get; set; } 101 | public uint Lap { get; set; } 102 | public uint RacePosition { get; set; }*/ 103 | 104 | /* public uint Clutch { get; set; } 105 | public uint Handbrake { get; set; } 106 | public uint Gear { get; set; } 107 | public int Steer { get; set; } 108 | public uint NormalDrivingLine { get; set; } 109 | public uint NormalAiBrakeDifference { get; set; }*/ 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /FMData.cs: -------------------------------------------------------------------------------- 1 | using static RacingDSX.PacketParse; 2 | 3 | namespace RacingDSX 4 | { 5 | public static class FMData 6 | { 7 | public static int BufferOffset = 0; 8 | 9 | // sled 10 | public static bool IsRaceOn(this byte[] bytes) { return GetSingle(bytes, 0) > 0; } 11 | public static uint TimestampMs(this byte[] bytes) { return GetUInt32(bytes, 4); } 12 | public static float EngineMaxRpm(this byte[] bytes) { return GetSingle(bytes, 8); } 13 | public static float EngineIdleRpm(this byte[] bytes) { return GetSingle(bytes, 12); } 14 | public static float CurrentEngineRpm(this byte[] bytes) { return GetSingle(bytes, 16); } 15 | public static float AccelerationX(this byte[] bytes) { return GetSingle(bytes, 20); } 16 | public static float AccelerationY(this byte[] bytes) { return GetSingle(bytes, 24); } 17 | public static float AccelerationZ(this byte[] bytes) { return GetSingle(bytes, 28); } 18 | public static float VelocityX(this byte[] bytes) { return GetSingle(bytes, 32); } 19 | public static float VelocityY(this byte[] bytes) { return GetSingle(bytes, 36); } 20 | public static float VelocityZ(this byte[] bytes) { return GetSingle(bytes, 40); } 21 | public static float AngularVelocityX(this byte[] bytes) { return GetSingle(bytes, 44); } 22 | public static float AngularVelocityY(this byte[] bytes) { return GetSingle(bytes, 48); } 23 | public static float AngularVelocityZ(this byte[] bytes) { return GetSingle(bytes, 52); } 24 | public static float Yaw(this byte[] bytes) { return GetSingle(bytes, 56); } 25 | public static float Pitch(this byte[] bytes) { return GetSingle(bytes, 60); } 26 | public static float Roll(this byte[] bytes) { return GetSingle(bytes, 64); } 27 | public static float NormSuspensionTravelFl(this byte[] bytes) { return GetSingle(bytes, 68); } 28 | public static float NormSuspensionTravelFr(this byte[] bytes) { return GetSingle(bytes, 72); } 29 | public static float NormSuspensionTravelRl(this byte[] bytes) { return GetSingle(bytes, 76); } 30 | public static float NormSuspensionTravelRr(this byte[] bytes) { return GetSingle(bytes, 80); } 31 | public static float TireSlipRatioFl(this byte[] bytes) { return GetSingle(bytes, 84); } 32 | public static float TireSlipRatioFr(this byte[] bytes) { return GetSingle(bytes, 88); } 33 | public static float TireSlipRatioRl(this byte[] bytes) { return GetSingle(bytes, 92); } 34 | public static float TireSlipRatioRr(this byte[] bytes) { return GetSingle(bytes, 96); } 35 | public static float WheelRotationSpeedFl(this byte[] bytes) { return GetSingle(bytes, 100); } 36 | public static float WheelRotationSpeedFr(this byte[] bytes) { return GetSingle(bytes, 104); } 37 | public static float WheelRotationSpeedRl(this byte[] bytes) { return GetSingle(bytes, 108); } 38 | public static float WheelRotationSpeedRr(this byte[] bytes) { return GetSingle(bytes, 112); } 39 | public static float WheelOnRumbleStripFl(this byte[] bytes) { return GetSingle(bytes, 116); } 40 | public static float WheelOnRumbleStripFr(this byte[] bytes) { return GetSingle(bytes, 120); } 41 | public static float WheelOnRumbleStripRl(this byte[] bytes) { return GetSingle(bytes, 124); } 42 | public static float WheelOnRumbleStripRr(this byte[] bytes) { return GetSingle(bytes, 128); } 43 | public static float WheelInPuddleFl(this byte[] bytes) { return GetSingle(bytes, 132); } 44 | public static float WheelInPuddleFr(this byte[] bytes) { return GetSingle(bytes, 136); } 45 | public static float WheelInPuddleRl(this byte[] bytes) { return GetSingle(bytes, 140); } 46 | public static float WheelInPuddleRr(this byte[] bytes) { return GetSingle(bytes, 144); } 47 | public static float SurfaceRumbleFl(this byte[] bytes) { return GetSingle(bytes, 148); } 48 | public static float SurfaceRumbleFr(this byte[] bytes) { return GetSingle(bytes, 152); } 49 | public static float SurfaceRumbleRl(this byte[] bytes) { return GetSingle(bytes, 156); } 50 | public static float SurfaceRumbleRr(this byte[] bytes) { return GetSingle(bytes, 160); } 51 | public static float TireSlipAngleFl(this byte[] bytes) { return GetSingle(bytes, 164); } 52 | public static float TireSlipAngleFr(this byte[] bytes) { return GetSingle(bytes, 168); } 53 | public static float TireSlipAngleRl(this byte[] bytes) { return GetSingle(bytes, 172); } 54 | public static float TireSlipAngleRr(this byte[] bytes) { return GetSingle(bytes, 176); } 55 | public static float TireCombinedSlipFl(this byte[] bytes) { return GetSingle(bytes, 180); } 56 | public static float TireCombinedSlipFr(this byte[] bytes) { return GetSingle(bytes, 184); } 57 | public static float TireCombinedSlipRl(this byte[] bytes) { return GetSingle(bytes, 188); } 58 | public static float TireCombinedSlipRr(this byte[] bytes) { return GetSingle(bytes, 192); } 59 | public static float SuspensionTravelMetersFl(this byte[] bytes) { return GetSingle(bytes, 196); } 60 | public static float SuspensionTravelMetersFr(this byte[] bytes) { return GetSingle(bytes, 200); } 61 | public static float SuspensionTravelMetersRl(this byte[] bytes) { return GetSingle(bytes, 204); } 62 | public static float SuspensionTravelMetersRr(this byte[] bytes) { return GetSingle(bytes, 208); } 63 | public static uint CarOrdinal(this byte[] bytes) { return GetUInt8(bytes, 212); } 64 | public static uint CarClass(this byte[] bytes) { return GetUInt8(bytes, 216); } 65 | public static uint CarPerformanceIndex(this byte[] bytes) { return GetUInt8(bytes, 220); } 66 | public static uint DriveTrain(this byte[] bytes) { return GetUInt8(bytes, 224); } 67 | public static uint NumCylinders(this byte[] bytes) { return GetUInt8(bytes, 228); } 68 | 69 | // dash 70 | public static float PositionX(this byte[] bytes) { return GetSingle(bytes, 232 + BufferOffset); } 71 | public static float PositionY(this byte[] bytes) { return GetSingle(bytes, 236 + BufferOffset); } 72 | public static float PositionZ(this byte[] bytes) { return GetSingle(bytes, 240 + BufferOffset); } 73 | public static float Speed(this byte[] bytes) { return GetSingle(bytes, 244 + BufferOffset); } 74 | public static float Power(this byte[] bytes) { return GetSingle(bytes, 248 + BufferOffset); } 75 | public static float Torque(this byte[] bytes) { return GetSingle(bytes, 252 + BufferOffset); } 76 | public static float TireTempFl(this byte[] bytes) { return GetSingle(bytes, 256 + BufferOffset); } 77 | public static float TireTempFr(this byte[] bytes) { return GetSingle(bytes, 260 + BufferOffset); } 78 | public static float TireTempRl(this byte[] bytes) { return GetSingle(bytes, 264 + BufferOffset); } 79 | public static float TireTempRr(this byte[] bytes) { return GetSingle(bytes, 268 + BufferOffset); } 80 | public static float Boost(this byte[] bytes) { return GetSingle(bytes, 272 + BufferOffset); } 81 | public static float Fuel(this byte[] bytes) { return GetSingle(bytes, 276 + BufferOffset); } 82 | public static float Distance(this byte[] bytes) { return GetSingle(bytes, 280 + BufferOffset); } 83 | public static float BestLapTime(this byte[] bytes) { return GetSingle(bytes, 284 + BufferOffset); } 84 | public static float LastLapTime(this byte[] bytes) { return GetSingle(bytes, 288 + BufferOffset); } 85 | public static float CurrentLapTime(this byte[] bytes) { return GetSingle(bytes, 292 + BufferOffset); } 86 | public static float CurrentRaceTime(this byte[] bytes) { return GetSingle(bytes, 296 + BufferOffset); } 87 | public static uint Lap(this byte[] bytes) { return GetUInt16(bytes, 300 + BufferOffset); } 88 | public static uint RacePosition(this byte[] bytes) { return GetUInt8(bytes, 302 + BufferOffset); } 89 | public static uint Accelerator(this byte[] bytes) { return GetUInt8(bytes, 303 + BufferOffset); } 90 | public static uint Brake(this byte[] bytes) { return GetUInt8(bytes, 304 + BufferOffset); } 91 | public static uint Clutch(this byte[] bytes) { return GetUInt8(bytes, 305 + BufferOffset); } 92 | public static uint Handbrake(this byte[] bytes) { return GetUInt8(bytes, 306 + BufferOffset); } 93 | public static uint Gear(this byte[] bytes) { return GetUInt8(bytes, 307 + BufferOffset); } 94 | public static int Steer(this byte[] bytes) { return GetInt8(bytes, 308 + BufferOffset); } 95 | public static uint NormalDrivingLine(this byte[] bytes) { return GetUInt8(bytes, 309 + BufferOffset); } 96 | public static uint NormalAiBrakeDifference(this byte[] bytes) { return GetUInt8(bytes, 310 + BufferOffset); } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /GameParsers/DirtParser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace RacingDSX.GameParsers 8 | { 9 | internal class DirtParser : Parser 10 | { 11 | public DirtParser(Config.Config settings) : base(settings) 12 | { 13 | } 14 | 15 | public override void ParsePacket(byte[] packet) 16 | { 17 | data = new DataPacket(); 18 | //data.AccelerationX 19 | 20 | data.IsRaceOn = true; 21 | data.Power = 1; 22 | data.CurrentEngineRpm = PacketParse.GetSingle(packet, 148) * 10.0f; 23 | data.Speed = PacketParse.GetSingle(packet, 28); 24 | data.frontLeftContactPatchV = PacketParse.GetSingle(packet, 108); 25 | data.TireCombinedSlipFrontLeft = calcTireSlip(PacketParse.GetSingle(packet, 108), data.Speed); 26 | data.TireCombinedSlipFrontRight = calcTireSlip(PacketParse.GetSingle(packet, 112), data.Speed); 27 | data.TireCombinedSlipRearLeft = calcTireSlip(PacketParse.GetSingle(packet, 100), data.Speed); 28 | data.TireCombinedSlipRearRight = calcTireSlip(PacketParse.GetSingle(packet, 104), data.Speed); 29 | 30 | 31 | data.CarClass = 0; 32 | 33 | data.CarPerformanceIndex = 0; 34 | 35 | data.AccelerationX = PacketParse.GetSingle(packet, 136); 36 | 37 | data.AccelerationZ = PacketParse.GetSingle(packet, 140); 38 | 39 | data.Accelerator = (uint)(PacketParse.GetSingle(packet, 116) * 255.0f); 40 | 41 | data.Brake = (uint)(PacketParse.GetSingle(packet, 120) * 255.0f); 42 | 43 | data.EngineMaxRpm = PacketParse.GetSingle(packet, 252) * 10.0f; 44 | data.EngineIdleRpm = 0; 45 | data.FourWheelCombinedTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight) + Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 4; 46 | data.FrontWheelsCombinedTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight)) / 2; 47 | data.RearWheelsCombinedTireSlip = (Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 2; 48 | } 49 | static float calcTireSlip(float contactPatchSpeed, float vehicleSpeed) 50 | { 51 | if (Math.Abs(vehicleSpeed) < 0.1f) 52 | { 53 | return 0; 54 | } 55 | return 3.0f * (Math.Abs(Math.Abs(contactPatchSpeed) - vehicleSpeed) / vehicleSpeed); 56 | } 57 | 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /GameParsers/ForzaParser.cs: -------------------------------------------------------------------------------- 1 | using RacingDSX.Config; 2 | using RacingDSX.Properties; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using static RacingDSX.RacingDSXWorker; 9 | 10 | namespace RacingDSX.GameParsers 11 | { 12 | internal class ForzaParser : Parser 13 | { 14 | // Colors for Light Bar while in menus -> using car's PI colors from Forza 15 | public static readonly uint CarClassD = 0; 16 | public static readonly int[] ColorClassD = { 107, 185, 236 }; 17 | public static readonly uint CarClassC = 1; 18 | public static readonly int[] ColorClassC = { 234, 202, 49 }; 19 | public static readonly uint CarClassB = 2; 20 | public static readonly int[] ColorClassB = { 211, 90, 37 }; 21 | public static readonly uint CarClassA = 3; 22 | public static readonly int[] ColorClassA = { 187, 59, 34 }; 23 | public static readonly uint CarClassS1 = 4; 24 | public static readonly int[] ColorClassS1 = { 128, 54, 243 }; 25 | public static readonly uint CarClassS2 = 5; 26 | public static readonly int[] ColorClassS2 = { 75, 88, 229 }; 27 | public static readonly int[] ColorClassX = { 105, 182, 72 }; 28 | public ForzaParser(Config.Config settings) : base(settings) 29 | { 30 | } 31 | 32 | public override bool IsRaceOn() 33 | { 34 | bool bInRace = data.IsRaceOn; 35 | float currentRPM = data.CurrentEngineRpm; 36 | 37 | if (currentRPM == LastEngineRPM 38 | && data.Power <= 0) 39 | { 40 | LastRPMAccumulator++; 41 | if (LastRPMAccumulator > RPMAccumulatorTriggerRaceOff) 42 | { 43 | bInRace = false; 44 | } 45 | } 46 | else 47 | { 48 | LastRPMAccumulator = 0; 49 | } 50 | 51 | LastEngineRPM = currentRPM; 52 | return bInRace; 53 | } 54 | 55 | public override ReportableInstruction GetPreRaceInstructions() 56 | { 57 | ReportableInstruction reportableInstruction = new ReportableInstruction(); 58 | 59 | uint currentClass = LastValidCarClass; 60 | if (data.CarClass > 0) 61 | { 62 | LastValidCarClass = currentClass = data.CarClass; 63 | } 64 | 65 | int currentCPI = LastValidCarCPI; 66 | if (data.CarPerformanceIndex > 0) 67 | { 68 | LastValidCarCPI = currentCPI = Math.Min((int)data.CarPerformanceIndex, 255); 69 | } 70 | 71 | 72 | RightTrigger.Parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Normal, 0, 0 }; 73 | LeftTrigger.Parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Normal, 0, 0 }; 74 | 75 | #region Light Bar color 76 | int CPIcolorR = 255; 77 | int CPIcolorG = 255; 78 | int CPIcolorB = 255; 79 | 80 | float cpiRatio = currentCPI / MaxCPI; 81 | 82 | if (currentClass <= CarClassD) 83 | { 84 | CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassD[0]); 85 | CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassD[1]); 86 | CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassD[2]); 87 | } 88 | else if (currentClass <= CarClassC) 89 | { 90 | CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassC[0]); 91 | CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassC[1]); 92 | CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassC[2]); 93 | } 94 | else if (currentClass <= CarClassB) 95 | { 96 | CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassB[0]); 97 | CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassB[1]); 98 | CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassB[2]); 99 | } 100 | else if (currentClass <= CarClassA) 101 | { 102 | CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassA[0]); 103 | CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassA[1]); 104 | CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassA[2]); 105 | } 106 | else if (currentClass <= CarClassS1) 107 | { 108 | CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassS1[0]); 109 | CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassS1[1]); 110 | CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassS1[2]); 111 | } 112 | else if (currentClass <= CarClassS2) 113 | { 114 | CPIcolorR = (int)Math.Floor(cpiRatio * ColorClassS2[0]); 115 | CPIcolorG = (int)Math.Floor(cpiRatio * ColorClassS2[1]); 116 | CPIcolorB = (int)Math.Floor(cpiRatio * ColorClassS2[2]); 117 | } 118 | else 119 | { 120 | CPIcolorR = ColorClassX[0]; 121 | CPIcolorG = ColorClassX[1]; 122 | CPIcolorB = ColorClassX[2]; 123 | } 124 | 125 | LightBar.Parameters = new object[] { controllerIndex, CPIcolorR, CPIcolorG, CPIcolorB }; 126 | #endregion 127 | 128 | 129 | reportableInstruction.RacingDSXReportStructs.Add(new RacingDSXReportStruct(VerboseLevel.Limited, RacingDSXReportStruct.ReportType.NORACE, $"No race going on. Normal Triggers. Car's Class = {currentClass}; CPI = {currentCPI}; CPI Ratio = {cpiRatio}; Color [{CPIcolorR}, {CPIcolorG}, {CPIcolorB}]")); 130 | 131 | 132 | reportableInstruction.Instructions = new Instruction[] { LightBar, LeftTrigger, RightTrigger }; 133 | return reportableInstruction; 134 | } 135 | 136 | 137 | public override void ParsePacket(byte[] packet) 138 | { 139 | data = new DataPacket(); 140 | 141 | 142 | 143 | // sled 144 | data.IsRaceOn = packet.IsRaceOn(); 145 | data.EngineMaxRpm = packet.EngineMaxRpm(); 146 | data.EngineIdleRpm = packet.EngineIdleRpm(); 147 | data.CurrentEngineRpm = packet.CurrentEngineRpm(); 148 | data.AccelerationX = packet.AccelerationX(); 149 | data.AccelerationZ = packet.AccelerationZ(); 150 | 151 | data.TireCombinedSlipFrontLeft = packet.TireCombinedSlipFl(); 152 | data.TireCombinedSlipFrontRight = packet.TireCombinedSlipFr(); 153 | data.TireCombinedSlipRearLeft = packet.TireCombinedSlipRl(); 154 | data.TireCombinedSlipRearRight = packet.TireCombinedSlipRr(); 155 | 156 | data.CarClass = packet.CarClass(); 157 | data.CarPerformanceIndex = packet.CarPerformanceIndex(); 158 | 159 | data.Speed = packet.Speed(); 160 | data.Power = packet.Power(); 161 | 162 | data.Accelerator = packet.Accelerator(); 163 | data.Brake = packet.Brake(); 164 | 165 | 166 | data.FourWheelCombinedTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight) + Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 4; 167 | data.FrontWheelsCombinedTireSlip = (Math.Abs(data.TireCombinedSlipFrontLeft) + Math.Abs(data.TireCombinedSlipFrontRight)) / 2; 168 | data.RearWheelsCombinedTireSlip = (Math.Abs(data.TireCombinedSlipRearLeft) + Math.Abs(data.TireCombinedSlipRearRight)) / 2; 169 | 170 | 171 | /* data.TimestampMS = packet.TimestampMs(); 172 | data.AccelerationY = packet.AccelerationY(); 173 | 174 | data.SuspensionTravelMetersFrontLeft = packet.SuspensionTravelMetersFl(); 175 | data.SuspensionTravelMetersFrontRight = packet.SuspensionTravelMetersFr(); 176 | data.SuspensionTravelMetersRearLeft = packet.SuspensionTravelMetersRl(); 177 | data.SuspensionTravelMetersRearRight = packet.SuspensionTravelMetersRr(); 178 | data.CarOrdinal = packet.CarOrdinal(); 179 | data.DrivetrainType = packet.DriveTrain(); 180 | data.NumCylinders = packet.NumCylinders(); 181 | 182 | // dash 183 | data.PositionX = packet.PositionX(); 184 | data.PositionY = packet.PositionY(); 185 | data.PositionZ = packet.PositionZ(); 186 | data.Torque = packet.Torque(); 187 | data.TireTempFl = packet.TireTempFl(); 188 | data.TireTempFr = packet.TireTempFr(); 189 | data.TireTempRl = packet.TireTempRl(); 190 | data.TireTempRr = packet.TireTempRr(); 191 | data.Boost = packet.Boost(); 192 | data.Fuel = packet.Fuel(); 193 | data.Distance = packet.Distance(); 194 | data.BestLapTime = packet.BestLapTime(); 195 | data.LastLapTime = packet.LastLapTime(); 196 | data.CurrentLapTime = packet.CurrentLapTime(); 197 | data.CurrentRaceTime = packet.CurrentRaceTime(); 198 | data.Lap = packet.Lap(); 199 | data.RacePosition = packet.RacePosition(); 200 | data.Clutch = packet.Clutch(); 201 | data.Handbrake = packet.Handbrake(); 202 | data.Gear = packet.Gear(); 203 | data.Steer = packet.Steer(); 204 | data.NormalDrivingLine = packet.NormalDrivingLine(); 205 | data.NormalAiBrakeDifference = packet.NormalAiBrakeDifference(); 206 | data.VelocityX = packet.VelocityX(); 207 | data.VelocityY = packet.VelocityY(); 208 | data.VelocityZ = packet.VelocityZ(); 209 | data.AngularVelocityX = packet.AngularVelocityX(); 210 | data.AngularVelocityY = packet.AngularVelocityY(); 211 | data.AngularVelocityZ = packet.AngularVelocityZ(); 212 | data.Yaw = packet.Yaw(); 213 | data.Pitch = packet.Pitch(); 214 | data.Roll = packet.Roll(); 215 | data.NormalizedSuspensionTravelFrontLeft = packet.NormSuspensionTravelFl(); 216 | data.NormalizedSuspensionTravelFrontRight = packet.NormSuspensionTravelFr(); 217 | data.NormalizedSuspensionTravelRearLeft = packet.NormSuspensionTravelRl(); 218 | data.NormalizedSuspensionTravelRearRight = packet.NormSuspensionTravelRr(); 219 | data.TireSlipRatioFrontLeft = packet.TireSlipRatioFl(); 220 | data.TireSlipRatioFrontRight = packet.TireSlipRatioFr(); 221 | data.TireSlipRatioRearLeft = packet.TireSlipRatioRl(); 222 | data.TireSlipRatioRearRight = packet.TireSlipRatioRr(); 223 | data.WheelRotationSpeedFrontLeft = packet.WheelRotationSpeedFl(); 224 | data.WheelRotationSpeedFrontRight = packet.WheelRotationSpeedFr(); 225 | data.WheelRotationSpeedRearLeft = packet.WheelRotationSpeedRl(); 226 | data.WheelRotationSpeedRearRight = packet.WheelRotationSpeedRr(); 227 | data.WheelOnRumbleStripFrontLeft = packet.WheelOnRumbleStripFl(); 228 | data.WheelOnRumbleStripFrontRight = packet.WheelOnRumbleStripFr(); 229 | data.WheelOnRumbleStripRearLeft = packet.WheelOnRumbleStripRl(); 230 | data.WheelOnRumbleStripRearRight = packet.WheelOnRumbleStripRr(); 231 | data.WheelInPuddleDepthFrontLeft = packet.WheelInPuddleFl(); 232 | data.WheelInPuddleDepthFrontRight = packet.WheelInPuddleFr(); 233 | data.WheelInPuddleDepthRearLeft = packet.WheelInPuddleRl(); 234 | data.WheelInPuddleDepthRearRight = packet.WheelInPuddleRr(); 235 | data.SurfaceRumbleFrontLeft = packet.SurfaceRumbleFl(); 236 | data.SurfaceRumbleFrontRight = packet.SurfaceRumbleFr(); 237 | data.SurfaceRumbleRearLeft = packet.SurfaceRumbleRl(); 238 | data.SurfaceRumbleRearRight = packet.SurfaceRumbleRr(); 239 | data.TireSlipAngleFrontLeft = packet.TireSlipAngleFl(); 240 | data.TireSlipAngleFrontRight = packet.TireSlipAngleFr(); 241 | data.TireSlipAngleRearLeft = packet.TireSlipAngleRl(); 242 | data.TireSlipAngleRearRight = packet.TireSlipAngleRr(); 243 | return data; 244 | throw new NotImplementedException();*/ 245 | } 246 | } 247 | } 248 | -------------------------------------------------------------------------------- /GameParsers/GameTypes.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace RacingDSX.GameParsers 8 | { 9 | public enum GameTypes 10 | { 11 | None = 0, 12 | Forza, 13 | Dirt 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /GameParsers/NullParser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace RacingDSX.GameParsers 8 | { 9 | internal class NullParser : Parser 10 | { 11 | public NullParser(Config.Config settings) : base(settings) 12 | { 13 | } 14 | 15 | public override void ParsePacket(byte[] packet) 16 | { 17 | data = new DataPacket(); 18 | //data.AccelerationX 19 | 20 | data.IsRaceOn = true; 21 | data.Power = 1; 22 | data.CurrentEngineRpm = 0; 23 | data.Speed = 0; 24 | data.TireCombinedSlipFrontLeft = 0; 25 | data.TireCombinedSlipFrontRight = 0; 26 | data.TireCombinedSlipRearLeft = 0; 27 | data.TireCombinedSlipRearRight = 0; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /GameParsers/Parser.cs: -------------------------------------------------------------------------------- 1 | using RacingDSX.Config; 2 | using RacingDSX.Properties; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using static RacingDSX.RacingDSXWorker; 9 | using static System.Runtime.InteropServices.JavaScript.JSType; 10 | 11 | namespace RacingDSX.GameParsers 12 | { 13 | public abstract class Parser 14 | { 15 | // Packet p = new Packet(); 16 | protected Instruction RightTrigger = new Instruction(InstructionType.TriggerUpdate); 17 | protected Instruction LeftTrigger = new Instruction(InstructionType.TriggerUpdate); 18 | protected Instruction LightBar = new Instruction(InstructionType.RGBUpdate); 19 | protected int controllerIndex = 0; 20 | protected DataPacket data; 21 | protected RacingDSX.Config.Config settings; 22 | protected RacingDSX.Config.Profile activeProfile; 23 | 24 | 25 | protected int lastThrottleResistance = 1; 26 | protected int lastThrottleFreq = 0; 27 | protected int lastBrakeResistance = 200; 28 | protected int lastBrakeFreq = 0; 29 | 30 | protected uint LastValidCarClass = 0; 31 | protected int LastValidCarCPI = 0; 32 | protected float MaxCPI = 255; 33 | 34 | protected float LastEngineRPM = 0; 35 | // FH does not always correctly set IsRaceOn, so we must also check if the RPM info is the same for a certain ammount of time 36 | protected uint LastRPMAccumulator = 0; 37 | protected uint RPMAccumulatorTriggerRaceOff = 200; 38 | 39 | 40 | protected Parser(RacingDSX.Config.Config settings) { 41 | this.settings = settings; 42 | activeProfile = settings.ActiveProfile; 43 | } 44 | public virtual bool IsRaceOn() 45 | { 46 | return true; 47 | } 48 | 49 | public virtual ReportableInstruction GetPreRaceInstructions() 50 | { 51 | ReportableInstruction p = new ReportableInstruction(); 52 | RightTrigger.Parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Normal, 0, 0 }; 53 | LeftTrigger.Parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Normal, 0, 0 }; 54 | LightBar.Parameters = new object[] { controllerIndex, 220, 120, 220}; 55 | p.Instructions = new Instruction[] { LightBar, LeftTrigger, RightTrigger }; 56 | 57 | return p; 58 | } 59 | 60 | public virtual ReportableInstruction GetInRaceLightbarInstruction() 61 | { 62 | ReportableInstruction reportableInstruction = new ReportableInstruction(); 63 | 64 | // Calculate RPM ratio 65 | float engineRange = data.EngineMaxRpm - data.EngineIdleRpm; 66 | float CurrentRPMRatio = (data.CurrentEngineRpm - data.EngineIdleRpm) / engineRange; 67 | 68 | // Calculate color based on RPM 69 | int RedChannel = (int)Math.Floor(CurrentRPMRatio * 255); 70 | int GreenChannel = Math.Max((int)Math.Floor((1 - CurrentRPMRatio) * 255), 50); 71 | int BlueChannel = 0; 72 | int Brightness = 255; 73 | 74 | // Check for redline 75 | if (CurrentRPMRatio >= activeProfile.RPMRedlineRatio) 76 | { 77 | RedChannel = 255; 78 | GreenChannel = 0; 79 | BlueChannel = 0; 80 | } 81 | 82 | // Set LightBar instruction 83 | LightBar.Parameters = new object[] { controllerIndex, RedChannel, GreenChannel, BlueChannel, Brightness }; 84 | 85 | // Add report for verbose output 86 | reportableInstruction.RacingDSXReportStructs.Add(new RacingDSXReportStruct( 87 | VerboseLevel.Full, 88 | $"Engine RPM: {data.CurrentEngineRpm}; Engine Max RPM: {data.EngineMaxRpm}; Engine Idle RPM: {data.EngineIdleRpm}; " + 89 | $"RPM Ratio: {CurrentRPMRatio:F2}; Light Color: R{RedChannel} G{GreenChannel} B{BlueChannel}" 90 | )); 91 | 92 | // Set instructions 93 | reportableInstruction.Instructions = new Instruction[] { LightBar }; 94 | 95 | return reportableInstruction; 96 | } 97 | public virtual ReportableInstruction GetInRaceLeftTriggerInstruction() 98 | { 99 | ReportableInstruction reportableInstruction = new ReportableInstruction(); 100 | 101 | int resistance = 0; 102 | int filteredResistance = 0; 103 | float avgAccel = 0; 104 | int freq = 0; 105 | int filteredFreq = 0; 106 | //Update the left(Brake) trigger 107 | BrakeSettings brakeSettings = activeProfile.brakeSettings; 108 | // Define losing grip as tires slipping while braking a fair ammount 109 | bool bLosingBrakeGrip = data.FourWheelCombinedTireSlip > brakeSettings.GripLossValue && data.Brake > 100; 110 | 111 | if (brakeSettings.TriggerMode == Config.TriggerMode.Off) 112 | { 113 | LeftTrigger.Parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Normal, 0, 0 }; 114 | } 115 | // If losing grip, start to "vibrate" 116 | else if (bLosingBrakeGrip && brakeSettings.TriggerMode == Config.TriggerMode.Vibration) 117 | { 118 | freq = (int)Math.Floor(Map(data.FourWheelCombinedTireSlip, brakeSettings.GripLossValue, 5, 0, brakeSettings.MaxVibration)); 119 | resistance = (int)Math.Floor(Map(data.Brake, 0, 255, brakeSettings.MaxStiffness, brakeSettings.MinStiffness)); 120 | filteredResistance = (int)EWMA(resistance, lastBrakeResistance, brakeSettings.ResistanceSmoothing); 121 | filteredFreq = (int)EWMA(freq, lastBrakeFreq, brakeSettings.VibrationSmoothing); 122 | 123 | lastBrakeResistance = filteredResistance; 124 | lastBrakeFreq = filteredFreq; 125 | 126 | if (filteredFreq <= brakeSettings.MinVibration) 127 | { 128 | LeftTrigger.Parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Resistance, 0, 0 }; 129 | } 130 | else 131 | { 132 | LeftTrigger.Parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, 133 | filteredFreq *brakeSettings.EffectIntensity, filteredResistance * brakeSettings.EffectIntensity, brakeSettings.VibrationStart, 0, 0, 0, 0 }; 134 | } 135 | //Set left trigger to the custom mode VibrateResitance with values of Frequency = freq, Stiffness = 104, startPostion = 76. 136 | reportableInstruction.RacingDSXReportStructs.Add(new RacingDSXReportStruct(VerboseLevel.Limited, RacingDSXReportStruct.ReportType.RACING, RacingDSXReportStruct.RacingReportType.BRAKE_VIBRATION, $"Setting Brake to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}")); 137 | 138 | } 139 | else 140 | { 141 | //By default, Increasingly resistant to force 142 | resistance = (int)Math.Floor(Map(data.Brake, 0, 255, brakeSettings.MinResistance, brakeSettings.MaxResistance)); 143 | filteredResistance = (int)EWMA(resistance, lastBrakeResistance, brakeSettings.ResistanceSmoothing); 144 | lastBrakeResistance = filteredResistance; 145 | 146 | LeftTrigger.Parameters = new object[] { controllerIndex, Trigger.Left, TriggerMode.Resistance, 0, filteredResistance * brakeSettings.EffectIntensity }; 147 | 148 | reportableInstruction.RacingDSXReportStructs.Add(new RacingDSXReportStruct(VerboseLevel.Limited, RacingDSXReportStruct.ReportType.RACING, RacingDSXReportStruct.RacingReportType.BRAKE_VIBRATION, "")); 149 | 150 | } 151 | 152 | 153 | reportableInstruction.RacingDSXReportStructs.Add(new RacingDSXReportStruct(VerboseLevel.Limited, RacingDSXReportStruct.ReportType.RACING, RacingDSXReportStruct.RacingReportType.BRAKE, $"Brake: {data.Brake}\r\n Brake Resistance: {filteredResistance}\r\n Tire Slip: {data.FourWheelCombinedTireSlip} \r\n FLCPS: {data.frontLeftContactPatchV} \r\n speed: {data.Speed}")); 154 | 155 | reportableInstruction.Instructions = new Instruction[] { LeftTrigger }; 156 | return reportableInstruction; 157 | 158 | } 159 | public virtual ReportableInstruction GetInRaceRightTriggerInstruction() 160 | { 161 | 162 | ReportableInstruction reportableInstruction = new ReportableInstruction(); 163 | int resistance = 0; 164 | int filteredResistance = 0; 165 | float avgAccel = 0; 166 | int freq = 0; 167 | int filteredFreq = 0; 168 | 169 | //Set the updates for the right Trigger(Throttle) 170 | ThrottleSettings throttleSettings = activeProfile.throttleSettings; 171 | avgAccel = (float)Math.Sqrt((throttleSettings.TurnAccelerationScale * (data.AccelerationX * data.AccelerationX)) + (throttleSettings.ForwardAccelerationScale * (data.AccelerationZ * data.AccelerationZ))); 172 | 173 | // Define losing grip as front tires slipping or rear tires slipping while accelerating a fair ammount 174 | bool bLosingAccelGrip = 175 | data.FrontWheelsCombinedTireSlip > throttleSettings.GripLossValue 176 | || (data.RearWheelsCombinedTireSlip > throttleSettings.GripLossValue && data.Accelerator > 200); 177 | 178 | if (throttleSettings.TriggerMode == Config.TriggerMode.Off) 179 | { 180 | RightTrigger.Parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Normal, 0, 0 }; 181 | } 182 | // If losing grip, start to "vibrate" 183 | else if (bLosingAccelGrip && throttleSettings.TriggerMode == Config.TriggerMode.Vibration) 184 | { 185 | freq = (int)Math.Floor(Map(data.FourWheelCombinedTireSlip, throttleSettings.GripLossValue, 5, 0, throttleSettings.MaxVibration)); 186 | resistance = (int)Math.Floor(Map(avgAccel, 0, throttleSettings.AccelerationLimit, throttleSettings.MinStiffness, throttleSettings.MaxStiffness)); 187 | filteredResistance = (int)EWMA(resistance, lastThrottleResistance, throttleSettings.ResistanceSmoothing); 188 | filteredFreq = (int)EWMA(freq, lastThrottleFreq, throttleSettings.VibrationSmoothing); 189 | 190 | lastThrottleResistance = filteredResistance; 191 | lastThrottleFreq = filteredFreq; 192 | 193 | if (filteredFreq <= throttleSettings.MinVibration 194 | || data.Accelerator <= throttleSettings.VibrationModeStart) 195 | { 196 | RightTrigger.Parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * throttleSettings.EffectIntensity }; 197 | 198 | filteredFreq = 0; 199 | filteredResistance = 0; 200 | } 201 | else 202 | { 203 | RightTrigger.Parameters = new object[] { 204 | controllerIndex, Trigger.Right, TriggerMode.CustomTriggerValue, CustomTriggerValueMode.VibrateResistance, 205 | filteredFreq * throttleSettings.EffectIntensity, filteredResistance * throttleSettings.EffectIntensity,throttleSettings.VibrationModeStart, 0, 0, 0, 0 }; 206 | } 207 | 208 | reportableInstruction.RacingDSXReportStructs.Add(new RacingDSXReportStruct(VerboseLevel.Limited, RacingDSXReportStruct.ReportType.RACING, RacingDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, $"Setting Throttle to vibration mode with freq: {filteredFreq}\r\n Resistance: {filteredResistance}")); 209 | 210 | } 211 | else 212 | { 213 | //It should probably always be uniformly stiff 214 | resistance = (int)Math.Floor(Map(avgAccel, 0, throttleSettings.AccelerationLimit, throttleSettings.MinResistance, throttleSettings.MaxResistance)); 215 | filteredResistance = (int)EWMA(resistance, lastThrottleResistance, throttleSettings.ResistanceSmoothing); 216 | 217 | lastThrottleResistance = filteredResistance; 218 | RightTrigger.Parameters = new object[] { controllerIndex, Trigger.Right, TriggerMode.Resistance, 0, filteredResistance * throttleSettings.EffectIntensity }; 219 | 220 | reportableInstruction.RacingDSXReportStructs.Add(new RacingDSXReportStruct(VerboseLevel.Limited, RacingDSXReportStruct.ReportType.RACING, RacingDSXReportStruct.RacingReportType.THROTTLE_VIBRATION, "")); 221 | 222 | } 223 | reportableInstruction.RacingDSXReportStructs.Add(new RacingDSXReportStruct(VerboseLevel.Limited, RacingDSXReportStruct.ReportType.RACING, RacingDSXReportStruct.RacingReportType.THROTTLE, $"Average Acceleration: {avgAccel}\r\n Throttle Resistance: {filteredResistance}\r\n Accelerator: {data.Accelerator}")); 224 | 225 | 226 | reportableInstruction.Instructions = new Instruction[] { RightTrigger }; 227 | 228 | return reportableInstruction; 229 | } 230 | 231 | public float Map(float x, float in_min, float in_max, float out_min, float out_max) 232 | { 233 | if (x > in_max) 234 | { 235 | x = in_max; 236 | } 237 | else if (x < in_min) 238 | { 239 | x = in_min; 240 | } 241 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; 242 | } 243 | 244 | static float EWMA(float input, float last, float alpha) 245 | { 246 | return (alpha * input) + (1 - alpha) * last; 247 | } 248 | static int EWMA(int input, int last, float alpha) 249 | { 250 | return (int)Math.Floor(EWMA((float)input, (float)last, alpha)); 251 | } 252 | 253 | public abstract void ParsePacket(byte[] packet); 254 | 255 | } 256 | } 257 | -------------------------------------------------------------------------------- /GameParsers/ReportableInstruction.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace RacingDSX.GameParsers 8 | { 9 | public class ReportableInstruction 10 | { 11 | public Instruction[] Instructions { get; set; } 12 | public List RacingDSXReportStructs { get; set; } = new List(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /NameForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace RacingDSX 2 | { 3 | partial class NameForm 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); 32 | OkButton = new System.Windows.Forms.Button(); 33 | CancelButton = new System.Windows.Forms.Button(); 34 | flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel(); 35 | label1 = new System.Windows.Forms.Label(); 36 | NameTextBox = new System.Windows.Forms.TextBox(); 37 | flowLayoutPanel1.SuspendLayout(); 38 | flowLayoutPanel2.SuspendLayout(); 39 | SuspendLayout(); 40 | // 41 | // flowLayoutPanel1 42 | // 43 | flowLayoutPanel1.Controls.Add(OkButton); 44 | flowLayoutPanel1.Controls.Add(CancelButton); 45 | flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom; 46 | flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; 47 | flowLayoutPanel1.Location = new System.Drawing.Point(0, 52); 48 | flowLayoutPanel1.Name = "flowLayoutPanel1"; 49 | flowLayoutPanel1.Size = new System.Drawing.Size(800, 50); 50 | flowLayoutPanel1.TabIndex = 0; 51 | // 52 | // OkButton 53 | // 54 | OkButton.DialogResult = System.Windows.Forms.DialogResult.OK; 55 | OkButton.Location = new System.Drawing.Point(685, 3); 56 | OkButton.Name = "OkButton"; 57 | OkButton.Size = new System.Drawing.Size(112, 34); 58 | OkButton.TabIndex = 0; 59 | OkButton.Text = "OK"; 60 | OkButton.UseVisualStyleBackColor = true; 61 | OkButton.Click += OkButton_Click; 62 | // 63 | // CancelButton 64 | // 65 | CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; 66 | CancelButton.Location = new System.Drawing.Point(567, 3); 67 | CancelButton.Name = "CancelButton"; 68 | CancelButton.Size = new System.Drawing.Size(112, 34); 69 | CancelButton.TabIndex = 1; 70 | CancelButton.Text = "Cancel"; 71 | CancelButton.UseVisualStyleBackColor = true; 72 | // 73 | // flowLayoutPanel2 74 | // 75 | flowLayoutPanel2.Controls.Add(label1); 76 | flowLayoutPanel2.Controls.Add(NameTextBox); 77 | flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; 78 | flowLayoutPanel2.Location = new System.Drawing.Point(0, 0); 79 | flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(20); 80 | flowLayoutPanel2.Name = "flowLayoutPanel2"; 81 | flowLayoutPanel2.Padding = new System.Windows.Forms.Padding(5); 82 | flowLayoutPanel2.Size = new System.Drawing.Size(800, 52); 83 | flowLayoutPanel2.TabIndex = 1; 84 | // 85 | // label1 86 | // 87 | label1.AutoSize = true; 88 | label1.Location = new System.Drawing.Point(8, 5); 89 | label1.Name = "label1"; 90 | label1.Size = new System.Drawing.Size(68, 25); 91 | label1.TabIndex = 0; 92 | label1.Text = "Name: "; 93 | // 94 | // NameTextBox 95 | // 96 | NameTextBox.Dock = System.Windows.Forms.DockStyle.Fill; 97 | NameTextBox.Location = new System.Drawing.Point(82, 8); 98 | NameTextBox.Name = "NameTextBox"; 99 | NameTextBox.Size = new System.Drawing.Size(684, 31); 100 | NameTextBox.TabIndex = 1; 101 | // 102 | // NameForm 103 | // 104 | AcceptButton = OkButton; 105 | AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); 106 | AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 107 | ClientSize = new System.Drawing.Size(800, 102); 108 | Controls.Add(flowLayoutPanel2); 109 | Controls.Add(flowLayoutPanel1); 110 | FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 111 | Name = "NameForm"; 112 | StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 113 | Text = "Please Enter the Profile Name:"; 114 | TopMost = true; 115 | Load += NameForm_Load; 116 | flowLayoutPanel1.ResumeLayout(false); 117 | flowLayoutPanel2.ResumeLayout(false); 118 | flowLayoutPanel2.PerformLayout(); 119 | ResumeLayout(false); 120 | } 121 | 122 | #endregion 123 | 124 | private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; 125 | private System.Windows.Forms.Button OkButton; 126 | private System.Windows.Forms.Button CancelButton; 127 | private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2; 128 | private System.Windows.Forms.Label label1; 129 | private System.Windows.Forms.TextBox NameTextBox; 130 | } 131 | } -------------------------------------------------------------------------------- /NameForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | 11 | namespace RacingDSX 12 | { 13 | public partial class NameForm : Form 14 | { 15 | 16 | public static string ShowDialog(string name, String title = "Please enter the Name") 17 | { 18 | NameForm form = new NameForm(name, title); 19 | return form.ShowDialog() == DialogResult.OK ? form.NameTextBox.Text : name; 20 | } 21 | 22 | public NameForm(String name, String title) 23 | { 24 | InitializeComponent(); 25 | this.Text = title; 26 | NameTextBox.Text = name; 27 | NameTextBox.Focus(); 28 | 29 | } 30 | 31 | private void OkButton_Click(object sender, EventArgs e) 32 | { 33 | 34 | } 35 | 36 | private void NameForm_Load(object sender, EventArgs e) 37 | { 38 | 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /NameForm.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /PacketParse.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace RacingDSX 4 | { 5 | public static class PacketParse 6 | { 7 | private const int SLED_PACKET_LENGTH = 232; // FM7 8 | private const int DASH_PACKET_LENGTH = 311; // FM7 9 | private const int FH7_PACKET_LENGTH = 324; // FH4 10 | 11 | public static bool IsSledFormat(byte[] packet) 12 | { 13 | return packet.Length == SLED_PACKET_LENGTH; 14 | } 15 | 16 | public static bool IsDashFormat(byte[] packet) 17 | { 18 | return packet.Length == DASH_PACKET_LENGTH; 19 | } 20 | 21 | public static bool IsFH7Format(byte[] packet) 22 | { 23 | return packet.Length == FH7_PACKET_LENGTH; 24 | } 25 | 26 | internal static float GetSingle(byte[] bytes, int index) 27 | { 28 | ByteCheck(bytes, index, 4); 29 | return BitConverter.ToSingle(bytes, index); 30 | } 31 | 32 | internal static uint GetUInt16(byte[] bytes, int index) 33 | { 34 | ByteCheck(bytes, index, 2); 35 | return BitConverter.ToUInt16(bytes, index); 36 | } 37 | 38 | internal static uint GetUInt32(byte[] bytes, int index) 39 | { 40 | ByteCheck(bytes, index, 4); 41 | return BitConverter.ToUInt32(bytes, index); 42 | } 43 | 44 | internal static uint GetUInt8(byte[] bytes, int index) 45 | { 46 | ByteCheck(bytes, index, 1); 47 | return bytes[index]; 48 | } 49 | 50 | internal static int GetInt8(byte[] bytes, int index) 51 | { 52 | ByteCheck(bytes, index, 1); 53 | return Convert.ToInt16((sbyte)bytes[index]); 54 | } 55 | 56 | private static void ByteCheck(byte[] bytes, int index, int byteCount) 57 | { 58 | if (index + byteCount <= bytes.Length) 59 | { 60 | return; 61 | } 62 | 63 | throw new ArgumentException("Not enough bytes in this array"); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Net; 4 | using System.Text.Json; 5 | using System.Text.Json.Serialization; 6 | using System.Windows.Forms; 7 | 8 | namespace RacingDSX 9 | { 10 | public class Program 11 | { 12 | public const String VERSION = "0.6.7"; 13 | 14 | [STAThread] 15 | static void Main(string[] args) 16 | { 17 | for (int i = 0; i < args.Length; i++) 18 | { 19 | string arg = args[i]; 20 | 21 | switch (arg) 22 | { 23 | case "-v": 24 | { 25 | return; 26 | } 27 | default: 28 | { 29 | break; 30 | } 31 | } 32 | } 33 | 34 | Application.EnableVisualStyles(); 35 | Application.SetCompatibleTextRenderingDefault(false); 36 | Application.Run(new UI()); 37 | } 38 | } 39 | 40 | public class ParametersConverter : JsonConverter 41 | { 42 | public override object[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) 43 | { 44 | if (reader.TokenType != JsonTokenType.StartArray) 45 | { 46 | throw new JsonException("Expected start of array"); 47 | } 48 | 49 | var parameters = new List(); 50 | reader.Read(); // Move past StartArray 51 | 52 | while (reader.TokenType != JsonTokenType.EndArray) 53 | { 54 | switch (reader.TokenType) 55 | { 56 | case JsonTokenType.Number: 57 | if (reader.TryGetInt32(out int intValue)) 58 | parameters.Add(intValue); 59 | else if (reader.TryGetDouble(out double doubleValue)) 60 | parameters.Add(doubleValue); 61 | break; 62 | case JsonTokenType.String: 63 | string stringValue = reader.GetString(); 64 | // Convert enum strings to their numeric values 65 | if (Enum.TryParse(stringValue, out var trigger)) 66 | parameters.Add((int)trigger); 67 | else if (Enum.TryParse(stringValue, out var triggerMode)) 68 | parameters.Add((int)triggerMode); 69 | else if (Enum.TryParse(stringValue, out var customTrigger)) 70 | parameters.Add((int)customTrigger); 71 | else if (Enum.TryParse(stringValue, out var playerLed)) 72 | parameters.Add((int)playerLed); 73 | else if (Enum.TryParse(stringValue, out var micLed)) 74 | parameters.Add((int)micLed); 75 | else 76 | parameters.Add(stringValue); 77 | break; 78 | case JsonTokenType.True: 79 | case JsonTokenType.False: 80 | parameters.Add(reader.GetBoolean()); 81 | break; 82 | case JsonTokenType.Null: 83 | parameters.Add(null); 84 | break; 85 | } 86 | reader.Read(); 87 | } 88 | 89 | return parameters.ToArray(); 90 | } 91 | 92 | public override void Write(Utf8JsonWriter writer, object[] value, JsonSerializerOptions options) 93 | { 94 | writer.WriteStartArray(); 95 | foreach (var item in value) 96 | { 97 | if (item == null) 98 | { 99 | writer.WriteNullValue(); 100 | continue; 101 | } 102 | 103 | switch (item) 104 | { 105 | case int intValue: 106 | writer.WriteNumberValue(intValue); 107 | break; 108 | case double doubleValue: 109 | writer.WriteNumberValue(doubleValue); 110 | break; 111 | case string stringValue: 112 | writer.WriteStringValue(stringValue); 113 | break; 114 | case bool boolValue: 115 | writer.WriteBooleanValue(boolValue); 116 | break; 117 | case Enum enumValue: 118 | writer.WriteNumberValue(Convert.ToInt32(enumValue)); 119 | break; 120 | default: 121 | writer.WriteNumberValue(Convert.ToInt32(item)); 122 | break; 123 | } 124 | } 125 | writer.WriteEndArray(); 126 | } 127 | } 128 | 129 | public static class Triggers 130 | { 131 | public static IPAddress localhost = new IPAddress(new byte[] { 127, 0, 0, 1 }); 132 | 133 | private static readonly JsonSerializerOptions jsonOptions = new JsonSerializerOptions 134 | { 135 | PropertyNamingPolicy = JsonNamingPolicy.CamelCase, 136 | WriteIndented = false, 137 | Converters = 138 | { 139 | new ParametersConverter() 140 | } 141 | }; 142 | 143 | public static string PacketToJson(Packet packet) 144 | { 145 | try 146 | { 147 | return JsonSerializer.Serialize(packet, jsonOptions); 148 | } 149 | catch (Exception ex) 150 | { 151 | throw new InvalidOperationException("Failed to serialize packet to JSON", ex); 152 | } 153 | } 154 | 155 | public static Packet JsonToPacket(string json) 156 | { 157 | try 158 | { 159 | return JsonSerializer.Deserialize(json, jsonOptions) 160 | ?? throw new InvalidOperationException("Deserialized packet is null"); 161 | } 162 | catch (Exception ex) 163 | { 164 | throw new InvalidOperationException("Failed to deserialize JSON to packet", ex); 165 | } 166 | } 167 | } 168 | 169 | public enum TriggerMode 170 | { 171 | Normal = 0, 172 | GameCube = 1, 173 | VerySoft = 2, 174 | Soft = 3, 175 | Hard = 4, 176 | VeryHard = 5, 177 | Hardest = 6, 178 | Rigid = 7, 179 | VibrateTrigger = 8, 180 | Choppy = 9, 181 | Medium = 10, 182 | VibrateTriggerPulse = 11, 183 | CustomTriggerValue = 12, 184 | Resistance = 13, 185 | Bow = 14, 186 | Galloping = 15, 187 | SemiAutomaticGun = 16, 188 | AutomaticGun = 17, 189 | Machine = 18, 190 | OFF = 19, 191 | FEEDBACK = 20, 192 | WEAPON = 21, 193 | VIBRATION = 22, 194 | SLOPE_FEEDBACK = 23, 195 | MULTIPLE_POSITION_FEEDBACK = 24, 196 | MULTIPLE_POSITION_VIBRATION = 25, 197 | VIBRATE_TRIGGER_10Hz = 26 198 | } 199 | 200 | public enum CustomTriggerValueMode 201 | { 202 | OFF = 0, 203 | Rigid = 1, 204 | RigidA = 2, 205 | RigidB = 3, 206 | RigidAB = 4, 207 | Pulse = 5, 208 | PulseA = 6, 209 | PulseB = 7, 210 | PulseAB = 8, 211 | VibrateResistance = 9, 212 | VibrateResistanceA = 10, 213 | VibrateResistanceB = 11, 214 | VibrateResistanceAB = 12, 215 | VibratePulse = 13, 216 | VibratePulseA = 14, 217 | VibratePulsB = 15, 218 | VibratePulseAB = 16 219 | } 220 | 221 | public enum Trigger 222 | { 223 | Invalid, 224 | Left, 225 | Right 226 | } 227 | 228 | public enum InstructionType 229 | { 230 | Invalid, 231 | TriggerUpdate, 232 | RGBUpdate, 233 | PlayerLED, 234 | PlayerLEDNewRevision, 235 | MicLED, 236 | TriggerThreshold, 237 | ResetToUserSettings, 238 | GetDSXStatus 239 | } 240 | 241 | public enum PlayerLEDNewRevision 242 | { 243 | One, 244 | Two, 245 | Three, 246 | Four, 247 | Five 248 | } 249 | 250 | public enum MicLEDMode 251 | { 252 | Off, 253 | On, 254 | Pulse 255 | } 256 | 257 | public class Instruction 258 | { 259 | [JsonConstructor] 260 | public Instruction(InstructionType type) 261 | { 262 | Type = type; 263 | } 264 | 265 | [JsonPropertyName("type")] 266 | public InstructionType Type { get; set; } 267 | 268 | [JsonPropertyName("parameters")] 269 | [JsonConverter(typeof(ParametersConverter))] 270 | public object[] Parameters { get; set; } 271 | } 272 | 273 | public class Packet 274 | { 275 | [JsonPropertyName("instructions")] 276 | public Instruction[] Instructions { get; set; } 277 | 278 | public Packet() 279 | { 280 | Instructions = Array.Empty(); 281 | } 282 | } 283 | } -------------------------------------------------------------------------------- /Properties/PublishProfiles/FolderProfile.pubxml: -------------------------------------------------------------------------------- 1 |  2 | 5 | 6 | 7 | Release 8 | Any CPU 9 | C:\Users\KennethTuisk\Downloads\forzaexpo 10 | FileSystem 11 | <_TargetId>Folder 12 | net8.0-windows 13 | false 14 | win-x64 15 | true 16 | true 17 | 18 | -------------------------------------------------------------------------------- /Properties/PublishProfiles/FolderProfile.pubxml.user: -------------------------------------------------------------------------------- 1 |  2 | 5 | 6 | 7 | True|2024-12-09T14:57:36.3079540Z||;True|2024-12-09T16:52:38.8370329+02:00||;True|2023-07-03T01:42:09.6600487+03:00||;True|2023-07-03T00:43:30.4990973+03:00||;True|2023-01-05T00:25:36.9900650+02:00||;False|2023-01-05T00:25:02.5847070+02:00||;True|2022-09-25T02:04:47.6718852+03:00||;True|2022-09-25T02:04:13.7848596+03:00||;True|2022-09-25T02:02:23.8678942+03:00||;True|2022-09-25T01:54:40.1407347+03:00||;True|2022-09-25T01:50:56.6721268+03:00||; 8 | 9 | 10 | -------------------------------------------------------------------------------- /Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace RacingDSX.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | public class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | public static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RacingDSX.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | public static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized resource of type System.Drawing.Bitmap. 65 | /// 66 | public static System.Drawing.Bitmap greenBtn { 67 | get { 68 | object obj = ResourceManager.GetObject("greenBtn", resourceCulture); 69 | return ((System.Drawing.Bitmap)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Looks up a localized resource of type System.Drawing.Bitmap. 75 | /// 76 | public static System.Drawing.Bitmap redBtn { 77 | get { 78 | object obj = ResourceManager.GetObject("redBtn", resourceCulture); 79 | return ((System.Drawing.Bitmap)(obj)); 80 | } 81 | } 82 | 83 | /// 84 | /// Looks up a localized resource of type System.Drawing.Bitmap. 85 | /// 86 | public static System.Drawing.Bitmap SpinnerGif { 87 | get { 88 | object obj = ResourceManager.GetObject("SpinnerGif", resourceCulture); 89 | return ((System.Drawing.Bitmap)(obj)); 90 | } 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\Resources\greenBtn.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | 125 | ..\Resources\redBtn.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 126 | 127 | 128 | ..\Resources\SpinnerGif.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 129 | 130 | -------------------------------------------------------------------------------- /Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 0.6 7 | 8 | 9 | 0.2 10 | 11 | 12 | 35 13 | 14 | 15 | 3 16 | 17 | 18 | 0.5 19 | 20 | 21 | 0.01 22 | 23 | 24 | 1 25 | 26 | 27 | 1 28 | 29 | 30 | 0.5 31 | 32 | 33 | 1 34 | 35 | 36 | 35 37 | 38 | 39 | 3 40 | 41 | 42 | 200 43 | 44 | 45 | 75 46 | 47 | 48 | 200 49 | 50 | 51 | 1 52 | 53 | 54 | 20 55 | 56 | 57 | 10 58 | 59 | 60 | 5 61 | 62 | 63 | 6 64 | 65 | 66 | 6 67 | 68 | 69 | 1 70 | 71 | 72 | 1 73 | 74 | 75 | 10 76 | 77 | 78 | 0.9 79 | 80 | 81 | False 82 | 83 | 84 | 6969 85 | 86 | 87 | 5300 88 | 89 | 90 | 0.7 91 | 92 | 93 | 0.7 94 | 95 | 96 | 0 97 | 98 | 99 | 2 100 | 101 | 102 | 2 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "RacingDSX": { 4 | "commandName": "Project", 5 | "nativeDebugging": true 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /RacingDSX.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | WinExe 6 | net8.0-windows 7 | true 8 | true 9 | true 10 | win-x64 11 | 14 | Debug 15 | AnyCPU 16 | Readme.md 17 | True 18 | RacingDSX.Program 19 | True 20 | RacingDSX 21 | True 22 | False 23 | 7.0 24 | Paliverse Apps LLC 25 | 26 | 27 | 28 | true 29 | 30 | 31 | 32 | AnyCPU 33 | true 34 | full 35 | false 36 | bin\Debug\ 37 | DEBUG;TRACE 38 | prompt 39 | 4 40 | 41 | 42 | AnyCPU 43 | none 44 | true 45 | bin\Release\ 46 | TRACE 47 | prompt 48 | 4 49 | 50 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | True 67 | True 68 | Resources.resx 69 | 70 | 71 | True 72 | True 73 | Settings.settings 74 | 75 | 76 | 77 | 78 | 79 | PublicResXFileCodeGenerator 80 | Resources.Designer.cs 81 | 82 | 83 | 84 | 85 | 86 | PublicSettingsSingleFileGenerator 87 | Settings.Designer.cs 88 | 89 | 90 | True 91 | \ 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /RacingDSX.csproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | ProjectDebugger 5 | 6 | 7 | RacingDSX 8 | <_LastSelectedProfileId>C:\Users\KennethTuisk\source\repos\cosmii02\RacingDSX\Properties\PublishProfiles\FolderProfile.pubxml 9 | 10 | 11 | 12 | Form 13 | 14 | 15 | Form 16 | 17 | 18 | -------------------------------------------------------------------------------- /RacingDSX.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.1.32328.378 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RacingDSX", "RacingDSX.csproj", "{1D4607E3-378B-4AC9-A223-B2EEB518DC3D}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {1D4607E3-378B-4AC9-A223-B2EEB518DC3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {1D4607E3-378B-4AC9-A223-B2EEB518DC3D}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {1D4607E3-378B-4AC9-A223-B2EEB518DC3D}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {1D4607E3-378B-4AC9-A223-B2EEB518DC3D}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {314A8E45-D550-4CD8-9283-40C708C7E179} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /RacingDSX.sln.DotSettings.user: -------------------------------------------------------------------------------- 1 |  2 | True 3 | False 4 | True 5 | True -------------------------------------------------------------------------------- /RacingDSXWorker.cs: -------------------------------------------------------------------------------- 1 | using RacingDSX.Config; 2 | using RacingDSX.GameParsers; 3 | using System; 4 | using System.IO; 5 | using System.Net; 6 | using System.Net.Sockets; 7 | using System.Runtime.InteropServices; 8 | using System.Text; 9 | using System.Text.Json; 10 | 11 | namespace RacingDSX 12 | { 13 | public enum InstructionTriggerMode : sbyte 14 | { 15 | NONE, 16 | RESISTANCE, 17 | VIBRATION 18 | } 19 | 20 | public class RacingDSXWorker 21 | { 22 | public struct RacingDSXReportStruct 23 | { 24 | public enum ReportType : ushort 25 | { 26 | VERBOSEMESSAGE = 0, 27 | NORACE = 1, 28 | RACING = 2 29 | } 30 | 31 | public enum RacingReportType : ushort 32 | { 33 | // 0 = Throttle vibration message 34 | THROTTLE_VIBRATION = 0, 35 | // 1 = Throttle message 36 | THROTTLE, 37 | // 2 = Brake vibration message 38 | BRAKE_VIBRATION, 39 | // 3 = Brake message 40 | BRAKE 41 | } 42 | public RacingDSXReportStruct(VerboseLevel level, ReportType type, RacingReportType racingType, string msg) 43 | { 44 | this.verboseLevel = level; 45 | this.type = type; 46 | this.racingType = racingType; 47 | this.message = msg; 48 | } 49 | 50 | public RacingDSXReportStruct(ReportType type, RacingReportType racingType, string msg) 51 | { 52 | this.type = type; 53 | this.racingType = racingType; 54 | this.message = msg; 55 | } 56 | 57 | public RacingDSXReportStruct(VerboseLevel level, ReportType type, string msg) 58 | { 59 | this.verboseLevel = level; 60 | this.type = type; 61 | this.message = msg; 62 | } 63 | 64 | public RacingDSXReportStruct(ReportType type, string msg) 65 | { 66 | this.type = type; 67 | this.message = msg; 68 | } 69 | 70 | public RacingDSXReportStruct(VerboseLevel level, string msg) 71 | { 72 | this.verboseLevel = level; 73 | this.type = ReportType.VERBOSEMESSAGE; 74 | this.message = String.Empty; 75 | } 76 | 77 | public RacingDSXReportStruct(string msg) 78 | { 79 | this.type = ReportType.VERBOSEMESSAGE; 80 | this.message = String.Empty; 81 | } 82 | 83 | public ReportType type = 0; 84 | public RacingReportType racingType = 0; 85 | public string message = string.Empty; 86 | public VerboseLevel verboseLevel = VerboseLevel.Limited; 87 | } 88 | 89 | private RacingDSX.Config.Config settings; 90 | private IProgress progressReporter; 91 | private Parser parser; 92 | 93 | // JSON serialization options 94 | private static readonly JsonSerializerOptions jsonOptions = new JsonSerializerOptions 95 | { 96 | PropertyNamingPolicy = JsonNamingPolicy.CamelCase, 97 | WriteIndented = false 98 | }; 99 | 100 | public RacingDSXWorker(RacingDSX.Config.Config currentSettings, IProgress progressReporter) 101 | { 102 | settings = currentSettings; 103 | this.progressReporter = progressReporter; 104 | } 105 | 106 | public void SetSettings(RacingDSX.Config.Config currentSettings) 107 | { 108 | lock(this) 109 | { 110 | settings = currentSettings; 111 | } 112 | } 113 | 114 | void SendData() 115 | { 116 | Packet p = new Packet(); 117 | CsvData csvRecord = new CsvData(); 118 | Profile activeProfile = settings.ActiveProfile; 119 | ReportableInstruction reportableInstruction = new ReportableInstruction(); 120 | 121 | // No race = normal triggers 122 | if (!parser.IsRaceOn()) 123 | { 124 | reportableInstruction = parser.GetPreRaceInstructions(); 125 | p.Instructions = reportableInstruction.Instructions; 126 | reportableInstruction.RacingDSXReportStructs.ForEach(x => 127 | { 128 | if (x.verboseLevel <= settings.VerboseLevel && progressReporter != null) 129 | { 130 | progressReporter.Report(x); 131 | } 132 | }); 133 | 134 | //Send the commands to DSX 135 | Send(p); 136 | } 137 | else 138 | { 139 | reportableInstruction = parser.GetInRaceRightTriggerInstruction(); 140 | sendReportableInstruction(reportableInstruction); 141 | reportableInstruction = parser.GetInRaceLeftTriggerInstruction(); 142 | sendReportableInstruction(reportableInstruction); 143 | reportableInstruction = parser.GetInRaceLightbarInstruction(); 144 | sendReportableInstruction(reportableInstruction); 145 | } 146 | } 147 | 148 | private void sendReportableInstruction(ReportableInstruction reportableInstruction) 149 | { 150 | reportableInstruction.RacingDSXReportStructs.ForEach(x => 151 | { 152 | if (x.verboseLevel <= settings.VerboseLevel && progressReporter != null) 153 | { 154 | progressReporter.Report(x); 155 | } 156 | }); 157 | Packet p = new Packet(); 158 | p.Instructions = reportableInstruction.Instructions; 159 | //Send the commands to DSX 160 | Send(p); 161 | } 162 | 163 | static UdpClient senderClient; 164 | static IPEndPoint endPoint; 165 | 166 | // Connect to DSX 167 | void Connect() 168 | { 169 | senderClient = new UdpClient(); 170 | var portNumber = settings.DSXPort; 171 | 172 | if (progressReporter != null) 173 | { 174 | progressReporter.Report(new RacingDSXReportStruct("DSX is using port " + portNumber + ". Attempting to connect..")); 175 | } 176 | 177 | if (!int.TryParse(portNumber.ToString(), out int portNum)) 178 | { 179 | if (progressReporter != null) 180 | { 181 | progressReporter.Report(new RacingDSXReportStruct($"DSX provided a non-numerical port! Using configured default ({settings.DSXPort}).")); 182 | } 183 | portNum = settings.DSXPort; 184 | } 185 | 186 | endPoint = new IPEndPoint(IPAddress.Loopback, portNum); 187 | 188 | try 189 | { 190 | senderClient.Connect(endPoint); 191 | } 192 | catch (Exception e) 193 | { 194 | if (progressReporter != null) 195 | { 196 | progressReporter.Report(new RacingDSXReportStruct("Error connecting: " + e.Message)); 197 | 198 | if (e is SocketException) 199 | { 200 | progressReporter.Report(new RacingDSXReportStruct("Couldn't access port. " + e.Message)); 201 | } 202 | else if (e is ObjectDisposedException) 203 | { 204 | progressReporter.Report(new RacingDSXReportStruct("Connection object closed. Restart the application.")); 205 | } 206 | else 207 | { 208 | progressReporter.Report(new RacingDSXReportStruct("Unknown error: " + e.Message)); 209 | } 210 | } 211 | } 212 | } 213 | 214 | //Send Data to DSX 215 | void Send(Packet data) 216 | { 217 | if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) 218 | { 219 | progressReporter.Report(new RacingDSXReportStruct($"Converting Message to JSON")); 220 | } 221 | 222 | try 223 | { 224 | string jsonString = JsonSerializer.Serialize(data, jsonOptions); 225 | byte[] RequestData = Encoding.ASCII.GetBytes(jsonString); 226 | 227 | if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) 228 | { 229 | progressReporter.Report(new RacingDSXReportStruct($"{Encoding.ASCII.GetString(RequestData)}")); 230 | } 231 | 232 | if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) 233 | { 234 | progressReporter.Report(new RacingDSXReportStruct($"Sending Message to DSX...")); 235 | } 236 | 237 | senderClient.Send(RequestData, RequestData.Length); 238 | 239 | if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) 240 | { 241 | progressReporter.Report(new RacingDSXReportStruct($"Message sent to DSX")); 242 | } 243 | } 244 | catch (JsonException je) 245 | { 246 | if (progressReporter != null) 247 | { 248 | progressReporter.Report(new RacingDSXReportStruct($"JSON Serialization Error: {je.Message}")); 249 | } 250 | } 251 | catch (Exception e) 252 | { 253 | if (progressReporter != null) 254 | { 255 | progressReporter.Report(new RacingDSXReportStruct("Error Sending Message: ")); 256 | } 257 | 258 | if (e is SocketException) 259 | { 260 | if (progressReporter != null) 261 | { 262 | progressReporter.Report(new RacingDSXReportStruct("Couldn't Access Port. " + e.Message)); 263 | } 264 | throw; 265 | } 266 | else if (e is ObjectDisposedException) 267 | { 268 | if (progressReporter != null) 269 | { 270 | progressReporter.Report(new RacingDSXReportStruct("Connection closed. Restarting...")); 271 | } 272 | Connect(); 273 | } 274 | else 275 | { 276 | if (progressReporter != null) 277 | { 278 | progressReporter.Report(new RacingDSXReportStruct("Unknown Error: " + e.Message)); 279 | } 280 | } 281 | } 282 | } 283 | 284 | static IPEndPoint ipEndPoint = null; 285 | static UdpClient client = null; 286 | 287 | public struct UdpState 288 | { 289 | public UdpClient u; 290 | public IPEndPoint e; 291 | 292 | public UdpState(UdpClient u, IPEndPoint e) 293 | { 294 | this.u = u; 295 | this.e = e; 296 | } 297 | } 298 | 299 | protected bool bRunning = false; 300 | 301 | public void Run() 302 | { 303 | bRunning = true; 304 | try 305 | { 306 | Connect(); 307 | if (settings.ActiveProfile == null) 308 | { 309 | if (progressReporter != null) 310 | { 311 | progressReporter.Report(new RacingDSXReportStruct("No active profile selected. Exiting...")); 312 | } 313 | return; 314 | } 315 | 316 | switch (settings.ActiveProfile.GameType) 317 | { 318 | case GameTypes.Forza: 319 | parser = new ForzaParser(settings); 320 | break; 321 | case GameTypes.Dirt: 322 | parser = new DirtParser(settings); 323 | break; 324 | default: 325 | parser = new NullParser(settings); 326 | break; 327 | } 328 | 329 | ipEndPoint = new IPEndPoint(IPAddress.Loopback, settings.ActiveProfile.gameUDPPort); 330 | client = new UdpClient(settings.ActiveProfile.gameUDPPort); 331 | 332 | byte[] resultBuffer; 333 | 334 | while (bRunning) 335 | { 336 | resultBuffer = client.Receive(ref ipEndPoint); 337 | if (resultBuffer == null) 338 | continue; 339 | 340 | if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) 341 | { 342 | progressReporter.Report(new RacingDSXReportStruct("received Message from Forza!")); 343 | } 344 | 345 | if (!AdjustToBufferType(resultBuffer.Length)) 346 | { 347 | continue; 348 | } 349 | 350 | parser.ParsePacket(resultBuffer); 351 | if (settings.VerboseLevel > VerboseLevel.Limited && progressReporter != null) 352 | { 353 | progressReporter.Report(new RacingDSXReportStruct("Data Parsed")); 354 | } 355 | 356 | SendData(); 357 | } 358 | } 359 | catch (Exception e) 360 | { 361 | if (progressReporter != null) 362 | { 363 | progressReporter.Report(new RacingDSXReportStruct("Application encountered an exception: " + e.Message)); 364 | } 365 | } 366 | finally 367 | { 368 | Stop(); 369 | } 370 | } 371 | 372 | public void Stop() 373 | { 374 | bRunning = false; 375 | 376 | if (settings.VerboseLevel > VerboseLevel.Off && progressReporter != null) 377 | { 378 | progressReporter.Report(new RacingDSXReportStruct($"Cleaning Up")); 379 | } 380 | 381 | if (client != null) 382 | { 383 | client.Close(); 384 | client.Dispose(); 385 | } 386 | if (senderClient != null) 387 | { 388 | senderClient.Close(); 389 | senderClient.Dispose(); 390 | } 391 | 392 | if (settings.VerboseLevel > VerboseLevel.Off) 393 | { 394 | progressReporter.Report(new RacingDSXReportStruct($"Cleanup Finished. Exiting...")); 395 | } 396 | } 397 | 398 | static bool AdjustToBufferType(int bufferLength) 399 | { 400 | switch (bufferLength) 401 | { 402 | case 232: // FM7 sled 403 | return false; 404 | case 264: // Dirt Rally 1 405 | FMData.BufferOffset = 0; 406 | return true; 407 | case 311: // FM7 dash 408 | FMData.BufferOffset = 0; 409 | return true; 410 | case 331: // FM8 dash 411 | FMData.BufferOffset = 0; 412 | return true; 413 | case 324: // FH4 414 | FMData.BufferOffset = 12; 415 | return true; 416 | default: 417 | return false; 418 | } 419 | } 420 | } 421 | } -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | ![GitHub all releases](https://img.shields.io/github/downloads/cosmii02/racingDSX/total) 2 | 3 | Tested and confirmed to work with DSX v2 and v3.1 4 | 5 | 🔺🔺 It is REQUIRED to install .NET8 for racingDSX to work at all!🔺🔺 6 | Download .NET8.0 from the link here: https://dotnet.microsoft.com/en-us/download 7 | 8 | 9 | 10 | # Setting up DiRT Rally 1 / 2 for UDP Connection: 11 | 1. Go to `C:\Users\\Documents\My Games\DiRT Rally X.0\hardwaresettings`; 12 | 2. Open `hardware_settings_config` file with your favorite text editor; 13 | 3. Find for **udp** tag and configure as shown below: 14 | ```xml 15 | 16 | ... 17 | 18 | ... 19 | 20 | ``` 21 | - **enabled = true** 22 | - **extradata = 3** 23 | - **port = 5300** 24 | 25 | 🔺🔺 Note for Forza Horizon 4 and Forza Motorsport 7 (THIS IS REQUIRED FOR IT TO WORK) 🔺🔺 26 | 1. Install [Window 8 AppContainer Loopback Utility](https://telerik-fiddler.s3.amazonaws.com/fiddler/addons/enableloopbackutility.exe) 27 | 2. Start the utility (if it shows a message about orphan sid, you can safely ignore it) 28 | 3. Make sure that Forza Horizon 4 / Motorsport 7 are checked 29 | 4. Save changes 30 | In case the above do not work for you run the below command in Powershell as admin, the command enables udp loopback without needing the utility. 31 | 32 | Forza Horizon 4: ```CheckNetIsolation LoopbackExempt -a -n="Microsoft.SunriseBaseGame_8wekyb3d8bbwe"``` 33 | 34 | Forza Motorsport 7: I do not have FM7 to get the ID, sorry :) 35 | 36 | ----------------------------------------------------------------------------------------------------------------------------------------- 37 | 38 | Step by step instructions for Forza Horizon 5: 39 | 1. Download latest version of RacingDSX from releases https://github.com/cosmii02/RacingDSX/releases 40 | 2. extract the zip file to a folder (For example desktop) 41 | 3. Run RacingDSX exe 42 | ![image](https://user-images.githubusercontent.com/27782168/183417053-33676d94-f137-454b-ad7b-78066f71f6d2.png) 43 | 4. allow firewall prompts if they show up 44 | 5. Open DSX 45 | 6. Run forza horizon 5 46 | 7. Go to settings and enable DATA OUT and set ip to 127.0.0.1 and DATA OUT IP PORT to 5300 47 | ![image](https://user-images.githubusercontent.com/27782168/183418210-145b6701-f1f7-4783-91ba-7a1893294601.png) 48 | 8. In DSX make sure UDP is enabled, go to settings, click controller and then click networking. UDP has to be enabled and must be listening to port 6969 49 | 50 | 51 | ----------------------------------------------------------------------------------------------------------------------------------------- 52 | Note for Forza Motorsport 7 53 | 1. Launch the game and head to the HUD options menu 54 | 2. Set Data Out to ON 55 | 3. Set Data Out IP Address to 127.0.0.1 (localhost) 56 | 4. Set Data Out IP Port to 5300 57 | 5. Set Data Out Packet Format to CAR DASH 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | ## Thanks and Credits 68 | 69 | [DualSenseX](https://github.com/Paliverse/DualSenseX) 70 | 71 | [Forza-Telemetry](https://github.com/austinbaccus/forza-telemetry/tree/main/ForzaCore) 72 | 73 | [patmagauran](https://github.com/patmagauran) 74 | -------------------------------------------------------------------------------- /Resources/SpinnerGif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/Resources/SpinnerGif.gif -------------------------------------------------------------------------------- /Resources/greenBtn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/Resources/greenBtn.png -------------------------------------------------------------------------------- /Resources/redBtn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/Resources/redBtn.png -------------------------------------------------------------------------------- /Settings.cs: -------------------------------------------------------------------------------- 1 | namespace RacingDSX.Properties { 2 | 3 | 4 | // This class allows you to handle specific events on the settings class: 5 | // The SettingChanging event is raised before a setting's value is changed. 6 | // The PropertyChanged event is raised after a setting's value is changed. 7 | // The SettingsLoaded event is raised after the setting values are loaded. 8 | // The SettingsSaving event is raised before the setting values are saved. 9 | public sealed partial class Settings { 10 | 11 | public Settings() { 12 | // // To add event handlers for saving and changing settings, uncomment the lines below: 13 | // 14 | // this.SettingChanging += this.SettingChangingEventHandler; 15 | // 16 | // this.SettingsSaving += this.SettingsSavingEventHandler; 17 | // 18 | } 19 | 20 | private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { 21 | // Add code to handle the SettingChangingEvent event here. 22 | } 23 | 24 | private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { 25 | // Add code to handle the SettingsSaving event here. 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /UI.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 170, 49 122 | 123 | 124 | 170, 49 125 | 126 | 127 | 258, 17 128 | 129 | 130 | 131 | 132 | iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 133 | YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEESURBVEhL3ZKvDoJQFId5Dk0238GGr2DXbqBa3Cw6uy+g 134 | RZozaTM4gxvZQHA6kc05/2CAetzP7bIrF0Hk3iLbx91O+L5xLloQBKQSDS/TNMkwDKnAGQYw0HVdKnAK 135 | Ae/+kIK0wPV0JHvWI3veo4M1kR+wBjot24UQFpEW4OUAX6I2MJMc2K2GoRzrwp18HXDOHjUXp9cZFaeR 136 | GoC0OnWpODq8zqyRxMDGvYdyRtbIx8B6f6Py2HmT/xKJDVRqjY/ytAhm/FwI1FtdKg23gjCOaITdFz8X 137 | An3rIoiSYDL+Z2BzrDl3gMmiPwPAmrHu3IEksG6sXVkAwPlHAZVovu93VKKpfp4ISreGcqlKAwAAAABJ 138 | RU5ErkJggg== 139 | 140 | 141 | 142 | 143 | iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 144 | YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEESURBVEhL3ZKvDoJQFId5Dk0238GGr2DXbqBa3Cw6uy+g 145 | RZozaTM4gxvZQHA6kc05/2CAetzP7bIrF0Hk3iLbx91O+L5xLloQBKQSDS/TNMkwDKnAGQYw0HVdKnAK 146 | Ae/+kIK0wPV0JHvWI3veo4M1kR+wBjot24UQFpEW4OUAX6I2MJMc2K2GoRzrwp18HXDOHjUXp9cZFaeR 147 | GoC0OnWpODq8zqyRxMDGvYdyRtbIx8B6f6Py2HmT/xKJDVRqjY/ytAhm/FwI1FtdKg23gjCOaITdFz8X 148 | An3rIoiSYDL+Z2BzrDl3gMmiPwPAmrHu3IEksG6sXVkAwPlHAZVovu93VKKpfp4ISreGcqlKAwAAAABJ 149 | RU5ErkJggg== 150 | 151 | 152 | 153 | 427, 28 154 | 155 | 156 | 25 157 | 158 | -------------------------------------------------------------------------------- /appsettings.ini: -------------------------------------------------------------------------------- 1 | ;The point at which the brake will begin to become choppy 2 | _grip_Loss_Val=0.05 3 | ;The point at which the throttle will begin to become choppy 4 | _throttle_Grip_Loss_Val=0.6 5 | ;The maximum brake frequency in Hz (avoid over 40). COrrelates to better grip 6 | _max_Brake_Vibration=40 7 | ;How to scale turning acceleration in determining throttle stiffness. 8 | TURN_ACCEL_MOD=0.25 9 | ;How to scale Forward acceleration in determining throttle stiffness. 10 | _forward_Accel_Mod=0.5 11 | ;On a scale of 1-255 with 1 being most stiff 12 | _min_Brake_Stiffness=150 13 | ;On a scale of 1-255 with 1 being most stiff 14 | _max_Brake_Stiffness=5 15 | ;The position (0-255) at which the brake should feel engaged with low grip surfaces 16 | _brake_Vibration_Start=20 17 | ;The Maximum resistance on the throttle (0-7) 18 | _max_Throttle_Resistance=4 19 | ;The Maximum resistance on the Brake (0-7) 20 | _max_Brake_Resistance=6 21 | ;The Minimum resistance on the throttle (0-7) 22 | _min_Throttle_Resistance=0 23 | ;The Minimum resistance on the Brake (0-7) 24 | _min_Brake_Resistance=0 25 | ;The upper end acceleration when calculating the throttle resistance. Any acceleration above this will be counted as this value when determining the throttle resistance. 26 | _acceleration_Limit=10 27 | DISABLE_APP_CHECK=true 28 | _dsx_PORT=6969 29 | FORZA_PORT=5300 30 | ;Smoothing for Throttle Resistance output. Lower = smoother. Must be greater than 0 { 0.01 - 0.99 } 31 | _ewma_Alpha_Throttle = 0.9 32 | ;Smoothing for Brake Resistance output. Lower = smoother. Must be greater than 0 { 0.01 - 0.99 } 33 | _ewma_Alpha_Brake = 0.9 34 | ;Smoothing for Brake Resistance output. Lower = smoother. Must be greater than 0 { 0.01 - 0.99 } 35 | _ewma_Alpha_Brake_Freq = 0.9 36 | ;The depression of the brake lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied. 37 | BRAKE_VIBRATION__MODE_START = 1 38 | ;The depression of the throttle lever at which the program should switch to vibration mode rather than smooth resistance. This helps to avoid clicking as vibration mode clicks when no force is applied. 39 | _throttle_Vibration_Mode_Start = 5 40 | ;The Minimum brake frequency in Hz (avoid over 40). Helps avoid clicking in controller 41 | _min_Brake_Vibration = 20 42 | ;Smoothing for Brake Resistance output. Lower = smoother. Must be greater than 0 43 | _ewma_Alpha_Throttle_Freq = 1 44 | ;The maximum acceleration frequency in Hz (avoid over 40). COrrelates to better grip 45 | _max_Accel_Griploss_Vibration = 55 46 | ;The Minimum acceleration frequency in Hz (avoid over 40). Helps avoid clicking in controller 47 | _min_Accel_Griploss_Vibration = 5 48 | ;On a scale of 1-255 with 1 being most stiff 49 | _min_Accel_Griploss_Stiffness = 255 50 | ;On a scale of 1-255 with 1 being most stiff 51 | _max_Accel_Griploss_Stiffness = 150 52 | ; The percentage of the current RPM when we are in the "redline" of the engine 53 | _rpm_Redline_Ratio = 0.9 54 | ; // The percentage of the trigger effects. 1 = 100%, 0.5 = 50%, 0 = 0% (off) 55 | _left_Trigger_Effect_Intensity = 1.0 56 | ; // The percentage of the trigger effects. 1 = 100%, 0.5 = 50%, 0 = 0% (off) 57 | _right_Trigger_Effect_Intensity = 1.0 -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "8.0.0", 4 | "rollForward": "latestMajor", 5 | "allowPrerelease": true 6 | } 7 | } -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | // 2 | using System; 3 | using System.Reflection; 4 | [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] 5 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Reflection; 13 | 14 | [assembly: System.Reflection.AssemblyCompanyAttribute("ForzaDSX")] 15 | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] 16 | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] 17 | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] 18 | [assembly: System.Reflection.AssemblyProductAttribute("ForzaDSX")] 19 | [assembly: System.Reflection.AssemblyTitleAttribute("ForzaDSX")] 20 | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] 21 | [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] 22 | [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] 23 | 24 | // Generated by the MSBuild WriteCodeFragment class. 25 | 26 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.AssemblyInfoInputs.cache: -------------------------------------------------------------------------------- 1 | 0b438f4ea72934afc647e093415ac9e90850ba55 2 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.GeneratedMSBuildEditorConfig.editorconfig: -------------------------------------------------------------------------------- 1 | is_global = true 2 | build_property.ApplicationManifest = 3 | build_property.StartupObject = ForzaDSX.Program 4 | build_property.ApplicationDefaultFont = 5 | build_property.ApplicationHighDpiMode = 6 | build_property.ApplicationUseCompatibleTextRendering = 7 | build_property.ApplicationVisualStyles = 8 | build_property.TargetFramework = net6.0-windows 9 | build_property.TargetPlatformMinVersion = 7.0 10 | build_property.UsingMicrosoftNETSdkWeb = 11 | build_property.ProjectTypeGuids = 12 | build_property.InvariantGlobalization = 13 | build_property.PlatformNeutralAssembly = 14 | build_property._SupportedPlatformList = Linux,macOS,Windows 15 | build_property.EnableSingleFileAnalyzer = true 16 | build_property.EnableTrimAnalyzer = 17 | build_property.IncludeAllContentForSelfExtract = 18 | build_property.RootNamespace = ForzaDSX 19 | build_property.ProjectDir = C:\Users\apple\source\repos\cosmii02\ForzaDSX\ 20 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.Properties.Resources.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/ForzaDSX.Properties.Resources.resources -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.UI.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/ForzaDSX.UI.resources -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.assets.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/ForzaDSX.assets.cache -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.csproj.AssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/ForzaDSX.csproj.AssemblyReference.cache -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.csproj.BuildWithSkipAnalyzers: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/ForzaDSX.csproj.BuildWithSkipAnalyzers -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.csproj.CopyComplete: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/ForzaDSX.csproj.CopyComplete -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.csproj.CoreCompileInputs.cache: -------------------------------------------------------------------------------- 1 | 228524f9b9e196ad1afa42ae8b5dddc623c1ec03 2 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.csproj.GenerateResource.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/ForzaDSX.csproj.GenerateResource.cache -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ForzaDSX.genruntimeconfig.cache: -------------------------------------------------------------------------------- 1 | a5aadedff4c7bfb2115404110fe893d8aa853be3 2 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/ref/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/ref/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/refint/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/refint/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows/win-x64/singlefilehost.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows/win-x64/singlefilehost.exe -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | // 2 | using System; 3 | using System.Reflection; 4 | [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] 5 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Reflection; 13 | 14 | [assembly: System.Reflection.AssemblyCompanyAttribute("CosmiiDev")] 15 | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] 16 | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] 17 | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] 18 | [assembly: System.Reflection.AssemblyProductAttribute("ForzaDSX")] 19 | [assembly: System.Reflection.AssemblyTitleAttribute("ForzaDSX")] 20 | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] 21 | [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows10.0.22621.0")] 22 | [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] 23 | 24 | // Generated by the MSBuild WriteCodeFragment class. 25 | 26 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.AssemblyInfoInputs.cache: -------------------------------------------------------------------------------- 1 | 70bc44e265f17b2b0fd8273084e66ae7201e8335 2 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.GeneratedMSBuildEditorConfig.editorconfig: -------------------------------------------------------------------------------- 1 | is_global = true 2 | build_property.ApplicationManifest = 3 | build_property.StartupObject = ForzaDSX.Program 4 | build_property.ApplicationDefaultFont = 5 | build_property.ApplicationHighDpiMode = 6 | build_property.ApplicationUseCompatibleTextRendering = 7 | build_property.ApplicationVisualStyles = 8 | build_property.TargetFramework = net6.0-windows10.0.22621.0 9 | build_property.TargetPlatformMinVersion = 7.0 10 | build_property.UsingMicrosoftNETSdkWeb = 11 | build_property.ProjectTypeGuids = 12 | build_property.InvariantGlobalization = 13 | build_property.PlatformNeutralAssembly = 14 | build_property.EnforceExtendedAnalyzerRules = 15 | build_property._SupportedPlatformList = Linux,macOS,Windows 16 | build_property.EnableAotAnalyzer = 17 | build_property.EnableSingleFileAnalyzer = true 18 | build_property.EnableTrimAnalyzer = 19 | build_property.IncludeAllContentForSelfExtract = 20 | build_property.RootNamespace = ForzaDSX 21 | build_property.ProjectDir = C:\Users\apple\RiderProjects\ForzaDSX\ 22 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.Properties.Resources.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.Properties.Resources.resources -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.UI.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.UI.resources -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.assets.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.assets.cache -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.csproj.AssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.csproj.AssemblyReference.cache -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.csproj.CopyComplete: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.csproj.CopyComplete -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.csproj.CoreCompileInputs.cache: -------------------------------------------------------------------------------- 1 | 952d8ab5097f79842bef9d43d415162f3ca44004 2 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.csproj.GenerateResource.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.csproj.GenerateResource.cache -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.genruntimeconfig.cache: -------------------------------------------------------------------------------- 1 | d649d3275054e0a8e9673a4dd94aaf2f5ff00875 2 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/PublishOutputs.cab13ce0e0.txt: -------------------------------------------------------------------------------- 1 | C:\Users\apple\RiderProjects\ForzaDSX\publish\ForzaDSX.dll.config 2 | C:\Users\apple\RiderProjects\ForzaDSX\publish\ForzaDSX.exe 3 | -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/CsvHelper.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/CsvHelper.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.Abstractions.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.Abstractions.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.Binder.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.Binder.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.EnvironmentVariables.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.EnvironmentVariables.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.FileExtensions.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.FileExtensions.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.Ini.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.Ini.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Configuration.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.FileProviders.Abstractions.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.FileProviders.Abstractions.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.FileProviders.Physical.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.FileProviders.Physical.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.FileSystemGlobbing.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.FileSystemGlobbing.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Primitives.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Microsoft.Extensions.Primitives.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Newtonsoft.Json.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/R2R/Newtonsoft.Json.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/apphost.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/apphost.exe -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/ref/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/ref/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/refint/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/refint/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Debug/net6.0-windows10.0.22621.0/win-x64/singlefilehost.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Debug/net6.0-windows10.0.22621.0/win-x64/singlefilehost.exe -------------------------------------------------------------------------------- /obj/ForzaDSX.csproj.nuget.dgspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "format": 1, 3 | "restore": { 4 | "c:\\Users\\apple\\ForzaDSX\\ForzaDSX.csproj": {} 5 | }, 6 | "projects": { 7 | "c:\\Users\\apple\\ForzaDSX\\ForzaDSX.csproj": { 8 | "version": "1.0.0", 9 | "restore": { 10 | "projectUniqueName": "c:\\Users\\apple\\ForzaDSX\\ForzaDSX.csproj", 11 | "projectName": "ForzaDSX", 12 | "projectPath": "c:\\Users\\apple\\ForzaDSX\\ForzaDSX.csproj", 13 | "packagesPath": "C:\\Users\\apple\\.nuget\\packages\\", 14 | "outputPath": "c:\\Users\\apple\\ForzaDSX\\obj\\", 15 | "projectStyle": "PackageReference", 16 | "configFilePaths": [ 17 | "C:\\Users\\apple\\AppData\\Roaming\\NuGet\\NuGet.Config" 18 | ], 19 | "originalTargetFrameworks": [ 20 | "net7.0-windows" 21 | ], 22 | "sources": { 23 | "https://api.nuget.org/v3/index.json": {} 24 | }, 25 | "frameworks": { 26 | "net7.0-windows7.0": { 27 | "targetAlias": "net7.0-windows", 28 | "projectReferences": {} 29 | } 30 | }, 31 | "warningProperties": { 32 | "warnAsError": [ 33 | "NU1605" 34 | ] 35 | }, 36 | "restoreAuditProperties": { 37 | "enableAudit": "true", 38 | "auditLevel": "low", 39 | "auditMode": "direct" 40 | } 41 | }, 42 | "frameworks": { 43 | "net7.0-windows7.0": { 44 | "targetAlias": "net7.0-windows", 45 | "dependencies": { 46 | "CsvHelper": { 47 | "target": "Package", 48 | "version": "[27.2.1, )" 49 | }, 50 | "Microsoft.Extensions.Configuration.Binder": { 51 | "target": "Package", 52 | "version": "[6.0.0, )" 53 | }, 54 | "Microsoft.Extensions.Configuration.EnvironmentVariables": { 55 | "target": "Package", 56 | "version": "[6.0.0, )" 57 | }, 58 | "Microsoft.Extensions.Configuration.Ini": { 59 | "target": "Package", 60 | "version": "[6.0.0, )" 61 | }, 62 | "Newtonsoft.Json": { 63 | "target": "Package", 64 | "version": "[13.0.1, )" 65 | } 66 | }, 67 | "imports": [ 68 | "net461", 69 | "net462", 70 | "net47", 71 | "net471", 72 | "net472", 73 | "net48", 74 | "net481" 75 | ], 76 | "assetTargetFallback": true, 77 | "warn": true, 78 | "downloadDependencies": [ 79 | { 80 | "name": "Microsoft.AspNetCore.App.Ref", 81 | "version": "[7.0.16, 7.0.16]" 82 | }, 83 | { 84 | "name": "Microsoft.AspNetCore.App.Runtime.win-x64", 85 | "version": "[7.0.16, 7.0.16]" 86 | }, 87 | { 88 | "name": "Microsoft.NETCore.App.Host.win-x64", 89 | "version": "[7.0.16, 7.0.16]" 90 | }, 91 | { 92 | "name": "Microsoft.NETCore.App.Ref", 93 | "version": "[7.0.16, 7.0.16]" 94 | }, 95 | { 96 | "name": "Microsoft.NETCore.App.Runtime.win-x64", 97 | "version": "[7.0.16, 7.0.16]" 98 | }, 99 | { 100 | "name": "Microsoft.WindowsDesktop.App.Ref", 101 | "version": "[7.0.16, 7.0.16]" 102 | }, 103 | { 104 | "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", 105 | "version": "[7.0.16, 7.0.16]" 106 | } 107 | ], 108 | "frameworkReferences": { 109 | "Microsoft.NETCore.App": { 110 | "privateAssets": "all" 111 | }, 112 | "Microsoft.WindowsDesktop.App.WindowsForms": { 113 | "privateAssets": "none" 114 | } 115 | }, 116 | "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.201\\RuntimeIdentifierGraph.json" 117 | } 118 | }, 119 | "runtimes": { 120 | "win-x64": { 121 | "#import": [] 122 | } 123 | } 124 | } 125 | } 126 | } -------------------------------------------------------------------------------- /obj/ForzaDSX.csproj.nuget.g.props: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | True 5 | NuGet 6 | $(MSBuildThisFileDirectory)project.assets.json 7 | $(UserProfile)\.nuget\packages\ 8 | C:\Users\apple\.nuget\packages\ 9 | PackageReference 10 | 6.9.1 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /obj/ForzaDSX.csproj.nuget.g.targets: -------------------------------------------------------------------------------- 1 |  2 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | // 2 | using System; 3 | using System.Reflection; 4 | [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] 5 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Reflection; 13 | 14 | [assembly: System.Reflection.AssemblyCompanyAttribute("ForzaDSX")] 15 | [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] 16 | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] 17 | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] 18 | [assembly: System.Reflection.AssemblyProductAttribute("ForzaDSX")] 19 | [assembly: System.Reflection.AssemblyTitleAttribute("ForzaDSX")] 20 | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] 21 | [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] 22 | [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] 23 | 24 | // Generated by the MSBuild WriteCodeFragment class. 25 | 26 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.AssemblyInfoInputs.cache: -------------------------------------------------------------------------------- 1 | 77293bb092388350954ecb858961f4c1764f00fa 2 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.GeneratedMSBuildEditorConfig.editorconfig: -------------------------------------------------------------------------------- 1 | is_global = true 2 | build_property.ApplicationManifest = 3 | build_property.StartupObject = ForzaDSX.Program 4 | build_property.ApplicationDefaultFont = 5 | build_property.ApplicationHighDpiMode = 6 | build_property.ApplicationUseCompatibleTextRendering = 7 | build_property.ApplicationVisualStyles = 8 | build_property.TargetFramework = net6.0-windows 9 | build_property.TargetPlatformMinVersion = 7.0 10 | build_property.UsingMicrosoftNETSdkWeb = 11 | build_property.ProjectTypeGuids = 12 | build_property.InvariantGlobalization = 13 | build_property.PlatformNeutralAssembly = 14 | build_property._SupportedPlatformList = Linux,macOS,Windows 15 | build_property.EnableSingleFileAnalyzer = true 16 | build_property.EnableTrimAnalyzer = 17 | build_property.IncludeAllContentForSelfExtract = 18 | build_property.RootNamespace = ForzaDSX 19 | build_property.ProjectDir = C:\Users\apple\source\repos\cosmii02\ForzaDSX\ 20 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.Properties.Resources.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/ForzaDSX.Properties.Resources.resources -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.UI.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/ForzaDSX.UI.resources -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.assets.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/ForzaDSX.assets.cache -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.csproj.AssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/ForzaDSX.csproj.AssemblyReference.cache -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.csproj.BuildWithSkipAnalyzers: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/ForzaDSX.csproj.BuildWithSkipAnalyzers -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.csproj.CopyComplete: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/ForzaDSX.csproj.CopyComplete -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.csproj.CoreCompileInputs.cache: -------------------------------------------------------------------------------- 1 | b7cd03f5bd52dd496e8ad38550134b8c5a3f1f35 2 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.csproj.GenerateResource.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/ForzaDSX.csproj.GenerateResource.cache -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.designer.deps.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtimeTarget": { 3 | "name": ".NETCoreApp,Version=v6.0", 4 | "signature": "" 5 | }, 6 | "compilationOptions": {}, 7 | "targets": { 8 | ".NETCoreApp,Version=v6.0": { 9 | "CsvHelper/27.2.1": { 10 | "runtime": { 11 | "lib/net6.0/CsvHelper.dll": { 12 | "assemblyVersion": "27.0.0.0", 13 | "fileVersion": "27.2.1.0" 14 | } 15 | } 16 | }, 17 | "Microsoft.Extensions.Configuration/6.0.0": { 18 | "dependencies": { 19 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", 20 | "Microsoft.Extensions.Primitives": "6.0.0" 21 | }, 22 | "runtime": { 23 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { 24 | "assemblyVersion": "6.0.0.0", 25 | "fileVersion": "6.0.21.52210" 26 | } 27 | } 28 | }, 29 | "Microsoft.Extensions.Configuration.Abstractions/6.0.0": { 30 | "dependencies": { 31 | "Microsoft.Extensions.Primitives": "6.0.0" 32 | }, 33 | "runtime": { 34 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { 35 | "assemblyVersion": "6.0.0.0", 36 | "fileVersion": "6.0.21.52210" 37 | } 38 | } 39 | }, 40 | "Microsoft.Extensions.Configuration.Binder/6.0.0": { 41 | "dependencies": { 42 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" 43 | }, 44 | "runtime": { 45 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { 46 | "assemblyVersion": "6.0.0.0", 47 | "fileVersion": "6.0.21.52210" 48 | } 49 | } 50 | }, 51 | "Microsoft.Extensions.Configuration.EnvironmentVariables/6.0.0": { 52 | "dependencies": { 53 | "Microsoft.Extensions.Configuration": "6.0.0", 54 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" 55 | }, 56 | "runtime": { 57 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { 58 | "assemblyVersion": "6.0.0.0", 59 | "fileVersion": "6.0.21.52210" 60 | } 61 | } 62 | }, 63 | "Microsoft.Extensions.Configuration.FileExtensions/6.0.0": { 64 | "dependencies": { 65 | "Microsoft.Extensions.Configuration": "6.0.0", 66 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", 67 | "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", 68 | "Microsoft.Extensions.FileProviders.Physical": "6.0.0", 69 | "Microsoft.Extensions.Primitives": "6.0.0" 70 | }, 71 | "runtime": { 72 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { 73 | "assemblyVersion": "6.0.0.0", 74 | "fileVersion": "6.0.21.52210" 75 | } 76 | } 77 | }, 78 | "Microsoft.Extensions.Configuration.Ini/6.0.0": { 79 | "dependencies": { 80 | "Microsoft.Extensions.Configuration": "6.0.0", 81 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", 82 | "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", 83 | "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" 84 | }, 85 | "runtime": { 86 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.Ini.dll": { 87 | "assemblyVersion": "6.0.0.0", 88 | "fileVersion": "6.0.21.52210" 89 | } 90 | } 91 | }, 92 | "Microsoft.Extensions.FileProviders.Abstractions/6.0.0": { 93 | "dependencies": { 94 | "Microsoft.Extensions.Primitives": "6.0.0" 95 | }, 96 | "runtime": { 97 | "lib/net6.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { 98 | "assemblyVersion": "6.0.0.0", 99 | "fileVersion": "6.0.21.52210" 100 | } 101 | } 102 | }, 103 | "Microsoft.Extensions.FileProviders.Physical/6.0.0": { 104 | "dependencies": { 105 | "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", 106 | "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", 107 | "Microsoft.Extensions.Primitives": "6.0.0" 108 | }, 109 | "runtime": { 110 | "lib/net6.0/Microsoft.Extensions.FileProviders.Physical.dll": { 111 | "assemblyVersion": "6.0.0.0", 112 | "fileVersion": "6.0.21.52210" 113 | } 114 | } 115 | }, 116 | "Microsoft.Extensions.FileSystemGlobbing/6.0.0": { 117 | "runtime": { 118 | "lib/net6.0/Microsoft.Extensions.FileSystemGlobbing.dll": { 119 | "assemblyVersion": "6.0.0.0", 120 | "fileVersion": "6.0.21.52210" 121 | } 122 | } 123 | }, 124 | "Microsoft.Extensions.Primitives/6.0.0": { 125 | "dependencies": { 126 | "System.Runtime.CompilerServices.Unsafe": "6.0.0" 127 | }, 128 | "runtime": { 129 | "lib/net6.0/Microsoft.Extensions.Primitives.dll": { 130 | "assemblyVersion": "6.0.0.0", 131 | "fileVersion": "6.0.21.52210" 132 | } 133 | } 134 | }, 135 | "Newtonsoft.Json/13.0.1": { 136 | "runtime": { 137 | "lib/netstandard2.0/Newtonsoft.Json.dll": { 138 | "assemblyVersion": "13.0.0.0", 139 | "fileVersion": "13.0.1.25517" 140 | } 141 | } 142 | }, 143 | "System.Runtime.CompilerServices.Unsafe/6.0.0": { 144 | "runtime": { 145 | "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll": { 146 | "assemblyVersion": "6.0.0.0", 147 | "fileVersion": "6.0.21.52210" 148 | } 149 | } 150 | } 151 | } 152 | }, 153 | "libraries": { 154 | "CsvHelper/27.2.1": { 155 | "type": "package", 156 | "serviceable": true, 157 | "sha512": "sha512-uS5ix5hL9gL5taiAG//CScyJa8Fn1ZOh3FDhDvf4laboESFs84mCNropfp7PIt8xCkyQofljFpqu1B5UnSXjyA==", 158 | "path": "csvhelper/27.2.1", 159 | "hashPath": "csvhelper.27.2.1.nupkg.sha512" 160 | }, 161 | "Microsoft.Extensions.Configuration/6.0.0": { 162 | "type": "package", 163 | "serviceable": true, 164 | "sha512": "sha512-tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==", 165 | "path": "microsoft.extensions.configuration/6.0.0", 166 | "hashPath": "microsoft.extensions.configuration.6.0.0.nupkg.sha512" 167 | }, 168 | "Microsoft.Extensions.Configuration.Abstractions/6.0.0": { 169 | "type": "package", 170 | "serviceable": true, 171 | "sha512": "sha512-qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", 172 | "path": "microsoft.extensions.configuration.abstractions/6.0.0", 173 | "hashPath": "microsoft.extensions.configuration.abstractions.6.0.0.nupkg.sha512" 174 | }, 175 | "Microsoft.Extensions.Configuration.Binder/6.0.0": { 176 | "type": "package", 177 | "serviceable": true, 178 | "sha512": "sha512-b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", 179 | "path": "microsoft.extensions.configuration.binder/6.0.0", 180 | "hashPath": "microsoft.extensions.configuration.binder.6.0.0.nupkg.sha512" 181 | }, 182 | "Microsoft.Extensions.Configuration.EnvironmentVariables/6.0.0": { 183 | "type": "package", 184 | "serviceable": true, 185 | "sha512": "sha512-DjYkzqvhiHCq38LW71PcIxXk6nhtV6VySP9yDcSO0goPl7YCU1VG1f2Wbgy58lkA10pWkjHCblZPUyboCB93ZA==", 186 | "path": "microsoft.extensions.configuration.environmentvariables/6.0.0", 187 | "hashPath": "microsoft.extensions.configuration.environmentvariables.6.0.0.nupkg.sha512" 188 | }, 189 | "Microsoft.Extensions.Configuration.FileExtensions/6.0.0": { 190 | "type": "package", 191 | "serviceable": true, 192 | "sha512": "sha512-V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", 193 | "path": "microsoft.extensions.configuration.fileextensions/6.0.0", 194 | "hashPath": "microsoft.extensions.configuration.fileextensions.6.0.0.nupkg.sha512" 195 | }, 196 | "Microsoft.Extensions.Configuration.Ini/6.0.0": { 197 | "type": "package", 198 | "serviceable": true, 199 | "sha512": "sha512-4p1kPxibT+RNlj91k9SfvtNIUALqru9xmh+XT7Pfw80WAufCmgj3F81hpXZ4YOcFFphBSw1a+n8NZQooWxCHWQ==", 200 | "path": "microsoft.extensions.configuration.ini/6.0.0", 201 | "hashPath": "microsoft.extensions.configuration.ini.6.0.0.nupkg.sha512" 202 | }, 203 | "Microsoft.Extensions.FileProviders.Abstractions/6.0.0": { 204 | "type": "package", 205 | "serviceable": true, 206 | "sha512": "sha512-0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", 207 | "path": "microsoft.extensions.fileproviders.abstractions/6.0.0", 208 | "hashPath": "microsoft.extensions.fileproviders.abstractions.6.0.0.nupkg.sha512" 209 | }, 210 | "Microsoft.Extensions.FileProviders.Physical/6.0.0": { 211 | "type": "package", 212 | "serviceable": true, 213 | "sha512": "sha512-QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", 214 | "path": "microsoft.extensions.fileproviders.physical/6.0.0", 215 | "hashPath": "microsoft.extensions.fileproviders.physical.6.0.0.nupkg.sha512" 216 | }, 217 | "Microsoft.Extensions.FileSystemGlobbing/6.0.0": { 218 | "type": "package", 219 | "serviceable": true, 220 | "sha512": "sha512-ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==", 221 | "path": "microsoft.extensions.filesystemglobbing/6.0.0", 222 | "hashPath": "microsoft.extensions.filesystemglobbing.6.0.0.nupkg.sha512" 223 | }, 224 | "Microsoft.Extensions.Primitives/6.0.0": { 225 | "type": "package", 226 | "serviceable": true, 227 | "sha512": "sha512-9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", 228 | "path": "microsoft.extensions.primitives/6.0.0", 229 | "hashPath": "microsoft.extensions.primitives.6.0.0.nupkg.sha512" 230 | }, 231 | "Newtonsoft.Json/13.0.1": { 232 | "type": "package", 233 | "serviceable": true, 234 | "sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", 235 | "path": "newtonsoft.json/13.0.1", 236 | "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512" 237 | }, 238 | "System.Runtime.CompilerServices.Unsafe/6.0.0": { 239 | "type": "package", 240 | "serviceable": true, 241 | "sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", 242 | "path": "system.runtime.compilerservices.unsafe/6.0.0", 243 | "hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512" 244 | } 245 | } 246 | } -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.designer.runtimeconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtimeOptions": { 3 | "tfm": "net6.0", 4 | "frameworks": [ 5 | { 6 | "name": "Microsoft.NETCore.App", 7 | "version": "6.0.9" 8 | }, 9 | { 10 | "name": "Microsoft.WindowsDesktop.App", 11 | "version": "6.0.9" 12 | } 13 | ], 14 | "additionalProbingPaths": [ 15 | "C:\\Users\\apple\\.dotnet\\store\\|arch|\\|tfm|", 16 | "C:\\Users\\apple\\.nuget\\packages", 17 | "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" 18 | ], 19 | "configProperties": { 20 | "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, 21 | "Microsoft.NETCore.DotNetHostPolicy.SetAppPaths": true 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ForzaDSX.genruntimeconfig.cache: -------------------------------------------------------------------------------- 1 | adb1c44782f8fad77687645b78c5581822559d25 2 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/ref/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/ref/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/refint/ForzaDSX.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/refint/ForzaDSX.dll -------------------------------------------------------------------------------- /obj/Release/net6.0-windows/win-x64/singlefilehost.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows/win-x64/singlefilehost.exe -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs: -------------------------------------------------------------------------------- 1 | // 2 | using System; 3 | using System.Reflection; 4 | [assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] 5 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | using System; 12 | using System.Reflection; 13 | 14 | [assembly: System.Reflection.AssemblyCompanyAttribute("CosmiiDev")] 15 | [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] 16 | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] 17 | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] 18 | [assembly: System.Reflection.AssemblyProductAttribute("ForzaDSX")] 19 | [assembly: System.Reflection.AssemblyTitleAttribute("ForzaDSX")] 20 | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] 21 | [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows10.0.22621.0")] 22 | [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] 23 | 24 | // Generated by the MSBuild WriteCodeFragment class. 25 | 26 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.AssemblyInfoInputs.cache: -------------------------------------------------------------------------------- 1 | 84b8fb96852bd3eb621d3849f36d873dac7fa7de 2 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.GeneratedMSBuildEditorConfig.editorconfig: -------------------------------------------------------------------------------- 1 | is_global = true 2 | build_property.ApplicationManifest = 3 | build_property.StartupObject = ForzaDSX.Program 4 | build_property.ApplicationDefaultFont = 5 | build_property.ApplicationHighDpiMode = 6 | build_property.ApplicationUseCompatibleTextRendering = 7 | build_property.ApplicationVisualStyles = 8 | build_property.TargetFramework = net6.0-windows10.0.22621.0 9 | build_property.TargetPlatformMinVersion = 7.0 10 | build_property.UsingMicrosoftNETSdkWeb = 11 | build_property.ProjectTypeGuids = 12 | build_property.InvariantGlobalization = 13 | build_property.PlatformNeutralAssembly = 14 | build_property.EnforceExtendedAnalyzerRules = 15 | build_property._SupportedPlatformList = Linux,macOS,Windows 16 | build_property.EnableAotAnalyzer = 17 | build_property.EnableSingleFileAnalyzer = true 18 | build_property.EnableTrimAnalyzer = 19 | build_property.IncludeAllContentForSelfExtract = 20 | build_property.RootNamespace = ForzaDSX 21 | build_property.ProjectDir = D:\Development\Projects\ForzaDSX\ 22 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.assets.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.assets.cache -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.csproj.AssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cosmii02/RacingDSX/ac82dd650fdceebdb53088a91add9dbba5f3a1ac/obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.csproj.AssemblyReference.cache -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.designer.deps.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtimeTarget": { 3 | "name": ".NETCoreApp,Version=v6.0", 4 | "signature": "" 5 | }, 6 | "compilationOptions": {}, 7 | "targets": { 8 | ".NETCoreApp,Version=v6.0": { 9 | "CsvHelper/27.2.1": { 10 | "runtime": { 11 | "lib/net6.0/CsvHelper.dll": { 12 | "assemblyVersion": "27.0.0.0", 13 | "fileVersion": "27.2.1.0" 14 | } 15 | } 16 | }, 17 | "Microsoft.Extensions.Configuration/6.0.0": { 18 | "dependencies": { 19 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", 20 | "Microsoft.Extensions.Primitives": "6.0.0" 21 | }, 22 | "runtime": { 23 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { 24 | "assemblyVersion": "6.0.0.0", 25 | "fileVersion": "6.0.21.52210" 26 | } 27 | } 28 | }, 29 | "Microsoft.Extensions.Configuration.Abstractions/6.0.0": { 30 | "dependencies": { 31 | "Microsoft.Extensions.Primitives": "6.0.0" 32 | }, 33 | "runtime": { 34 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { 35 | "assemblyVersion": "6.0.0.0", 36 | "fileVersion": "6.0.21.52210" 37 | } 38 | } 39 | }, 40 | "Microsoft.Extensions.Configuration.Binder/6.0.0": { 41 | "dependencies": { 42 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" 43 | }, 44 | "runtime": { 45 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { 46 | "assemblyVersion": "6.0.0.0", 47 | "fileVersion": "6.0.21.52210" 48 | } 49 | } 50 | }, 51 | "Microsoft.Extensions.Configuration.EnvironmentVariables/6.0.0": { 52 | "dependencies": { 53 | "Microsoft.Extensions.Configuration": "6.0.0", 54 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" 55 | }, 56 | "runtime": { 57 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll": { 58 | "assemblyVersion": "6.0.0.0", 59 | "fileVersion": "6.0.21.52210" 60 | } 61 | } 62 | }, 63 | "Microsoft.Extensions.Configuration.FileExtensions/6.0.0": { 64 | "dependencies": { 65 | "Microsoft.Extensions.Configuration": "6.0.0", 66 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", 67 | "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", 68 | "Microsoft.Extensions.FileProviders.Physical": "6.0.0", 69 | "Microsoft.Extensions.Primitives": "6.0.0" 70 | }, 71 | "runtime": { 72 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.FileExtensions.dll": { 73 | "assemblyVersion": "6.0.0.0", 74 | "fileVersion": "6.0.21.52210" 75 | } 76 | } 77 | }, 78 | "Microsoft.Extensions.Configuration.Ini/6.0.0": { 79 | "dependencies": { 80 | "Microsoft.Extensions.Configuration": "6.0.0", 81 | "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", 82 | "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", 83 | "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" 84 | }, 85 | "runtime": { 86 | "lib/netstandard2.0/Microsoft.Extensions.Configuration.Ini.dll": { 87 | "assemblyVersion": "6.0.0.0", 88 | "fileVersion": "6.0.21.52210" 89 | } 90 | } 91 | }, 92 | "Microsoft.Extensions.FileProviders.Abstractions/6.0.0": { 93 | "dependencies": { 94 | "Microsoft.Extensions.Primitives": "6.0.0" 95 | }, 96 | "runtime": { 97 | "lib/net6.0/Microsoft.Extensions.FileProviders.Abstractions.dll": { 98 | "assemblyVersion": "6.0.0.0", 99 | "fileVersion": "6.0.21.52210" 100 | } 101 | } 102 | }, 103 | "Microsoft.Extensions.FileProviders.Physical/6.0.0": { 104 | "dependencies": { 105 | "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", 106 | "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", 107 | "Microsoft.Extensions.Primitives": "6.0.0" 108 | }, 109 | "runtime": { 110 | "lib/net6.0/Microsoft.Extensions.FileProviders.Physical.dll": { 111 | "assemblyVersion": "6.0.0.0", 112 | "fileVersion": "6.0.21.52210" 113 | } 114 | } 115 | }, 116 | "Microsoft.Extensions.FileSystemGlobbing/6.0.0": { 117 | "runtime": { 118 | "lib/net6.0/Microsoft.Extensions.FileSystemGlobbing.dll": { 119 | "assemblyVersion": "6.0.0.0", 120 | "fileVersion": "6.0.21.52210" 121 | } 122 | } 123 | }, 124 | "Microsoft.Extensions.Primitives/6.0.0": { 125 | "dependencies": { 126 | "System.Runtime.CompilerServices.Unsafe": "6.0.0" 127 | }, 128 | "runtime": { 129 | "lib/net6.0/Microsoft.Extensions.Primitives.dll": { 130 | "assemblyVersion": "6.0.0.0", 131 | "fileVersion": "6.0.21.52210" 132 | } 133 | } 134 | }, 135 | "Newtonsoft.Json/13.0.1": { 136 | "runtime": { 137 | "lib/netstandard2.0/Newtonsoft.Json.dll": { 138 | "assemblyVersion": "13.0.0.0", 139 | "fileVersion": "13.0.1.25517" 140 | } 141 | } 142 | }, 143 | "System.Runtime.CompilerServices.Unsafe/6.0.0": { 144 | "runtime": { 145 | "lib/net6.0/System.Runtime.CompilerServices.Unsafe.dll": { 146 | "assemblyVersion": "6.0.0.0", 147 | "fileVersion": "6.0.21.52210" 148 | } 149 | } 150 | } 151 | } 152 | }, 153 | "libraries": { 154 | "CsvHelper/27.2.1": { 155 | "type": "package", 156 | "serviceable": true, 157 | "sha512": "sha512-uS5ix5hL9gL5taiAG//CScyJa8Fn1ZOh3FDhDvf4laboESFs84mCNropfp7PIt8xCkyQofljFpqu1B5UnSXjyA==", 158 | "path": "csvhelper/27.2.1", 159 | "hashPath": "csvhelper.27.2.1.nupkg.sha512" 160 | }, 161 | "Microsoft.Extensions.Configuration/6.0.0": { 162 | "type": "package", 163 | "serviceable": true, 164 | "sha512": "sha512-tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==", 165 | "path": "microsoft.extensions.configuration/6.0.0", 166 | "hashPath": "microsoft.extensions.configuration.6.0.0.nupkg.sha512" 167 | }, 168 | "Microsoft.Extensions.Configuration.Abstractions/6.0.0": { 169 | "type": "package", 170 | "serviceable": true, 171 | "sha512": "sha512-qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", 172 | "path": "microsoft.extensions.configuration.abstractions/6.0.0", 173 | "hashPath": "microsoft.extensions.configuration.abstractions.6.0.0.nupkg.sha512" 174 | }, 175 | "Microsoft.Extensions.Configuration.Binder/6.0.0": { 176 | "type": "package", 177 | "serviceable": true, 178 | "sha512": "sha512-b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", 179 | "path": "microsoft.extensions.configuration.binder/6.0.0", 180 | "hashPath": "microsoft.extensions.configuration.binder.6.0.0.nupkg.sha512" 181 | }, 182 | "Microsoft.Extensions.Configuration.EnvironmentVariables/6.0.0": { 183 | "type": "package", 184 | "serviceable": true, 185 | "sha512": "sha512-DjYkzqvhiHCq38LW71PcIxXk6nhtV6VySP9yDcSO0goPl7YCU1VG1f2Wbgy58lkA10pWkjHCblZPUyboCB93ZA==", 186 | "path": "microsoft.extensions.configuration.environmentvariables/6.0.0", 187 | "hashPath": "microsoft.extensions.configuration.environmentvariables.6.0.0.nupkg.sha512" 188 | }, 189 | "Microsoft.Extensions.Configuration.FileExtensions/6.0.0": { 190 | "type": "package", 191 | "serviceable": true, 192 | "sha512": "sha512-V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", 193 | "path": "microsoft.extensions.configuration.fileextensions/6.0.0", 194 | "hashPath": "microsoft.extensions.configuration.fileextensions.6.0.0.nupkg.sha512" 195 | }, 196 | "Microsoft.Extensions.Configuration.Ini/6.0.0": { 197 | "type": "package", 198 | "serviceable": true, 199 | "sha512": "sha512-4p1kPxibT+RNlj91k9SfvtNIUALqru9xmh+XT7Pfw80WAufCmgj3F81hpXZ4YOcFFphBSw1a+n8NZQooWxCHWQ==", 200 | "path": "microsoft.extensions.configuration.ini/6.0.0", 201 | "hashPath": "microsoft.extensions.configuration.ini.6.0.0.nupkg.sha512" 202 | }, 203 | "Microsoft.Extensions.FileProviders.Abstractions/6.0.0": { 204 | "type": "package", 205 | "serviceable": true, 206 | "sha512": "sha512-0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", 207 | "path": "microsoft.extensions.fileproviders.abstractions/6.0.0", 208 | "hashPath": "microsoft.extensions.fileproviders.abstractions.6.0.0.nupkg.sha512" 209 | }, 210 | "Microsoft.Extensions.FileProviders.Physical/6.0.0": { 211 | "type": "package", 212 | "serviceable": true, 213 | "sha512": "sha512-QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", 214 | "path": "microsoft.extensions.fileproviders.physical/6.0.0", 215 | "hashPath": "microsoft.extensions.fileproviders.physical.6.0.0.nupkg.sha512" 216 | }, 217 | "Microsoft.Extensions.FileSystemGlobbing/6.0.0": { 218 | "type": "package", 219 | "serviceable": true, 220 | "sha512": "sha512-ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==", 221 | "path": "microsoft.extensions.filesystemglobbing/6.0.0", 222 | "hashPath": "microsoft.extensions.filesystemglobbing.6.0.0.nupkg.sha512" 223 | }, 224 | "Microsoft.Extensions.Primitives/6.0.0": { 225 | "type": "package", 226 | "serviceable": true, 227 | "sha512": "sha512-9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", 228 | "path": "microsoft.extensions.primitives/6.0.0", 229 | "hashPath": "microsoft.extensions.primitives.6.0.0.nupkg.sha512" 230 | }, 231 | "Newtonsoft.Json/13.0.1": { 232 | "type": "package", 233 | "serviceable": true, 234 | "sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", 235 | "path": "newtonsoft.json/13.0.1", 236 | "hashPath": "newtonsoft.json.13.0.1.nupkg.sha512" 237 | }, 238 | "System.Runtime.CompilerServices.Unsafe/6.0.0": { 239 | "type": "package", 240 | "serviceable": true, 241 | "sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==", 242 | "path": "system.runtime.compilerservices.unsafe/6.0.0", 243 | "hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512" 244 | } 245 | } 246 | } -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX.designer.runtimeconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtimeOptions": { 3 | "tfm": "net6.0", 4 | "frameworks": [ 5 | { 6 | "name": "Microsoft.NETCore.App", 7 | "version": "6.0.12" 8 | }, 9 | { 10 | "name": "Microsoft.WindowsDesktop.App", 11 | "version": "6.0.12" 12 | } 13 | ], 14 | "additionalProbingPaths": [ 15 | "C:\\Users\\Guilherme\\.dotnet\\store\\|arch|\\|tfm|", 16 | "C:\\Users\\Guilherme\\.nuget\\packages", 17 | "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" 18 | ], 19 | "configProperties": { 20 | "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, 21 | "Microsoft.NETCore.DotNetHostPolicy.SetAppPaths": true 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX_MarkupCompile.i.cache: -------------------------------------------------------------------------------- 1 | ForzaDSX 2 | 1.0.0.0 3 | 4 | winexe 5 | C# 6 | .cs 7 | C:\Users\apple\Source\Repos\cosmii02\ForzaDSX\obj\Release\net6.0-windows10.0.22621.0\win-x64\ 8 | ForzaDSX 9 | none 10 | false 11 | TRACE;RELEASE;NET;NET6_0;NETCOREAPP 12 | 13 | 1533748988 14 | 15 | 15-2055208160 16 | 217-1615747165 17 | Window1.xaml; 18 | 19 | True 20 | 21 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/ForzaDSX_MarkupCompile.i.lref: -------------------------------------------------------------------------------- 1 |  2 | 3 | FC:\Users\apple\Source\Repos\cosmii02\ForzaDSX\Window1.xaml;; 4 | 5 | -------------------------------------------------------------------------------- /obj/Release/net6.0-windows10.0.22621.0/win-x64/Window1.g.i.cs: -------------------------------------------------------------------------------- 1 | #pragma checksum "..\..\..\..\Window1.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "1DB7EEA2FFF1BAA2C27DB2C719128F1D9A766D72" 2 | //------------------------------------------------------------------------------ 3 | // 4 | // This code was generated by a tool. 5 | // Runtime Version:4.0.30319.42000 6 | // 7 | // Changes to this file may cause incorrect behavior and will be lost if 8 | // the code is regenerated. 9 | // 10 | //------------------------------------------------------------------------------ 11 | 12 | using ForzaDSX; 13 | using System; 14 | using System.Diagnostics; 15 | using System.Windows; 16 | using System.Windows.Automation; 17 | using System.Windows.Controls; 18 | using System.Windows.Controls.Primitives; 19 | using System.Windows.Controls.Ribbon; 20 | using System.Windows.Data; 21 | using System.Windows.Documents; 22 | using System.Windows.Forms.Integration; 23 | using System.Windows.Ink; 24 | using System.Windows.Input; 25 | using System.Windows.Markup; 26 | using System.Windows.Media; 27 | using System.Windows.Media.Animation; 28 | using System.Windows.Media.Effects; 29 | using System.Windows.Media.Imaging; 30 | using System.Windows.Media.Media3D; 31 | using System.Windows.Media.TextFormatting; 32 | using System.Windows.Navigation; 33 | using System.Windows.Shapes; 34 | using System.Windows.Shell; 35 | 36 | 37 | namespace ForzaDSX { 38 | 39 | 40 | /// 41 | /// Window1 42 | /// 43 | public partial class Window1 : System.Windows.Window, System.Windows.Markup.IComponentConnector { 44 | 45 | private bool _contentLoaded; 46 | 47 | /// 48 | /// InitializeComponent 49 | /// 50 | [System.Diagnostics.DebuggerNonUserCodeAttribute()] 51 | [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "6.0.9.0")] 52 | public void InitializeComponent() { 53 | if (_contentLoaded) { 54 | return; 55 | } 56 | _contentLoaded = true; 57 | System.Uri resourceLocater = new System.Uri("/ForzaDSX;V1.0.0.0;component/window1.xaml", System.UriKind.Relative); 58 | 59 | #line 1 "..\..\..\..\Window1.xaml" 60 | System.Windows.Application.LoadComponent(this, resourceLocater); 61 | 62 | #line default 63 | #line hidden 64 | } 65 | 66 | [System.Diagnostics.DebuggerNonUserCodeAttribute()] 67 | [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "6.0.9.0")] 68 | [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] 69 | [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] 70 | [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] 71 | [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] 72 | void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { 73 | this._contentLoaded = true; 74 | } 75 | } 76 | } 77 | 78 | -------------------------------------------------------------------------------- /obj/project.nuget.cache: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "dgSpecHash": "7hYAscAyPaY=", 4 | "success": true, 5 | "projectFilePath": "C:\\Users\\KennethTuisk\\source\\repos\\cosmii02\\RacingDSX\\RacingDSX.csproj", 6 | "expectedPackageFiles": [ 7 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\csvhelper\\33.0.1\\csvhelper.33.0.1.nupkg.sha512", 8 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.configuration\\9.0.0\\microsoft.extensions.configuration.9.0.0.nupkg.sha512", 9 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\9.0.0\\microsoft.extensions.configuration.abstractions.9.0.0.nupkg.sha512", 10 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.configuration.binder\\9.0.0\\microsoft.extensions.configuration.binder.9.0.0.nupkg.sha512", 11 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\9.0.0\\microsoft.extensions.configuration.environmentvariables.9.0.0.nupkg.sha512", 12 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\9.0.0\\microsoft.extensions.configuration.fileextensions.9.0.0.nupkg.sha512", 13 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.configuration.ini\\9.0.0\\microsoft.extensions.configuration.ini.9.0.0.nupkg.sha512", 14 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.fileproviders.abstractions\\9.0.0\\microsoft.extensions.fileproviders.abstractions.9.0.0.nupkg.sha512", 15 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.fileproviders.physical\\9.0.0\\microsoft.extensions.fileproviders.physical.9.0.0.nupkg.sha512", 16 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.filesystemglobbing\\9.0.0\\microsoft.extensions.filesystemglobbing.9.0.0.nupkg.sha512", 17 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\microsoft.extensions.primitives\\9.0.0\\microsoft.extensions.primitives.9.0.0.nupkg.sha512", 18 | "C:\\Users\\KennethTuisk\\.nuget\\packages\\newtonsoft.json\\13.0.3\\newtonsoft.json.13.0.3.nupkg.sha512" 19 | ], 20 | "logs": [] 21 | } -------------------------------------------------------------------------------- /obj/project.packagespec.json: -------------------------------------------------------------------------------- 1 | "restore":{"projectUniqueName":"C:\\Users\\apple\\RiderProjects\\RacingDSX\\RacingDSX.csproj","projectName":"RacingDSX","projectPath":"C:\\Users\\apple\\RiderProjects\\RacingDSX\\RacingDSX.csproj","outputPath":"C:\\Users\\apple\\RiderProjects\\RacingDSX\\obj\\","projectStyle":"PackageReference","UsingMicrosoftNETSdk":false,"originalTargetFrameworks":["net8.0-windows"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0-windows7.0":{"targetAlias":"net8.0-windows","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"}}"frameworks":{"net8.0-windows7.0":{"targetAlias":"net8.0-windows","dependencies":{"CsvHelper":{"target":"Package","version":"[33.0.1, )"},"Microsoft.Extensions.Configuration.Binder":{"target":"Package","version":"[9.0.0, )"},"Microsoft.Extensions.Configuration.EnvironmentVariables":{"target":"Package","version":"[9.0.0, )"},"Microsoft.Extensions.Configuration.Ini":{"target":"Package","version":"[9.0.0, )"},"Newtonsoft.Json":{"target":"Package","version":"[13.0.3, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"},"Microsoft.WindowsDesktop.App.WindowsForms":{"privateAssets":"none"}},"runtimeIdentifierGraphPath":"C:\\Users\\apple\\.dotnet\\sdk\\8.0.404/PortableRuntimeIdentifierGraph.json"}}"runtimes":{"win-x64":{"#import":[]}} -------------------------------------------------------------------------------- /obj/rider.project.restore.info: -------------------------------------------------------------------------------- 1 | 17336812128248650 --------------------------------------------------------------------------------