|
@@ -26,13 +26,19 @@ constexpr std::array<u8, 8> DefaultVibrationBuffer{0x0, 0x1, 0x40, 0x40, 0x0, 0x
|
|
|
using MacAddress = std::array<u8, 6>;
|
|
using MacAddress = std::array<u8, 6>;
|
|
|
using SerialNumber = std::array<u8, 15>;
|
|
using SerialNumber = std::array<u8, 15>;
|
|
|
|
|
|
|
|
-enum class ControllerType {
|
|
|
|
|
- None,
|
|
|
|
|
- Left,
|
|
|
|
|
- Right,
|
|
|
|
|
- Pro,
|
|
|
|
|
- Grip,
|
|
|
|
|
- Dual,
|
|
|
|
|
|
|
+enum class ControllerType : u8 {
|
|
|
|
|
+ None = 0x00,
|
|
|
|
|
+ Left = 0x01,
|
|
|
|
|
+ Right = 0x02,
|
|
|
|
|
+ Pro = 0x03,
|
|
|
|
|
+ Dual = 0x05, // TODO: Verify this id
|
|
|
|
|
+ LarkHvc1 = 0x07,
|
|
|
|
|
+ LarkHvc2 = 0x08,
|
|
|
|
|
+ LarkNesLeft = 0x09,
|
|
|
|
|
+ LarkNesRight = 0x0A,
|
|
|
|
|
+ Lucia = 0x0B,
|
|
|
|
|
+ Lagon = 0x0C,
|
|
|
|
|
+ Lager = 0x0D,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
enum class PadAxes {
|
|
enum class PadAxes {
|
|
@@ -143,9 +149,10 @@ enum class SubCommand : u8 {
|
|
|
ENABLE_VIBRATION = 0x48,
|
|
ENABLE_VIBRATION = 0x48,
|
|
|
GET_REGULATED_VOLTAGE = 0x50,
|
|
GET_REGULATED_VOLTAGE = 0x50,
|
|
|
SET_EXTERNAL_CONFIG = 0x58,
|
|
SET_EXTERNAL_CONFIG = 0x58,
|
|
|
- UNKNOWN_RINGCON = 0x59,
|
|
|
|
|
- UNKNOWN_RINGCON2 = 0x5A,
|
|
|
|
|
- UNKNOWN_RINGCON3 = 0x5C,
|
|
|
|
|
|
|
+ GET_EXTERNAL_DEVICE_INFO = 0x59,
|
|
|
|
|
+ ENABLE_EXTERNAL_POLLING = 0x5A,
|
|
|
|
|
+ DISABLE_EXTERNAL_POLLING = 0x5B,
|
|
|
|
|
+ SET_EXTERNAL_FORMAT_CONFIG = 0x5C,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
enum class UsbSubCommand : u8 {
|
|
enum class UsbSubCommand : u8 {
|
|
@@ -165,19 +172,25 @@ enum class CalibrationMagic : u8 {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
enum class SpiAddress {
|
|
enum class SpiAddress {
|
|
|
- SERIAL_NUMBER = 0X6000,
|
|
|
|
|
- DEVICE_TYPE = 0X6012,
|
|
|
|
|
- COLOR_EXIST = 0X601B,
|
|
|
|
|
- FACT_LEFT_DATA = 0X603d,
|
|
|
|
|
- FACT_RIGHT_DATA = 0X6046,
|
|
|
|
|
- COLOR_DATA = 0X6050,
|
|
|
|
|
- FACT_IMU_DATA = 0X6020,
|
|
|
|
|
- USER_LEFT_MAGIC = 0X8010,
|
|
|
|
|
- USER_LEFT_DATA = 0X8012,
|
|
|
|
|
- USER_RIGHT_MAGIC = 0X801B,
|
|
|
|
|
- USER_RIGHT_DATA = 0X801D,
|
|
|
|
|
- USER_IMU_MAGIC = 0X8026,
|
|
|
|
|
- USER_IMU_DATA = 0X8028,
|
|
|
|
|
|
|
+ MAGIC = 0x0000,
|
|
|
|
|
+ MAC_ADDRESS = 0x0015,
|
|
|
|
|
+ PAIRING_INFO = 0x2000,
|
|
|
|
|
+ SHIPMENT = 0x5000,
|
|
|
|
|
+ SERIAL_NUMBER = 0x6000,
|
|
|
|
|
+ DEVICE_TYPE = 0x6012,
|
|
|
|
|
+ FORMAT_VERSION = 0x601B,
|
|
|
|
|
+ FACT_IMU_DATA = 0x6020,
|
|
|
|
|
+ FACT_LEFT_DATA = 0x603d,
|
|
|
|
|
+ FACT_RIGHT_DATA = 0x6046,
|
|
|
|
|
+ COLOR_DATA = 0x6050,
|
|
|
|
|
+ DESIGN_VARIATION = 0x605C,
|
|
|
|
|
+ SENSOR_DATA = 0x6080,
|
|
|
|
|
+ USER_LEFT_MAGIC = 0x8010,
|
|
|
|
|
+ USER_LEFT_DATA = 0x8012,
|
|
|
|
|
+ USER_RIGHT_MAGIC = 0x801B,
|
|
|
|
|
+ USER_RIGHT_DATA = 0x801D,
|
|
|
|
|
+ USER_IMU_MAGIC = 0x8026,
|
|
|
|
|
+ USER_IMU_DATA = 0x8028,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
enum class ReportMode : u8 {
|
|
enum class ReportMode : u8 {
|
|
@@ -359,6 +372,11 @@ enum class IrRegistersAddress : u16 {
|
|
|
DenoiseColor = 0x6901,
|
|
DenoiseColor = 0x6901,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+enum class ExternalDeviceId : u8 {
|
|
|
|
|
+ RingController = 0x20,
|
|
|
|
|
+ Starlink = 0x28,
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
enum class DriverResult {
|
|
enum class DriverResult {
|
|
|
Success,
|
|
Success,
|
|
|
WrongReply,
|
|
WrongReply,
|
|
@@ -605,9 +623,11 @@ static_assert(sizeof(FirmwareVersion) == 0x2, "FirmwareVersion is an invalid siz
|
|
|
|
|
|
|
|
struct DeviceInfo {
|
|
struct DeviceInfo {
|
|
|
FirmwareVersion firmware;
|
|
FirmwareVersion firmware;
|
|
|
|
|
+ std::array<u8, 2> unknown_1;
|
|
|
MacAddress mac_address;
|
|
MacAddress mac_address;
|
|
|
|
|
+ std::array<u8, 2> unknown_2;
|
|
|
};
|
|
};
|
|
|
-static_assert(sizeof(DeviceInfo) == 0x8, "DeviceInfo is an invalid size");
|
|
|
|
|
|
|
+static_assert(sizeof(DeviceInfo) == 0xC, "DeviceInfo is an invalid size");
|
|
|
|
|
|
|
|
struct MotionStatus {
|
|
struct MotionStatus {
|
|
|
bool is_enabled;
|
|
bool is_enabled;
|