Add SensorPurpose for total_power sensor

Change will allow users to find the total system/chassis power sensor by
querying the SensorPurpose for TotalPower.
The total_power chassis association is being removed, since the
SensorPurpose will be used in its place.

Tested on Rainier.

'''
$ busctl call xyz.openbmc_project.ObjectMapper /xyz/openbmc_project/object_mapper xyz.openbmc_project.ObjectMapper GetSubTree sias "/" 0 1 "xyz.openbmc_project.Sensor.Purpose"

a{sa{sas}} 1 "/xyz/openbmc_project/sensors/power/total_power" 1 "org.open_power.OCC.Control" 6 "org.freedesktop.DBus.Introspectable" "org.freedesktop.DBus.Peer" "org.freedesktop.DBus.Properties" "xyz.openbmc_project.Sensor.Purpose" "xyz.openbmc_project.Sensor.Value" "xyz.openbmc_project.State.Decorator.OperationalStatus"

$ busctl -l introspect org.open_power.OCC.Control /xyz/openbmc_project/sensors/power/total_power

NAME                                                  TYPE      SIGNATURE RESULT/VALUE                                                                                                                                      FLAGS
org.freedesktop.DBus.Introspectable                   interface -         -                                                                                                                                                 -
.Introspect                                           method    -         s                                                                                                                                                 -
org.freedesktop.DBus.Peer                             interface -         -                                                                                                                                                 -
.GetMachineId                                         method    -         s                                                                                                                                                 -
.Ping                                                 method    -         -                                                                                                                                                 -
org.freedesktop.DBus.Properties                       interface -         -                                                                                                                                                 -
.Get                                                  method    ss        v                                                                                                                                                 -
.GetAll                                               method    s         a{sv}                                                                                                                                             -
.Set                                                  method    ssv       -                                                                                                                                                 -
.PropertiesChanged                                    signal    sa{sv}as  -                                                                                                                                                 -
xyz.openbmc_project.Association.Definitions           interface -         -                                                                                                                                                 -
.Associations                                         property  a(sss)    1 "chassis" "all_sensors" "/xyz/openbmc_project/inventory/system/chassis" emits-change writable
B
xyz.openbmc_project.Sensor.Purpose                    interface -         -                                                                                                                                                 -
.Purpose                                              property  as        1 "xyz.openbmc_project.Sensor.Purpose.SensorPurpose.TotalPower"                                                                                   emits-change
xyz.openbmc_project.Sensor.Value                      interface -         -                                                                                                                                                 -
.MaxValue                                             property  d         inf                                                                                                                                               emits-change writable
.MinValue                                             property  d         -inf                                                                                                                                              emits-change writable
.Unit                                                 property  s         "xyz.openbmc_project.Sensor.Value.Unit.Watts"                                                                                                     emits-change writable
.Value                                                property  d         419                                                                                                                                               emits-change writable
xyz.openbmc_project.State.Decorator.OperationalStatus interface -         -                                                                                                                                                 -
.Functional                                           property  b         true                                                                                                                                              emits-change writable
'''

Change-Id: I414c01e81cbb965d9ab68bafa06565d997abbe0f
Signed-off-by: Chris Cain <cjcain@us.ibm.com>
diff --git a/occ_dbus.cpp b/occ_dbus.cpp
index e018246..f68aa2a 100644
--- a/occ_dbus.cpp
+++ b/occ_dbus.cpp
@@ -242,6 +242,38 @@
     dvfsTemps[path]->value(value);
 }
 
+bool OccDBusSensors::setPurpose(const std::string& path,
+                                const std::string& value)
+{
+    if (path.empty())
+    {
+        return false;
+    }
+
+    if (!purposes.contains(path))
+    {
+        purposes.emplace(
+            path, std::make_unique<PurposeIntf>(utils::getBus(), path.c_str()));
+        try
+        {
+            std::set<sdbusplus::common::xyz::openbmc_project::sensor::Purpose::
+                         SensorPurpose>
+                pSet{sdbusplus::common::xyz::openbmc_project::sensor::Purpose::
+                         convertSensorPurposeFromString(value)};
+            purposes.at(path)->purpose(pSet);
+        }
+        catch (const std::exception& e)
+        {
+            lg2::error(
+                "set SensorPurpose propety failed for {PATH}: error={ERR}",
+                "PATH", path, "ERR", e.what());
+            return false;
+        }
+    }
+
+    return true;
+}
+
 } // namespace dbus
 } // namespace occ
 } // namespace open_power