mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-04-29 06:49:24 -04:00
Wiimote/L2CAP: More accurate descriptions for descriptors (#1512)
This commit is contained in:
parent
186e92221a
commit
8b5cafa98e
2 changed files with 34 additions and 34 deletions
|
@ -23,15 +23,15 @@ static bool AttemptSetNonBlock(int sockFd)
|
||||||
return fcntl(sockFd, F_SETFL, fcntl(sockFd, F_GETFL) | O_NONBLOCK) == 0;
|
return fcntl(sockFd, F_SETFL, fcntl(sockFd, F_GETFL) | O_NONBLOCK) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
L2CapWiimote::L2CapWiimote(int recvFd, int sendFd, bdaddr_t addr)
|
L2CapWiimote::L2CapWiimote(int controlFd, int dataFd, bdaddr_t addr)
|
||||||
: m_recvFd(recvFd), m_sendFd(sendFd), m_addr(addr)
|
: m_controlFd(controlFd), m_dataFd(dataFd), m_addr(addr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
L2CapWiimote::~L2CapWiimote()
|
L2CapWiimote::~L2CapWiimote()
|
||||||
{
|
{
|
||||||
close(m_recvFd);
|
close(m_dataFd);
|
||||||
close(m_sendFd);
|
close(m_controlFd);
|
||||||
const auto& b = m_addr.b;
|
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]);
|
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;
|
std::vector<WiimoteDevicePtr> outDevices;
|
||||||
for (const auto& addr : unconnected)
|
for (const auto& addr : unconnected)
|
||||||
{
|
{
|
||||||
// Socket for sending data to controller, PSM 0x11
|
// Control socket, PSM 0x11, needs to be open for the data socket to be opened
|
||||||
auto sendFd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
|
auto controlFd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
|
||||||
if (sendFd < 0)
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
sockaddr_l2 sendAddr{};
|
sockaddr_l2 controlAddr{};
|
||||||
sendAddr.l2_family = AF_BLUETOOTH;
|
controlAddr.l2_family = AF_BLUETOOTH;
|
||||||
sendAddr.l2_psm = htobs(0x11);
|
controlAddr.l2_psm = htobs(0x11);
|
||||||
sendAddr.l2_bdaddr = addr;
|
controlAddr.l2_bdaddr = addr;
|
||||||
|
|
||||||
if (!AttemptConnect(sendFd, sendAddr) || !AttemptSetNonBlock(sendFd))
|
if (!AttemptConnect(controlFd, controlAddr) || !AttemptSetNonBlock(controlFd))
|
||||||
{
|
{
|
||||||
const auto& b = addr.b;
|
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));
|
b[5], b[4], b[3], b[2], b[1], b[0], strerror(errno));
|
||||||
close(sendFd);
|
close(controlFd);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Socket for receiving data from controller, PSM 0x13
|
// Socket for sending and receiving data from controller, PSM 0x13
|
||||||
auto recvFd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
|
auto dataFd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
|
||||||
if (recvFd < 0)
|
if (dataFd < 0)
|
||||||
{
|
{
|
||||||
cemuLog_logDebug(LogType::Force, "Failed to open recv socket: {}", strerror(errno));
|
cemuLog_logDebug(LogType::Force, "Failed to open data socket: {}", strerror(errno));
|
||||||
close(sendFd);
|
close(controlFd);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
sockaddr_l2 recvAddr{};
|
sockaddr_l2 dataAddr{};
|
||||||
recvAddr.l2_family = AF_BLUETOOTH;
|
dataAddr.l2_family = AF_BLUETOOTH;
|
||||||
recvAddr.l2_psm = htobs(0x13);
|
dataAddr.l2_psm = htobs(0x13);
|
||||||
recvAddr.l2_bdaddr = addr;
|
dataAddr.l2_bdaddr = addr;
|
||||||
|
|
||||||
if (!AttemptConnect(recvFd, recvAddr) || !AttemptSetNonBlock(recvFd))
|
if (!AttemptConnect(dataFd, dataAddr) || !AttemptSetNonBlock(dataFd))
|
||||||
{
|
{
|
||||||
const auto& b = addr.b;
|
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));
|
b[5], b[4], b[3], b[2], b[1], b[0], strerror(errno));
|
||||||
close(sendFd);
|
close(dataFd);
|
||||||
close(recvFd);
|
close(controlFd);
|
||||||
continue;
|
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_addressMutex.lock();
|
||||||
s_addresses[addr] = true;
|
s_addresses[addr] = true;
|
||||||
|
@ -123,13 +123,13 @@ bool L2CapWiimote::write_data(const std::vector<uint8>& data)
|
||||||
buffer[0] = 0xA2;
|
buffer[0] = 0xA2;
|
||||||
std::memcpy(buffer + 1, data.data(), size);
|
std::memcpy(buffer + 1, data.data(), size);
|
||||||
const auto outSize = size + 1;
|
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()
|
std::optional<std::vector<uint8>> L2CapWiimote::read_data()
|
||||||
{
|
{
|
||||||
uint8 buffer[23];
|
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)
|
if (nBytes < 0 && errno == EWOULDBLOCK)
|
||||||
return std::vector<uint8>{};
|
return std::vector<uint8>{};
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
class L2CapWiimote : public WiimoteDevice
|
class L2CapWiimote : public WiimoteDevice
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
L2CapWiimote(int recvFd, int sendFd, bdaddr_t addr);
|
L2CapWiimote(int controlFd, int dataFd, bdaddr_t addr);
|
||||||
~L2CapWiimote() override;
|
~L2CapWiimote() override;
|
||||||
|
|
||||||
bool write_data(const std::vector<uint8>& data) 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 void AddCandidateAddress(bdaddr_t addr);
|
||||||
static std::vector<WiimoteDevicePtr> get_devices();
|
static std::vector<WiimoteDevicePtr> get_devices();
|
||||||
private:
|
private:
|
||||||
int m_recvFd;
|
int m_controlFd;
|
||||||
int m_sendFd;
|
int m_dataFd;
|
||||||
bdaddr_t m_addr;
|
bdaddr_t m_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue