Skip to content

Commit 848f7d3

Browse files
committed
Rename shipped app to SimpleOps and harden desktop GSX voice controller
1 parent 9f0928b commit 848f7d3

101 files changed

Lines changed: 37211 additions & 410 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/dotnet-desktop.yml

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# .github/workflows/windows-desktop.yml
2-
31
name: Windows Desktop Build
42

53
on:
@@ -20,7 +18,7 @@ env:
2018
PROJECT_FILE: SimpleOps.GsxRamp.csproj
2119
CONFIGURATION: Release
2220
PLATFORM: x64
23-
EXE_PATH: bin\Release\SimpleOps.GsxRamp.exe
21+
EXE_PATH: bin\Release\SimpleOps.exe
2422
ZIP_NAME: SimpleOPS-windows-x64.zip
2523

2624
jobs:
@@ -45,13 +43,19 @@ jobs:
4543
/p:Configuration=$env:CONFIGURATION `
4644
/p:Platform=$env:PLATFORM `
4745
/p:PlatformTarget=x64 `
46+
/p:UseSharedCompilation=false `
4847
/m
4948
5049
- name: Run parser tests
5150
shell: pwsh
5251
run: |
5352
& $env:EXE_PATH --run-parser-tests
5453
54+
- name: Run dry-run smoke test
55+
shell: pwsh
56+
run: |
57+
& $env:EXE_PATH --no-speech --no-voice --dry-run --run-duration-seconds 1
58+
5559
# Optional signing.
5660
# This only runs if you add WINDOWS_SIGNING_CERT_BASE64 as a GitHub secret.
5761
- name: Sign executable
@@ -95,8 +99,23 @@ jobs:
9599
New-Item -ItemType Directory -Force -Path dist\package | Out-Null
96100
97101
Copy-Item $env:EXE_PATH dist\package\
102+
Copy-Item bin\Release\*.dll dist\package\ -ErrorAction Stop
98103
Copy-Item README.md dist\package\ -ErrorAction SilentlyContinue
99-
Copy-Item LICENSE dist\package\ -ErrorAction SilentlyContinue
104+
Copy-Item license.md dist\package\ -ErrorAction SilentlyContinue
105+
106+
@(
107+
'SimpleOps.exe',
108+
'Microsoft.FlightSimulator.SimConnect.dll',
109+
'SimConnect.dll',
110+
'NAudio.dll',
111+
'NAudio.Core.dll',
112+
'NAudio.Wasapi.dll',
113+
'NAudio.WinMM.dll'
114+
) | ForEach-Object {
115+
if (-not (Test-Path (Join-Path 'dist\\package' $_))) {
116+
throw "Missing packaged dependency: $_"
117+
}
118+
}
100119
101120
Compress-Archive `
102121
-Path dist\package\* `

NAudio.Core.dll

184 KB
Binary file not shown.

NAudio.Wasapi.dll

175 KB
Binary file not shown.

NAudio.WinMM.dll

56 KB
Binary file not shown.

NAudio.dll

7.5 KB
Binary file not shown.

README.md

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,63 @@
1-
# SimpleOps GSX Ramp
1+
# SimpleOps
22

3-
Compiled .NET Framework 4.8 Windows desktop app for Microsoft Flight Simulator 2020/2024 with GSX Remote Control integration.
3+
Standalone `.NET Framework 4.8` Windows desktop app for Microsoft Flight Simulator 2020/2024 with GSX Remote Control integration.
44

5-
It polls your local telemetry API at `http://127.0.0.1:4789/telemetry`, checks `onGround`, and only becomes active when the aircraft is on the ground. It listens for voice phrases, enables GSX Remote Control mode through SimConnect, reads the live GSX menu file, and selects the matching menu entry automatically.
5+
It polls `http://127.0.0.1:4789/telemetry`, keeps the `onGround` safety gate intact, listens for ramp phrases, and drives GSX through SimConnect Remote Control mode plus live GSX menu matching.
66

7-
## What it does
7+
## Highlights
88

9-
- Polls your local telemetry bridge
10-
- Arms only when telemetry says `onGround = true`
11-
- Recognizes:
12-
- `connect ground power`
13-
- `connect ground power unit`
14-
- `prepare for pushback`
15-
- `push south west`
16-
- `push back south west`
17-
- `push south`
18-
- `push west`
19-
- Sends the matching request into GSX through GSX Remote Control mode plus live menu selection
20-
- Skips unsafe actions when the phrase is blocked, weak, unknown, ambiguous, or the GSX menu is ambiguous
9+
- Real desktop UI with live status, logs, parser diagnostics, and in-app settings
10+
- Persisted settings in `%AppData%\SimpleOps\settings.json`
11+
- If `%AppData%` is unavailable, the app falls back to a local `appdata` folder beside the executable
12+
- OpenAI ramp voice playback with the API key stored in Windows Credential Manager
13+
- Selectable microphone and speaker devices
14+
- Radio-style output controls
15+
- volume
16+
- left / right / both channel
17+
- pan
18+
- Built-in deterministic phrase coverage plus user-editable aliases in `%AppData%\SimpleOps\phrases.json`
19+
- GSX safety checks for unknown, weak, blocked, missing-menu, and ambiguous-menu cases
2120

