diff options
author | FearlessTobi <thm.frey@gmail.com> | 2019-11-03 07:04:28 +0100 |
---|---|---|
committer | FearlessTobi <thm.frey@gmail.com> | 2020-01-23 20:55:26 +0100 |
commit | 0fe11746fcb37de2465cdbbe74be6ad4a59228e5 (patch) | |
tree | df1f0c06411a69f801e969db6892ade90dec6460 | |
parent | Input: UDP Client to provide motion and touch controls (diff) | |
download | yuzu-0fe11746fcb37de2465cdbbe74be6ad4a59228e5.tar yuzu-0fe11746fcb37de2465cdbbe74be6ad4a59228e5.tar.gz yuzu-0fe11746fcb37de2465cdbbe74be6ad4a59228e5.tar.bz2 yuzu-0fe11746fcb37de2465cdbbe74be6ad4a59228e5.tar.lz yuzu-0fe11746fcb37de2465cdbbe74be6ad4a59228e5.tar.xz yuzu-0fe11746fcb37de2465cdbbe74be6ad4a59228e5.tar.zst yuzu-0fe11746fcb37de2465cdbbe74be6ad4a59228e5.zip |
-rw-r--r-- | src/input_common/udp/client.cpp | 24 | ||||
-rw-r--r-- | src/input_common/udp/client.h | 8 | ||||
-rw-r--r-- | src/input_common/udp/protocol.cpp | 4 | ||||
-rw-r--r-- | src/input_common/udp/protocol.h | 101 |
4 files changed, 72 insertions, 65 deletions
diff --git a/src/input_common/udp/client.cpp b/src/input_common/udp/client.cpp index c31236c7c..3c51f72a0 100644 --- a/src/input_common/udp/client.cpp +++ b/src/input_common/udp/client.cpp @@ -88,15 +88,15 @@ private: void HandleSend(const boost::system::error_code& error) { // Send a request for getting port info for the pad Request::PortInfo port_info{1, {pad_index, 0, 0, 0}}; - auto port_message = Request::Create(port_info, client_id); + const auto port_message = Request::Create(port_info, client_id); std::memcpy(&send_buffer1, &port_message, PORT_INFO_SIZE); - std::size_t len = socket.send_to(boost::asio::buffer(send_buffer1), send_endpoint); + socket.send_to(boost::asio::buffer(send_buffer1), send_endpoint); // Send a request for getting pad data for the pad Request::PadData pad_data{Request::PadData::Flags::Id, pad_index, EMPTY_MAC_ADDRESS}; - auto pad_message = Request::Create(pad_data, client_id); + const auto pad_message = Request::Create(pad_data, client_id); std::memcpy(send_buffer2.data(), &pad_message, PAD_DATA_SIZE); - std::size_t len2 = socket.send_to(boost::asio::buffer(send_buffer2), send_endpoint); + socket.send_to(boost::asio::buffer(send_buffer2), send_endpoint); StartSend(timer.expiry()); } @@ -105,8 +105,8 @@ private: boost::asio::basic_waitable_timer<clock> timer; udp::socket socket; - u32 client_id; - u8 pad_index; + u32 client_id{}; + u8 pad_index{}; static constexpr std::size_t PORT_INFO_SIZE = sizeof(Message<Request::PortInfo>); static constexpr std::size_t PAD_DATA_SIZE = sizeof(Message<Request::PadData>); @@ -170,16 +170,16 @@ void Client::OnPadData(Response::PadData data) { // TODO: add a setting for "click" touch. Click touch refers to a device that differentiates // between a simple "tap" and a hard press that causes the touch screen to click. - bool is_active = data.touch_1.is_active != 0; + const bool is_active = data.touch_1.is_active != 0; float x = 0; float y = 0; if (is_active && status->touch_calibration) { - u16 min_x = status->touch_calibration->min_x; - u16 max_x = status->touch_calibration->max_x; - u16 min_y = status->touch_calibration->min_y; - u16 max_y = status->touch_calibration->max_y; + const u16 min_x = status->touch_calibration->min_x; + const u16 max_x = status->touch_calibration->max_x; + const u16 min_y = status->touch_calibration->min_y; + const u16 max_y = status->touch_calibration->max_y; x = (std::clamp(static_cast<u16>(data.touch_1.x), min_x, max_x) - min_x) / static_cast<float>(max_x - min_x); @@ -229,7 +229,7 @@ CalibrationConfigurationJob::CalibrationConfigurationJob( constexpr u16 CALIBRATION_THRESHOLD = 100; u16 min_x{UINT16_MAX}, min_y{UINT16_MAX}; - u16 max_x, max_y; + u16 max_x{}, max_y{}; Status current_status{Status::Initialized}; SocketCallback callback{[](Response::Version version) {}, [](Response::PortInfo info) {}, diff --git a/src/input_common/udp/client.h b/src/input_common/udp/client.h index 5177f46be..b06a3f85a 100644 --- a/src/input_common/udp/client.h +++ b/src/input_common/udp/client.h @@ -36,10 +36,10 @@ struct DeviceStatus { // calibration data for scaling the device's touch area to 3ds struct CalibrationData { - u16 min_x; - u16 min_y; - u16 max_x; - u16 max_y; + u16 min_x{}; + u16 min_y{}; + u16 max_x{}; + u16 max_y{}; }; std::optional<CalibrationData> touch_calibration; }; diff --git a/src/input_common/udp/protocol.cpp b/src/input_common/udp/protocol.cpp index d65069207..16da706d5 100644 --- a/src/input_common/udp/protocol.cpp +++ b/src/input_common/udp/protocol.cpp @@ -9,7 +9,7 @@ namespace InputCommon::CemuhookUDP { -static const std::size_t GetSizeOfResponseType(Type t) { +static constexpr std::size_t GetSizeOfResponseType(Type t) { switch (t) { case Type::Version: return sizeof(Response::Version); @@ -34,7 +34,7 @@ std::optional<Type> Validate(u8* data, std::size_t size) { LOG_DEBUG(Input, "Invalid UDP packet received"); return {}; } - Header header; + Header header{}; std::memcpy(&header, data, sizeof(Header)); if (header.magic != SERVER_MAGIC) { LOG_ERROR(Input, "UDP Packet has an unexpected magic value"); diff --git a/src/input_common/udp/protocol.h b/src/input_common/udp/protocol.h index d31bbeb89..1b521860a 100644 --- a/src/input_common/udp/protocol.h +++ b/src/input_common/udp/protocol.h @@ -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 |