Use exprtk expression parser

Using expression parser tool exprtk to calculate sensor value
from given expression from config file.

Signed-off-by: Vijay Khemka <vijaykhemka@fb.com>
Change-Id: Ie765748374a2c7a82ab9689b57c63fce7b015364
diff --git a/virtualSensor.cpp b/virtualSensor.cpp
index 501d9cd..ac5e123 100644
--- a/virtualSensor.cpp
+++ b/virtualSensor.cpp
@@ -84,7 +84,9 @@
             if (j.find("ParamName") != j.end())
             {
                 auto paramPtr = std::make_unique<SensorParam>(j["Value"]);
-                paramMap.emplace(j["ParamName"], std::move(paramPtr));
+                std::string name = j["ParamName"];
+                symbols.create_variable(name);
+                paramMap.emplace(std::move(name), std::move(paramPtr));
             }
             else
             {
@@ -114,12 +116,21 @@
                     objPath += sensorType + "/" + name;
 
                     auto paramPtr = std::make_unique<SensorParam>(bus, objPath);
-                    paramMap.emplace(j["ParamName"], std::move(paramPtr));
+                    std::string name = j["ParamName"];
+                    symbols.create_variable(name);
+                    paramMap.emplace(std::move(name), std::move(paramPtr));
                 }
             }
         }
     }
 
+    symbols.add_constants();
+    expression.register_symbol_table(symbols);
+
+    /* parser from exprtk */
+    exprtk::parser<double> parser{};
+    parser.compile(exprStr, expression);
+
     /* Print all parameters for debug purpose only */
     if (DEBUG)
         printParams(paramMap);
@@ -138,9 +149,27 @@
     WarningInterface::warningLow(sensorThreshold.warningLow);
 }
 
-/* TBD */
 void VirtualSensor::updateVirtualSensor()
-{}
+{
+    for (auto& param : paramMap)
+    {
+        auto& name = param.first;
+        auto& data = param.second;
+        if (auto var = symbols.get_variable(name))
+        {
+            var->ref() = data->getParamValue();
+        }
+        else
+        {
+            /* Invalid parameter */
+            throw std::invalid_argument("ParamName not found in symbols");
+        }
+    }
+    double val = expression.value();
+    setSensorValue(val);
+    if (DEBUG)
+        std::cout << "Sensor value is " << val << "\n";
+}
 
 /** @brief Parsing Virtual Sensor config JSON file  */
 Json VirtualSensors::parseConfigFile(const std::string configFile)
@@ -189,10 +218,12 @@
 
                 auto virtualSensorPtr =
                     std::make_unique<VirtualSensor>(bus, objPath.c_str(), j);
-                virtualSensorsMap.emplace(name, std::move(virtualSensorPtr));
 
                 log<level::INFO>("Added a new virtual sensor",
                                  entry("NAME = %s", name.c_str()));
+                virtualSensorPtr->updateVirtualSensor();
+                virtualSensorsMap.emplace(std::move(name),
+                                          std::move(virtualSensorPtr));
             }
             else
             {