Untested Windows buildfix attempt.

This commit is contained in:
Jordan Woyak 2013-01-15 22:57:25 -06:00
parent b2acae44b7
commit 54497be653
7 changed files with 139 additions and 144 deletions

View File

@ -21,9 +21,19 @@
namespace WiimoteReal
{
int FindWiimotes(Wiimote **wm, int max_wiimotes)
WiimoteScanner::WiimoteScanner()
{
return 0;
return;
}
std::vector<Wiimote*> WiimoteScanner::FindWiimotes(size_t max_wiimotes)
{
return std::vector<Wiimote*>()
}
bool WiimoteScanner::IsReady() const
{
return false;
}
bool Wiimote::Connect()
@ -31,7 +41,7 @@ bool Wiimote::Connect()
return 0;
}
void Wiimote::RealDisconnect()
void Wiimote::Disconnect()
{
return;
}

View File

@ -131,7 +131,7 @@ std::vector<Wiimote*> WiimoteScanner::FindWiimotes(size_t max_wiimotes)
}
// Connect to a wiimote with a known address.
bool Wiimote::Open()
bool Wiimote::Connect()
{
sockaddr_l2 addr;
addr.l2_family = AF_BLUETOOTH;
@ -177,7 +177,7 @@ void Wiimote::StopThread()
m_wiimote_thread.join();
}
void Wiimote::Close()
void Wiimote::Disconnect()
{
close(cmd_sock);
close(int_sock);
@ -186,7 +186,7 @@ void Wiimote::Close()
int_sock = -1;
}
bool Wiimote::IsOpen() const
bool Wiimote::IsConnected() const
{
return cmd_sock != -1;// && int_sock != -1;
}

View File

