mirror of
https://github.com/AxioDL/boo.git
synced 2025-12-16 16:37:20 +00:00
HID Parser for Win32
This commit is contained in:
@@ -5,6 +5,12 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include "boo/System.hpp"
|
||||
|
||||
#if _WIN32
|
||||
#include <hidsdi.h>
|
||||
#endif
|
||||
|
||||
namespace boo
|
||||
{
|
||||
@@ -45,7 +51,11 @@ public:
|
||||
size_t receiveUSBInterruptTransfer(uint8_t* data, size_t length);
|
||||
|
||||
/* High-Level API */
|
||||
#if _WIN32
|
||||
const PHIDP_PREPARSED_DATA getReportDescriptor();
|
||||
#else
|
||||
std::vector<uint8_t> getReportDescriptor();
|
||||
#endif
|
||||
bool sendHIDReport(const uint8_t* data, size_t length, HIDReportType tp, uint32_t message=0);
|
||||
size_t receiveHIDReport(uint8_t* data, size_t length, HIDReportType tp, uint32_t message=0); // Prefer callback version
|
||||
virtual void receivedHIDReport(const uint8_t* /*data*/, size_t /*length*/, HIDReportType /*tp*/, uint32_t /*message*/) {}
|
||||
|
||||
@@ -20,8 +20,6 @@
|
||||
namespace boo
|
||||
{
|
||||
|
||||
static class DeviceFinder* skDevFinder = NULL;
|
||||
|
||||
class DeviceFinder
|
||||
{
|
||||
public:
|
||||
@@ -31,6 +29,7 @@ public:
|
||||
static inline DeviceFinder* instance() {return skDevFinder;}
|
||||
|
||||
private:
|
||||
static class DeviceFinder* skDevFinder;
|
||||
|
||||
/* Types this finder is interested in (immutable) */
|
||||
DeviceSignature::TDeviceSignatureSet m_types;
|
||||
|
||||
@@ -29,7 +29,7 @@ public:
|
||||
void initialCycle();
|
||||
void receivedHIDReport(const uint8_t* data, size_t length, HIDReportType tp, uint32_t message);
|
||||
|
||||
void enumerateValues(std::function<bool(const HIDMainItem& item)>& valueCB) const;
|
||||
void enumerateValues(const std::function<bool(const HIDMainItem& item)>& valueCB) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
#include <vector>
|
||||
#include <stack>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
|
||||
#if _WIN32
|
||||
#include <hidsdi.h>
|
||||
#endif
|
||||
|
||||
namespace boo
|
||||
{
|
||||
@@ -157,6 +162,8 @@ struct HIDMainItem
|
||||
|
||||
HIDMainItem() = default;
|
||||
HIDMainItem(uint32_t flags, const HIDItemState& state, uint32_t reportIdx);
|
||||
HIDMainItem(uint32_t flags, HIDUsagePage usagePage, HIDUsage usage,
|
||||
HIDRange logicalRange, int32_t reportSize);
|
||||
const char* GetUsagePageName() const;
|
||||
const char* GetUsageName() const;
|
||||
};
|
||||
@@ -171,22 +178,35 @@ public:
|
||||
Error
|
||||
};
|
||||
private:
|
||||
|
||||
ParserStatus m_status = ParserStatus::OK;
|
||||
#if _WIN32
|
||||
std::vector<HIDMainItem> m_itemPool;
|
||||
mutable std::vector<HIDP_DATA> m_dataList;
|
||||
PHIDP_PREPARSED_DATA m_descriptorData = nullptr;
|
||||
#else
|
||||
std::unique_ptr<HIDMainItem[]> m_itemPool;
|
||||
using Report = std::pair<uint32_t, std::pair<uint32_t, uint32_t>>;
|
||||
std::unique_ptr<Report[]> m_reportPool;
|
||||
std::pair<uint32_t, uint32_t> m_inputReports = {};
|
||||
std::pair<uint32_t, uint32_t> m_outputReports = {};
|
||||
std::pair<uint32_t, uint32_t> m_featureReports = {};
|
||||
ParserStatus m_status = ParserStatus::OK;
|
||||
bool m_multipleReports = false;
|
||||
ParserStatus ParseItem(HIDReports& reportsOut,
|
||||
std::stack<HIDItemState>& stateStack, std::stack<HIDCollectionItem>& collectionStack,
|
||||
std::stack<HIDItemState>& stateStack,
|
||||
std::stack<HIDCollectionItem>& collectionStack,
|
||||
const uint8_t*& it, const uint8_t* end);
|
||||
#endif
|
||||
|
||||
public:
|
||||
#if _WIN32
|
||||
ParserStatus Parse(const PHIDP_PREPARSED_DATA descriptorData);
|
||||
#else
|
||||
ParserStatus Parse(const uint8_t* descriptorData, size_t len);
|
||||
#endif
|
||||
operator bool() const { return m_status == ParserStatus::Done; }
|
||||
void EnumerateValues(std::function<bool(uint32_t rep, const HIDMainItem& item)>& valueCB) const;
|
||||
void ScanValues(std::function<bool(const HIDMainItem& item, int32_t value)>& valueCB,
|
||||
void EnumerateValues(const std::function<bool(const HIDMainItem& item)>& valueCB) const;
|
||||
void ScanValues(const std::function<bool(const HIDMainItem& item, int32_t value)>& valueCB,
|
||||
const uint8_t* data, size_t len) const;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user