|
|
|
@ -26,15 +26,15 @@ enum class Type : u32 {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Header {
|
|
|
|
|
u32_le magic;
|
|
|
|
|
u16_le protocol_version;
|
|
|
|
|
u16_le payload_length;
|
|
|
|
|
u32_le crc;
|
|
|
|
|
u32_le id;
|
|
|
|
|
u32_le magic{};
|
|
|
|
|
u16_le protocol_version{};
|
|
|
|
|
u16_le payload_length{};
|
|
|
|
|
u32_le crc{};
|
|
|
|
|
u32_le id{};
|
|
|
|
|
///> In the protocol, the type of the packet is not part of the header, but its convenient to
|
|
|
|
|
///> include in the header so the callee doesn't have to duplicate the type twice when building
|
|
|
|
|
///> the data
|
|
|
|
|
Type type;
|
|
|
|
|
Type type{};
|
|
|
|
|
};
|
|
|
|
|
static_assert(sizeof(Header) == 20, "UDP Message Header struct has wrong size");
|
|
|
|
|
static_assert(std::is_trivially_copyable_v<Header>, "UDP Message Header is not trivially copyable");
|
|
|
|
@ -45,7 +45,7 @@ constexpr MacAddress EMPTY_MAC_ADDRESS = {0, 0, 0, 0, 0, 0};
|
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
|
template <typename T>
|
|
|
|
|
struct Message {
|
|
|
|
|
Header header;
|
|
|
|
|
Header header{};
|
|
|
|
|
T data;
|
|
|
|
|
};
|
|
|
|
|
#pragma pack(pop)
|
|
|
|
@ -64,7 +64,7 @@ struct Version {};
|
|
|
|
|
*/
|
|
|
|
|
constexpr u32 MAX_PORTS = 4;
|
|
|
|
|
struct PortInfo {
|
|
|
|
|
u32_le pad_count; ///> Number of ports to request data for
|
|
|
|
|
u32_le pad_count{}; ///> Number of ports to request data for
|
|
|
|
|
std::array<u8, MAX_PORTS> port;
|
|
|
|
|
};
|
|
|
|
|
static_assert(std::is_trivially_copyable_v<PortInfo>,
|
|
|
|
@ -82,9 +82,9 @@ struct PadData {
|
|
|
|
|
Mac,
|
|
|
|
|
};
|
|
|
|
|
/// Determines which method will be used as a look up for the controller
|
|
|
|
|
Flags flags;
|
|
|
|
|
Flags flags{};
|
|
|
|
|
/// Index of the port of the controller to retrieve data about
|
|
|
|
|
u8 port_id;
|
|
|
|
|
u8 port_id{};
|
|
|
|
|
/// Mac address of the controller to retrieve data about
|
|
|
|
|
MacAddress mac;
|
|
|
|
|
};
|
|
|
|
@ -113,20 +113,20 @@ Message<T> Create(const T data, const u32 client_id = 0) {
|
|
|
|
|
namespace Response {
|
|
|
|
|
|
|
|
|
|
struct Version {
|
|
|
|
|
u16_le version;
|
|
|
|
|
u16_le version{};
|
|
|
|
|
};
|
|
|
|
|
static_assert(sizeof(Version) == 2, "UDP Response Version struct has wrong size");
|
|
|
|
|
static_assert(std::is_trivially_copyable_v<Version>,
|
|
|
|
|
"UDP Response Version is not trivially copyable");
|
|
|
|
|
|
|
|
|
|
struct PortInfo {
|
|
|
|
|
u8 id;
|
|
|
|
|
u8 state;
|
|
|
|
|
u8 model;
|
|
|
|
|
u8 connection_type;
|
|
|
|
|
u8 id{};
|
|
|
|
|
u8 state{};
|
|
|
|
|
u8 model{};
|
|
|
|
|
u8 connection_type{};
|
|
|
|
|
MacAddress mac;
|
|
|
|
|
u8 battery;
|
|
|
|
|
u8 is_pad_active;
|
|
|
|
|
u8 battery{};
|
|
|
|
|
u8 is_pad_active{};
|
|
|
|
|
};
|
|
|
|
|
static_assert(sizeof(PortInfo) == 12, "UDP Response PortInfo struct has wrong size");
|
|
|
|
|
static_assert(std::is_trivially_copyable_v<PortInfo>,
|
|
|
|
@ -134,10 +134,10 @@ static_assert(std::is_trivially_copyable_v<PortInfo>,
|
|
|
|
|
|
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
|
struct PadData {
|
|
|
|
|
PortInfo info;
|
|
|
|
|
u32_le packet_counter;
|
|
|
|
|
PortInfo info{};
|
|
|
|
|
u32_le packet_counter{};
|
|
|
|
|
|
|
|
|
|
u16_le digital_button;
|
|
|
|
|
u16_le digital_button{};
|
|
|
|
|
// The following union isn't trivially copyable but we don't use this input anyway.
|
|
|
|
|
// union DigitalButton {
|
|
|
|
|
// u16_le button;
|
|
|
|
@ -161,46 +161,46 @@ struct PadData {
|
|
|
|
|
|
|
|
|
|
u8 home;
|
|
|
|
|
/// If the device supports a "click" on the touchpad, this will change to 1 when a click happens
|
|
|
|
|
u8 touch_hard_press;
|
|
|
|
|
u8 left_stick_x;
|
|
|
|
|
u8 left_stick_y;
|
|
|
|
|
u8 right_stick_x;
|
|
|
|
|
u8 right_stick_y;
|
|
|
|
|
u8 touch_hard_press{};
|
|
|
|
|
u8 left_stick_x{};
|
|
|
|
|
u8 left_stick_y{};
|
|
|
|
|
u8 right_stick_x{};
|
|
|
|
|
u8 right_stick_y{};
|
|
|
|
|
|
|
|
|
|
struct AnalogButton {
|
|
|
|
|
u8 button_8;
|
|
|
|
|
u8 button_7;
|
|
|
|
|
u8 button_6;
|
|
|
|
|
u8 button_5;
|
|
|
|
|
u8 button_12;
|
|
|
|
|
u8 button_11;
|
|
|
|
|
u8 button_10;
|
|
|
|
|
u8 button_9;
|
|
|
|
|
u8 button_16;
|
|
|
|
|
u8 button_15;
|
|
|
|
|
u8 button_14;
|
|
|
|
|
u8 button_13;
|
|
|
|
|
u8 button_8{};
|
|
|
|
|
u8 button_7{};
|
|
|
|
|
u8 button_6{};
|
|
|
|
|
u8 button_5{};
|
|
|
|
|
u8 button_12{};
|
|
|
|
|
u8 button_11{};
|
|
|
|
|
u8 button_10{};
|
|
|
|
|
u8 button_9{};
|
|
|
|
|
u8 button_16{};
|
|
|
|
|
u8 button_15{};
|
|
|
|
|
u8 button_14{};
|
|
|
|
|
u8 button_13{};
|
|
|
|
|
} analog_button;
|
|
|
|
|
|
|
|
|
|
struct TouchPad {
|
|
|
|
|
u8 is_active;
|
|
|
|
|
u8 id;
|
|
|
|
|
u16_le x;
|
|
|
|
|
u16_le y;
|
|
|
|
|
u8 is_active{};
|
|
|
|
|
u8 id{};
|
|
|
|
|
u16_le x{};
|
|
|
|
|
u16_le y{};
|
|
|
|
|
} touch_1, touch_2;
|
|
|
|
|
|
|
|
|
|
u64_le motion_timestamp;
|
|
|
|
|
|
|
|
|
|
struct Accelerometer {
|
|
|
|
|
float x;
|
|
|
|
|
float y;
|
|
|
|
|
float z;
|
|
|
|
|
float x{};
|
|
|
|
|
float y{};
|
|
|
|
|
float z{};
|
|
|
|
|
} accel;
|
|
|
|
|
|
|
|
|
|
struct Gyroscope {
|
|
|
|
|
float pitch;
|
|
|
|
|
float yaw;
|
|
|
|
|
float roll;
|
|
|
|
|
float pitch{};
|
|
|
|
|
float yaw{};
|
|
|
|
|
float roll{};
|
|
|
|
|
} gyro;
|
|
|
|
|
};
|
|
|
|
|
#pragma pack(pop)
|
|
|
|
@ -212,6 +212,13 @@ static_assert(std::is_trivially_copyable_v<PadData>,
|
|
|
|
|
static_assert(sizeof(Message<PadData>) == MAX_PACKET_SIZE,
|
|
|
|
|
"UDP MAX_PACKET_SIZE is no longer larger than Message<PadData>");
|
|
|
|
|
|
|
|
|
|
static_assert(sizeof(PadData::AnalogButton) == 12,
|
|
|
|
|
"UDP Response AnalogButton struct has wrong size ");
|
|
|
|
|
static_assert(sizeof(PadData::TouchPad) == 6, "UDP Response TouchPad struct has wrong size ");
|
|
|
|
|
static_assert(sizeof(PadData::Accelerometer) == 12,
|
|
|
|
|
"UDP Response Accelerometer struct has wrong size ");
|
|
|
|
|
static_assert(sizeof(PadData::Gyroscope) == 12, "UDP Response Gyroscope struct has wrong size ");
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create a Response Message from the data
|
|
|
|
|
* @param data array of bytes sent from the server
|
|
|
|
|