54 lines
1.7 KiB
C++
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
|