From 37864c9e3b25d31071070a91a5d7c5f0a19c7b16 Mon Sep 17 00:00:00 2001 From: PeposCJ <66405692+PeposCJ@users.noreply.github.com> Date: Thu, 30 Jul 2026 03:31:34 -0600 Subject: [PATCH 1/4] feat: integrate validated RS50 OLED foundation --- .github/workflows/ci.yml | 143 ++++++ .gitignore | 8 + LogiDynamicDash.Configurator/App.xaml | 7 + LogiDynamicDash.Configurator/App.xaml.cs | 7 + .../LogiDynamicDash.Configurator.csproj | 17 + LogiDynamicDash.Configurator/MainWindow.xaml | 181 +++++++ .../MainWindow.xaml.cs | 338 +++++++++++++ .../ApplicationDisplayFactoryTests.cs | 233 +++++++++ .../CompositeApplicationDisplayTests.cs | 96 ++++ .../ConsoleDashboardTests.cs | 27 ++ .../DisciplineProfileRecommendationTests.cs | 81 ++++ .../DisplayControllerTests.cs | 22 + LogiDynamicDash.Tests/Golden/layouts.txt | 50 ++ LogiDynamicDash.Tests/GoldenPreviewTests.cs | 26 + .../IRacingSessionIdentityTests.cs | 100 ++++ .../LogiDynamicDash.Tests.csproj | 29 ++ .../LogiDynamicDashApplicationTests.cs | 286 +++++++++++ .../OfflineCommandLineTests.cs | 77 +++ .../Rs50DrivingTrialOptionsTests.cs | 56 +++ .../Rs50LowSpeedTrialOptionsTests.cs | 63 +++ .../Rs50OledConfigurationFileTests.cs | 115 +++++ .../Rs50OledDeviceExchangeTests.cs | 281 +++++++++++ .../Rs50OledDisplaySinkTests.cs | 215 ++++++++ .../Rs50OledFrameSchedulerTests.cs | 120 +++++ .../Rs50OledPreviewRunnerTests.cs | 37 ++ .../Rs50OledProtocolTests.cs | 230 +++++++++ LogiDynamicDash.Tests/Rs50OledSessionTests.cs | 261 ++++++++++ .../Rs50OledSimulationRunnerTests.cs | 82 ++++ .../Rs50StationaryTrialOptionsTests.cs | 58 +++ .../Rs50TelemetryFrameFormatterTests.cs | 150 ++++++ ...tizedApplicationRuntimeDiagnosticsTests.cs | 66 +++ .../SanitizedRs50OledDiagnosticsTests.cs | 210 ++++++++ .../SessionProfileResolverTests.cs | 91 ++++ .../TelemetryRecorderTests.cs | 84 ++++ LogiDynamicDash.Tests/TelemetryReplayTests.cs | 169 +++++++ .../VirtualEnduranceTests.cs | 37 ++ LogiDynamicDash.slnx | 2 + .../ApplicationDisplayFactory.cs | 107 ++++ .../Configuration/Rs50DrivingTrialOptions.cs | 45 ++ .../Configuration/Rs50LowSpeedTrialOptions.cs | 51 ++ .../Rs50OledConfigurationFile.cs | 259 ++++++++++ .../Rs50StationaryTrialOptions.cs | 49 ++ .../Controllers/DisplayController.cs | 43 +- .../Diagnostics/DiagnosticRs50OledSession.cs | 85 ++++ .../IApplicationRuntimeDiagnostics.cs | 13 + .../Diagnostics/IRs50OledDiagnostics.cs | 18 + .../Diagnostics/Rs50OledSessionFactory.cs | 27 ++ .../SanitizedApplicationRuntimeDiagnostics.cs | 99 ++++ .../SanitizedRs50OledDiagnostics.cs | 117 +++++ .../Displays/CompositeApplicationDisplay.cs | 104 ++++ LogiDynamicDash/Displays/ConsoleDashboard.cs | 144 ++++-- .../Displays/IApplicationDisplay.cs | 16 + .../Displays/Rs50OledDisplaySink.cs | 167 +++++++ .../Displays/Rs50OledFrameScheduler.cs | 74 +++ .../Displays/Rs50TelemetryFrameFormatter.cs | 331 +++++++++++++ LogiDynamicDash/Hidpp/IRs50OledExchange.cs | 6 + LogiDynamicDash/Hidpp/Rs50OledProtocol.cs | 339 +++++++++++++ .../Hidpp/Rs50OledProtocolException.cs | 9 + LogiDynamicDash/Hidpp/Rs50OledSession.cs | 156 ++++++ LogiDynamicDash/Hidpp/Rs50OledTransaction.cs | 52 ++ .../Transport/ConfirmedOledDeviceIdentity.cs | 15 + .../Hidpp/Transport/HidSharpRs50HidCatalog.cs | 76 +++ .../Hidpp/Transport/IRs50HidCatalog.cs | 30 ++ ...Rs50OledAcknowledgementTimeoutException.cs | 10 + .../Hidpp/Transport/Rs50OledDeviceExchange.cs | 244 ++++++++++ LogiDynamicDash/LogiDynamicDash.csproj | 6 + LogiDynamicDash/LogiDynamicDashApplication.cs | 202 ++++++++ .../DisciplineProfileRecommendations.cs | 113 +++++ .../Models/IRacingSessionIdentity.cs | 66 +++ .../Models/Rs50OledConfiguration.cs | 105 ++++ LogiDynamicDash/Models/Rs50OledFrame.cs | 88 ++++ .../Models/SessionProfileResolver.cs | 57 +++ LogiDynamicDash/Models/TelemetrySnapshot.cs | 17 +- LogiDynamicDash/Offline/OfflineCommandLine.cs | 85 ++++ .../Offline/Rs50OledFrameDescription.cs | 43 ++ .../Offline/Rs50OledPreviewRunner.cs | 47 ++ .../Offline/Rs50OledSimulationRunner.cs | 155 ++++++ .../Offline/Rs50TelemetryRecorder.cs | 158 ++++++ .../Offline/Rs50TelemetryReplayRunner.cs | 458 ++++++++++++++++++ .../Offline/SimulatedRs50OledExchange.cs | 41 ++ LogiDynamicDash/Program.cs | 170 ++++--- LogiDynamicDash/Properties/AssemblyInfo.cs | 4 + .../IRacingSessionIdentityResolver.cs | 46 ++ .../Services/IRacingTelemetryService.cs | 65 ++- LogiDynamicDash/Services/ITelemetrySource.cs | 11 + LogiDynamicDash/docs/OFFLINE_FAULT_MATRIX.md | 35 ++ LogiDynamicDash/docs/OLED_DISPLAY_DESIGN.md | 89 +++- .../docs/PRODUCT_AND_MONETIZATION_PLAN.md | 281 +++++++++++ .../docs/RS50_OLED_PRODUCTION_ARCHITECTURE.md | 258 ++++++++++ LogiDynamicDash/docs/WINDOWS_PACKAGE.md | 77 +++ README.md | 73 ++- THIRD_PARTY_NOTICES.md | 24 + logidynamicdash.example.json | 12 + replays/acceleration.json | 49 ++ replays/disconnect.json | 38 ++ replays/mode-transitions.json | 49 ++ replays/session-identity.json | 30 ++ scripts/Complete-WindowsPackage.ps1 | 103 ++++ scripts/New-PackageSbom.ps1 | 80 +++ scripts/Test-Rs50OledProductionSurface.ps1 | 228 +++++++++ 100 files changed, 9942 insertions(+), 162 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 LogiDynamicDash.Configurator/App.xaml create mode 100644 LogiDynamicDash.Configurator/App.xaml.cs create mode 100644 LogiDynamicDash.Configurator/LogiDynamicDash.Configurator.csproj create mode 100644 LogiDynamicDash.Configurator/MainWindow.xaml create mode 100644 LogiDynamicDash.Configurator/MainWindow.xaml.cs create mode 100644 LogiDynamicDash.Tests/ApplicationDisplayFactoryTests.cs create mode 100644 LogiDynamicDash.Tests/CompositeApplicationDisplayTests.cs create mode 100644 LogiDynamicDash.Tests/ConsoleDashboardTests.cs create mode 100644 LogiDynamicDash.Tests/DisciplineProfileRecommendationTests.cs create mode 100644 LogiDynamicDash.Tests/DisplayControllerTests.cs create mode 100644 LogiDynamicDash.Tests/Golden/layouts.txt create mode 100644 LogiDynamicDash.Tests/GoldenPreviewTests.cs create mode 100644 LogiDynamicDash.Tests/IRacingSessionIdentityTests.cs create mode 100644 LogiDynamicDash.Tests/LogiDynamicDash.Tests.csproj create mode 100644 LogiDynamicDash.Tests/LogiDynamicDashApplicationTests.cs create mode 100644 LogiDynamicDash.Tests/OfflineCommandLineTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50DrivingTrialOptionsTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50LowSpeedTrialOptionsTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50OledConfigurationFileTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50OledDeviceExchangeTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50OledDisplaySinkTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50OledFrameSchedulerTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50OledPreviewRunnerTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50OledProtocolTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50OledSessionTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50OledSimulationRunnerTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50StationaryTrialOptionsTests.cs create mode 100644 LogiDynamicDash.Tests/Rs50TelemetryFrameFormatterTests.cs create mode 100644 LogiDynamicDash.Tests/SanitizedApplicationRuntimeDiagnosticsTests.cs create mode 100644 LogiDynamicDash.Tests/SanitizedRs50OledDiagnosticsTests.cs create mode 100644 LogiDynamicDash.Tests/SessionProfileResolverTests.cs create mode 100644 LogiDynamicDash.Tests/TelemetryRecorderTests.cs create mode 100644 LogiDynamicDash.Tests/TelemetryReplayTests.cs create mode 100644 LogiDynamicDash.Tests/VirtualEnduranceTests.cs create mode 100644 LogiDynamicDash/Configuration/ApplicationDisplayFactory.cs create mode 100644 LogiDynamicDash/Configuration/Rs50DrivingTrialOptions.cs create mode 100644 LogiDynamicDash/Configuration/Rs50LowSpeedTrialOptions.cs create mode 100644 LogiDynamicDash/Configuration/Rs50OledConfigurationFile.cs create mode 100644 LogiDynamicDash/Configuration/Rs50StationaryTrialOptions.cs create mode 100644 LogiDynamicDash/Diagnostics/DiagnosticRs50OledSession.cs create mode 100644 LogiDynamicDash/Diagnostics/IApplicationRuntimeDiagnostics.cs create mode 100644 LogiDynamicDash/Diagnostics/IRs50OledDiagnostics.cs create mode 100644 LogiDynamicDash/Diagnostics/Rs50OledSessionFactory.cs create mode 100644 LogiDynamicDash/Diagnostics/SanitizedApplicationRuntimeDiagnostics.cs create mode 100644 LogiDynamicDash/Diagnostics/SanitizedRs50OledDiagnostics.cs create mode 100644 LogiDynamicDash/Displays/CompositeApplicationDisplay.cs create mode 100644 LogiDynamicDash/Displays/IApplicationDisplay.cs create mode 100644 LogiDynamicDash/Displays/Rs50OledDisplaySink.cs create mode 100644 LogiDynamicDash/Displays/Rs50OledFrameScheduler.cs create mode 100644 LogiDynamicDash/Displays/Rs50TelemetryFrameFormatter.cs create mode 100644 LogiDynamicDash/Hidpp/IRs50OledExchange.cs create mode 100644 LogiDynamicDash/Hidpp/Rs50OledProtocol.cs create mode 100644 LogiDynamicDash/Hidpp/Rs50OledProtocolException.cs create mode 100644 LogiDynamicDash/Hidpp/Rs50OledSession.cs create mode 100644 LogiDynamicDash/Hidpp/Rs50OledTransaction.cs create mode 100644 LogiDynamicDash/Hidpp/Transport/ConfirmedOledDeviceIdentity.cs create mode 100644 LogiDynamicDash/Hidpp/Transport/HidSharpRs50HidCatalog.cs create mode 100644 LogiDynamicDash/Hidpp/Transport/IRs50HidCatalog.cs create mode 100644 LogiDynamicDash/Hidpp/Transport/Rs50OledAcknowledgementTimeoutException.cs create mode 100644 LogiDynamicDash/Hidpp/Transport/Rs50OledDeviceExchange.cs create mode 100644 LogiDynamicDash/LogiDynamicDashApplication.cs create mode 100644 LogiDynamicDash/Models/DisciplineProfileRecommendations.cs create mode 100644 LogiDynamicDash/Models/IRacingSessionIdentity.cs create mode 100644 LogiDynamicDash/Models/Rs50OledConfiguration.cs create mode 100644 LogiDynamicDash/Models/Rs50OledFrame.cs create mode 100644 LogiDynamicDash/Models/SessionProfileResolver.cs create mode 100644 LogiDynamicDash/Offline/OfflineCommandLine.cs create mode 100644 LogiDynamicDash/Offline/Rs50OledFrameDescription.cs create mode 100644 LogiDynamicDash/Offline/Rs50OledPreviewRunner.cs create mode 100644 LogiDynamicDash/Offline/Rs50OledSimulationRunner.cs create mode 100644 LogiDynamicDash/Offline/Rs50TelemetryRecorder.cs create mode 100644 LogiDynamicDash/Offline/Rs50TelemetryReplayRunner.cs create mode 100644 LogiDynamicDash/Offline/SimulatedRs50OledExchange.cs create mode 100644 LogiDynamicDash/Properties/AssemblyInfo.cs create mode 100644 LogiDynamicDash/Services/IRacingSessionIdentityResolver.cs create mode 100644 LogiDynamicDash/Services/ITelemetrySource.cs create mode 100644 LogiDynamicDash/docs/OFFLINE_FAULT_MATRIX.md create mode 100644 LogiDynamicDash/docs/PRODUCT_AND_MONETIZATION_PLAN.md create mode 100644 LogiDynamicDash/docs/RS50_OLED_PRODUCTION_ARCHITECTURE.md create mode 100644 LogiDynamicDash/docs/WINDOWS_PACKAGE.md create mode 100644 THIRD_PARTY_NOTICES.md create mode 100644 logidynamicdash.example.json create mode 100644 replays/acceleration.json create mode 100644 replays/disconnect.json create mode 100644 replays/mode-transitions.json create mode 100644 replays/session-identity.json create mode 100644 scripts/Complete-WindowsPackage.ps1 create mode 100644 scripts/New-PackageSbom.ps1 create mode 100644 scripts/Test-Rs50OledProductionSurface.ps1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f35d301 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,143 @@ +name: CI + +on: + push: + branches: + - main + - codex/rs50-oled-production + pull_request: + +permissions: + contents: read + +jobs: + build-and-test: + runs-on: windows-latest + + steps: + - name: Check out source + uses: actions/checkout@v7 + + - name: Install .NET 10 SDK + uses: actions/setup-dotnet@v6 + with: + dotnet-version: 10.0.x + + - name: Restore + run: dotnet restore .\LogiDynamicDash.slnx + + - name: Build with warnings as errors + run: > + dotnet build .\LogiDynamicDash.slnx + -c Release + --no-restore + -warnaserror + + - name: Test + run: > + dotnet test .\LogiDynamicDash.slnx + -c Release + --no-build + + - name: Verify formatting + run: > + dotnet format .\LogiDynamicDash.slnx + --verify-no-changes + --no-restore + + - name: Audit RS50 production surface + shell: powershell + run: .\scripts\Test-Rs50OledProductionSurface.ps1 + + - name: Audit vulnerable packages + run: > + dotnet list .\LogiDynamicDash.slnx + package + --vulnerable + --include-transitive + + package-windows: + needs: build-and-test + runs-on: windows-latest + + steps: + - name: Check out source + uses: actions/checkout@v7 + + - name: Install .NET 10 SDK + uses: actions/setup-dotnet@v6 + with: + dotnet-version: 10.0.x + + - name: Restore Windows runtime + run: | + dotnet restore .\LogiDynamicDash\LogiDynamicDash.csproj -r win-x64 + dotnet restore .\LogiDynamicDash.Configurator\LogiDynamicDash.Configurator.csproj -r win-x64 + + - name: Publish framework-dependent Windows package + run: > + dotnet publish .\LogiDynamicDash\LogiDynamicDash.csproj + -c Release + -r win-x64 + --self-contained false + --no-restore + -o .\artifacts\LogiDynamicDash-win-x64 + + - name: Publish framework-dependent configurator + run: > + dotnet publish + .\LogiDynamicDash.Configurator\LogiDynamicDash.Configurator.csproj + -c Release + -r win-x64 + --self-contained false + --no-restore + -o .\artifacts\LogiDynamicDash-win-x64 + + - name: Complete and smoke-test framework-dependent package + shell: powershell + run: > + .\scripts\Complete-WindowsPackage.ps1 + -PackageRoot .\artifacts\LogiDynamicDash-win-x64 + -Version 0.2.0 + + - name: Upload Windows package + uses: actions/upload-artifact@v7 + with: + name: LogiDynamicDash-win-x64 + path: artifacts/LogiDynamicDash-win-x64 + if-no-files-found: error + retention-days: 14 + + - name: Publish self-contained Windows package + run: > + dotnet publish .\LogiDynamicDash\LogiDynamicDash.csproj + -c Release + -r win-x64 + --self-contained true + --no-restore + -o .\artifacts\LogiDynamicDash-win-x64-self-contained + + - name: Publish self-contained configurator + run: > + dotnet publish + .\LogiDynamicDash.Configurator\LogiDynamicDash.Configurator.csproj + -c Release + -r win-x64 + --self-contained true + --no-restore + -o .\artifacts\LogiDynamicDash-win-x64-self-contained + + - name: Complete and smoke-test self-contained package + shell: powershell + run: > + .\scripts\Complete-WindowsPackage.ps1 + -PackageRoot .\artifacts\LogiDynamicDash-win-x64-self-contained + -Version 0.2.0 + + - name: Upload self-contained Windows package + uses: actions/upload-artifact@v7 + with: + name: LogiDynamicDash-win-x64-self-contained + path: artifacts/LogiDynamicDash-win-x64-self-contained + if-no-files-found: error + retention-days: 14 diff --git a/.gitignore b/.gitignore index 93df31b..66ae82b 100644 --- a/.gitignore +++ b/.gitignore @@ -379,6 +379,14 @@ MigrationBackup/ # Fody - auto-generated XML schema FodyWeavers.xsd +# Local hardware-research artifacts +.tmp/ +.logs/ +*.pcap +*.pcapng +*.mov +*.MOV + # VS Code files for those working on multiple tools .vscode/* !.vscode/settings.json diff --git a/LogiDynamicDash.Configurator/App.xaml b/LogiDynamicDash.Configurator/App.xaml new file mode 100644 index 0000000..cba0c76 --- /dev/null +++ b/LogiDynamicDash.Configurator/App.xaml @@ -0,0 +1,7 @@ + + + + diff --git a/LogiDynamicDash.Configurator/App.xaml.cs b/LogiDynamicDash.Configurator/App.xaml.cs new file mode 100644 index 0000000..9a6c03b --- /dev/null +++ b/LogiDynamicDash.Configurator/App.xaml.cs @@ -0,0 +1,7 @@ +using System.Windows; + +namespace LogiDynamicDash.Configurator; + +public partial class App : Application +{ +} diff --git a/LogiDynamicDash.Configurator/LogiDynamicDash.Configurator.csproj b/LogiDynamicDash.Configurator/LogiDynamicDash.Configurator.csproj new file mode 100644 index 0000000..77eb3db --- /dev/null +++ b/LogiDynamicDash.Configurator/LogiDynamicDash.Configurator.csproj @@ -0,0 +1,17 @@ + + + + WinExe + net10.0-windows + true + enable + enable + LogiDynamicDash.Configurator + 0.2.0 + + + + + + + diff --git a/LogiDynamicDash.Configurator/MainWindow.xaml b/LogiDynamicDash.Configurator/MainWindow.xaml new file mode 100644 index 0000000..f697842 --- /dev/null +++ b/LogiDynamicDash.Configurator/MainWindow.xaml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +