summaryrefslogtreecommitdiffhomepage
path: root/tracker-wii/wii_camera.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tracker-wii/wii_camera.cpp')
-rw-r--r--tracker-wii/wii_camera.cpp122
1 files changed, 68 insertions, 54 deletions
diff --git a/tracker-wii/wii_camera.cpp b/tracker-wii/wii_camera.cpp
index af9a2d1f..bec47651 100644
--- a/tracker-wii/wii_camera.cpp
+++ b/tracker-wii/wii_camera.cpp
@@ -15,14 +15,9 @@
#include "wii_camera.h"
#include "wii_frame.hpp"
-#include "compat/sleep.hpp"
-#include "compat/camera-names.hpp"
#include "compat/math-imports.hpp"
#include <opencv2/imgproc.hpp>
-
-#include "cv/video-property-page.hpp"
-
#include <bluetoothapis.h>
using namespace pt_module;
@@ -33,93 +28,111 @@ WIICamera::WIICamera(const QString& module_name) : s { module_name }
cam_info.res_x = 1024;
cam_info.res_y = 768;
cam_info.fov = 42.0f;
- cam_info.idx = 0;
+ cam_info.name = "Wii";
}
WIICamera::~WIICamera()
{
- //stop();
+ stop();
}
QString WIICamera::get_desired_name() const
{
- return desired_name;
+ return QStringLiteral("Wii");
}
QString WIICamera::get_active_name() const
{
- return active_name;
+ return get_desired_name();
}
void WIICamera::show_camera_settings()
{
-
}
WIICamera::result WIICamera::get_info() const
{
- if (cam_info.res_x == 0 || cam_info.res_y == 0)
- return result(false, pt_camera_info());
- return result(true, cam_info);
+ if (cam_info.res_x == 0 || cam_info.res_y == 0)
+ return result(false, pt_camera_info());
+ return result(true, cam_info);
}
WIICamera::result WIICamera::get_frame(pt_frame& frame_)
{
- cv::Mat& frame = frame_.as<WIIFrame>()->mat;
+ cv::Mat& frame = frame_.as<WIIFrame>()->mat;
struct wii_info& wii = frame_.as<WIIFrame>()->wii;
+ const wii_camera_status new_frame = get_frame(frame);
- const wii_camera_status new_frame = _get_frame(frame);
//create a fake blank frame
- frame = cv::Mat(cam_info.res_x, cam_info.res_y, CV_8UC3, cv::Scalar(0, 0, 0));
+ frame.create(cam_info.res_x, cam_info.res_y, CV_8UC3);
+ frame.setTo({0});
wii.status = new_frame;
- switch (new_frame)
- {
+ switch (new_frame)
+ {
case wii_cam_data_change:
- _get_status(wii);
- _get_points(wii);
+ get_status(wii);
+ get_points(wii);
break;
case wii_cam_data_no_change:
return result(false, cam_info);
+ default:
+ break;
}
return result(true, cam_info);
}
-bool WIICamera::start(int idx, int fps, int res_x, int res_y)
+bool WIICamera::start(const pt_settings&)
{
+ if (m_pDev)
+ return true;
m_pDev = std::make_unique<wiimote>();
m_pDev->ChangedCallback = on_state_change;
m_pDev->CallbackTriggerFlags = (state_change_flags)(CONNECTED |
EXTENSION_CHANGED |
MOTIONPLUS_CHANGED);
- return true;
+ return true;
}
void WIICamera::stop()
{
- onExit = true;
- m_pDev->ChangedCallback = NULL;
- m_pDev->Disconnect();
- Beep(1000, 200);
- if (m_pDev) {
- m_pDev=nullptr;
- m_pDev = NULL;
- }
+ if (!m_pDev)
+ return;
- desired_name = QString();
- active_name = QString();
- cam_info = pt_camera_info();
- cam_desired = pt_camera_info();
+ cam_info = {};
+ cam_desired = {};
+ pitch_ = 0; roll_ = 0;
+
+ m_pDev->ChangedCallback = nullptr;
+ m_pDev->Disconnect();
+ m_pDev = nullptr;
}
+#ifdef __MINGW32__
+extern "C"
+ DWORD WINAPI BluetoothAuthenticateDevice(
+ HWND hwndParent,
+ HANDLE hRadio,
+ BLUETOOTH_DEVICE_INFO *pbtbi,
+ PWSTR pszPasskey,
+ ULONG ulPasskeyLength
+ );
+
+#ifndef BLUETOOTH_SERVICE_ENABLE
+# define BLUETOOTH_SERVICE_DISABLE 0x00
+# define BLUETOOTH_SERVICE_ENABLE 0x01
+#endif
+
+#endif
-wii_camera_status WIICamera::_pair()
+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];
+ constexpr int max_devices = 64;
+ HANDLE hbtlist[max_devices];
int ibtidx = 0;
bool wiifound = false;
@@ -127,12 +140,10 @@ wii_camera_status WIICamera::_pair()
hbt = BluetoothFindFirstRadio(&bt_param, hbtlist + ibtidx);
if (!hbt) { ret = wii_cam_wait_for_dongle; return ret; }
do
- {
ibtidx++;
- } while (BluetoothFindNextRadio(&bt_param, hbtlist + ibtidx));
+ while (ibtidx < max_devices && BluetoothFindNextRadio(&bt_param, hbtlist + ibtidx));
BluetoothFindRadioClose(hbt);
-
int i;
bool error = false;
for (i = 0; i < ibtidx; i++)
@@ -143,11 +154,12 @@ wii_camera_status WIICamera::_pair()
if (ERROR_SUCCESS != BluetoothGetRadioInfo(hbtlist[i], &btinfo)) {break;}
HBLUETOOTH_DEVICE_FIND hbtdevfd;
- BLUETOOTH_DEVICE_SEARCH_PARAMS btdevparam;
+ BLUETOOTH_DEVICE_SEARCH_PARAMS btdevparam {};
BLUETOOTH_DEVICE_INFO btdevinfo;
btdevinfo.dwSize = sizeof(btdevinfo);
btdevparam.dwSize = sizeof(btdevparam);
+ btdevparam.fReturnUnknown = TRUE;
btdevparam.fReturnAuthenticated = TRUE;
btdevparam.fReturnConnected = TRUE;
btdevparam.fReturnRemembered = TRUE;
@@ -162,7 +174,8 @@ wii_camera_status WIICamera::_pair()
}
do
{
- if (wcscmp(btdevinfo.szName, L"Nintendo RVL-CNT-01-TR") && wcscmp(btdevinfo.szName, L"Nintendo RVL-CNT-01"))
+ if (!!wcscmp(btdevinfo.szName, L"Nintendo RVL-CNT-01-TR") &&
+ !!wcscmp(btdevinfo.szName, L"Nintendo RVL-CNT-01"))
{
continue;
}
@@ -183,11 +196,11 @@ wii_camera_status WIICamera::_pair()
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; }
+ if (ERROR_SUCCESS != BluetoothAuthenticateDevice(nullptr, 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; }
+ if (ERROR_SUCCESS != BluetoothSetServiceState(hbtlist[i], &btdevinfo, (GUID*)&HumanInterfaceDeviceServiceClass_UUID, BLUETOOTH_SERVICE_ENABLE)) { error = true; continue; }
break;
} while (BluetoothFindNextDevice(hbtdevfd, &btdevinfo));
BluetoothFindDeviceClose(hbtdevfd);
@@ -201,19 +214,22 @@ wii_camera_status WIICamera::_pair()
return ret;
}
-wii_camera_status WIICamera::_get_frame(cv::Mat& frame)
+wii_camera_status WIICamera::get_frame(cv::Mat&)
{
wii_camera_status ret = wii_cam_wait_for_connect;
if (!m_pDev->IsConnected()) {
qDebug() << "wii wait";
- ret = _pair();
- switch(ret){
+ ret = pair();
+ switch(ret)
+ {
case wii_cam_wait_for_sync:
m_pDev->Disconnect();
goto goodbye;
case wii_cam_wait_for_connect:
break;
+ default:
+ break;
}
if (!m_pDev->Connect(wiimote::FIRST_AVAILABLE)) {
Beep(500, 30); Sleep(1000);
@@ -238,7 +254,7 @@ goodbye:
return ret;
}
-bool WIICamera::_get_points(struct wii_info& wii)
+bool WIICamera::get_points(struct wii_info& wii)
{
bool dot_sizes = (m_pDev->IR.Mode == wiimote_state::ir::EXTENDED);
bool ret = false;
@@ -269,23 +285,21 @@ bool WIICamera::_get_points(struct wii_info& wii)
return ret;
}
-void WIICamera::_get_status(struct wii_info& wii)
+void WIICamera::get_status(struct wii_info& wii)
{
//draw battery status
wii.BatteryPercent = m_pDev->BatteryPercent;
wii.bBatteryDrained = m_pDev->bBatteryDrained;
//draw horizon
- static int p = 0;
- static int r = 0;
if (m_pDev->Nunchuk.Acceleration.Orientation.UpdateAge < 10)
{
- p = m_pDev->Acceleration.Orientation.Pitch;
- r = m_pDev->Acceleration.Orientation.Roll;
+ pitch_ = (int)m_pDev->Acceleration.Orientation.Pitch;
+ roll_ = (int)m_pDev->Acceleration.Orientation.Roll;
}
- wii.Pitch = p;
- wii.Roll = r;
+ wii.Pitch = pitch_;
+ wii.Roll = roll_;
}
void WIICamera::on_state_change(wiimote &remote,