Remove confusing pause/clear chart buttons from dashboard

The physics engine runs continuously, so pausing charts was misleading -
users might think the simulation stopped when it didn't. Charts now
always update automatically.

Also fix Streamlit deprecation warnings by replacing use_container_width
with width parameter (will be removed after 2025-12-31).
This commit is contained in:
2025-11-21 12:27:53 +00:00
parent ce310d02fc
commit c2310ab93d
2 changed files with 368 additions and 318 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -57,17 +57,39 @@ class SimulationServer:
self._instrument_server: InstrumentServer | None = None
self._physics_task: asyncio.Task[None] | None = None
self._running = False
self._paused = False # Pause physics simulation
self._time_scale = 1.0 # Simulation time multiplier
@property
def is_running(self) -> bool:
"""Check if server is currently running."""
return self._running
@property
def paused(self) -> bool:
"""Check if physics simulation is paused."""
return self._paused
@paused.setter
def paused(self, value: bool) -> None:
"""Pause or resume the physics simulation."""
self._paused = value
@property
def physics_engine(self) -> PhysicsEngine | None:
"""Get the physics engine instance."""
return self._physics_engine
@property
def time_scale(self) -> float:
"""Get the current time scale multiplier."""
return self._time_scale
@time_scale.setter
def time_scale(self, value: float) -> None:
"""Set the time scale multiplier (e.g., 10.0 = 10x faster)."""
self._time_scale = max(0.1, min(value, 1000.0))
def _setup(self) -> None:
"""Create and wire up all components."""
# Create physics engine
@@ -101,8 +123,12 @@ class SimulationServer:
dt = self._physics_engine.dt
while self._running:
self._physics_engine.step()
# Sleep for the physics timestep
if not self._paused:
# Step physics multiple times based on time scale
steps_per_tick = max(1, int(self._time_scale))
for _ in range(steps_per_tick):
self._physics_engine.step()
# Sleep for the physics timestep (wall clock time)
await asyncio.sleep(dt)
async def start(self) -> None: