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