22-
## Project
23-
24-
The source is in a proper `.NET Framework 4.8` project:
21+
## Main files
2522

23+
- [SimpleOps.exe](C:\Users\Alex\SimpleOPS\SimpleOps.exe)
2624
- [SimpleOps.GsxRamp.csproj](C:\Users\Alex\SimpleOPS\SimpleOps.GsxRamp.csproj)
27-
28-
The built executables are:
29-
30-
- [SimpleOps.GsxRamp.exe](C:\Users\Alex\SimpleOPS\SimpleOps.GsxRamp.exe)
31-
- [SimpleOps.GsxRamp.exe](C:\Users\Alex\SimpleOPS\bin\Release\SimpleOps.GsxRamp.exe)
25+
- [RampControlForm.cs](C:\Users\Alex\SimpleOPS\src\RampControlForm.cs)
26+
- [RampController.cs](C:\Users\Alex\SimpleOPS\src\RampController.cs)
27+
- [OpenAiVoiceOutputService.cs](C:\Users\Alex\SimpleOPS\src\OpenAiVoiceOutputService.cs)
28+
- [LocalSpeechInputService.cs](C:\Users\Alex\SimpleOPS\src\LocalSpeechInputService.cs)
3229

3330
## Run
3431

35-
Launch the desktop application directly:
32+
Launch the desktop app directly:
3633

3734
```cmd
38-
C:\Users\Alex\SimpleOPS\SimpleOps.GsxRamp.exe
35+
C:\Users\Alex\SimpleOPS\SimpleOps.exe
3936
```
4037

4138
## Helpful flags
4239

40+
Dry-run without live GSX actions:
41+
4342
```cmd
44-
C:\Users\Alex\SimpleOPS\SimpleOps.GsxRamp.exe --no-speech --run-duration-seconds 5
43+
C:\Users\Alex\SimpleOPS\SimpleOps.exe --dry-run
4544
```
4645

46+
Dry-run one phrase:
47+
4748
```cmd
48-
C:\Users\Alex\SimpleOPS\SimpleOps.GsxRamp.exe --dry-run --no-speech --test-phrase "push south west"
49+
C:\Users\Alex\SimpleOPS\SimpleOps.exe --dry-run --no-speech --no-voice --test-phrase "request catering"
4950
```
5051

51-
Run the built-in parser and safety harness without sending live GSX keypresses:
52+
Run the built-in parser and safety harness:
5253

5354
```cmd
54-
C:\Users\Alex\SimpleOPS\SimpleOps.GsxRamp.exe --run-parser-tests
55+
C:\Users\Alex\SimpleOPS\SimpleOps.exe --run-parser-tests
5556
```
5657

5758
## Notes
5859

5960
- GSX must already be installed and running.
60-
- The app uses the Microsoft Flight Simulator managed SimConnect wrapper and native `SimConnect.dll` copied next to the executable.
61-
- The FSDreamTeam install root is read from `HKCU\Software\Fsdreamteam\root`.
62-
- The pushback submenu selection is text-based, so if GSX uses different wording on your setup, update the pattern list in [RampController.cs](C:\Users\Alex\SimpleOPS\src\RampController.cs).
63-
- Parser tests and dry-run mode do not send real GSX keypresses.
61+
- The app keeps the `onGround == true` gate exactly intact before GSX actions are allowed.
62+
- OpenAI is used for ramp voice output only in this version. Speech recognition remains local.
63+
- The project now uses repo-local SimConnect and NAudio dependencies so the GitHub desktop build can run off-machine.

