From 2f2c82d08c5d646fced09340f56810bfbbe953b6 Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Sat, 25 Oct 2025 07:30:54 +0000 Subject: [PATCH 1/2] Succeed power on command on PolyScope 5 when robot is running We check for the robot state being IDLE and retry that with a very high timeout by default. This commit also accepts the robot to be in RUNNING in order to succeed. --- src/ur/dashboard_client_implementation_g5.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ur/dashboard_client_implementation_g5.cpp b/src/ur/dashboard_client_implementation_g5.cpp index 61f50435..25e5a6b9 100644 --- a/src/ur/dashboard_client_implementation_g5.cpp +++ b/src/ur/dashboard_client_implementation_g5.cpp @@ -438,7 +438,7 @@ DashboardResponse DashboardClientImplG5::commandPowerOn(const std::chrono::durat DashboardResponse response; try { - response.message = retryCommandString("power on", "Powering on", "robotmode", "Robotmode: IDLE", timeout); + response.message = retryCommandString("power on", "Powering on", "robotmode", "Robotmode: (IDLE|RUNNING)", timeout); response.ok = true; } catch (const UnexpectedResponse& e) From 043778890c26cac9a0c2532e603b7d5edb12503d Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Mon, 27 Oct 2025 07:48:10 +0100 Subject: [PATCH 2/2] Add a power_cycle test to dashboard_client_g5 --- tests/test_dashboard_client_g5.cpp | 37 ++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tests/test_dashboard_client_g5.cpp b/tests/test_dashboard_client_g5.cpp index 2b8164f2..3696ac0c 100644 --- a/tests/test_dashboard_client_g5.cpp +++ b/tests/test_dashboard_client_g5.cpp @@ -91,6 +91,43 @@ TEST_F(DashboardClientTestG5, connect) ASSERT_TRUE(response.ok); } +TEST_F(DashboardClientTestG5, power_cycle) +{ + EXPECT_TRUE(dashboard_client_->connect()); + DashboardResponse response; + + // Cycle from POWER_OFF to IDLE to RUNNING + response = dashboard_client_->commandPowerOff(); + EXPECT_TRUE(response.ok); + response = dashboard_client_->commandPowerOn(std::chrono::seconds(5)); + EXPECT_TRUE(response.ok); + response = dashboard_client_->commandBrakeRelease(); + EXPECT_TRUE(response.ok); + + // Calling power_on on a brake-released robot should succeed + response = dashboard_client_->commandPowerOn(std::chrono::seconds(5)); + EXPECT_TRUE(response.ok); + + // Power off from brake-released state (RUNNING) + response = dashboard_client_->commandPowerOff(); + EXPECT_TRUE(response.ok); + + // Power off from powered_on state (IDLE) + dashboard_client_->commandPowerOn(); + response = dashboard_client_->commandPowerOff(); + EXPECT_TRUE(response.ok); + + // Power off from powered_on state (IDLE) + dashboard_client_->commandPowerOff(); + response = dashboard_client_->commandPowerOff(); + EXPECT_TRUE(response.ok); + + // Brake release from POWER_OFF should succeed + dashboard_client_->commandPowerOff(); + response = dashboard_client_->commandBrakeRelease(); + EXPECT_TRUE(response.ok); +} + TEST_F(DashboardClientTestG5, run_program) { EXPECT_TRUE(dashboard_client_->connect());