Go to the documentation of this file.00001 #include "mitkWiiMoteThread.h"
00002
00003 #include "mitkWiiMoteAddOn.h"
00004 #include "mitkWiiMoteIREvent.h"
00005 #include "mitkWiiMoteButtonEvent.h"
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 const double TIMELIMIT = 0.5;
00021 const int SLEEPDEFAULT = 70;
00022
00023 mitk::WiiMoteThread::WiiMoteThread()
00024 : m_MultiThreader(itk::MultiThreader::New())
00025 , m_WiiMoteThreadFinished(itk::FastMutexLock::New())
00026 , m_StopWiiMote(false)
00027 , m_ThreadID(-1)
00028 , m_LastRecordTime(0)
00029 , m_ReadDataOnce(false)
00030
00031
00032 , m_SleepTime(SLEEPDEFAULT)
00033 , m_InCalibrationMode(false)
00034 {
00035
00036
00037
00038
00039 m_WiiMote.ChangedCallback = &mitk::WiiMoteThread::OnStateChange;
00040
00041
00042 m_WiiMote.CallbackTriggerFlags = (state_change_flags) (CONNECTED | IR_CHANGED);
00043 }
00044
00045 mitk::WiiMoteThread::~WiiMoteThread()
00046 {
00047 }
00048
00049 void mitk::WiiMoteThread::OnStateChange(wiimote &remote,state_change_flags changed, const wiimote_state &newState)
00050 {
00051
00052 }
00053
00054 void mitk::WiiMoteThread::Run()
00055 {
00056 m_ThreadID = m_MultiThreader->SpawnThread(this->StartWiiMoteThread, this);
00057 }
00058
00059 ITK_THREAD_RETURN_TYPE mitk::WiiMoteThread::StartWiiMoteThread(void* pInfoStruct)
00060 {
00061
00062 struct itk::MultiThreader::ThreadInfoStruct * pInfo = (struct itk::MultiThreader::ThreadInfoStruct*)pInfoStruct;
00063 if (pInfo == NULL)
00064 return ITK_THREAD_RETURN_VALUE;
00065
00066 if (pInfo->UserData == NULL)
00067 return ITK_THREAD_RETURN_VALUE;
00068
00069 mitk::WiiMoteThread* wiiMoteThread = static_cast<mitk::WiiMoteThread*>(pInfo->UserData);
00070 if (wiiMoteThread != NULL)
00071 wiiMoteThread->StartWiiMote();
00072
00073 return ITK_THREAD_RETURN_VALUE;
00074 }
00075
00076 void mitk::WiiMoteThread::StartWiiMote()
00077 {
00078
00079
00080
00081
00082 m_WiiMoteThreadFinished->Lock();
00083
00084
00085
00086 this->m_StopWiiMote = false;
00087
00088
00089 m_WiiMoteThreadFinished->Unlock();
00090
00091 while(CONNECTED && !m_StopWiiMote)
00092 {
00093
00094 if(m_WiiMote.Connect(wiimote::FIRST_AVAILABLE))
00095 {
00096 m_WiiMoteThreadFinished->Lock();
00097
00098 MITK_INFO << "WiiMote connected..";
00099
00100
00101
00102
00103
00104
00105
00106 m_WiiMote.SetLEDs(0x01);
00107
00108
00109 m_WiiMote.SetReportType(wiimote::IN_BUTTONS_ACCEL_IR);
00110
00111 m_WiiMoteThreadFinished->Unlock();
00112
00113 break;
00114 }
00115 }
00116
00117
00118 while(!m_WiiMote.Button.Minus() && !m_StopWiiMote )
00119 {
00120 m_WiiMoteThreadFinished->Lock();
00121 while(m_WiiMote.RefreshState() == NO_CHANGE)
00122 {
00123 itksys::SystemTools::Delay(1);
00124 }
00125 m_WiiMoteThreadFinished->Unlock();
00126
00127 m_WiiMoteThreadFinished->Lock();
00128 if(!m_InCalibrationMode)
00129 {
00130 this->WiiMoteIRInput();
00131 }
00132 else
00133 {
00134 this->WiiMoteCalibrationInput();
00135 }
00136 m_WiiMoteThreadFinished->Unlock();
00137
00138 if(m_WiiMote.Button.Home())
00139 this->WiiMoteButtonPressed(mitk::Key_Home);
00140
00141 if(m_WiiMote.Button.A())
00142 {
00143 this->WiiMoteButtonPressed(mitk::Key_A);
00144
00145
00146
00147 if(this->m_InCalibrationMode)
00148 {
00149 this->m_InCalibrationMode = false;
00150 }
00151 else
00152 {
00153 this->m_InCalibrationMode = true;
00154 }
00155
00156 itksys::SystemTools::Delay(3000);
00157 }
00158
00159 if(m_WiiMote.ConnectionLost())
00160 {
00161 m_WiiMoteThreadFinished->Lock();
00162 this->ReconnectWiiMote();
00163 m_WiiMoteThreadFinished->Unlock();
00164 }
00165
00167
00168
00169
00170 }
00171
00172
00173
00174
00175 m_WiiMoteThreadFinished->Lock();
00176 m_WiiMote.Disconnect();
00177 m_WiiMoteThreadFinished->Unlock();
00178
00179 MITK_INFO << "WiiMote disconnected..";
00180
00181
00182
00183 return;
00184 }
00185
00186 void mitk::WiiMoteThread::StopWiiMote()
00187 {
00188 this->m_StopWiiMote = true;
00189 }
00190
00191 void mitk::WiiMoteThread::ReconnectWiiMote()
00192 {
00193 if(m_WiiMote.Connect(wiimote::FIRST_AVAILABLE))
00194 {
00195 MITK_INFO << "WiiMote reconnected..";
00196 }
00197 }
00198
00199 void mitk::WiiMoteThread::DetectWiiMotes()
00200 {
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 }
00217
00218 void mitk::WiiMoteThread::WiiMoteIRInput()
00219 {
00220 if(IR_CHANGED && m_WiiMote.IR.Dot[0].bVisible)
00221 {
00222
00223
00224
00225 m_Command = ReceptorCommand::New();
00226 m_Command->SetCallbackFunction(mitk::WiiMoteAddOn::GetInstance(), &mitk::WiiMoteAddOn::WiiMoteInput);
00227
00228 double tempTime(itksys::SystemTools::GetTime());
00229 float inputCoordinates[2] = {m_WiiMote.IR.Dot[0].RawX, m_WiiMote.IR.Dot[0].RawY};
00230 mitk::Point2D tempPoint(inputCoordinates);
00231
00232
00233
00234 if(!m_ReadDataOnce)
00235 {
00236 m_ReadDataOnce = true;
00237 }
00238 else
00239 {
00240
00241
00242
00243
00244
00245
00246
00247 if ((tempTime-m_LastRecordTime) < TIMELIMIT)
00248 {
00249 mitk::Vector2D resultingVector(m_LastReadData-tempPoint);
00250 mitk::WiiMoteIREvent e(resultingVector, tempTime);
00251 mitk::CallbackFromGUIThread::GetInstance()->CallThisFromGUIThread(m_Command, e.MakeObject());
00252 }
00253 }
00254 m_LastRecordTime = tempTime;
00255 m_LastReadData = tempPoint;
00256
00257 itksys::SystemTools::Delay(m_SleepTime);
00258
00259
00260
00261 }
00262
00263
00264
00265
00266
00267
00268
00269
00270 }
00271
00272 void mitk::WiiMoteThread::WiiMoteButtonPressed(int buttonType)
00273 {
00274 m_Command = ReceptorCommand::New();
00275 m_Command->SetCallbackFunction(mitk::WiiMoteAddOn::GetInstance(), &mitk::WiiMoteAddOn::WiiMoteButtonPressed);
00276
00277 mitk::WiiMoteButtonEvent e(mitk::Type_WiiMoteButton, mitk::BS_NoButton, mitk::BS_NoButton, buttonType);
00278 mitk::CallbackFromGUIThread::GetInstance()->CallThisFromGUIThread(m_Command, e.MakeObject());
00279 }
00280
00281 void mitk::WiiMoteThread::WiiMoteCalibrationInput()
00282 {
00283 if(IR_CHANGED && m_WiiMote.IR.Dot[0].bVisible)
00284 {
00285 m_Command = ReceptorCommand::New();
00286 m_Command->SetCallbackFunction(mitk::WiiMoteAddOn::GetInstance(), &mitk::WiiMoteAddOn::WiiMoteCalibrationInput);
00287
00288 mitk::WiiMoteCalibrationEvent e(m_WiiMote.IR.Dot[0].RawX,m_WiiMote.IR.Dot[0].RawY);
00289 mitk::CallbackFromGUIThread::GetInstance()->CallThisFromGUIThread(m_Command, e.MakeObject());
00290 }
00291
00292 itksys::SystemTools::Delay(m_SleepTime);
00293 }
00294
00295
00296
00297
00298