udp.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright 2020 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <mutex>
  5. #include <utility>
  6. #include "common/assert.h"
  7. #include "common/threadsafe_queue.h"
  8. #include "input_common/udp/client.h"
  9. #include "input_common/udp/udp.h"
  10. namespace InputCommon {
  11. class UDPMotion final : public Input::MotionDevice {
  12. public:
  13. explicit UDPMotion(std::string ip_, u16 port_, u16 pad_, CemuhookUDP::Client* client_)
  14. : ip(std::move(ip_)), port(port_), pad(pad_), client(client_) {}
  15. Input::MotionStatus GetStatus() const override {
  16. return client->GetPadState(ip, port, pad).motion_status;
  17. }
  18. private:
  19. const std::string ip;
  20. const u16 port;
  21. const u16 pad;
  22. CemuhookUDP::Client* client;
  23. mutable std::mutex mutex;
  24. };
  25. /// A motion device factory that creates motion devices from a UDP client
  26. UDPMotionFactory::UDPMotionFactory(std::shared_ptr<CemuhookUDP::Client> client_)
  27. : client(std::move(client_)) {}
  28. /**
  29. * Creates motion device
  30. * @param params contains parameters for creating the device:
  31. * - "port": the UDP port number
  32. */
  33. std::unique_ptr<Input::MotionDevice> UDPMotionFactory::Create(const Common::ParamPackage& params) {
  34. auto ip = params.Get("ip", "127.0.0.1");
  35. const auto port = static_cast<u16>(params.Get("port", 26760));
  36. const auto pad = static_cast<u16>(params.Get("pad_index", 0));
  37. return std::make_unique<UDPMotion>(std::move(ip), port, pad, client.get());
  38. }
  39. void UDPMotionFactory::BeginConfiguration() {
  40. polling = true;
  41. client->BeginConfiguration();
  42. }
  43. void UDPMotionFactory::EndConfiguration() {
  44. polling = false;
  45. client->EndConfiguration();
  46. }
  47. Common::ParamPackage UDPMotionFactory::GetNextInput() {
  48. Common::ParamPackage params;
  49. CemuhookUDP::UDPPadStatus pad;
  50. auto& queue = client->GetPadQueue();
  51. while (queue.Pop(pad)) {
  52. if (pad.motion == CemuhookUDP::PadMotion::Undefined || std::abs(pad.motion_value) < 1) {
  53. continue;
  54. }
  55. params.Set("engine", "cemuhookudp");
  56. params.Set("ip", pad.host);
  57. params.Set("port", static_cast<u16>(pad.port));
  58. params.Set("pad_index", static_cast<u16>(pad.pad_index));
  59. params.Set("motion", static_cast<u16>(pad.motion));
  60. return params;
  61. }
  62. return params;
  63. }
  64. class UDPTouch final : public Input::TouchDevice {
  65. public:
  66. explicit UDPTouch(std::string ip_, u16 port_, u16 pad_, CemuhookUDP::Client* client_)
  67. : ip(std::move(ip_)), port(port_), pad(pad_), client(client_) {}
  68. Input::TouchStatus GetStatus() const override {
  69. return client->GetTouchState();
  70. }
  71. private:
  72. const std::string ip;
  73. [[maybe_unused]] const u16 port;
  74. [[maybe_unused]] const u16 pad;
  75. CemuhookUDP::Client* client;
  76. mutable std::mutex mutex;
  77. };
  78. /// A motion device factory that creates motion devices from a UDP client
  79. UDPTouchFactory::UDPTouchFactory(std::shared_ptr<CemuhookUDP::Client> client_)
  80. : client(std::move(client_)) {}
  81. /**
  82. * Creates motion device
  83. * @param params contains parameters for creating the device:
  84. * - "port": the UDP port number
  85. */
  86. std::unique_ptr<Input::TouchDevice> UDPTouchFactory::Create(const Common::ParamPackage& params) {
  87. auto ip = params.Get("ip", "127.0.0.1");
  88. const auto port = static_cast<u16>(params.Get("port", 26760));
  89. const auto pad = static_cast<u16>(params.Get("pad_index", 0));
  90. return std::make_unique<UDPTouch>(std::move(ip), port, pad, client.get());
  91. }
  92. } // namespace InputCommon