From 73b4eaf86163c155b99221f3a05198b99a407d6c Mon Sep 17 00:00:00 2001 From: Etienne Chassaing <60154720+cetiennec@users.noreply.github.com> Date: Wed, 27 Aug 2025 15:07:17 +0200 Subject: [PATCH] Adds auto test stop --- MockCAN.py | 2 +- main.py | 79 ++++++++++++++++++++++++++++++++---------- templates/control.html | 38 ++++++++++++++------ 3 files changed, 89 insertions(+), 30 deletions(-) diff --git a/MockCAN.py b/MockCAN.py index 14a528e..936d9cb 100644 --- a/MockCAN.py +++ b/MockCAN.py @@ -23,7 +23,7 @@ class CANBackend: # Placeholder for thermal loop cleaning pass - def send_state_command(self, state: str, pu_number : int, ploop_setpoint : float): + def send_state_command(self, state: str, pu_number : int, ploop_setpoint : float, qperm_setpoint : float): # Placeholder for sending mode command PUs_states[pu_number-1] = {"PU_MODE": state, "ploop_setpoint":ploop_setpoint} diff --git a/main.py b/main.py index aa15641..506bd0e 100644 --- a/main.py +++ b/main.py @@ -61,6 +61,9 @@ latest_setpoints: Dict[str, Any] = { active_PUs: list[int] = [] +# Dictionary to hold running tasks +tasks: dict[str, asyncio.Task] = {} + # RECORDER recording_flag = False recording_task = None @@ -424,7 +427,7 @@ async def record_data_loop(): ## AUTOMATIC TESTING async def send_command_with_delay( - state: str, pu: int, delay_s: int = 0, ploop_setpoint: float = 0.0, qperm_setpoint:float = 1200.0 + state: str, pu: int, delay_s: int = 0, ploop_setpoint: float = 2.5, qperm_setpoint:float = 1200.0 ): await asyncio.sleep(delay_s) logging.info(f"[AUTO TEST] Sending {state} to PU{pu} after {delay_s}s") @@ -439,35 +442,73 @@ async def set_patients_with_delay(count: int, delay_s: int): async def auto_test_pu1(ploop_setpoint: float = Query(0.0)): pu = 1 logging.info("[AUTO TEST] Starting automatic test for 1 PU") - asyncio.create_task(run_auto_test_pu1(pu, ploop_setpoint)) + + # Cancel existing task if still running + if "pu1" in tasks and not tasks["pu1"].done(): + tasks["pu1"].cancel() + logging.info("[AUTO TEST] PU1 Cancelled") + + task = asyncio.create_task(run_auto_test_pu1(pu, ploop_setpoint)) + tasks["pu1"] = task return {"status": "started", "pu": pu} @router.post("/test/auto/2") async def auto_test_pu2(ploop_setpoint: float = Query(0.0)): logging.info("[AUTO TEST] Starting automatic test for 2 PUs") - asyncio.create_task(run_auto_test_pu2(ploop_setpoint)) + + if "pu2" in tasks and not tasks["pu2"].done(): + tasks["pu2"].cancel() + logging.info("[AUTO TEST] PU2 Cancelled") + + task = asyncio.create_task(run_auto_test_pu2(ploop_setpoint)) + tasks["pu2"] = task return {"status": "started", "pu": [1, 2]} +@router.post("/test/auto/stop/{pu}") +async def stop_auto_test(pu: int): + key = f"pu{pu}" + logging.info(f"[AUTO TEST] Stopping {pu}") + print("tasks",tasks) + if key in tasks and not tasks[key].done(): + tasks[key].cancel() + await send_command_with_delay("IDLE", pu, delay_s=0) + logging.info(f"[AUTO TEST] {key} STOPPED") + return {"status": "stopped", "pu": pu} + + logging.info(f"[AUTO TEST] Stopping {pu} No test Runining") + return {"status": "no task running", "pu": pu} + async def run_auto_test_pu1(pu: int, ploop_setpoint: float): - await send_command_with_delay("PRE-PRODUCTION", pu, delay_s=0, ploop_setpoint=ploop_setpoint) - # await send_command_with_delay("PRODUCTION", pu, delay_s=180, ploop_setpoint=ploop_setpoint) - await set_patients_with_delay(5, delay_s=60) - await set_patients_with_delay(10, delay_s=60) - await send_command_with_delay("IDLE", pu, delay_s=60, ploop_setpoint=ploop_setpoint) - logging.info("[AUTO TEST] Finished PU1 test") + try: + await send_command_with_delay("PRE-PRODUCTION", pu, delay_s=0, ploop_setpoint=ploop_setpoint) + # await send_command_with_delay("PRODUCTION", pu, delay_s=180, ploop_setpoint=ploop_setpoint) + await set_patients_with_delay(5, delay_s=60) + await set_patients_with_delay(10, delay_s=60) + await send_command_with_delay("IDLE", pu, delay_s=60, ploop_setpoint=ploop_setpoint) + logging.info("[AUTO TEST] Finished PU1 test") + + except asyncio.CancelledError: + logging.info(f"[AUTO TEST] PU 1 task cancelled") + # optional cleanup + raise async def run_auto_test_pu2(ploop_setpoint: float): - # Step 1: Run PU1 test - # await run_auto_test_pu1(1, ploop_setpoint) + try: + # Step 1: Run PU1 test + # await run_auto_test_pu1(1, ploop_setpoint) - # Step 2: PU2 sequence - await send_command_with_delay("PRE-PRODUCTION", 2, delay_s=0, ploop_setpoint=ploop_setpoint) - # await send_command_with_delay("PRODUCTION", 2, delay_s=180, ploop_setpoint=ploop_setpoint) - await set_patients_with_delay(15, delay_s=60) - await set_patients_with_delay(0, delay_s=60) - await send_command_with_delay("IDLE", 2, delay_s=60, ploop_setpoint=ploop_setpoint) - await send_command_with_delay("IDLE", 1, delay_s=60, ploop_setpoint=ploop_setpoint) - logging.info("[AUTO TEST] Finished PU1 + PU2 test") + # Step 2: PU2 sequence + await send_command_with_delay("PRE-PRODUCTION", 2, delay_s=0, ploop_setpoint=ploop_setpoint) + # await send_command_with_delay("PRODUCTION", 2, delay_s=180, ploop_setpoint=ploop_setpoint) + await set_patients_with_delay(15, delay_s=60) + await set_patients_with_delay(0, delay_s=60) + await send_command_with_delay("IDLE", 2, delay_s=60, ploop_setpoint=ploop_setpoint) + await send_command_with_delay("IDLE", 1, delay_s=60, ploop_setpoint=ploop_setpoint) + logging.info("[AUTO TEST] Finished PU1 + PU2 test") + except asyncio.CancelledError: + logging.info(f"[AUTO TEST] PU 2 task cancelled") + # optional cleanup + raise @router.post("/test/auto/3") async def auto_test_pu3(): diff --git a/templates/control.html b/templates/control.html index c1607a8..004be18 100644 --- a/templates/control.html +++ b/templates/control.html @@ -234,6 +234,11 @@ .button-group button:hover { background-color: #005f6b; } + .auto-running { + background-color: #ffcc00 !important; /* yellow */ + color: black !important; + } +
@@ -324,6 +329,7 @@ +