diff options
| author | Wei Shuai <cpuwolf@sina.com> | 2018-02-08 06:51:33 +0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-02-08 06:51:33 +0800 | 
| commit | 938d7987047179d3bac4a4fcaaed9fbbe3424bbf (patch) | |
| tree | e3ccfcbb2720af4ac05f31dfcb3c3bd919d3491e /tracker-wii/wii_camera.cpp | |
| parent | 48b0266eb73f233fa0c031b7b9dab96f476be141 (diff) | |
| parent | b62f4a94932785203ad133565575bc5cf0f0f408 (diff) | |
Merge pull request #742 from cpuwolf/autopair4
tracker/wii: add WIImote auto-pair function
Diffstat (limited to 'tracker-wii/wii_camera.cpp')
| -rw-r--r-- | tracker-wii/wii_camera.cpp | 99 | 
1 files changed, 98 insertions, 1 deletions
| diff --git a/tracker-wii/wii_camera.cpp b/tracker-wii/wii_camera.cpp index 9c2d618c..1186afc1 100644 --- a/tracker-wii/wii_camera.cpp +++ b/tracker-wii/wii_camera.cpp @@ -18,6 +18,7 @@  #include "cv/video-property-page.hpp" +#include <BluetoothAPIs.h>  using namespace pt_module; @@ -102,12 +103,108 @@ void WIICamera::stop()      cam_desired = pt_camera_info();  } + +wii_camera_status WIICamera::_pair() +{ +	wii_camera_status ret = wii_cam_wait_for_sync; +	HBLUETOOTH_RADIO_FIND hbt; +	BLUETOOTH_FIND_RADIO_PARAMS bt_param; +	HANDLE hbtlist[10]; +	int ibtidx = 0; +	bool wiifound = false; + +	bt_param.dwSize = sizeof(bt_param); +	hbt = BluetoothFindFirstRadio(&bt_param, hbtlist + ibtidx); +	if (!hbt) { ret = wii_cam_wait_for_dongle; return ret; } +	do +	{ +		ibtidx++; +	} while (BluetoothFindNextRadio(&bt_param, hbtlist + ibtidx)); +	BluetoothFindRadioClose(hbt); + + +	int i; +	bool error = false; +	for (i = 0; i < ibtidx; i++) +	{ +		BLUETOOTH_RADIO_INFO btinfo; +		btinfo.dwSize = sizeof(btinfo); + +		if (ERROR_SUCCESS != BluetoothGetRadioInfo(hbtlist[i], &btinfo)) {break;} + +		HBLUETOOTH_DEVICE_FIND hbtdevfd; +		BLUETOOTH_DEVICE_SEARCH_PARAMS btdevparam; +		BLUETOOTH_DEVICE_INFO btdevinfo; + +		btdevinfo.dwSize = sizeof(btdevinfo); +		btdevparam.dwSize = sizeof(btdevparam); +		btdevparam.fReturnAuthenticated = TRUE; +		btdevparam.fReturnConnected = TRUE; +		btdevparam.fReturnRemembered = TRUE; +		btdevparam.fIssueInquiry = TRUE; +		btdevparam.cTimeoutMultiplier = 2; +		btdevparam.hRadio = hbtlist[i]; +		hbtdevfd=BluetoothFindFirstDevice(&btdevparam, &btdevinfo); +		if (!hbtdevfd) { +			int error= GetLastError(); +			qDebug() << error; +			break; +		} +		do +		{ +			if (wcscmp(btdevinfo.szName, L"Nintendo RVL-CNT-01-TR") && wcscmp(btdevinfo.szName, L"Nintendo RVL-CNT-01")) +			{ +				continue; +			} + +			if ((btdevinfo.fRemembered)&&error) { +				BluetoothRemoveDevice(&btdevinfo.Address); +			} + +			wiifound = true; +			if (btdevinfo.fConnected) { +				break; +			} +			WCHAR pwd[6]; +			pwd[0] = btinfo.address.rgBytes[0]; +			pwd[1] = btinfo.address.rgBytes[1]; +			pwd[2] = btinfo.address.rgBytes[2]; +			pwd[3] = btinfo.address.rgBytes[3]; +			pwd[4] = btinfo.address.rgBytes[4]; +			pwd[5] = btinfo.address.rgBytes[5]; + +			if (ERROR_SUCCESS != BluetoothAuthenticateDevice(NULL, hbtlist[i], &btdevinfo, pwd, 6)) { error = true; continue; } +			DWORD servicecount = 32; +			GUID guids[32]; +			if (ERROR_SUCCESS != BluetoothEnumerateInstalledServices(hbtlist[i], &btdevinfo, &servicecount, guids)) { error = true; continue; } +			if (ERROR_SUCCESS != BluetoothSetServiceState(hbtlist[i], &btdevinfo, &HumanInterfaceDeviceServiceClass_UUID, BLUETOOTH_SERVICE_ENABLE)) { error = true; continue; } +			break; +		} while (BluetoothFindNextDevice(hbtdevfd, &btdevinfo)); +		BluetoothFindDeviceClose(hbtdevfd); +	} + +	for (i = 0; i < ibtidx; i++) +	{ +		CloseHandle(hbtlist[i]); +	} +	if (wiifound) { ret = wii_cam_wait_for_connect; } +	return ret; +} +  wii_camera_status WIICamera::_get_frame(cv::Mat& frame)  {  	wii_camera_status ret = wii_cam_wait_for_connect;  	if (!m_pDev->IsConnected()) {  		qDebug() << "wii wait"; +		ret = _pair(); +		switch(ret){ +		case wii_cam_wait_for_sync: +			m_pDev->Disconnect(); +			goto goodbye; +		case wii_cam_wait_for_connect: +			break; +		}  		if (!m_pDev->Connect(wiimote::FIRST_AVAILABLE)) {  			Beep(500, 30); Sleep(1000);  			goto goodbye; @@ -158,7 +255,7 @@ bool WIICamera::_get_points(struct wii_info& wii)  			wii.Points[index].bvis = dot.bVisible;  		}  	} -	m_pDev->SetLEDs(3 - point_count); +	m_pDev->SetLEDs(0);  	return ret;  } | 
