1dd2c6fdcSAndrew Geissler #pragma once 2dd2c6fdcSAndrew Geissler 3*12866370SAndrew Geissler #include <queue> 4dd2c6fdcSAndrew Geissler #include <sdbusplus/bus.hpp> 5*12866370SAndrew Geissler #include <phosphor-logging/elog.hpp> 6dd2c6fdcSAndrew Geissler #include <xyz/openbmc_project/Control/Host/server.hpp> 7*12866370SAndrew Geissler #include "elog-errors.hpp" 8dd2c6fdcSAndrew Geissler 9dd2c6fdcSAndrew Geissler namespace phosphor 10dd2c6fdcSAndrew Geissler { 11dd2c6fdcSAndrew Geissler namespace host 12dd2c6fdcSAndrew Geissler { 13dd2c6fdcSAndrew Geissler 14*12866370SAndrew Geissler using namespace phosphor::logging; 15*12866370SAndrew Geissler 16dd2c6fdcSAndrew Geissler /** @class Host 17dd2c6fdcSAndrew Geissler * @brief OpenBMC control host interface implementation. 18dd2c6fdcSAndrew Geissler * @details A concrete implementation for xyz.openbmc_project.Control.Host 19dd2c6fdcSAndrew Geissler * DBus API. 20dd2c6fdcSAndrew Geissler */ 21dd2c6fdcSAndrew Geissler class Host : public sdbusplus::server::object::object< 22dd2c6fdcSAndrew Geissler sdbusplus::xyz::openbmc_project::Control::server::Host> 23dd2c6fdcSAndrew Geissler { 24dd2c6fdcSAndrew Geissler public: 25dd2c6fdcSAndrew Geissler /** @brief Constructs Host Control Interface 26dd2c6fdcSAndrew Geissler * 27dd2c6fdcSAndrew Geissler * @param[in] bus - The Dbus bus object 28dd2c6fdcSAndrew Geissler * @param[in] objPath - The Dbus object path 29dd2c6fdcSAndrew Geissler */ 30dd2c6fdcSAndrew Geissler Host(sdbusplus::bus::bus& bus, 31dd2c6fdcSAndrew Geissler const char* objPath) : 32dd2c6fdcSAndrew Geissler sdbusplus::server::object::object< 33dd2c6fdcSAndrew Geissler sdbusplus::xyz::openbmc_project::Control::server::Host>( 341b9d4e5cSAndrew Geissler bus, objPath), 351b9d4e5cSAndrew Geissler bus(bus) 36dd2c6fdcSAndrew Geissler {} 3762817fa9SAndrew Geissler 3862817fa9SAndrew Geissler /** @brief Send input command to host 3962817fa9SAndrew Geissler * 4062817fa9SAndrew Geissler * Note that the command will be queued in a FIFO if other commands 4162817fa9SAndrew Geissler * to the host have yet to be run 4262817fa9SAndrew Geissler * 4362817fa9SAndrew Geissler * @param[in] command - Input command to execute 4462817fa9SAndrew Geissler */ 4562817fa9SAndrew Geissler void execute(Command command) override; 461b9d4e5cSAndrew Geissler 47*12866370SAndrew Geissler /** @brief Return the next entry in the queue 48*12866370SAndrew Geissler * 49*12866370SAndrew Geissler * Also signal that the command is complete since the interface 50*12866370SAndrew Geissler * contract is that we emit this signal once the message has been 51*12866370SAndrew Geissler * passed to the host (which is required when calling this interface) 52*12866370SAndrew Geissler * 53*12866370SAndrew Geissler */ 54*12866370SAndrew Geissler Command getNextCommand() 55*12866370SAndrew Geissler { 56*12866370SAndrew Geissler if(this->workQueue.empty()) 57*12866370SAndrew Geissler { 58*12866370SAndrew Geissler log<level::ERR>("Control Host work queue is empty!"); 59*12866370SAndrew Geissler elog<xyz::openbmc_project::Control::Internal::Host::QueueEmpty>(); 60*12866370SAndrew Geissler } 61*12866370SAndrew Geissler Command command = this->workQueue.front(); 62*12866370SAndrew Geissler this->workQueue.pop(); 63*12866370SAndrew Geissler this->commandComplete(command, Result::Success); 64*12866370SAndrew Geissler return command; 65*12866370SAndrew Geissler } 66*12866370SAndrew Geissler 671b9d4e5cSAndrew Geissler private: 681b9d4e5cSAndrew Geissler 691b9d4e5cSAndrew Geissler /** @brief Persistent sdbusplus DBus bus connection. */ 701b9d4e5cSAndrew Geissler sdbusplus::bus::bus& bus; 71*12866370SAndrew Geissler 72*12866370SAndrew Geissler /** @brief Queue to store the requested commands */ 73*12866370SAndrew Geissler std::queue<Command> workQueue{}; 74dd2c6fdcSAndrew Geissler }; 75dd2c6fdcSAndrew Geissler 76dd2c6fdcSAndrew Geissler } // namespace host 77dd2c6fdcSAndrew Geissler } // namespace phosphor 78