xref: /openbmc/phosphor-gpio-monitor/monitor.hpp (revision 8377d59c61c653a34df1c3c4ca72219eceb0b43b)
14902a10cSVishwanatha Subbanna #pragma once
24902a10cSVishwanatha Subbanna 
3dace680fSPatrick Venture #include "evdev.hpp"
4dace680fSPatrick Venture 
54902a10cSVishwanatha Subbanna #include <linux/input.h>
60b95603eSVishwanatha Subbanna #include <systemd/sd-event.h>
7dace680fSPatrick Venture #include <unistd.h>
8dace680fSPatrick Venture 
9ba730130SVishwanatha Subbanna #include <sdbusplus/bus.hpp>
1039084b4aSPatrick Williams 
11dace680fSPatrick Venture #include <string>
129925857aSGunnar Mills 
134902a10cSVishwanatha Subbanna namespace phosphor
144902a10cSVishwanatha Subbanna {
154902a10cSVishwanatha Subbanna namespace gpio
164902a10cSVishwanatha Subbanna {
170b95603eSVishwanatha Subbanna 
184902a10cSVishwanatha Subbanna /** @class Monitor
194902a10cSVishwanatha Subbanna  *  @brief Responsible for catching GPIO state change
209925857aSGunnar Mills  *  condition and starting systemd targets.
214902a10cSVishwanatha Subbanna  */
229925857aSGunnar Mills class Monitor : public Evdev
234902a10cSVishwanatha Subbanna {
244902a10cSVishwanatha Subbanna   public:
254902a10cSVishwanatha Subbanna     Monitor() = delete;
260b95603eSVishwanatha Subbanna     ~Monitor() = default;
274902a10cSVishwanatha Subbanna     Monitor(const Monitor&) = delete;
284902a10cSVishwanatha Subbanna     Monitor& operator=(const Monitor&) = delete;
294902a10cSVishwanatha Subbanna     Monitor(Monitor&&) = delete;
304902a10cSVishwanatha Subbanna     Monitor& operator=(Monitor&&) = delete;
314902a10cSVishwanatha Subbanna 
324902a10cSVishwanatha Subbanna     /** @brief Constructs Monitor object.
334902a10cSVishwanatha Subbanna      *
344902a10cSVishwanatha Subbanna      *  @param[in] path     - Path to gpio input device
354902a10cSVishwanatha Subbanna      *  @param[in] key      - GPIO key to monitor
364902a10cSVishwanatha Subbanna      *  @param[in] polarity - GPIO assertion polarity to look for
374902a10cSVishwanatha Subbanna      *  @param[in] target   - systemd unit to be started on GPIO
384902a10cSVishwanatha Subbanna      *                        value change
390b95603eSVishwanatha Subbanna      *  @param[in] event    - sd_event handler
40bc4a4ff6SLei YU      *  @param[in] continueRun - Whether to continue after key pressed
410b95603eSVishwanatha Subbanna      *  @param[in] handler  - IO callback handler. Defaults to one in this
420b95603eSVishwanatha Subbanna      *                        class
43ba8de421SVishwanatha Subbanna      *  @param[in] useEvDev - Whether to use EvDev to retrieve events
444902a10cSVishwanatha Subbanna      */
Monitor(const std::string & path,decltype(input_event::code)key,decltype(input_event::value)polarity,const std::string & target,EventPtr & event,bool continueRun,sd_event_io_handler_t handler=Monitor::processEvents,bool useEvDev=true)45dace680fSPatrick Venture     Monitor(const std::string& path, decltype(input_event::code) key,
46dace680fSPatrick Venture             decltype(input_event::value) polarity, const std::string& target,
47dace680fSPatrick Venture             EventPtr& event, bool continueRun,
48ba8de421SVishwanatha Subbanna             sd_event_io_handler_t handler = Monitor::processEvents,
49dace680fSPatrick Venture             bool useEvDev = true) :
50*8377d59cSPatrick Williams         Evdev(path, key, event, handler, useEvDev), polarity(polarity),
51*8377d59cSPatrick Williams         target(target), continueAfterKeyPress(continueRun) {};
524902a10cSVishwanatha Subbanna 
530b95603eSVishwanatha Subbanna     /** @brief Callback handler when the FD has some activity on it
540b95603eSVishwanatha Subbanna      *
550b95603eSVishwanatha Subbanna      *  @param[in] es       - Populated event source
560b95603eSVishwanatha Subbanna      *  @param[in] fd       - Associated File descriptor
570b95603eSVishwanatha Subbanna      *  @param[in] revents  - Type of event
580b95603eSVishwanatha Subbanna      *  @param[in] userData - User data that was passed during registration
590b95603eSVishwanatha Subbanna      *
600b95603eSVishwanatha Subbanna      *  @return             - 0 or positive number on success and negative
610b95603eSVishwanatha Subbanna      *                        errno otherwise
620b95603eSVishwanatha Subbanna      */
63dace680fSPatrick Venture     static int processEvents(sd_event_source* es, int fd, uint32_t revents,
64dace680fSPatrick Venture                              void* userData);
650b95603eSVishwanatha Subbanna 
66ba730130SVishwanatha Subbanna     /** @brief Returns the completion state of this handler */
completed() const67ba730130SVishwanatha Subbanna     inline auto completed() const
68ba730130SVishwanatha Subbanna     {
69ba730130SVishwanatha Subbanna         return complete;
70ba730130SVishwanatha Subbanna     }
71ba730130SVishwanatha Subbanna 
724902a10cSVishwanatha Subbanna   private:
734902a10cSVishwanatha Subbanna     /** @brief GPIO key value that is of interest */
744902a10cSVishwanatha Subbanna     decltype(input_event::value) polarity;
754902a10cSVishwanatha Subbanna 
764902a10cSVishwanatha Subbanna     /** @brief Systemd unit to be started when the condition is met */
774902a10cSVishwanatha Subbanna     const std::string& target;
784902a10cSVishwanatha Subbanna 
79bc4a4ff6SLei YU     /** @brief If the monitor should continue after key press */
80bc4a4ff6SLei YU     bool continueAfterKeyPress;
81bc4a4ff6SLei YU 
82ba730130SVishwanatha Subbanna     /** @brief Completion indicator */
83ba730130SVishwanatha Subbanna     bool complete = false;
84ba730130SVishwanatha Subbanna 
8577ec4799SVishwanatha Subbanna     /** @brief Analyzes the GPIO event and starts configured target */
8677ec4799SVishwanatha Subbanna     void analyzeEvent();
874902a10cSVishwanatha Subbanna };
884902a10cSVishwanatha Subbanna 
894902a10cSVishwanatha Subbanna } // namespace gpio
904902a10cSVishwanatha Subbanna } // namespace phosphor
91