diff --git a/src/input/api/Wiimote/l2cap/L2CapWiimote.cpp b/src/input/api/Wiimote/l2cap/L2CapWiimote.cpp index 28a123f3..a6bdf574 100644 --- a/src/input/api/Wiimote/l2cap/L2CapWiimote.cpp +++ b/src/input/api/Wiimote/l2cap/L2CapWiimote.cpp @@ -23,15 +23,15 @@ static bool AttemptSetNonBlock(int sockFd) return fcntl(sockFd, F_SETFL, fcntl(sockFd, F_GETFL) | O_NONBLOCK) == 0; } -L2CapWiimote::L2CapWiimote(int recvFd, int sendFd, bdaddr_t addr) - : m_recvFd(recvFd), m_sendFd(sendFd), m_addr(addr) +L2CapWiimote::L2CapWiimote(int controlFd, int dataFd, bdaddr_t addr) + : m_controlFd(controlFd), m_dataFd(dataFd), m_addr(addr) { } L2CapWiimote::~L2CapWiimote() { - close(m_recvFd); - close(m_sendFd); + close(m_dataFd); + close(m_controlFd); const auto& b = m_addr.b; cemuLog_logDebug(LogType::Force, "Wiimote at {:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x} disconnected", b[5], b[4], b[3], b[2], b[1], b[0]); @@ -61,51 +61,51 @@ std::vector L2CapWiimote::get_devices() std::vector outDevices; for (const auto& addr : unconnected) { - // Socket for sending data to controller, PSM 0x11 - auto sendFd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); - if (sendFd < 0) + // Control socket, PSM 0x11, needs to be open for the data socket to be opened + auto controlFd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); + if (controlFd < 0) { - cemuLog_logDebug(LogType::Force, "Failed to open send socket: {}", strerror(errno)); + cemuLog_logDebug(LogType::Force, "Failed to open control socket: {}", strerror(errno)); continue; } - sockaddr_l2 sendAddr{}; - sendAddr.l2_family = AF_BLUETOOTH; - sendAddr.l2_psm = htobs(0x11); - sendAddr.l2_bdaddr = addr; + sockaddr_l2 controlAddr{}; + controlAddr.l2_family = AF_BLUETOOTH; + controlAddr.l2_psm = htobs(0x11); + controlAddr.l2_bdaddr = addr; - if (!AttemptConnect(sendFd, sendAddr) || !AttemptSetNonBlock(sendFd)) + if (!AttemptConnect(controlFd, controlAddr) || !AttemptSetNonBlock(controlFd)) { const auto& b = addr.b; - cemuLog_logDebug(LogType::Force, "Failed to connect send socket to '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}': {}", + cemuLog_logDebug(LogType::Force, "Failed to connect control socket to '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}': {}", b[5], b[4], b[3], b[2], b[1], b[0], strerror(errno)); - close(sendFd); + close(controlFd); continue; } - // Socket for receiving data from controller, PSM 0x13 - auto recvFd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); - if (recvFd < 0) + // Socket for sending and receiving data from controller, PSM 0x13 + auto dataFd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); + if (dataFd < 0) { - cemuLog_logDebug(LogType::Force, "Failed to open recv socket: {}", strerror(errno)); - close(sendFd); + cemuLog_logDebug(LogType::Force, "Failed to open data socket: {}", strerror(errno)); + close(controlFd); continue; } - sockaddr_l2 recvAddr{}; - recvAddr.l2_family = AF_BLUETOOTH; - recvAddr.l2_psm = htobs(0x13); - recvAddr.l2_bdaddr = addr; + sockaddr_l2 dataAddr{}; + dataAddr.l2_family = AF_BLUETOOTH; + dataAddr.l2_psm = htobs(0x13); + dataAddr.l2_bdaddr = addr; - if (!AttemptConnect(recvFd, recvAddr) || !AttemptSetNonBlock(recvFd)) + if (!AttemptConnect(dataFd, dataAddr) || !AttemptSetNonBlock(dataFd)) { const auto& b = addr.b; - cemuLog_logDebug(LogType::Force, "Failed to connect recv socket to '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}': {}", + cemuLog_logDebug(LogType::Force, "Failed to connect data socket to '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}': {}", b[5], b[4], b[3], b[2], b[1], b[0], strerror(errno)); - close(sendFd); - close(recvFd); + close(dataFd); + close(controlFd); continue; } - outDevices.emplace_back(std::make_shared(sendFd, recvFd, addr)); + outDevices.emplace_back(std::make_shared(controlFd, dataFd, addr)); s_addressMutex.lock(); s_addresses[addr] = true; @@ -123,13 +123,13 @@ bool L2CapWiimote::write_data(const std::vector& data) buffer[0] = 0xA2; std::memcpy(buffer + 1, data.data(), size); const auto outSize = size + 1; - return send(m_sendFd, buffer, outSize, 0) == outSize; + return send(m_dataFd, buffer, outSize, 0) == outSize; } std::optional> L2CapWiimote::read_data() { uint8 buffer[23]; - const auto nBytes = recv(m_sendFd, buffer, 23, 0); + const auto nBytes = recv(m_dataFd, buffer, 23, 0); if (nBytes < 0 && errno == EWOULDBLOCK) return std::vector{}; diff --git a/src/input/api/Wiimote/l2cap/L2CapWiimote.h b/src/input/api/Wiimote/l2cap/L2CapWiimote.h index cc8d071b..0b6c5c19 100644 --- a/src/input/api/Wiimote/l2cap/L2CapWiimote.h +++ b/src/input/api/Wiimote/l2cap/L2CapWiimote.h @@ -5,7 +5,7 @@ class L2CapWiimote : public WiimoteDevice { public: - L2CapWiimote(int recvFd, int sendFd, bdaddr_t addr); + L2CapWiimote(int controlFd, int dataFd, bdaddr_t addr); ~L2CapWiimote() override; bool write_data(const std::vector& data) override; @@ -15,8 +15,8 @@ class L2CapWiimote : public WiimoteDevice static void AddCandidateAddress(bdaddr_t addr); static std::vector get_devices(); private: - int m_recvFd; - int m_sendFd; + int m_controlFd; + int m_dataFd; bdaddr_t m_addr; };