diff --git a/ECTrainer2/ECTrainer.cpp b/ECTrainer2/ECTrainer.cpp index 7578b21..19ab040 100644 --- a/ECTrainer2/ECTrainer.cpp +++ b/ECTrainer2/ECTrainer.cpp @@ -16,8 +16,10 @@ , _pMarker(NULL) , _pImageProc(NULL) , _pEyeTrack(NULL) + , _pTobiiREST(NULL) , _Running(true) , _HomographyOK(false) + , _CalibResult(0) , _hInstance(hInstance) { _pMarker = new Marker(); @@ -26,6 +28,7 @@ _pSceneCam = new SceneCamera(this, _pImageProc); _pStimulus = new Stimulus(this, _pMarker); _pEyeTrack = new EyeTrack(this, _pMarker); + _pTobiiREST = new TobiiREST(this); } // �f�X�g���N�^ @@ -36,6 +39,7 @@ if (_pMarker) delete _pMarker; if (_pImageProc) delete _pImageProc; if (_pEyeTrack) delete _pEyeTrack; + if (_pTobiiREST) delete _pTobiiREST; } // ������ @@ -45,19 +49,19 @@ if (!_pStimulus->Init()) return false; if (!_pImageProc->Init()) return false; if (!_pEyeTrack->Init()) return false; + if (!_pTobiiREST->Init()) return false; - DWORD dwThreadIdSceneCam, dwThreadIdStimulus, dwThreadIdImageProc, dwThreadIdEyeTrack, dwThreadIdKeepAlive; - HANDLE hThreadSceneCam = CreateThread(NULL, 0, SceneCamThreadEntry, this, 0, &dwThreadIdSceneCam); - HANDLE hThreadStimulus = CreateThread(NULL, 0, StimulusThreadEntry, this, 0, &dwThreadIdStimulus); - HANDLE hThreadImageProc = CreateThread(NULL, 0, ImageProcThreadEntry, this, 0, &dwThreadIdImageProc); - HANDLE hThreadEyeTrack = CreateThread(NULL, 0, EyeTrackThreadEntry, this, 0, &dwThreadIdEyeTrack); + DWORD dwThreadIdSceneCam, dwThreadIdStimulus, dwThreadIdImageProc, dwThreadIdEyeTrack, dwThreadIdKeepAlive, dwThreadTobiiREST; + HANDLE hThreadSceneCam = CreateThread(NULL, 0, ThreadEntry, _pSceneCam, 0, &dwThreadIdSceneCam); + HANDLE hThreadStimulus = CreateThread(NULL, 0, ThreadEntry, _pStimulus, 0, &dwThreadIdStimulus); + HANDLE hThreadImageProc = CreateThread(NULL, 0, ThreadEntry, _pImageProc, 0, &dwThreadIdImageProc); + HANDLE hThreadEyeTrack = CreateThread(NULL, 0, ThreadEntry, _pEyeTrack, 0, &dwThreadIdEyeTrack); HANDLE hThreadKeepAlive = CreateThread(NULL, 0, KeepAliveThreadEntry, this, 0, &dwThreadIdKeepAlive); - - _TobiiREST.GetCalibID(); + HANDLE hThreadTobiiREST = CreateThread(NULL, 0, ThreadEntry, _pTobiiREST, 0, &dwThreadTobiiREST); _pGui->MainLoop(); - HANDLE handles[] = { hThreadSceneCam , hThreadStimulus, hThreadImageProc, hThreadEyeTrack, hThreadKeepAlive }; + HANDLE handles[] = { hThreadSceneCam , hThreadStimulus, hThreadImageProc, hThreadEyeTrack, hThreadKeepAlive, hThreadTobiiREST }; DWORD timeOut = 1000; // �^�C���A�E�g(ms) if (WaitForMultipleObjects(sizeof(handles) / sizeof(HANDLE), handles, TRUE, timeOut) != WAIT_TIMEOUT) { OutputDebugString(_T("All threads stopped sccessfully.\n")); @@ -69,29 +73,34 @@ if (hThreadImageProc) CloseHandle(hThreadImageProc); if (hThreadEyeTrack) CloseHandle(hThreadEyeTrack); if (hThreadKeepAlive) CloseHandle(hThreadKeepAlive); + if (hThreadTobiiREST) CloseHandle(hThreadTobiiREST); return true; } -// �L�����u���[�V���� +// �L�����u���[�V�����J�n void ECTrainer::CalibStart() { - _pStimulus->Calibration(); - _TobiiREST.StartCalibration(); + _pStimulus->SetStimulus(Stimulus::STIM::CALIB); + _pTobiiREST->Start(); } -// �L�����u���[�V�������ʎ擾 -void ECTrainer::CalibGetResult() { - _TobiiREST.GetCalibResult(); +// �L�����u���[�V�������ʕ\�� +int ECTrainer::CheckCalibResult() { + int res = _CalibResult; + if (res > 0) _pStimulus->SetStimulus(Stimulus::STIM::CALIB_COMPLETE); + if (res < 0) _pStimulus->SetStimulus(Stimulus::STIM::CALIB_FAILED); + _CalibResult = 0; + return res; } // �J�n void ECTrainer::Start() { - _pStimulus->Start(); + _pStimulus->SetStimulus(Stimulus::STIM::START); } // ���� void ECTrainer::Next() { - _pStimulus->Next(); + _pStimulus->SetStimulus(Stimulus::STIM::NEXT); } // ����摜�o�b�t�@�ɉ摜��ݒ� @@ -104,27 +113,9 @@ _pGui->SetDispBuffer(img); } -// ����J�����X���b�h�J�n�_ -DWORD WINAPI ECTrainer::SceneCamThreadEntry(LPVOID lpParameter) { - ((ECTrainer*)lpParameter)->_pSceneCam->MainLoop(); - return 0; -} - -// �h���摜�X���b�h�J�n�_ -DWORD WINAPI ECTrainer::StimulusThreadEntry(LPVOID lpParameter) { - ((ECTrainer*)lpParameter)->_pStimulus->MainLoop(); - return 0; -} - -// �摜�����X���b�h�J�n�_ -DWORD WINAPI ECTrainer::ImageProcThreadEntry(LPVOID lpParameter) { - ((ECTrainer*)lpParameter)->_pImageProc->MainLoop(); - return 0; -} - -// �����_�X���b�h�J�n�_ -DWORD WINAPI ECTrainer::EyeTrackThreadEntry(LPVOID lpParameter) { - ((ECTrainer*)lpParameter)->_pEyeTrack->MainLoop(); +// ���ʃX���b�h�J�n�_ +DWORD WINAPI ECTrainer::ThreadEntry(LPVOID lpParameter) { + ((BaseProcess*)lpParameter)->MainLoop(); return 0; } diff --git a/ECTrainer2/ECTrainer.h b/ECTrainer2/ECTrainer.h index 4a47d7d..428c3c6 100644 --- a/ECTrainer2/ECTrainer.h +++ b/ECTrainer2/ECTrainer.h @@ -12,6 +12,7 @@ class Marker; class ImageProc; class EyeTrack; +class TobiiREST; class ECTrainer { @@ -23,15 +24,14 @@ Marker* _pMarker; ImageProc* _pImageProc; EyeTrack* _pEyeTrack; - TobiiREST _TobiiREST; + TobiiREST* _pTobiiREST; bool _Running; // ���s���t���O bool _HomographyOK; // �ϊ��s��̊l���L�� + int _CalibResult; // �L�����u���[�V�������� 0:�����{ 1:���� -1:���s cv::Size _SceneSize; // ���E�J�����̉摜�T�C�Y + // �X���b�h�J�n�_ - static DWORD WINAPI SceneCamThreadEntry(LPVOID lpParameter); - static DWORD WINAPI StimulusThreadEntry(LPVOID lpParameter); - static DWORD WINAPI ImageProcThreadEntry(LPVOID lpParameter); - static DWORD WINAPI EyeTrackThreadEntry(LPVOID lpParameter); + static DWORD WINAPI ThreadEntry(LPVOID lpParameter); static DWORD WINAPI KeepAliveThreadEntry(LPVOID lpParameter); public: @@ -39,7 +39,7 @@ ~ECTrainer(); bool Process(); void CalibStart(); - void CalibGetResult(); + int CheckCalibResult(); void Start(); void Next(); void SetSceneBuffer(cv::Mat& img); @@ -57,4 +57,5 @@ bool GetHomographyStatus() { return _HomographyOK; } void SetSceneSize(cv::Size s) { _SceneSize = s; } cv::Size GetSceneSize() { return _SceneSize; } + void SetCalibResult(int result) { _CalibResult = result; } }; diff --git a/ECTrainer2/ECTrainerGUI.cpp b/ECTrainer2/ECTrainerGUI.cpp index f814705..d251e43 100644 --- a/ECTrainer2/ECTrainerGUI.cpp +++ b/ECTrainer2/ECTrainerGUI.cpp @@ -139,7 +139,7 @@ bool fShowEyesPos = true; bool fStimulus = false; bool fContact = false; - bool fCalib = false; + bool fCaliblated = false; //bool fKeepContact = false; int contactLevel = 0; float targetSize = 2.0; @@ -234,10 +234,7 @@ } // �L�����u���[�V�������� - if (fCalib) { - _pEct->CalibGetResult(); - fCalib = false; - } + if (_pEct->CheckCalibResult() > 0) fCaliblated = true; // UI�`�� cvui::image(_MainFrame, 0, 0, _Logo); @@ -261,13 +258,15 @@ } else { if (cvui::button(140, 30, "CALIBRATION")) { _pEct->CalibStart(); - fCalib = true; + //fCalib = true; } - if (cvui::button(140, 30, "START")) { - fStimulus = true; - //fKeepContact = false; - if (!PlayMovie()) _pEct->Stop(); - //_pEct->Start(); + if (fCaliblated) { + if (cvui::button(140, 30, "START")) { + fStimulus = true; + //fKeepContact = false; + if (!PlayMovie()) _pEct->Stop(); + //_pEct->Start(); + } } } cvui::printf("Mouse W %d, %d", mp.x, mp.y); diff --git a/ECTrainer2/Stimulus.cpp b/ECTrainer2/Stimulus.cpp index 4b68258..ab19c96 100644 --- a/ECTrainer2/Stimulus.cpp +++ b/ECTrainer2/Stimulus.cpp @@ -17,7 +17,8 @@ // ������ bool Stimulus::Init() { - _DispBuffer = cv::imread(OPENING_FILE); + SetStimulus(STIM::OPENING); + //_DispBuffer = cv::imread(OPENING_FILE); std::ifstream ifs(DATA_FILE); if (!ifs) @@ -46,26 +47,34 @@ return true; } - -// �L�����u���[�V�����J�n -void Stimulus::Calibration() { - _DispBuffer = cv::imread(CALIB_FILE); -} - -// �J�n -void Stimulus::Start() { - _StimNo = 0; - SetStimulus(); -} - -// ���� -void Stimulus::Next() { - _StimNo = (_StimNo + 1) % _StimImages.size(); - SetStimulus(); +// �h���摜�\�� +void Stimulus::SetStimulus(STIM st) { + switch (st) { + case STIM::OPENING: + _DispBuffer = cv::imread(OPENING_FILE); + break; + case STIM::CALIB: + _DispBuffer = cv::imread(CALIB_FILE); + break; + case STIM::CALIB_COMPLETE: + _DispBuffer = cv::imread(CALIB_COMPLETE_FILE); + break; + case STIM::CALIB_FAILED: + _DispBuffer = cv::imread(CALIB_FAILED_FILE); + break; + case STIM::START: + _StimNo = 0; + StimWithMarker(); + break; + case STIM::NEXT: + _StimNo = (_StimNo + 1) % _StimImages.size(); + StimWithMarker(); + break; + } } // �h�����Z�b�g -void Stimulus::SetStimulus() { +void Stimulus::StimWithMarker() { cv::Mat img = cv::imread(_StimImages[_StimNo].filename); _pMarker->Generate(img.size()); _pMarker->DrawMarker(img); diff --git a/ECTrainer2/Stimulus.h b/ECTrainer2/Stimulus.h index 6550041..009bda4 100644 --- a/ECTrainer2/Stimulus.h +++ b/ECTrainer2/Stimulus.h @@ -14,22 +14,25 @@ class Stimulus : public BaseProcess { +public: + enum STIM {OPENING, CALIB, CALIB_COMPLETE, CALIB_FAILED, START, NEXT}; +private: const cv::String OPENING_FILE = "../images/ECT_toppage.png"; const cv::String CALIB_FILE = "../images/calib.png"; + const cv::String CALIB_COMPLETE_FILE = "../images/CalibComplete.png"; + const cv::String CALIB_FAILED_FILE = "../images/CalibFailed.png"; const std::string DATA_FILE = "StimData.txt"; Marker* _pMarker; cv::Mat _DispBuffer; std::vector _StimImages; int _StimNo; - void SetStimulus(); + void StimWithMarker(); public: Stimulus(ECTrainer* pEct, Marker* pMarker); bool Init(); bool MainLoop(); - void Calibration(); - void Start(); - void Next(); + void SetStimulus(STIM st); cv::Point2f GetEyeR() { return _StimImages[_StimNo].eyes[0]; } cv::Point2f GetEyeL() { return _StimImages[_StimNo].eyes[1]; } }; diff --git a/ECTrainer2/TobiiREST.cpp b/ECTrainer2/TobiiREST.cpp index b10d20e..c63bcdb 100644 --- a/ECTrainer2/TobiiREST.cpp +++ b/ECTrainer2/TobiiREST.cpp @@ -1,25 +1,25 @@ +#include "ECTrainer.h" #include "TobiiREST.h" -bool TobiiREST::GetCalibID() { +// �R���X�g���N�^ +TobiiREST::TobiiREST(ECTrainer* pEct) + :BaseProcess(pEct), _Start(false) { + +} + +// ������ +bool TobiiREST::Init() { try { json::value json = REST_Handler::POST_Request(SERVER _T("/api/projects")).extract_json().get(); - auto prId = json[_T("pr_id")].as_string(); - std::wcout << "prId=" << prId << std::endl; + _ProjectID = json[_T("pr_id")].as_string(); + std::wcout << "prId=" << _ProjectID << std::endl; json::value postData; - postData[L"pa_project"] = json::value::string(prId); + postData[L"pa_project"] = json::value::string(_ProjectID); json = REST_Handler::POST_Request(SERVER _T("/api/participants"), postData).extract_json().get(); - auto paId = json[_T("pa_id")].as_string(); - std::wcout << "paId=" << paId << std::endl; - - json::value postData2; - postData2[L"ca_project"] = json::value::string(prId); - postData2[L"ca_type"] = json::value::string(L"default"); - postData2[L"ca_participant"] = json::value::string(paId); - json = REST_Handler::POST_Request(SERVER _T("/api/calibrations"), postData2).extract_json().get(); - _CalibID = json[_T("ca_id")].as_string(); - std::wcout << "caId=" << _CalibID << std::endl; + _ParticipantID = json[_T("pa_id")].as_string(); + std::wcout << "paId=" << _ParticipantID << std::endl; return true; } @@ -30,11 +30,35 @@ } } +// ���[�v +bool TobiiREST::MainLoop() { + while (_pEct->IsRunning()) { + if (_Start) { + _Start = false; + if (StartCalibration()) { + int res = GetCalibResult(); + if (res != 0) _pEct->SetCalibResult(res); + } + } + Sleep(1); + } + return true; +} + +// �L�����u���[�V�����J�n bool TobiiREST::StartCalibration() { try { - std::wstring url = SERVER _T("/api/calibrations/") + _CalibID + _T("/start"); - json::value json = REST_Handler::POST_Request(url.c_str()).extract_json().get(); + json::value postData; + postData[L"ca_project"] = json::value::string(_ProjectID); + postData[L"ca_type"] = json::value::string(L"default"); + postData[L"ca_participant"] = json::value::string(_ParticipantID); + json::value json = REST_Handler::POST_Request(SERVER _T("/api/calibrations"), postData).extract_json().get(); + _CalibrationID = json[_T("ca_id")].as_string(); + std::wcout << "caId=" << _CalibrationID << std::endl; + + std::wstring url = SERVER _T("/api/calibrations/") + _CalibrationID + _T("/start"); + json = REST_Handler::POST_Request(url.c_str()).extract_json().get(); std::wcout << "Calibration start" << std::endl; return true; } @@ -50,14 +74,14 @@ int TobiiREST::GetCalibResult() { try { - std::wstring url = SERVER _T("/api/calibrations/") + _CalibID + _T("/status"); + std::wstring url = SERVER _T("/api/calibrations/") + _CalibrationID + _T("/status"); std::vector values; values.push_back(_T("failed")); values.push_back(_T("calibrated")); std::wstring status = REST_Handler::WaitForStatus(url.c_str(), _T("ca_state"), values); if (status == _T("failed")) { std::wcout << _T("Calibration failed.") << std::endl; - return 0; + return -1; } std::wcout << _T("Calibration successful.") << std::endl; return 1; @@ -66,6 +90,6 @@ { std::cout << "Error " << e.what() << std::endl; - return -1; + return 0; } } diff --git a/ECTrainer2/TobiiREST.h b/ECTrainer2/TobiiREST.h index 806b03a..a9788f0 100644 --- a/ECTrainer2/TobiiREST.h +++ b/ECTrainer2/TobiiREST.h @@ -1,19 +1,24 @@ #pragma once #include "REST_Handler.h" +#include "BaseProcess.h" #include #define SERVER _T("http://192.168.71.50") -class TobiiREST +class TobiiREST : public BaseProcess { - utility::string_t _CalibID; - -public: - bool GetCalibID(); + utility::string_t _ProjectID; + utility::string_t _ParticipantID; + utility::string_t _CalibrationID; + bool _Start; bool StartCalibration(); - int GetCalibResult(); -}; +public: + TobiiREST(ECTrainer* pEct); + bool Init(); + bool MainLoop(); + void Start() { if (!_Start) _Start = true; }; +}; diff --git a/images/CalibComplete.png b/images/CalibComplete.png new file mode 100644 index 0000000..d062a42 --- /dev/null +++ b/images/CalibComplete.png Binary files differ diff --git a/images/CalibFailed.png b/images/CalibFailed.png new file mode 100644 index 0000000..a5c6a93 --- /dev/null +++ b/images/CalibFailed.png Binary files differ diff --git a/images/break.PNG b/images/break.PNG deleted file mode 100644 index 3366812..0000000 --- a/images/break.PNG +++ /dev/null Binary files differ diff --git a/images/circle1.PNG b/images/circle1.PNG deleted file mode 100644 index dc81eb8..0000000 --- a/images/circle1.PNG +++ /dev/null Binary files differ diff --git a/images/circle2.PNG b/images/circle2.PNG deleted file mode 100644 index 85e2f63..0000000 --- a/images/circle2.PNG +++ /dev/null Binary files differ diff --git a/images/circle3.PNG b/images/circle3.PNG deleted file mode 100644 index a04a05a..0000000 --- a/images/circle3.PNG +++ /dev/null Binary files differ diff --git a/images/face_F_L_E.PNG b/images/face_F_L_E.PNG deleted file mode 100644 index 2cff64f..0000000 --- a/images/face_F_L_E.PNG +++ /dev/null Binary files differ diff --git a/images/face_F_L_M.PNG b/images/face_F_L_M.PNG deleted file mode 100644 index cfb8d66..0000000 --- a/images/face_F_L_M.PNG +++ /dev/null Binary files differ diff --git a/images/face_F_M_E.PNG b/images/face_F_M_E.PNG deleted file mode 100644 index 213238e..0000000 --- a/images/face_F_M_E.PNG +++ /dev/null Binary files differ diff --git a/images/face_F_M_M.PNG b/images/face_F_M_M.PNG deleted file mode 100644 index a774dad..0000000 --- a/images/face_F_M_M.PNG +++ /dev/null Binary files differ diff --git a/images/face_F_SS_E.PNG b/images/face_F_SS_E.PNG deleted file mode 100644 index fde0327..0000000 --- a/images/face_F_SS_E.PNG +++ /dev/null Binary files differ diff --git a/images/face_F_SS_M.PNG b/images/face_F_SS_M.PNG deleted file mode 100644 index 1cc4ff7..0000000 --- a/images/face_F_SS_M.PNG +++ /dev/null Binary files differ diff --git a/images/face_F_S_E.PNG b/images/face_F_S_E.PNG deleted file mode 100644 index 3a7817b..0000000 --- a/images/face_F_S_E.PNG +++ /dev/null Binary files differ diff --git a/images/face_F_S_M.PNG b/images/face_F_S_M.PNG deleted file mode 100644 index 5a056b4..0000000 --- a/images/face_F_S_M.PNG +++ /dev/null Binary files differ diff --git a/images/face_I_L_E.PNG b/images/face_I_L_E.PNG deleted file mode 100644 index 2a9d95d..0000000 --- a/images/face_I_L_E.PNG +++ /dev/null Binary files differ diff --git a/images/face_I_L_M.PNG b/images/face_I_L_M.PNG deleted file mode 100644 index f0f29c3..0000000 --- a/images/face_I_L_M.PNG +++ /dev/null Binary files differ diff --git a/images/face_I_M_E.PNG b/images/face_I_M_E.PNG deleted file mode 100644 index 7724211..0000000 --- a/images/face_I_M_E.PNG +++ /dev/null Binary files differ diff --git a/images/face_I_M_M.PNG b/images/face_I_M_M.PNG deleted file mode 100644 index dab26a9..0000000 --- a/images/face_I_M_M.PNG +++ /dev/null Binary files differ diff --git a/images/face_M_L_E.PNG b/images/face_M_L_E.PNG deleted file mode 100644 index 1a031c5..0000000 --- a/images/face_M_L_E.PNG +++ /dev/null Binary files differ diff --git a/images/face_M_L_M.PNG b/images/face_M_L_M.PNG deleted file mode 100644 index 87090d9..0000000 --- a/images/face_M_L_M.PNG +++ /dev/null Binary files differ diff --git a/images/man1.jpg b/images/man1.jpg deleted file mode 100644 index 0d8f84b..0000000 --- a/images/man1.jpg +++ /dev/null Binary files differ diff --git a/images/man2.png b/images/man2.png deleted file mode 100644 index 05c541b..0000000 --- a/images/man2.png +++ /dev/null Binary files differ diff --git a/images/manL1.png b/images/manL1.png deleted file mode 100644 index 8167af3..0000000 --- a/images/manL1.png +++ /dev/null Binary files differ diff --git a/images/manL2.png b/images/manL2.png deleted file mode 100644 index d37157f..0000000 --- a/images/manL2.png +++ /dev/null Binary files differ diff --git a/images/manL3.png b/images/manL3.png deleted file mode 100644 index 1b84370..0000000 --- a/images/manL3.png +++ /dev/null Binary files differ diff --git a/images/manL4.png b/images/manL4.png deleted file mode 100644 index 68a6be2..0000000 --- a/images/manL4.png +++ /dev/null Binary files differ diff --git a/images/manS1.png b/images/manS1.png deleted file mode 100644 index 3d5f2a0..0000000 --- a/images/manS1.png +++ /dev/null Binary files differ diff --git a/images/manS2.png b/images/manS2.png deleted file mode 100644 index 4ad81e1..0000000 --- a/images/manS2.png +++ /dev/null Binary files differ diff --git a/images/manS3.png b/images/manS3.png deleted file mode 100644 index afb705c..0000000 --- a/images/manS3.png +++ /dev/null Binary files differ diff --git a/images/manS4.png b/images/manS4.png deleted file mode 100644 index 7e17283..0000000 --- a/images/manS4.png +++ /dev/null Binary files differ