171230efdSCarol Wang #pragma once
271230efdSCarol Wang 
371230efdSCarol Wang #include <sdbusplus/bus.hpp>
471230efdSCarol Wang #include <phosphor-logging/log.hpp>
5*6a5db3d3SCarol Wang #include <sdeventplus/event.hpp>
6*6a5db3d3SCarol Wang #include <sdeventplus/utility/timer.hpp>
771230efdSCarol Wang #include <xyz/openbmc_project/State/ScheduledHostTransition/server.hpp>
8*6a5db3d3SCarol Wang #include "config.h"
971230efdSCarol Wang 
104ca6f3f4SCarol Wang class TestScheduledHostTransition;
114ca6f3f4SCarol Wang 
1271230efdSCarol Wang namespace phosphor
1371230efdSCarol Wang {
1471230efdSCarol Wang namespace state
1571230efdSCarol Wang {
1671230efdSCarol Wang namespace manager
1771230efdSCarol Wang {
1871230efdSCarol Wang 
19*6a5db3d3SCarol Wang using Transition =
20*6a5db3d3SCarol Wang     sdbusplus::xyz::openbmc_project::State::server::Host::Transition;
2171230efdSCarol Wang using ScheduledHostTransitionInherit = sdbusplus::server::object::object<
2271230efdSCarol Wang     sdbusplus::xyz::openbmc_project::State::server::ScheduledHostTransition>;
2371230efdSCarol Wang 
2471230efdSCarol Wang /** @class ScheduledHostTransition
2571230efdSCarol Wang  *  @brief Scheduled host transition implementation.
2671230efdSCarol Wang  *  @details A concrete implementation for
2771230efdSCarol Wang  *  xyz.openbmc_project.State.ScheduledHostTransition
2871230efdSCarol Wang  */
2971230efdSCarol Wang class ScheduledHostTransition : public ScheduledHostTransitionInherit
3071230efdSCarol Wang {
3171230efdSCarol Wang   public:
32*6a5db3d3SCarol Wang     ScheduledHostTransition(sdbusplus::bus::bus& bus, const char* objPath,
33*6a5db3d3SCarol Wang                             const sdeventplus::Event& event) :
34*6a5db3d3SCarol Wang         ScheduledHostTransitionInherit(bus, objPath),
35*6a5db3d3SCarol Wang         bus(bus),
36*6a5db3d3SCarol Wang         timer(event, std::bind(&ScheduledHostTransition::callback, this))
3771230efdSCarol Wang     {
3871230efdSCarol Wang     }
3971230efdSCarol Wang 
4071230efdSCarol Wang     ~ScheduledHostTransition() = default;
4171230efdSCarol Wang 
4271230efdSCarol Wang     /**
4371230efdSCarol Wang      * @brief Handle with scheduled time
4471230efdSCarol Wang      *
4571230efdSCarol Wang      * @param[in] value - The seconds since epoch
4671230efdSCarol Wang      * @return The time for the transition. It is the same as the input value if
4771230efdSCarol Wang      * it is set successfully. Otherwise, it won't return value, but throw an
4871230efdSCarol Wang      * error.
4971230efdSCarol Wang      **/
5071230efdSCarol Wang     uint64_t scheduledTime(uint64_t value) override;
514ca6f3f4SCarol Wang 
524ca6f3f4SCarol Wang   private:
534ca6f3f4SCarol Wang     friend class TestScheduledHostTransition;
54*6a5db3d3SCarol Wang 
55*6a5db3d3SCarol Wang     /** @brief sdbusplus bus client connection */
56*6a5db3d3SCarol Wang     sdbusplus::bus::bus& bus;
57*6a5db3d3SCarol Wang 
58*6a5db3d3SCarol Wang     /** @brief Timer used for host transition with seconds */
59*6a5db3d3SCarol Wang     sdeventplus::utility::Timer<sdeventplus::ClockId::RealTime> timer;
60*6a5db3d3SCarol Wang 
614ca6f3f4SCarol Wang     /** @brief Get current time
624ca6f3f4SCarol Wang      *
634ca6f3f4SCarol Wang      *  @return - return current epoch time
644ca6f3f4SCarol Wang      */
654ca6f3f4SCarol Wang     std::chrono::seconds getTime();
66*6a5db3d3SCarol Wang 
67*6a5db3d3SCarol Wang     /** @brief Implement host transition
68*6a5db3d3SCarol Wang      *
69*6a5db3d3SCarol Wang      *  @return - Does not return anything. Error will result in exception
70*6a5db3d3SCarol Wang      *            being thrown
71*6a5db3d3SCarol Wang      */
72*6a5db3d3SCarol Wang     void hostTransition();
73*6a5db3d3SCarol Wang 
74*6a5db3d3SCarol Wang     /** @brief Used by the timer to do host transition */
75*6a5db3d3SCarol Wang     void callback();
7671230efdSCarol Wang };
7771230efdSCarol Wang } // namespace manager
7871230efdSCarol Wang } // namespace state
7971230efdSCarol Wang } // namespace phosphor
80