176833cb5SWludzik, Jozef #include "trigger_factory.hpp" 276833cb5SWludzik, Jozef 31477fe6aSWludzik, Jozef #include "numeric_threshold.hpp" 41477fe6aSWludzik, Jozef #include "sensor.hpp" 576833cb5SWludzik, Jozef #include "trigger.hpp" 6*d960e1f3SWludzik, Jozef #include "trigger_actions.hpp" 71477fe6aSWludzik, Jozef #include "utils/dbus_mapper.hpp" 876833cb5SWludzik, Jozef 976833cb5SWludzik, Jozef TriggerFactory::TriggerFactory( 1076833cb5SWludzik, Jozef std::shared_ptr<sdbusplus::asio::connection> bus, 111477fe6aSWludzik, Jozef std::shared_ptr<sdbusplus::asio::object_server> objServer, 12*d960e1f3SWludzik, Jozef SensorCache& sensorCache, interfaces::ReportManager& reportManager) : 1376833cb5SWludzik, Jozef bus(std::move(bus)), 14*d960e1f3SWludzik, Jozef objServer(std::move(objServer)), sensorCache(sensorCache), 15*d960e1f3SWludzik, Jozef reportManager(reportManager) 1676833cb5SWludzik, Jozef {} 1776833cb5SWludzik, Jozef 1876833cb5SWludzik, Jozef std::unique_ptr<interfaces::Trigger> TriggerFactory::make( 191477fe6aSWludzik, Jozef boost::asio::yield_context& yield, const std::string& name, bool isDiscrete, 201477fe6aSWludzik, Jozef bool logToJournal, bool logToRedfish, bool updateReport, 2176833cb5SWludzik, Jozef const std::vector<std::pair<sdbusplus::message::object_path, std::string>>& 221477fe6aSWludzik, Jozef sensorPaths, 2376833cb5SWludzik, Jozef const std::vector<std::string>& reportNames, 2476833cb5SWludzik, Jozef const TriggerThresholdParams& thresholdParams, 251477fe6aSWludzik, Jozef interfaces::TriggerManager& triggerManager) const 2676833cb5SWludzik, Jozef { 271477fe6aSWludzik, Jozef if (isDiscrete) 281477fe6aSWludzik, Jozef { 291477fe6aSWludzik, Jozef throw std::runtime_error("Not implemented!"); 301477fe6aSWludzik, Jozef } 311477fe6aSWludzik, Jozef 321477fe6aSWludzik, Jozef auto [sensors, sensorNames] = getSensors(yield, sensorPaths); 331477fe6aSWludzik, Jozef std::vector<std::shared_ptr<interfaces::Threshold>> thresholds; 341477fe6aSWludzik, Jozef 351477fe6aSWludzik, Jozef const auto& params = 361477fe6aSWludzik, Jozef std::get<std::vector<numeric::ThresholdParam>>(thresholdParams); 371477fe6aSWludzik, Jozef for (const auto& [type, dwellTime, direction, value] : params) 381477fe6aSWludzik, Jozef { 391477fe6aSWludzik, Jozef std::vector<std::unique_ptr<interfaces::TriggerAction>> actions; 40*d960e1f3SWludzik, Jozef if (logToJournal) 41*d960e1f3SWludzik, Jozef { 42*d960e1f3SWludzik, Jozef actions.emplace_back(std::make_unique<action::LogToJournal>( 43*d960e1f3SWludzik, Jozef numeric::toType(type), value)); 44*d960e1f3SWludzik, Jozef } 45*d960e1f3SWludzik, Jozef if (logToRedfish) 46*d960e1f3SWludzik, Jozef { 47*d960e1f3SWludzik, Jozef actions.emplace_back(std::make_unique<action::LogToRedfish>( 48*d960e1f3SWludzik, Jozef numeric::toType(type), value)); 49*d960e1f3SWludzik, Jozef } 50*d960e1f3SWludzik, Jozef if (updateReport) 51*d960e1f3SWludzik, Jozef { 52*d960e1f3SWludzik, Jozef actions.emplace_back(std::make_unique<action::UpdateReport>( 53*d960e1f3SWludzik, Jozef reportManager, reportNames)); 54*d960e1f3SWludzik, Jozef } 551477fe6aSWludzik, Jozef 561477fe6aSWludzik, Jozef thresholds.emplace_back(std::make_shared<NumericThreshold>( 571477fe6aSWludzik, Jozef bus->get_io_context(), sensors, sensorNames, std::move(actions), 581477fe6aSWludzik, Jozef std::chrono::milliseconds(dwellTime), 59*d960e1f3SWludzik, Jozef numeric::toDirection(direction), value)); 601477fe6aSWludzik, Jozef } 611477fe6aSWludzik, Jozef 621477fe6aSWludzik, Jozef return std::make_unique<Trigger>( 631477fe6aSWludzik, Jozef bus->get_io_context(), objServer, name, isDiscrete, logToJournal, 641477fe6aSWludzik, Jozef logToRedfish, updateReport, sensorPaths, reportNames, thresholdParams, 651477fe6aSWludzik, Jozef std::move(thresholds), triggerManager); 661477fe6aSWludzik, Jozef } 671477fe6aSWludzik, Jozef 681477fe6aSWludzik, Jozef std::pair<std::vector<std::shared_ptr<interfaces::Sensor>>, 691477fe6aSWludzik, Jozef std::vector<std::string>> 701477fe6aSWludzik, Jozef TriggerFactory::getSensors( 711477fe6aSWludzik, Jozef boost::asio::yield_context& yield, 721477fe6aSWludzik, Jozef const std::vector<std::pair<sdbusplus::message::object_path, 731477fe6aSWludzik, Jozef std::string>>& sensorPaths) const 741477fe6aSWludzik, Jozef { 751477fe6aSWludzik, Jozef auto tree = utils::getSubTreeSensors(yield, bus); 761477fe6aSWludzik, Jozef 771477fe6aSWludzik, Jozef std::vector<std::shared_ptr<interfaces::Sensor>> sensors; 781477fe6aSWludzik, Jozef std::vector<std::string> sensorNames; 791477fe6aSWludzik, Jozef for (const auto& [sensorPath, metadata] : sensorPaths) 801477fe6aSWludzik, Jozef { 811477fe6aSWludzik, Jozef auto found = std::find_if( 821477fe6aSWludzik, Jozef tree.begin(), tree.end(), 831477fe6aSWludzik, Jozef [&sensorPath](const auto& x) { return x.first == sensorPath; }); 841477fe6aSWludzik, Jozef if (found == tree.end()) 851477fe6aSWludzik, Jozef { 861477fe6aSWludzik, Jozef throw std::runtime_error("Not found"); 871477fe6aSWludzik, Jozef } 881477fe6aSWludzik, Jozef 891477fe6aSWludzik, Jozef const auto& service = found->second[0].first; 901477fe6aSWludzik, Jozef const auto& path = found->first; 911477fe6aSWludzik, Jozef sensors.emplace_back(sensorCache.makeSensor<Sensor>( 921477fe6aSWludzik, Jozef service, path, bus->get_io_context(), bus)); 931477fe6aSWludzik, Jozef if (metadata.empty()) 941477fe6aSWludzik, Jozef { 951477fe6aSWludzik, Jozef sensorNames.emplace_back(sensorPath); 961477fe6aSWludzik, Jozef } 971477fe6aSWludzik, Jozef else 981477fe6aSWludzik, Jozef { 991477fe6aSWludzik, Jozef sensorNames.emplace_back(metadata); 1001477fe6aSWludzik, Jozef } 1011477fe6aSWludzik, Jozef } 1021477fe6aSWludzik, Jozef return {sensors, sensorNames}; 10376833cb5SWludzik, Jozef } 104