#include "PinMonitor.h" #include "DevUtil.h" #include #include #include #include #include #include "StopWatch.h" PinMonitor::PinMonitor(unsigned int pinNum, std::function call_back) : pin(pinNum) { pin.setDirection(Gpio::in); pin.setEdge(Gpio::falling); this->call_back = call_back; thread_monitor = std::thread(&PinMonitor::monitor, this); // printf("PinMonitor threadid = %d \n",thread_monitor.get_id()); } PinMonitor::~PinMonitor() { bMonitor = false; if (thread_monitor.joinable()) thread_monitor.join(); } void PinMonitor::monitor() { pollfd pfd; int ret = 0; pfd.fd = -1; char buf[8]; int num; StopWatch sw; pfd.fd = open(pin.getValuePath().c_str(), O_RDONLY); if (pfd.fd < 0) ret = -1; pfd.events = POLLPRI; num = read(pfd.fd, buf, 8); // This is to clear the avaible read while (bMonitor) { ret = poll(&pfd, 1, 1000); if (ret > 0) { if (pfd.revents & POLLPRI) { lseek(pfd.fd, 0, SEEK_SET); num = read(pfd.fd, buf, 8); buf[num - 1] = '\0'; ret = atoi(buf); if (call_back) call_back(pin.getPort()); sw.reset(); while (sw.elapsed_ms() < 30) { ret = poll(&pfd, 1, 1); if (ret > 0) { num = read(pfd.fd, buf, 8); buf[num - 1] = '\0'; ret = atoi(buf); // printf("pMonitor nread = %d ret val = %d \n",num,ret); } } } } } close(pfd.fd); }