Files
sdrpi-fpv-control/lib/port/poller.h

54 lines
1.7 KiB
C++

#ifndef SDRPI_FPV_CONTROL_GROUND_PORT_POLLER_H
#define SDRPI_FPV_CONTROL_GROUND_PORT_POLLER_H
#include <memory>
#include <vector>
namespace poller {
/**
* PollObject - базовый объект для мониторинга I/O.
* Платформенно-специфичные дескрипторы хранятся в защищённых полях.
*/
class PollObject {
public:
bool isPollIn() const;
bool isPollOut() const;
bool isPollHup() const;
virtual ~PollObject();
protected:
#ifdef _WIN32
// UART HANDLE или UDP событие
HANDLE hCom{INVALID_HANDLE_VALUE};
SOCKET sock{INVALID_SOCKET};
WSAEVENT winHandle{nullptr};
short revents{0}; // событие произошло
#else
int fd{0};
short events{0};
short revents{0};
#endif
friend class PollWrapper;
};
/**
* Класс-обертка для мониторинга файловых дискрипторов. Использует стек для хранения массива структур мониторинга.
*/
class PollWrapper {
public:
PollWrapper();
std::vector<std::shared_ptr<PollObject>> objects;
/**
* Функция, которую нужно вызывать в бесконечном цикле. Вызывает `poll`, после чего выполняет обработчики событий, если нужно.
* @param timeoutMs
*/
void loop(int timeoutMs = -1);
~PollWrapper();
};
} // namespace poller
#endif //SDRPI_FPV_CONTROL_GROUND_PORT_POLLER_H