sensorhandler: Add functionality to use m, b, b_exp from config.yaml

Change-Id: I1b5b8a5e0e5abd74eadde494728f363cf1ca4ec6
Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/sensorhandler.cpp b/sensorhandler.cpp
index cbf6b65..25d6861 100644
--- a/sensorhandler.cpp
+++ b/sensorhandler.cpp
@@ -557,7 +557,7 @@
 
     *data_len=0;
 
-    int64_t raw_value, scale;
+    int64_t raw_value;
     ipmi::sensor::Info sensor;
 
     switch(type) {
@@ -593,6 +593,14 @@
         case IPMI_SENSOR_CURRENT:
         case IPMI_SENSOR_FAN:
             // Get reading for /xyz/openbmc_project/Sensor/Value.interface
+            if(sensors.find(reqptr->sennum) == sensors.end())
+            {
+                fprintf(stderr, "Failed to find config entry for Sensor 0x%02x\n",
+                        reqptr->sennum);
+                return IPMI_CC_SENSOR_INVALID;
+            }
+
+            sensor = sensors.at(reqptr->sennum);
 
             // Get value
             r = sd_bus_get_property_trivial(bus,
@@ -613,26 +621,13 @@
                 break;
             }
 
-            // Get scale
-            r = sd_bus_get_property_trivial(bus,
-                                            a.bus,
-                                            a.path,
-                                            a.interface,
-                                            "Scale",
-                                            NULL,
-                                            'x',
-                                            &scale);
-            if (r < 0) {
-                fprintf(stderr,
-                        "Failed to call sd_bus_get_property:%d,  %s (scale)\n",
-                        r,
-                        strerror(-r));
-                fprintf(stderr, "Bus: %s, Path: %s, Interface: %s\n",
-                        a.bus, a.path, a.interface);
-                break;
-            }
+            // Prevent div0
+            if (sensor.coefficientM == 0) {
+                sensor.coefficientM = 1;
+            };
 
-            resp->value = raw_value * pow(10,scale);
+            resp->value = static_cast<uint8_t>(
+                    (raw_value - sensor.scaledOffset) / sensor.coefficientM);
             resp->operation = 1<<6; // scanning enabled
             resp->indication[0] = 0; // not a threshold sensor. ignore
             resp->indication[1] = 0;
@@ -771,9 +766,25 @@
         free(raw_cstr);
 
         /* Modifiers to reading info */
-        get_sdr::body::set_b(0, body);
-        get_sdr::body::set_m(1, body);
-        body->r_b_exponents = 0;
+        // Get scale
+        int64_t scale;
+        if (0 > sd_bus_get_property_trivial(bus,
+                                        iface.bus,
+                                        iface.path,
+                                        iface.interface,
+                                        "Scale",
+                                        NULL,
+                                        'x',
+                                        &scale)) {
+            fprintf(stderr, "Expected to find Scale interface in bus %s, path %s, but it was missing.\n",
+                    iface.bus, iface.path);
+            return IPMI_CC_SENSOR_INVALID;
+        }
+
+        get_sdr::body::set_b(info->coefficientB, body);
+        get_sdr::body::set_m(info->coefficientM, body);
+        get_sdr::body::set_b_exp(info->exponentB, body);
+        get_sdr::body::set_r_exp(scale, body);
 
         /* ID string */
         std::string id_string = info->sensorPath.substr(