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
{