# app/simulation/simulator_main.py from __future__ import annotations from typing import Dict, Any from .vehicle import Vehicle, Orchestrator from .modules.engine import EngineModule from .modules.gearbox import GearboxModule from .modules.abs import AbsModule from .modules.basic import BasicModule class VehicleSimulator: def __init__(self): self.v = Vehicle() self.orch = Orchestrator(self.v) # order matters: base → engine → gearbox → abs self.orch.add(BasicModule()) self.orch.add(EngineModule()) self.orch.add(GearboxModule()) self.orch.add(AbsModule()) # control from GUI def set_gear(self, g: int) -> None: self.v.set("gear", max(0, min(10, int(g)))) def set_throttle(self, t: int) -> None: self.v.set("throttle_pct", max(0, min(100, int(t)))) def update(self, dt: float) -> None: self.orch.update(dt) def snapshot(self) -> Dict[str, Any]: return self.v.snapshot() # config I/O (compat with old layout) def load_config(self, cfg: Dict[str, Any]) -> None: for k in ("engine","gearbox","vehicle"): if k in cfg: self.v.config.setdefault(k, {}).update(cfg[k]) if "dtc" in cfg: self.v.dtc.update(cfg["dtc"]) def export_config(self) -> Dict[str, Any]: return { "engine": dict(self.v.config.get("engine", {})), "gearbox": dict(self.v.config.get("gearbox", {})), "vehicle": dict(self.v.config.get("vehicle", {})), "dtc": dict(self.v.dtc), }