Befehle in die Simulation schicken #129

Open
opened 2026-07-13 18:30:09 +02:00 by thomasknaus · 1 comment
thomasknaus commented 2026-07-13 18:30:09 +02:00 (Migrated from github.com)

Erster Anwendungsfall ist
Bitte erstelle eine Brücke zwischen unserer generativen Sprachsteuerung und der iRacing Write-Back API (PitCommandExecutor), die wir bereits konzipiert haben. Wir benötigen einen iRacing_PitIntentParser.

Logik & Architektur:

  1. Wenn der Fahrer einen Funkspruch absetzt (z. B. "Bernd, wir brauchen nur außen links neue Reifen und 40 Liter Sprit"), wertet Qwen diesen Intent aus.
  2. Wir erweitern den System-Prompt von Qwen so, dass es bei erkannten Boxen-Instruktionen ein strukturiertes JSON-Objekt am Ende seiner Text-Antwort anhängt.
    Beispiel-Antwort von Qwen:
    "Copy, Box diese Runde, 40 Liter und linke Reifen. Out.
    { "intent": "PIT_COMMAND", "fuel_add_liters": 40, "tyres": ["LF", "LR"], "clear_tears": false }
    ```"
    
  3. Der PitIntentParser in unserem System fängt die Antwort ab, filtert das JSON heraus, schickt den normalen Text an die TTS-Engine (Kokoro) und leitet die JSON-Parameter an den nativen Rust irsdk_BroadcastPitCommand weiter.
  4. iRacing-spezifische Commands: Nutze die Enum-Flags aus der iRacing API (irsdk_PitCommand_Fuel, irsdk_PitCommand_LF, etc.), um das Auto entsprechend dem JSON zu konfigurieren.
Erster Anwendungsfall ist Bitte erstelle eine Brücke zwischen unserer generativen Sprachsteuerung und der iRacing Write-Back API (`PitCommandExecutor`), die wir bereits konzipiert haben. Wir benötigen einen `iRacing_PitIntentParser`. ### Logik & Architektur: 1. Wenn der Fahrer einen Funkspruch absetzt (z. B. "Bernd, wir brauchen nur außen links neue Reifen und 40 Liter Sprit"), wertet Qwen diesen Intent aus. 2. Wir erweitern den System-Prompt von Qwen so, dass es bei erkannten Boxen-Instruktionen ein strukturiertes JSON-Objekt am Ende seiner Text-Antwort anhängt. Beispiel-Antwort von Qwen: "Copy, Box diese Runde, 40 Liter und linke Reifen. Out. ```json { "intent": "PIT_COMMAND", "fuel_add_liters": 40, "tyres": ["LF", "LR"], "clear_tears": false } ```" 3. Der `PitIntentParser` in unserem System fängt die Antwort ab, filtert das JSON heraus, schickt den normalen Text an die TTS-Engine (Kokoro) und leitet die JSON-Parameter an den nativen Rust `irsdk_BroadcastPitCommand` weiter. 4. iRacing-spezifische Commands: Nutze die Enum-Flags aus der iRacing API (`irsdk_PitCommand_Fuel`, `irsdk_PitCommand_LF`, etc.), um das Auto entsprechend dem JSON zu konfigurieren.
thomasknaus commented 2026-07-13 22:04:26 +02:00 (Migrated from github.com)

Hier ist dein Master‑Prompt für das komplette Feature, sauber in drei Ebenen gegliedert: Game‑Screens, Race‑Engineer‑Screen und die eigentliche PitIntent‑Pipeline.


Master‑Prompt: „Simulationssensitiver PitIntentParser + Hotkey‑Brücke für iRacing, ACC, AC Evo und F1“

Bitte implementiere das neue Feature PitIntentParser als simulationssensitiven Brückenmechanismus zwischen unserer generativen Sprachsteuerung (Qwen) und den Pit/Pit‑Setup‑Systemen der jeweiligen Simulationen. Das Feature besteht aus drei Teilen:


Teil 1: Erweiterung der Game‑Screens (Hotkey‑Konfiguration pro Simulation)

Ziel:
Jede Simulation, die keine Write‑Back API besitzt (ACC, AC Evo, F1), bekommt einen eigenen Konfigurations‑Screen, in dem der Nutzer die relevanten Hotkeys hinterlegt. iRacing benötigt keine Erweiterung, da dort die native Write‑Back API genutzt wird.

Umsetzung:

  1. Erweitere die Game‑Settings‑Screens für:

    • ACC
    • AC Evo
    • F1‑Games (aktuelle Versionen)
  2. Für jede dieser Sims einen Abschnitt „Pit & Setup Hotkeys“ hinzufügen mit folgenden Feldern:

    F1:

    • MFD Open
    • MFD Left
    • MFD Right
    • MFD Confirm
    • Front Wing Up
    • Front Wing Down
    • Rear Wing Up
    • Rear Wing Down
    • (optional) Tyre Compound Next / Previous, falls vorhanden

    ACC / AC Evo:

    • Pit Menu Open
    • Pit Menu Next Tyre Compound
    • Pit Menu Fuel Up
    • Pit Menu Fuel Down
    • Setup Open
    • Setup Aero Tab
    • Setup Wing Up
    • Setup Wing Down
    • Setup Save / Confirm
  3. Speichere diese Hotkeys zentral im GameState bzw. in einer HotkeyConfig:

    pub struct HotkeyConfigF1 {
        pub mfd_open: KeyCode,
        pub mfd_left: KeyCode,
        pub mfd_right: KeyCode,
        pub mfd_confirm: KeyCode,
        pub front_wing_up: KeyCode,
        pub front_wing_down: KeyCode,
        pub rear_wing_up: KeyCode,
        pub rear_wing_down: KeyCode,
    }
    
    pub struct HotkeyConfigAcc {
        pub pit_menu_open: KeyCode,
        pub pit_menu_next_compound: KeyCode,
        pub pit_menu_fuel_up: KeyCode,
        pub pit_menu_fuel_down: KeyCode,
        pub setup_open: KeyCode,
        pub setup_aero_tab: KeyCode,
        pub setup_wing_up: KeyCode,
        pub setup_wing_down: KeyCode,
        pub setup_save: KeyCode,
    }
    
    pub struct GameState {
        pub simulation_id: SimulationId,
        pub online_session: bool,
        pub hotkeys_f1: Option<HotkeyConfigF1>,
        pub hotkeys_acc: Option<HotkeyConfigAcc>,
        // iRacing braucht hier keine Hotkeys
        // weitere Felder …
    }
    
  4. Hinweis im jeweiligen Game‑Screen:
    „Diese Hotkeys müssen exakt den In‑Game‑Keybinds entsprechen, damit der PitIntentParser das MFD/Pit‑Menü korrekt steuern kann.“


Teil 2: Erweiterung des Race‑Engineer‑Screens (Feature‑Panel + Warnung)

Ziel:
Der Race‑Engineer‑Screen bekommt ein eigenes Panel für das Feature PitIntentParser, inklusive Status‑Anzeige und klarer Warnung, dass die Funktion für ACC/AC Evo/F1 nur mit gepflegten Hotkeys funktioniert.

Umsetzung:

  1. Neues Panel im Race‑Engineer‑Screen:
    „Pit Intent / Voice‑Pitstop“

  2. Anzeige‑Elemente:

    • Simulation: iRacing / ACC / AC Evo / F1
    • Status:
      • „aktiv (iRacing Write‑Back)“
      • „aktiv (Hotkey‑Steuerung, Hotkeys konfiguriert)“
      • „deaktiv (Hotkeys fehlen)“
    • Letzter erkannter Pit‑Intent:
      • Fuel, Compound, Reifenwechsel (true/false), Front‑Wing, Rear‑Wing
    • Ausführungsmodus:
      • iRacing: „Write‑Back API“
      • ACC/F1: „Hotkey‑Sequenz“
  3. Warnhinweis im Panel (deutlich sichtbar):

    • Text:
      „Achtung: Für ACC, AC Evo und F1 müssen die Pit‑ und Setup‑Hotkeys im jeweiligen Game‑Screen gepflegt werden. Ohne korrekte Hotkeys kann das System das MFD/Pit‑Menü nicht automatisch steuern.“
  4. Optional: Checkbox im Race‑Engineer‑Screen:

    • „PitIntentParser aktivieren/deaktivieren“
      (globales Feature‑Toggle)

Teil 3: PitIntentParser – Qwen‑Brücke, JSON‑Parsing, iRacing‑Write‑Back & ACC/F1‑Hotkey‑Sequenzen

Ziel:
Ein zentrales Feature, das Qwen‑Antworten auswertet, JSON‑Intents extrahiert, TTS‑Text trennt und je nach Simulation entweder iRacing‑Write‑Back ausführt oder Hotkey‑Sequenzen in ACC/AC Evo/F1 abspielt.

Logik & Architektur:

  1. Qwen‑System‑Prompt‑Erweiterung

    Qwen soll bei erkannten Pit‑Instruktionen am Ende seiner Antwort einen JSON‑Block anhängen:

    {
      "intent": "PIT_COMMAND",
      "fuel_add_liters": 30,
      "change_tyres": true,
      "tyre_compound": "SOFT",
      "front_wing": 2,
      "rear_wing": 0
    }
    

    Textbeispiel:

    „Copy, Box nächste Runde, 30 Liter, Soft und Frontflügel +2.

    { ... }
    ```“
    
  2. PitIntentParser – zentrale Struktur

    pub struct PitIntentParser;
    
    pub struct PitCommand {
        pub fuel_add_liters: Option<f32>,
        pub change_tyres: bool,
        pub tyre_compound: Option<String>,
        pub front_wing: Option<i32>,
        pub rear_wing: Option<i32>,
    }
    
    impl PitIntentParser {
        pub fn process_qwen_reply(
            &self,
            reply_text: &str,
            game_state: &GameState,
        ) -> (String, Option<PitCommand>) {
            // 1) JSON-Block extrahieren
            // 2) Textteil für TTS zurückgeben
            // 3) PitCommand aus JSON parsen
        }
    
        pub fn execute(
            &self,
            pit_cmd: &PitCommand,
            game_state: &GameState,
        ) {
            match game_state.simulation_id {
                SimulationId::IRacing => self.execute_iracing(pit_cmd),
                SimulationId::F1      => self.execute_f1_hotkeys(pit_cmd, &game_state.hotkeys_f1),
                SimulationId::ACC     => self.execute_acc_hotkeys(pit_cmd, &game_state.hotkeys_acc),
                SimulationId::AC_Evo  => self.execute_acc_hotkeys(pit_cmd, &game_state.hotkeys_acc),
                _                     => { /* keine Aktion */ }
            }
        }
    }
    
  3. iRacing‑Pfad (Write‑Back API)

    • Nutze irsdk_BroadcastPitCommand mit den entsprechenden Flags:
      • Fuel: irsdk_PitCommand_Fuel
      • Reifen: irsdk_PitCommand_LF/LR/RF/RR (je nach Logik)
      • Compound: irsdk_PitCommand_TireCompound
      • Wing (falls verfügbar): entsprechender iRacing‑Flag
    • Der Pitstop ist nach Ausführung vollständig vorbereitet, Fahrer kann in der nächsten Runde in die Box fahren.
  4. F1‑Pfad (MFD‑Hotkey‑Sequenzen)

    • Voraussetzung: game_state.hotkeys_f1 ist gesetzt, sonst keine Aktion und Warnung im GUI.
    • Sequenz (Beispiel):
      • mfd_open
      • Navigation zum Reifen‑Tab (mfd_left/mfd_right)
      • Tyre‑Compound setzen (Soft/Medium/Hard/Wet)
      • Navigation zum Wing‑Tab
      • Front‑Wing/Rear‑Wing per front_wing_up/down, rear_wing_up/down auf Zielwert bringen
      • mfd_confirm
    • Parallel dazu: Race‑Engineer‑GUI zeigt die geplante Konfiguration und den Status „Hotkey‑Sequenz ausgeführt“.
  5. ACC / AC Evo‑Pfad (Pit‑Menü + Setup‑Hotkeys)

    • Voraussetzung: game_state.hotkeys_acc ist gesetzt.
    • Pitstop:
      • pit_menu_open
      • Compound wählen über pit_menu_next_compound
      • Fuel über pit_menu_fuel_up/down auf Zielwert bringen
    • Flügel:
      • setup_open
      • setup_aero_tab
      • Wing über setup_wing_up/down auf Zielwert bringen
      • setup_save
    • GUI zeigt: „Pitstop vorbereitet: {fuel}L, {compound}, Front Wing {front_wing}, Rear Wing {rear_wing} – via Hotkeys“.
  6. Race‑Engineer‑GUI‑Integration

    • Anzeige des letzten PitCommand inkl. Simulation und Ausführungsmodus:
      • iRacing: „Write‑Back API“
      • ACC/F1: „Hotkey‑Sequenz (Simulation‑Hotkeys)“
    • Warnung, wenn Hotkeys fehlen:
      • „Hotkeys für diese Simulation nicht konfiguriert – PitIntentParser arbeitet nur als Voice‑Overlay, keine automatische Steuerung.“
  7. Registry‑Eintrag

    {
      "id": "pit_intent_parser",
      "name": "Pit Intent Parser",
      "type": "feature",
      "online_only": true,
      "visible_in_gui": true
    }
    

