#pragma once
#include "Common/CommonWindows.h"
#include "Windows/Hid/HidInputDevice.h"
constexpr u8 LED_R = 0x05;
constexpr u8 LED_G = 0x10;
constexpr u8 LED_B = 0x40;
enum HidStickAxis : u32 {
HID_STICK_LX = 0,
HID_STICK_LY = 1,
HID_STICK_RX = 2,
HID_STICK_RY = 3,
};
enum HidTriggerAxis : u32 {
HID_TRIGGER_L2 = 0,
HID_TRIGGER_R2 = 1,
};
bool WriteReport(HANDLE handle, const u8 *data, size_t size);
template<class T>
inline bool WriteReport(HANDLE handle, const T &report) {
return WriteReport(handle, (const u8 *)&report, sizeof(T));
}
constexpr inline uint32_t UpdateCRC32(uint32_t crc, const uint8_t* data, size_t len) {
for (size_t i = 0; i < len; i++) {
crc ^= data[i];
for (int j = 0; j < 8; j++) {
crc = (crc >> 1) ^ (0xEDB88320 & (-(int32_t)(crc & 1)));
}
}
return crc;
}
constexpr inline uint32_t ComputeDualSenseBTCRC(const uint8_t* buffer, size_t len) {
constexpr uint8_t btHeader = 0xA2;
constexpr uint32_t headerCRC = UpdateCRC32(0xFFFFFFFF, &btHeader, 1);
const uint32_t crc = UpdateCRC32(headerCRC, buffer, len);
return ~crc;
}