blob: 611cac6d78fa65645014f9d00516ebe840c9738b [file] [log] [blame]
Matt Spinlerf02daec2017-08-14 14:00:46 -05001#pragma once
2
3#include <sdbusplus/bus.hpp>
4#include <sdbusplus/server.hpp>
5#include "event.hpp"
6#include "timer.hpp"
7
8namespace witherspoon
9{
10namespace power
11{
12
13/**
14 * @class PGOODMonitor
15 *
16 * Monitors PGOOD and creates an error if it doesn't come on in time.
17 *
18 * The run() function is designed to be called right after the
19 * power sequencer device is told to kick off a power on.
20 *
21 * Future commits will analyze the power sequencer chip for errors
22 * on a PGOOD fail.
23 */
24class PGOODMonitor
25{
26 public:
27
28 PGOODMonitor() = delete;
29 ~PGOODMonitor() = default;
30 PGOODMonitor(const PGOODMonitor&) = delete;
31 PGOODMonitor& operator=(const PGOODMonitor&) = delete;
32 PGOODMonitor(PGOODMonitor&&) = delete;
33 PGOODMonitor& operator=(PGOODMonitor&&) = delete;
34
35 /**
36 * Constructor
37 *
38 * @param[in] b - D-Bus bus object
39 * @param[in] e - event object
40 * @param[in] t - time to allow PGOOD to come up
41 */
42 PGOODMonitor(sdbusplus::bus::bus& b,
43 event::Event& e,
44 std::chrono::seconds& t) :
45 bus(b),
46 event(e),
47 interval(t),
48 timer(e, [this]() { this->analyze(); })
49 {
50 }
51
52 /**
53 * The timer callback.
54 *
55 * Creates a PGOOD failure error log.
56 */
57 void analyze();
58
59 /**
60 * Waits a specified amount of time for PGOOD to
61 * come on, and if it fails to come on in that time
62 * an error log will be created.
63 *
64 * @return - the return value from sd_event_loop()
65 */
66 int run();
67
68 private:
69
70 /**
71 * Enables the properties changed signal callback
72 * on the power object so we can tell when PGOOD
73 * comes on.
74 */
75 void startListening();
76
77 /**
78 * The callback function for the properties changed
79 * signal.
80 */
81 void propertyChanged();
82
83 /**
84 * Returns true if the system has been turned on
85 * but PGOOD isn't up yet.
86 */
87 bool pgoodPending();
88
89 /**
90 * Used to break out of the event loop in run()
91 */
92 void exitEventLoop();
93
94 /**
95 * The D-Bus object
96 */
97 sdbusplus::bus::bus& bus;
98
99 /**
100 * The match object for the properties changed signal
101 */
102 std::unique_ptr<sdbusplus::bus::match_t> match;
103
104 /**
105 * The sd_event structure used by the timer
106 */
107 event::Event& event;
108
109 /**
110 * The amount of time to wait for PGOOD to turn on
111 */
112 std::chrono::seconds interval;
113
114 /**
115 * The timer used to do the callback
116 */
117 Timer timer;
118};
119
120}
121}