Damit hast du einen Master‑Prompt, der:

  • die Game‑Screens für ACC/AC Evo/F1 um Hotkey‑Konfiguration erweitert,
  • den Race‑Engineer‑Screen um ein klares Feature‑Panel + Warnung ergänzt,
  • und die komplette PitIntent‑Pipeline (Qwen → JSON → TTS → iRacing‑Write‑Back / ACC/F1‑Hotkeys) beschreibt.

Wenn du magst, können wir den jetzt noch in eine „Coding‑Agent‑Version“ übersetzen, die direkt in deinem Repo loslegt.

Hier ist dein Master‑Prompt für das komplette Feature, sauber in drei Ebenen gegliedert: Game‑Screens, Race‑Engineer‑Screen und die eigentliche PitIntent‑Pipeline. --- ### Master‑Prompt: „Simulationssensitiver PitIntentParser + Hotkey‑Brücke für iRacing, ACC, AC Evo und F1“ Bitte implementiere das neue Feature `PitIntentParser` als simulationssensitiven Brückenmechanismus zwischen unserer generativen Sprachsteuerung (Qwen) und den Pit/Pit‑Setup‑Systemen der jeweiligen Simulationen. Das Feature besteht aus drei Teilen: --- #### Teil 1: Erweiterung der Game‑Screens (Hotkey‑Konfiguration pro Simulation) **Ziel:** Jede Simulation, die keine Write‑Back API besitzt (ACC, AC Evo, F1), bekommt einen eigenen Konfigurations‑Screen, in dem der Nutzer die relevanten Hotkeys hinterlegt. iRacing benötigt keine Erweiterung, da dort die native Write‑Back API genutzt wird. **Umsetzung:** 1. Erweitere die Game‑Settings‑Screens für: - **ACC** - **AC Evo** - **F1‑Games (aktuelle Versionen)** 2. Für jede dieser Sims einen Abschnitt „Pit & Setup Hotkeys“ hinzufügen mit folgenden Feldern: **F1:** - **MFD Open** - **MFD Left** - **MFD Right** - **MFD Confirm** - **Front Wing Up** - **Front Wing Down** - **Rear Wing Up** - **Rear Wing Down** - (optional) **Tyre Compound Next / Previous**, falls vorhanden **ACC / AC Evo:** - **Pit Menu Open** - **Pit Menu Next Tyre Compound** - **Pit Menu Fuel Up** - **Pit Menu Fuel Down** - **Setup Open** - **Setup Aero Tab** - **Setup Wing Up** - **Setup Wing Down** - **Setup Save / Confirm** 3. Speichere diese Hotkeys zentral im `GameState` bzw. in einer `HotkeyConfig`: ```rust pub struct HotkeyConfigF1 { pub mfd_open: KeyCode, pub mfd_left: KeyCode, pub mfd_right: KeyCode, pub mfd_confirm: KeyCode, pub front_wing_up: KeyCode, pub front_wing_down: KeyCode, pub rear_wing_up: KeyCode, pub rear_wing_down: KeyCode, } pub struct HotkeyConfigAcc { pub pit_menu_open: KeyCode, pub pit_menu_next_compound: KeyCode, pub pit_menu_fuel_up: KeyCode, pub pit_menu_fuel_down: KeyCode, pub setup_open: KeyCode, pub setup_aero_tab: KeyCode, pub setup_wing_up: KeyCode, pub setup_wing_down: KeyCode, pub setup_save: KeyCode, } pub struct GameState { pub simulation_id: SimulationId, pub online_session: bool, pub hotkeys_f1: Option<HotkeyConfigF1>, pub hotkeys_acc: Option<HotkeyConfigAcc>, // iRacing braucht hier keine Hotkeys // weitere Felder … } ``` 4. Hinweis im jeweiligen Game‑Screen: **„Diese Hotkeys müssen exakt den In‑Game‑Keybinds entsprechen, damit der PitIntentParser das MFD/Pit‑Menü korrekt steuern kann.“** --- #### Teil 2: Erweiterung des Race‑Engineer‑Screens (Feature‑Panel + Warnung) **Ziel:** Der Race‑Engineer‑Screen bekommt ein eigenes Panel für das Feature `PitIntentParser`, inklusive Status‑Anzeige und klarer Warnung, dass die Funktion für ACC/AC Evo/F1 nur mit gepflegten Hotkeys funktioniert. **Umsetzung:** 1. Neues Panel im Race‑Engineer‑Screen: **„Pit Intent / Voice‑Pitstop“** 2. Anzeige‑Elemente: - **Simulation:** iRacing / ACC / AC Evo / F1 - **Status:** - „aktiv (iRacing Write‑Back)“ - „aktiv (Hotkey‑Steuerung, Hotkeys konfiguriert)“ - „deaktiv (Hotkeys fehlen)“ - **Letzter erkannter Pit‑Intent:** - Fuel, Compound, Reifenwechsel (true/false), Front‑Wing, Rear‑Wing - **Ausführungsmodus:** - iRacing: „Write‑Back API“ - ACC/F1: „Hotkey‑Sequenz“ 3. Warnhinweis im Panel (deutlich sichtbar): - **Text:** „Achtung: Für ACC, AC Evo und F1 müssen die Pit‑ und Setup‑Hotkeys im jeweiligen Game‑Screen gepflegt werden. Ohne korrekte Hotkeys kann das System das MFD/Pit‑Menü nicht automatisch steuern.“ 4. Optional: Checkbox im Race‑Engineer‑Screen: - **„PitIntentParser aktivieren/deaktivieren“** (globales Feature‑Toggle) --- #### Teil 3: PitIntentParser – Qwen‑Brücke, JSON‑Parsing, iRacing‑Write‑Back & ACC/F1‑Hotkey‑Sequenzen **Ziel:** Ein zentrales Feature, das Qwen‑Antworten auswertet, JSON‑Intents extrahiert, TTS‑Text trennt und je nach Simulation entweder iRacing‑Write‑Back ausführt oder Hotkey‑Sequenzen in ACC/AC Evo/F1 abspielt. **Logik & Architektur:** 1. **Qwen‑System‑Prompt‑Erweiterung** Qwen soll bei erkannten Pit‑Instruktionen am Ende seiner Antwort einen JSON‑Block anhängen: ```json { "intent": "PIT_COMMAND", "fuel_add_liters": 30, "change_tyres": true, "tyre_compound": "SOFT", "front_wing": 2, "rear_wing": 0 } ``` Textbeispiel: > „Copy, Box nächste Runde, 30 Liter, Soft und Frontflügel +2. > ```json > { ... } > ```“ 2. **PitIntentParser – zentrale Struktur** ```rust pub struct PitIntentParser; pub struct PitCommand { pub fuel_add_liters: Option<f32>, pub change_tyres: bool, pub tyre_compound: Option<String>, pub front_wing: Option<i32>, pub rear_wing: Option<i32>, } impl PitIntentParser { pub fn process_qwen_reply( &self, reply_text: &str, game_state: &GameState, ) -> (String, Option<PitCommand>) { // 1) JSON-Block extrahieren // 2) Textteil für TTS zurückgeben // 3) PitCommand aus JSON parsen } pub fn execute( &self, pit_cmd: &PitCommand, game_state: &GameState, ) { match game_state.simulation_id { SimulationId::IRacing => self.execute_iracing(pit_cmd), SimulationId::F1 => self.execute_f1_hotkeys(pit_cmd, &game_state.hotkeys_f1), SimulationId::ACC => self.execute_acc_hotkeys(pit_cmd, &game_state.hotkeys_acc), SimulationId::AC_Evo => self.execute_acc_hotkeys(pit_cmd, &game_state.hotkeys_acc), _ => { /* keine Aktion */ } } } } ``` 3. **iRacing‑Pfad (Write‑Back API)** - Nutze `irsdk_BroadcastPitCommand` mit den entsprechenden Flags: - Fuel: `irsdk_PitCommand_Fuel` - Reifen: `irsdk_PitCommand_LF/LR/RF/RR` (je nach Logik) - Compound: `irsdk_PitCommand_TireCompound` - Wing (falls verfügbar): entsprechender iRacing‑Flag - Der Pitstop ist nach Ausführung vollständig vorbereitet, Fahrer kann in der nächsten Runde in die Box fahren. 4. **F1‑Pfad (MFD‑Hotkey‑Sequenzen)** - Voraussetzung: `game_state.hotkeys_f1` ist gesetzt, sonst keine Aktion und Warnung im GUI. - Sequenz (Beispiel): - `mfd_open` - Navigation zum Reifen‑Tab (`mfd_left/mfd_right`) - Tyre‑Compound setzen (Soft/Medium/Hard/Wet) - Navigation zum Wing‑Tab - Front‑Wing/Rear‑Wing per `front_wing_up/down`, `rear_wing_up/down` auf Zielwert bringen - `mfd_confirm` - Parallel dazu: Race‑Engineer‑GUI zeigt die geplante Konfiguration und den Status „Hotkey‑Sequenz ausgeführt“. 5. **ACC / AC Evo‑Pfad (Pit‑Menü + Setup‑Hotkeys)** - Voraussetzung: `game_state.hotkeys_acc` ist gesetzt. - Pitstop: - `pit_menu_open` - Compound wählen über `pit_menu_next_compound` - Fuel über `pit_menu_fuel_up/down` auf Zielwert bringen - Flügel: - `setup_open` - `setup_aero_tab` - Wing über `setup_wing_up/down` auf Zielwert bringen - `setup_save` - GUI zeigt: „Pitstop vorbereitet: {fuel}L, {compound}, Front Wing {front_wing}, Rear Wing {rear_wing} – via Hotkeys“. 6. **Race‑Engineer‑GUI‑Integration** - Anzeige des letzten `PitCommand` inkl. Simulation und Ausführungsmodus: - iRacing: „Write‑Back API“ - ACC/F1: „Hotkey‑Sequenz (Simulation‑Hotkeys)“ - Warnung, wenn Hotkeys fehlen: - „Hotkeys für diese Simulation nicht konfiguriert – PitIntentParser arbeitet nur als Voice‑Overlay, keine automatische Steuerung.“ 7. **Registry‑Eintrag** ```json { "id": "pit_intent_parser", "name": "Pit Intent Parser", "type": "feature", "online_only": true, "visible_in_gui": true } ``` --- Damit hast du einen Master‑Prompt, der: - die Game‑Screens für ACC/AC Evo/F1 um Hotkey‑Konfiguration erweitert, - den Race‑Engineer‑Screen um ein klares Feature‑Panel + Warnung ergänzt, - und die komplette PitIntent‑Pipeline (Qwen → JSON → TTS → iRacing‑Write‑Back / ACC/F1‑Hotkeys) beschreibt. Wenn du magst, können wir den jetzt noch in eine „Coding‑Agent‑Version“ übersetzen, die direkt in deinem Repo loslegt.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
thomas_knaus/RaceEngineer#129
No description provided.