Add SIGHUP handling for reloading configuration

Add signal handling feature for handling the SIGHUP generated by
systemd ExecReload.

Tested log:
- Brfore reload
root@bletchley:~# systemctl status phosphor-pid-control.service
* phosphor-pid-control.service - Phosphor-Pid-Control Margin-based Fan Control Daemon
     Loaded: loaded (/lib/systemd/system/phosphor-pid-control.service; enabled; preset: enabled)
    Drop-In: /lib/systemd/system/phosphor-pid-control.service.d
             `-10-bletchley.conf
     Active: active (running) since Fri 2022-09-30 09:12:10 UTC; 1min 11s ago
   Main PID: 884 (swampd)
     CGroup: /system.slice/phosphor-pid-control.service
             `-884 /usr/bin/swampd

Sep 30 09:12:32 bletchley swampd[884]: PID name: fan_tachs
Sep 30 09:12:32 bletchley swampd[884]: inputs: FAN0_TACH_IL, FAN0_TACH_OL, FAN1_TACH_IL, FAN1_TACH_OL, FAN2_TACH_IL, FAN2_TACH_OL, FAN3_TACH_IL, FAN3_TACH_OL,
Sep 30 09:12:32 bletchley swampd[884]: PID name: inlet_Temp
Sep 30 09:12:32 bletchley swampd[884]: inputs: Virtual_Inlet_Temp,
Sep 30 09:12:32 bletchley swampd[884]: PID name: retimer_temp
Sep 30 09:12:32 bletchley swampd[884]: inputs: MB_U19_THERM_LOCAL,
Sep 30 09:12:32 bletchley swampd[884]: PID name: switch_temp
Sep 30 09:12:32 bletchley swampd[884]: inputs: MB_U402_THERM_LOCAL,
Sep 30 09:12:32 bletchley swampd[884]: pushing zone 1
Sep 30 09:12:32 bletchley swampd[884]: PID Zone 1 max SetPoint 37 requested by inlet_Temp FAN0_TACH_IL FAN0_TACH_OL FAN1_TACH_IL FAN1_TACH_OL FAN2_TACH_IL FAN2_TACH_OL FAN3_TACH_IL FAN3_TACH_OL

- After reload called
root@bletchley:~# journalctl -u phosphor-pid-control.service | grep -i reload
Sep 30 09:13:46 bletchley systemd[1]: Reloading Phosphor-Pid-Control Margin-based Fan Control Daemon...
Sep 30 09:13:46 bletchley swampd[884]: reloading configuration
Sep 30 09:13:46 bletchley systemd[1]: Reloaded Phosphor-Pid-Control Margin-based Fan Control Daemon.
root@bletchley:~#
root@bletchley:~# systemctl status phosphor-pid-control
* phosphor-pid-control.service - Phosphor-Pid-Control Margin-based Fan Control Daemon
     Loaded: loaded (/lib/systemd/system/phosphor-pid-control.service; enabled; preset: enabled)
    Drop-In: /lib/systemd/system/phosphor-pid-control.service.d
             `-10-bletchley.conf
     Active: active (running) since Fri 2022-09-30 09:12:10 UTC; 2min 35s ago
    Process: 1353 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
   Main PID: 884 (swampd)
     CGroup: /system.slice/phosphor-pid-control.service
             `-884 /usr/bin/swampd

Sep 30 09:13:56 bletchley swampd[884]: PID name: fan_tachs
Sep 30 09:13:56 bletchley swampd[884]: inputs: FAN0_TACH_IL, FAN0_TACH_OL, FAN1_TACH_IL, FAN1_TACH_OL, FAN2_TACH_IL, FAN2_TACH_OL, FAN3_TACH_IL, FAN3_TACH_OL,
Sep 30 09:13:56 bletchley swampd[884]: PID name: inlet_Temp
Sep 30 09:13:56 bletchley swampd[884]: inputs: Virtual_Inlet_Temp,
Sep 30 09:13:56 bletchley swampd[884]: PID name: retimer_temp
Sep 30 09:13:56 bletchley swampd[884]: inputs: MB_U19_THERM_LOCAL,
Sep 30 09:13:56 bletchley swampd[884]: PID name: switch_temp
Sep 30 09:13:56 bletchley swampd[884]: inputs: MB_U402_THERM_LOCAL,
Sep 30 09:13:56 bletchley swampd[884]: pushing zone 1
Sep 30 09:13:56 bletchley swampd[884]: PID Zone 1 max SetPoint 37 requested by inlet_Temp FAN0_TACH_IL FAN0_TACH_OL FAN1_TACH_IL FAN1_TACH_OL FAN2_TACH_IL FAN2_TACH_OL FAN3_TACH_IL FAN3_TACH_OL

Signed-off-by: Potin Lai <potin.lai@quantatw.com>
Change-Id: Idea1ede908fe4a2da3018cc0624c78ac7e0530eb
diff --git a/main.cpp b/main.cpp
index 3ae9374..81c85a6 100644
--- a/main.cpp
+++ b/main.cpp
@@ -32,6 +32,7 @@
 
 #include <CLI/CLI.hpp>
 #include <boost/asio/io_context.hpp>
+#include <boost/asio/signal_set.hpp>
 #include <boost/asio/steady_timer.hpp>
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/bus.hpp>
@@ -66,6 +67,8 @@
 
 /* async io context for operation */
 boost::asio::io_context io;
+/* async signal_set for signal handling */
+boost::asio::signal_set signals(io, SIGHUP);
 
 /* buses for system control */
 static sdbusplus::asio::connection modeControlBus(io);
@@ -211,6 +214,31 @@
 
 } // namespace pid_control
 
+void sighupHandler(const boost::system::error_code& error, int signal_number)
+{
+    static boost::asio::steady_timer timer(io);
+
+    if (error)
+    {
+        std::cout << "Signal " << signal_number
+                  << " handler error: " << error.message() << "\n";
+        return;
+    }
+
+    timer.expires_after(std::chrono::seconds(1));
+    timer.async_wait([](const boost::system::error_code ec) {
+        if (ec)
+        {
+            std::cout << "Signal timer error: " << ec.message() << "\n";
+            return;
+        }
+
+        std::cout << "reloading configuration\n";
+        pid_control::tryRestartControlLoops();
+    });
+    signals.async_wait(sighupHandler);
+}
+
 int main(int argc, char* argv[])
 {
     loggingPath = "";
@@ -286,6 +314,9 @@
     modeControlBus.request_name("xyz.openbmc_project.State.FanCtrl");
     sdbusplus::server::manager_t objManager(modeControlBus, modeRoot);
 
+    // Enable SIGHUP handling to reload JSON config
+    signals.async_wait(sighupHandler);
+
     /*
      * All sensors are managed by one manager, but each zone has a pointer to
      * it.