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