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