SimpleOps.GsxRamp.csproj

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<ProjectGuid>{5DD281AB-D51D-489B-A75D-5A370B52E8B3}</ProjectGuid>
88
<OutputType>WinExe</OutputType>
99
<RootNamespace>SimpleOps.GsxRamp</RootNamespace>
10-
<AssemblyName>SimpleOps.GsxRamp</AssemblyName>
10+
<AssemblyName>SimpleOps</AssemblyName>
1111
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
1212
<FileAlignment>512</FileAlignment>
1313
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
@@ -31,19 +31,46 @@
3131
<Reference Include="System.Windows.Forms" />
3232
<Reference Include="System.Web.Extensions" />
3333
<Reference Include="Microsoft.CSharp" />
34+
<Reference Include="NAudio">
35+
<HintPath>packages\NAudio.2.2.1\expanded\lib\net472\NAudio.dll</HintPath>
36+
<Private>true</Private>
37+
</Reference>
38+
<Reference Include="NAudio.Core">
39+
<HintPath>packages\NAudio.Core.2.2.1\expanded\lib\netstandard2.0\NAudio.Core.dll</HintPath>
40+
<Private>true</Private>
41+
</Reference>
42+
<Reference Include="NAudio.Wasapi">
43+
<HintPath>packages\NAudio.Wasapi.2.2.1\expanded\lib\netstandard2.0\NAudio.Wasapi.dll</HintPath>
44+
<Private>true</Private>
45+
</Reference>
46+
<Reference Include="NAudio.WinMM">
47+
<HintPath>packages\NAudio.WinMM.2.2.1\expanded\lib\netstandard2.0\NAudio.WinMM.dll</HintPath>
48+
<Private>true</Private>
49+
</Reference>
3450
<Reference Include="Microsoft.FlightSimulator.SimConnect">
35-
<HintPath>C:\MSFS 2024 SDK\SimConnect SDK\lib\managed\Microsoft.FlightSimulator.SimConnect.dll</HintPath>
51+
<HintPath>lib\SimConnect\Microsoft.FlightSimulator.SimConnect.dll</HintPath>
3652
<Private>true</Private>
3753
</Reference>
3854
</ItemGroup>
3955
<ItemGroup>
56+
<Compile Include="src\AppLogger.cs" />
57+
<Compile Include="src\AppPaths.cs" />
58+
<Compile Include="src\AppSettings.cs" />
59+
<Compile Include="src\AudioDeviceCatalog.cs" />
60+
<Compile Include="src\DisabledSpeechInputService.cs" />
4061
<Compile Include="src\Program.cs" />
4162
<Compile Include="src\Options.cs" />
4263
<Compile Include="src\TelemetrySnapshot.cs" />
64+
<Compile Include="src\ITelemetryClient.cs" />
4365
<Compile Include="src\TelemetryClient.cs" />
4466
<Compile Include="src\GsxPaths.cs" />
4567
<Compile Include="src\IGsxMenuController.cs" />
4668
<Compile Include="src\GsxMenuDriver.cs" />
69+
<Compile Include="src\ICredentialStore.cs" />
70+
<Compile Include="src\ISettingsStore.cs" />
71+
<Compile Include="src\JsonSettingsStore.cs" />
72+
<Compile Include="src\PhraseAliasStore.cs" />
73+
<Compile Include="src\WindowsCredentialStore.cs" />
4774
<Compile Include="src\TextUtility.cs" />
4875
<Compile Include="src\RampIntent.cs" />
4976
<Compile Include="src\FuelParser.cs" />
@@ -53,17 +80,23 @@
5380
<Compile Include="src\RampPhraseParser.Support.cs" />
5481
<Compile Include="src\RampCommandProcessor.cs" />
5582
<Compile Include="src\ParserTestHarness.cs" />
83+
<Compile Include="src\SpeechServices.cs" />
84+
<Compile Include="src\LocalSpeechInputService.cs" />
85+
<Compile Include="src\OpenAiVoiceOutputService.cs" />
86+
<Compile Include="src\SilentVoiceOutputService.cs" />
87+
<Compile Include="src\NullGsxMenuController.cs" />
5688
<Compile Include="src\RampController.cs" />
5789
<Compile Include="src\RampControlForm.cs" />
90+
<Compile Include="src\SettingsForm.cs" />
5891
</ItemGroup>
5992
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
6093
<Target Name="CopyManagedSimConnect" AfterTargets="Build">
6194
<Copy
62-
SourceFiles="C:\MSFS 2024 SDK\SimConnect SDK\lib\managed\Microsoft.FlightSimulator.SimConnect.dll"
95+
SourceFiles="lib\SimConnect\Microsoft.FlightSimulator.SimConnect.dll"
6396
DestinationFolder="$(TargetDir)"
6497
SkipUnchangedFiles="true" />
6598
<Copy
66-
SourceFiles="C:\MSFS 2024 SDK\SimConnect SDK\lib\SimConnect.dll"
99+
SourceFiles="lib\SimConnect\SimConnect.dll"
67100
DestinationFolder="$(TargetDir)"
68101
SkipUnchangedFiles="true" />
69102
</Target>

SimpleOps.GsxRamp.exe

-61.5 KB
Binary file not shown.

SimpleOps.exe

105 KB
Binary file not shown.
157 KB
Binary file not shown.

0 commit comments

Comments
 (0)