From 496383883b07c63b5aa3c4f4962f2483e7709e69 Mon Sep 17 00:00:00 2001 From: Robbie Leslie Date: Mon, 16 Jun 2025 12:10:26 -0400 Subject: [PATCH 1/2] Tested fan speed, stopped fans on shutdown, only publish on change --- src/temp_monitor.cpp | 105 ++++++++++++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 32 deletions(-) diff --git a/src/temp_monitor.cpp b/src/temp_monitor.cpp index 9dbe21a..2756867 100644 --- a/src/temp_monitor.cpp +++ b/src/temp_monitor.cpp @@ -10,6 +10,15 @@ #include #include #include +#include +#include + +std::atomic_bool running(true); + +void handle_sigint(int) +{ + running = false; // causes main loop to exit +} namespace fs = std::filesystem; @@ -56,52 +65,67 @@ int main(int argc, char** argv) { auto node = std::make_shared("temperature_monitor"); auto fan_publisher = std::make_shared(node); + std::signal(SIGINT, handle_sigint); + + auto executor = std::make_shared(); + executor->add_node(node); + + // Thread that runs the executor manually std::thread spin_thread([&]() { - rclcpp::spin(node); + while (rclcpp::ok() && running) { + executor->spin_some(); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } }); // Set the rate to 10 Hz rclcpp::Rate rate(10); RCLCPP_INFO(node->get_logger(), "Monitoring CPU temperature (press Ctrl+C to stop):"); - while (rclcpp::ok()) { + while (rclcpp::ok() && running) { double tempC = readTemperature(tempPath); if (tempC < 0) { RCLCPP_INFO(node->get_logger(), "Failed to read temperature!"); } else { RCLCPP_INFO(node->get_logger(), "CPU Temperature: %f °C", tempC); + FanSpeed newFanSpeed; + if (tempC < 30.0) { - // Handle case for temperatures below 30°C - FanSpeed fanSpeed; - fanSpeed.fan_percent_0 = 0; - fanSpeed.fan_percent_1 = 0; - fanSpeed.fan_percent_2 = 0; - fanSpeed.fan_percent_3 = 0; - fan_publisher->trigger_publish(fanSpeed); - } else if (tempC >= 30.0 && tempC < 40.0) { - // Handle case for temperatures between 30°C and 50°C - FanSpeed fanSpeed; - fanSpeed.fan_percent_0 = 25; - fanSpeed.fan_percent_1 = 25; - fanSpeed.fan_percent_2 = 25; - fanSpeed.fan_percent_3 = 25; - fan_publisher->trigger_publish(fanSpeed); - } else if (tempC >= 40.0 && tempC < 50) { - // Handle case for temperatures above 50°C - FanSpeed fanSpeed; - fanSpeed.fan_percent_0 = 50; - fanSpeed.fan_percent_1 = 50; - fanSpeed.fan_percent_2 = 50; - fanSpeed.fan_percent_3 = 50; - fan_publisher->trigger_publish(fanSpeed); - } else if (tempC >= 50.0){ - FanSpeed fanSpeed; - fanSpeed.fan_percent_0 = 75; - fanSpeed.fan_percent_1 = 75; - fanSpeed.fan_percent_2 = 75; - fanSpeed.fan_percent_3 = 75; - fan_publisher->trigger_publish(fanSpeed); + newFanSpeed.fan_percent_0 = 0; + newFanSpeed.fan_percent_1 = 0; + newFanSpeed.fan_percent_2 = 0; + newFanSpeed.fan_percent_3 = 0; + } else if (tempC < 40.0) { + newFanSpeed.fan_percent_0 = 25; + newFanSpeed.fan_percent_1 = 25; + newFanSpeed.fan_percent_2 = 25; + newFanSpeed.fan_percent_3 = 25; + } else if (tempC < 50.0) { + newFanSpeed.fan_percent_0 = 50; + newFanSpeed.fan_percent_1 = 50; + newFanSpeed.fan_percent_2 = 50; + newFanSpeed.fan_percent_3 = 50; + } else { + newFanSpeed.fan_percent_0 = 75; + newFanSpeed.fan_percent_1 = 75; + newFanSpeed.fan_percent_2 = 75; + newFanSpeed.fan_percent_3 = 75; + } + + // Static flag to ensure first publish happens + static bool first_run = true; + static FanSpeed lastFanSpeed; + + if (first_run || + newFanSpeed.fan_percent_0 != lastFanSpeed.fan_percent_0 || + newFanSpeed.fan_percent_1 != lastFanSpeed.fan_percent_1 || + newFanSpeed.fan_percent_2 != lastFanSpeed.fan_percent_2 || + newFanSpeed.fan_percent_3 != lastFanSpeed.fan_percent_3) { + + fan_publisher->trigger_publish(newFanSpeed); + lastFanSpeed = newFanSpeed; + first_run = false; } } @@ -109,5 +133,22 @@ int main(int argc, char** argv) { rate.sleep(); } + FanSpeed off; + off.fan_percent_0 = 0; + off.fan_percent_1 = 0; + off.fan_percent_2 = 0; + off.fan_percent_3 = 0; + fan_publisher->trigger_publish(off); + RCLCPP_INFO(rclcpp::get_logger("shutdown"), "Shutdown: Turning off fans."); + + // Give time to publish and flush + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + // Cleanup + executor->cancel(); // This ensures executor thread stops + rclcpp::shutdown(); + spin_thread.join(); + + return 0; } From c3428958f2377006b45e20b0b85773282a2d6152 Mon Sep 17 00:00:00 2001 From: Robbie Leslie Date: Mon, 16 Jun 2025 12:24:26 -0400 Subject: [PATCH 2/2] Changed back to publishing on a frequency but slowed it down --- src/temp_monitor.cpp | 70 ++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/src/temp_monitor.cpp b/src/temp_monitor.cpp index 2756867..28d891a 100644 --- a/src/temp_monitor.cpp +++ b/src/temp_monitor.cpp @@ -78,8 +78,8 @@ int main(int argc, char** argv) { } }); - // Set the rate to 10 Hz - rclcpp::Rate rate(10); + // Set the rate to 1 Hz + rclcpp::Rate rate(1); RCLCPP_INFO(node->get_logger(), "Monitoring CPU temperature (press Ctrl+C to stop):"); while (rclcpp::ok() && running) { @@ -89,43 +89,37 @@ int main(int argc, char** argv) { } else { RCLCPP_INFO(node->get_logger(), "CPU Temperature: %f °C", tempC); - FanSpeed newFanSpeed; - if (tempC < 30.0) { - newFanSpeed.fan_percent_0 = 0; - newFanSpeed.fan_percent_1 = 0; - newFanSpeed.fan_percent_2 = 0; - newFanSpeed.fan_percent_3 = 0; - } else if (tempC < 40.0) { - newFanSpeed.fan_percent_0 = 25; - newFanSpeed.fan_percent_1 = 25; - newFanSpeed.fan_percent_2 = 25; - newFanSpeed.fan_percent_3 = 25; - } else if (tempC < 50.0) { - newFanSpeed.fan_percent_0 = 50; - newFanSpeed.fan_percent_1 = 50; - newFanSpeed.fan_percent_2 = 50; - newFanSpeed.fan_percent_3 = 50; - } else { - newFanSpeed.fan_percent_0 = 75; - newFanSpeed.fan_percent_1 = 75; - newFanSpeed.fan_percent_2 = 75; - newFanSpeed.fan_percent_3 = 75; - } - - // Static flag to ensure first publish happens - static bool first_run = true; - static FanSpeed lastFanSpeed; - - if (first_run || - newFanSpeed.fan_percent_0 != lastFanSpeed.fan_percent_0 || - newFanSpeed.fan_percent_1 != lastFanSpeed.fan_percent_1 || - newFanSpeed.fan_percent_2 != lastFanSpeed.fan_percent_2 || - newFanSpeed.fan_percent_3 != lastFanSpeed.fan_percent_3) { - - fan_publisher->trigger_publish(newFanSpeed); - lastFanSpeed = newFanSpeed; - first_run = false; + // Handle case for temperatures below 30°C + FanSpeed fanSpeed; + fanSpeed.fan_percent_0 = 0; + fanSpeed.fan_percent_1 = 0; + fanSpeed.fan_percent_2 = 0; + fanSpeed.fan_percent_3 = 0; + fan_publisher->trigger_publish(fanSpeed); + } else if (tempC >= 30.0 && tempC < 40.0) { + // Handle case for temperatures between 30°C and 40°C + FanSpeed fanSpeed; + fanSpeed.fan_percent_0 = 25; + fanSpeed.fan_percent_1 = 25; + fanSpeed.fan_percent_2 = 25; + fanSpeed.fan_percent_3 = 25; + fan_publisher->trigger_publish(fanSpeed); + } else if (tempC >= 40.0 && tempC < 50) { + // Handle case for temperatures between 40 and 50 + FanSpeed fanSpeed; + fanSpeed.fan_percent_0 = 50; + fanSpeed.fan_percent_1 = 50; + fanSpeed.fan_percent_2 = 50; + fanSpeed.fan_percent_3 = 50; + fan_publisher->trigger_publish(fanSpeed); + } else if (tempC >= 50.0){ + FanSpeed fanSpeed; + fanSpeed.fan_percent_0 = 75; + fanSpeed.fan_percent_1 = 75; + fanSpeed.fan_percent_2 = 75; + fanSpeed.fan_percent_3 = 75; + fan_publisher->trigger_publish(fanSpeed); } }