logiops/src/logid/backend/hidpp/Device.h
pixl b41649b0de
Implement dj::Receiver class
Again, many things were done here.
2020-07-12 16:13:54 -04:00

70 lines
1.8 KiB
C++

#ifndef LOGID_HIDPP_DEVICE_H
#define LOGID_HIDPP_DEVICE_H
#include <string>
#include <memory>
#include <functional>
#include <map>
#include "../raw/RawDevice.h"
#include "Report.h"
#include "defs.h"
namespace logid {
namespace backend {
namespace hidpp
{
struct EventHandler
{
std::function<bool(Report&)> condition;
std::function<void(Report&)> callback;
};
class Device
{
public:
class InvalidDevice : std::exception
{
public:
enum Reason
{
NoHIDPPReport,
InvalidRawDevice
};
InvalidDevice(Reason reason) : _reason (reason) {}
virtual const char *what() const noexcept;
virtual Reason code() const noexcept;
private:
Reason _reason;
};
Device(const std::string& path, DeviceIndex index);
Device(std::shared_ptr<raw::RawDevice> raw_device, DeviceIndex index);
~Device();
std::string devicePath() const { return path; }
DeviceIndex deviceIndex() const { return _index; }
std::tuple<uint8_t, uint8_t> version() const { return _version; }
void listen(); // Runs asynchronously
void stopListening();
void addEventHandler(const std::string& nickname, const std::shared_ptr<EventHandler>& handler);
void removeEventHandler(const std::string& nickname);
Report sendReport(Report& report);
void handleEvent(Report& report);
private:
void _init();
std::shared_ptr<raw::RawDevice> raw_device;
std::string path;
DeviceIndex _index;
uint8_t supported_reports;
std::tuple<uint8_t, uint8_t> _version;
std::map<std::string, std::shared_ptr<EventHandler>> event_handlers;
};
} } }
#endif //LOGID_HIDPP_DEVICE_H