1 #include <sdbusplus/bus.hpp>
2 #include <sdbusplus/message.hpp>
3 
4 #include <iostream>
5 #include <string>
6 #include <variant>
7 
8 /* Fan Control */
9 static constexpr auto objectPath = "/xyz/openbmc_project/settings/fanctrl/zone";
10 static constexpr auto busName = "xyz.openbmc_project.State.FanCtrl";
11 static constexpr auto intf = "xyz.openbmc_project.Control.Mode";
12 static constexpr auto property = "Manual";
13 using Value = std::variant<bool>;
14 
15 /* Host Sensor. */
16 static constexpr auto sobjectPath =
17     "/xyz/openbmc_project/extsensors/margin/sluggish0";
18 static constexpr auto sbusName = "xyz.openbmc_project.Hwmon.external";
19 static constexpr auto sintf = "xyz.openbmc_project.Sensor.Value";
20 static constexpr auto sproperty = "Value";
21 using sValue = std::variant<int64_t>;
22 
23 static constexpr auto propertiesintf = "org.freedesktop.DBus.Properties";
24 
SetHostSensor(void)25 static void SetHostSensor(void)
26 {
27     int64_t value = 300;
28     sValue v{value};
29 
30     std::string busname{sbusName};
31     auto PropertyWriteBus = sdbusplus::bus::new_system();
32     std::string path{sobjectPath};
33 
34     auto pimMsg = PropertyWriteBus.new_method_call(
35         busname.c_str(), path.c_str(), propertiesintf, "Set");
36 
37     pimMsg.append(sintf);
38     pimMsg.append(sproperty);
39     pimMsg.append(v);
40 
41     try
42     {
43         auto responseMsg = PropertyWriteBus.call(pimMsg);
44         fprintf(stderr, "call to Set the host sensor value succeeded.\n");
45     }
46     catch (const sdbusplus::exception_t& ex)
47     {
48         fprintf(stderr, "call to Set the host sensor value failed.\n");
49     }
50 }
51 
GetControlPath(int8_t zone)52 static std::string GetControlPath(int8_t zone)
53 {
54     return std::string(objectPath) + std::to_string(zone);
55 }
56 
SetManualMode(int8_t zone)57 static void SetManualMode(int8_t zone)
58 {
59     bool setValue = (bool)0x01;
60 
61     Value v{setValue};
62 
63     std::string busname{busName};
64     auto PropertyWriteBus = sdbusplus::bus::new_system();
65     std::string path = GetControlPath(zone);
66 
67     auto pimMsg = PropertyWriteBus.new_method_call(
68         busname.c_str(), path.c_str(), propertiesintf, "Set");
69 
70     pimMsg.append(intf);
71     pimMsg.append(property);
72     pimMsg.append(v);
73 
74     try
75     {
76         auto responseMsg = PropertyWriteBus.call(pimMsg);
77         fprintf(stderr, "call to Set the manual mode succeeded.\n");
78     }
79     catch (const sdbusplus::exception_t& ex)
80     {
81         fprintf(stderr, "call to Set the manual mode failed.\n");
82     }
83 }
84 
main(int argc,char * argv[])85 int main([[maybe_unused]] int argc, [[maybe_unused]] char* argv[])
86 {
87     int rc = 0;
88 
89     int64_t zone = 0x01;
90 
91     SetManualMode(zone);
92     SetHostSensor();
93     return rc;
94 }
95