mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-04-20 15:51:15 +02:00
Wiimote/L2CAP: More accurate descriptions for descriptors (#1512)
This commit is contained in:
parent
186e92221a
commit
8b5cafa98e
src/input/api/Wiimote/l2cap
@ -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<WiimoteDevicePtr> L2CapWiimote::get_devices()
|
||||
std::vector<WiimoteDevicePtr> 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<L2CapWiimote>(sendFd, recvFd, addr));
|
||||
outDevices.emplace_back(std::make_shared<L2CapWiimote>(controlFd, dataFd, addr));
|
||||
|
||||
s_addressMutex.lock();
|
||||
s_addresses[addr] = true;
|
||||
@ -123,13 +123,13 @@ bool L2CapWiimote::write_data(const std::vector<uint8>& 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<std::vector<uint8>> 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<uint8>{};
|
||||
|
@ -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<uint8>& data) override;
|
||||
@ -15,8 +15,8 @@ class L2CapWiimote : public WiimoteDevice
|
||||
static void AddCandidateAddress(bdaddr_t addr);
|
||||
static std::vector<WiimoteDevicePtr> get_devices();
|
||||
private:
|
||||
int m_recvFd;
|
||||
int m_sendFd;
|
||||
int m_controlFd;
|
||||
int m_dataFd;
|
||||
bdaddr_t m_addr;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user