@ -127,12 +127,21 @@ inline void init_lib()
namespace WiimoteReal
{
WiimoteScanner::WiimoteScanner()
{
init_lib();
}
// Find and connect wiimotes.
// Does not replace already found wiimotes even if they are disconnected.
// wm is an array of max_wiimotes wiimotes
// Returns the total number of found and connected wiimotes.
int FindWiimotes(Wiimote** wm, int max_wiimotes)
std::vector<Wiimote*> WiimoteScanner::FindWiimotes(size_t max_wiimotes)
{
PairUp();
std::vector<Wiimote*> wiimotes;
GUID device_id;
HANDLE dev;
HDEVINFO device_info;
@ -142,8 +151,6 @@ int FindWiimotes(Wiimote** wm, int max_wiimotes)
PSP_DEVICE_INTERFACE_DETAIL_DATA detail_data = NULL;
HIDD_ATTRIBUTES attr;
init_lib();
// Count the number of already found wiimotes
for (int i = 0; i < MAX_WIIMOTES; ++i)
{
@ -207,22 +214,11 @@ int FindWiimotes(Wiimote** wm, int max_wiimotes)
// Find an unused slot
unsigned int k = 0;
for (; k < MAX_WIIMOTES && !(WIIMOTE_SRC_REAL & g_wiimote_sources[k] && !wm[k]); ++k);
wm[k] = new Wiimote(k);
wm[k]->dev_handle = dev;
memcpy(wm[k]->devicepath, detail_data->DevicePath, 197);
auto const wm = new Wiimote;
wm->dev_handle = dev;
memcpy(wm->devicepath, detail_data->DevicePath, 197);
if (!wm[k]->Connect())
{
ERROR_LOG(WIIMOTE, "Unable to connect to wiimote %i.", wm[k]->index + 1);
delete wm[k];
wm[k] = NULL;
CloseHandle(dev);
}
else
{
++found_wiimotes;
}
found_wiimotes.push_back(wm);
}
if (detail_data)
@ -233,87 +229,64 @@ int FindWiimotes(Wiimote** wm, int max_wiimotes)
return found_wiimotes;
}
bool WiimoteScanner::IsReady() const
{
// TODO: impl
return true;
}
// Connect to a wiimote with a known device path.
bool Wiimote::Connect()
{
if (IsConnected()) return false;
dev_handle = CreateFile(devicepath,
(GENERIC_READ | GENERIC_WRITE),
(FILE_SHARE_READ | FILE_SHARE_WRITE),
NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (!dev_handle)
if (dev_handle == INVALID_HANDLE_VALUE)
{
dev_handle = CreateFile(devicepath,
(GENERIC_READ | GENERIC_WRITE),
(FILE_SHARE_READ | FILE_SHARE_WRITE),
NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (dev_handle == INVALID_HANDLE_VALUE)
return false;
dev_handle = 0;
return false;
}
hid_overlap.hEvent = CreateEvent(NULL, 1, 1, _T(""));
hid_overlap.Offset = 0;
hid_overlap.OffsetHigh = 0;
m_connected = true;
// Try a handshake to see if the device is actually connected
if (!Handshake())
{
m_connected = false;
return false;
}
// Set LEDs
SetLEDs(WIIMOTE_LED_1 << index);
m_wiimote_thread = std::thread(std::mem_fun(&Wiimote::ThreadFunc), this);
// TODO: do this elsewhere
// This isn't as drastic as it sounds, since the process in which the threads
// reside is normal priority. Needed for keeping audio reports at a decent rate
/*
if (!SetThreadPriority(m_wiimote_thread.native_handle(), THREAD_PRIORITY_TIME_CRITICAL))
{
ERROR_LOG(WIIMOTE, "Failed to set wiimote thread priority");
}
NOTICE_LOG(WIIMOTE, "Connected to wiimote %i.", index + 1);
*/
return true;
}
void Wiimote::RealDisconnect()
void Wiimote::Disconnect()
{
if (!IsConnected())
return;
m_connected = false;
if (m_wiimote_thread.joinable())
m_wiimote_thread.join();
CloseHandle(dev_handle);
dev_handle = 0;
ResetEvent(&hid_overlap);
//ResetEvent(&hid_overlap);
CloseHandle(hid_overlap.hEvent);
}
bool Wiimote::IsOpen() const
bool Wiimote::IsConnected() const
{
return IsConnected();
return dev_handle != 0;
}
int Wiimote::IORead(unsigned char* buf)
{
DWORD b, r;
init_lib();
if (!IsConnected())
return 0;
*buf = 0;
//*buf = 0;
if (!ReadFile(dev_handle, buf, MAX_PAYLOAD, &b, &hid_overlap))
{
// Partial read
b = GetLastError();
auto const b = GetLastError();
if ((b == ERROR_HANDLE_EOF) || (b == ERROR_DEVICE_NOT_CONNECTED))
{
// Remote disconnect
@ -321,7 +294,7 @@ int Wiimote::IORead(unsigned char* buf)
return 0;
}
r = WaitForSingleObject(hid_overlap.hEvent, WIIMOTE_DEFAULT_TIMEOUT);
auto const r = WaitForSingleObject(hid_overlap.hEvent, WIIMOTE_DEFAULT_TIMEOUT);
if (r == WAIT_TIMEOUT)
{
// Timeout - cancel and continue
@ -357,77 +330,71 @@ int Wiimote::IORead(unsigned char* buf)
int Wiimote::IOWrite(unsigned char* buf, int len)
{
DWORD bytes, dw;
int i;
init_lib();
if (!IsConnected())
return 0;
switch (stack)
{
case MSBT_STACK_UNKNOWN:
{
// Try to auto-detect the stack type
if (i = WriteFile(dev_handle, buf + 1, 22, &bytes, &hid_overlap))
{
// Bluesoleil will always return 1 here, even if it's not connected
stack = MSBT_STACK_BLUESOLEIL;
return i;
}
if (i = HidD_SetOutputReport(dev_handle, buf + 1, len - 1))
{
stack = MSBT_STACK_MS;
return i;
}
dw = GetLastError();
// Checking for 121 = timeout on semaphore/device off/disconnected to
// avoid trouble with other stacks toshiba/widcomm
if (dw == 121)
{
NOTICE_LOG(WIIMOTE, "IOWrite[MSBT_STACK_UNKNOWN]: Timeout");
RealDisconnect();
}
else ERROR_LOG(WIIMOTE,
"IOWrite[MSBT_STACK_UNKNOWN]: ERROR: %08x", dw);
return 0;
}
case MSBT_STACK_MS:
i = HidD_SetOutputReport(dev_handle, buf + 1, len - 1);
dw = GetLastError();
if (dw == 121)
{
// Semaphore timeout
NOTICE_LOG(WIIMOTE, "WiimoteIOWrite[MSBT_STACK_MS]: Unable to send data to wiimote");
RealDisconnect();
return 0;
}
case MSBT_STACK_UNKNOWN:
{
// Try to auto-detect the stack type
DWORD bytes = 0;
auto i = WriteFile(dev_handle, buf + 1, 22, &bytes, &hid_overlap);
if (i)
{
// Bluesoleil will always return 1 here, even if it's not connected
stack = MSBT_STACK_BLUESOLEIL;
return i;
}
case MSBT_STACK_BLUESOLEIL:
return WriteFile(dev_handle, buf + 1, 22, &bytes, &hid_overlap);
i = HidD_SetOutputReport(dev_handle, buf + 1, len - 1);
if (i)
{
stack = MSBT_STACK_MS;
return i;
}
auto const dw = GetLastError();
// Checking for 121 = timeout on semaphore/device off/disconnected to
// avoid trouble with other stacks toshiba/widcomm
if (dw == 121)
{
NOTICE_LOG(WIIMOTE, "IOWrite[MSBT_STACK_UNKNOWN]: Timeout");
return 0;
}
else
{
ERROR_LOG(WIIMOTE, "IOWrite[MSBT_STACK_UNKNOWN]: ERROR: %08x", dw);
// Correct?
return -1
}
break;
}
case MSBT_STACK_MS:
{
i = HidD_SetOutputReport(dev_handle, buf + 1, len - 1);
dw = GetLastError();
if (dw == 121)
{
// Semaphore timeout
NOTICE_LOG(WIIMOTE, "WiimoteIOWrite[MSBT_STACK_MS]: Unable to send data to wiimote");
RealDisconnect();
return 0;
}
return i;
break;
}
case MSBT_STACK_BLUESOLEIL:
return WriteFile(dev_handle, buf + 1, 22, &bytes, &hid_overlap);
break;
}
return 0;
}
int UnPair()
{
// TODO:
return 0;
}
// WiiMote Pair-Up, function will return amount of either new paired or unpaired devices
// negative number on failure
int PairUp(bool unpair)
{
init_lib();
// match strings like "Nintendo RVL-WBC-01", "Nintendo RVL-CNT-01", "Nintendo RVL-CNT-01-TR"
const std::wregex wiimote_device_name(L"Nintendo RVL-\\w{3}-\\d{2}(-\\w{2})?");

View File

@ -10,6 +10,19 @@
}
@end
WiimoteScanner::WiimoteScanner()
{}
std::vector<Wiimote*> WiimoteScanner::FindWiimotes(size_t max_wiimotes)
{
return std::vector<Wiimote*>();
}
bool WiimoteScanner::IsReady() const
{
return false;
}
@implementation SearchBT
- (void) deviceInquiryComplete: (IOBluetoothDeviceInquiry *) sender
error: (IOReturn) error
@ -92,7 +105,7 @@
WARN_LOG(WIIMOTE, "Lost channel to wiimote %i", wm->index + 1);
wm->RealDisconnect();
wm->Disconnect();
}
@end
@ -182,7 +195,7 @@ bool Wiimote::Connect()
if (ichan == NULL || cchan == NULL) {
ERROR_LOG(WIIMOTE, "Unable to open L2CAP channels "
"for wiimote %i", index + 1);
RealDisconnect();
Disconnect();
return false;
}
@ -207,7 +220,7 @@ bool Wiimote::Connect()
}
// Disconnect a wiimote.
void Wiimote::RealDisconnect()
void Wiimote::Disconnect()
{
if (!IsConnected())
return;

View File

@ -69,8 +69,8 @@ Wiimote::~Wiimote()
{
StopThread();
if (IsOpen())
Close();
if (IsConnected())
Disconnect();
ClearReadQueue();
@ -178,7 +178,7 @@ bool Wiimote::Read()
rpt.second = IORead(rpt.first);
if (0 == rpt.second)
Close();
Disconnect();
if (rpt.second > 0 && m_channel > 0) {
// Add it to queue
@ -348,7 +348,7 @@ void WiimoteScanner::ThreadFunc()
// TODO: this code here is ugly
std::lock_guard<std::recursive_mutex> lk(g_refresh_lock);
for (unsigned int i = 0; i != MAX_WIIMOTES; ++i)
if (g_wiimotes[i] && !g_wiimotes[i]->IsOpen())
if (g_wiimotes[i] && !g_wiimotes[i]->IsConnected())
HandleWiimoteDisconnect(i);
}
#endif
@ -365,14 +365,14 @@ void Wiimote::ThreadFunc()
Rumble();
// main loop
while (m_run_thread && IsOpen())
while (m_run_thread && IsConnected())
{
#ifdef __APPLE__
while (Write()) {}
Common::SleepCurrentThread(1);
#else
// TODO: this is all a mess
while (m_run_thread && IsOpen())
while (m_run_thread && IsConnected())
{
bool const did_write = Write();
@ -512,7 +512,7 @@ void HandleFoundWiimotes(const std::vector<Wiimote*>& wiimotes)
{
std::for_each(wiimotes.begin(), wiimotes.end(), [](Wiimote* const wm)
{
if (wm->Open())
if (wm->Connect())
HandleWiimoteConnect(wm);
else
delete wm;

View File

@ -62,11 +62,11 @@ public:
void EmuStop();
// connecting and disconnecting from physical devices
bool Open();
void Close();
bool Connect();
void Disconnect();
// TODO: change to something like IsRelevant
bool IsOpen() const;
bool IsConnected() const;
void SetLEDs(int leds);
@ -141,8 +141,13 @@ private:
// TODO: this should probably be atomic
volatile size_t want_wiimotes;
#if defined(_WIN32)
#elif defined(__linux__) && HAVE_BLUEZ
int device_id;
int device_sock;
int device_sock;
#endif
};
extern std::recursive_mutex g_refresh_lock;

View File

@ -245,7 +245,7 @@ void WiimoteConfigDiag::UpdateWiimoteStatus()
if (WIIMOTE_SRC_EMU & g_wiimote_sources[index])
CFrame::ConnectWiimote(index, true);
else if (WIIMOTE_SRC_REAL & g_wiimote_sources[index] && WiimoteReal::g_wiimotes[index])
CFrame::ConnectWiimote(index, WiimoteReal::g_wiimotes[index]->IsOpen());
CFrame::ConnectWiimote(index, WiimoteReal::g_wiimotes[index]->IsConnected());
}
}
}