diff --git a/ECTrainer2/ECTrainer.cpp b/ECTrainer2/ECTrainer.cpp index 2bcd88e..b1895b8 100644 --- a/ECTrainer2/ECTrainer.cpp +++ b/ECTrainer2/ECTrainer.cpp @@ -21,13 +21,12 @@ _pProcs[(int)PROC::GUI] = new ECTrainerGUI(this); _pProcs[(int)PROC::IMGPROC] = new ImageProc(this); _pProcs[(int)PROC::SCNCAM] = new SceneCamera(this); - _pProcs[(int)PROC::STIM] = new Stimulus(this, _pMarker); + _pProcs[(int)PROC::STIM] = new Stimulus(this); _pProcs[(int)PROC::ALIVE] = new KeepAlive(this); _pProcs[(int)PROC::EYETR] = new EyeTrack(this); _pProcs[(int)PROC::REST] = new TobiiREST(this); _pProcs[(int)PROC::BITAL] = new BitalMonitor(this); _pProcs[(int)PROC::WORKER] = new Worker(this); - //_MovieToShow = _T(""); } // �f�X�g���N�^ @@ -69,9 +68,3 @@ ::MessageBox(PECTrainerGUI()->GetMainHWnd(), msg, _T("Eye Communication Trainer"), MB_OK | icon); } -// -//// ���ʃ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 7047e0d..d5ccbfa 100644 --- a/ECTrainer2/ECTrainer.h +++ b/ECTrainer2/ECTrainer.h @@ -28,10 +28,10 @@ CALIB_OK, // �L�����u���[�V�������� CALIB_FAILED, // �L�����u���[�V�������s CALIB_ERR, // �L�����u���[�V�����G���[ - STIM_START, // �����J�n - STIM_STOP, // ������~ - STIM_END, // �����I�� - STIM_NEXT, // ���̎h���Ɉړ� + EXP_START, // �����J�n + EXP_STOP, // ������~ + EXP_END, // �����I�� + EXP_NEXT, // ���̎h���Ɉړ� MOVIE_START, // ����Đ��J�n MOVIE_STOP, // ����Đ���~ MOVIE_END, // ����Đ��I�� @@ -45,16 +45,12 @@ class ECTrainer { - // �v���Z�X�ꗗ�i���������j GUI�擪, SCNCAM->ALIVE->EYETR - enum class PROC { GUI, REST, IMGPROC, STIM, SCNCAM, ALIVE, EYETR, BITAL, WORKER, NUM }; + // �v���Z�X�ꗗ�i���������j GUI << SCNCAM < ALIVE < EYETR << STIM + enum class PROC { GUI, REST, IMGPROC, SCNCAM, ALIVE, EYETR, BITAL, STIM, WORKER, NUM }; BaseProcess* _pProcs[(int)PROC::NUM]; Marker* _pMarker; HINSTANCE _hInstance; - //std::wstring _MovieToShow; // �Đ����铮��t�@�C�� - - // �X���b�h�J�n�_ - //static DWORD WINAPI ThreadEntry(LPVOID lpParameter); public: static const int RINGBUFSIZE = 4; @@ -79,8 +75,4 @@ void StopApp(); // ���b�Z�[�W�{�b�N�X�\�� void MsgBox(LPCWSTR msg, UINT icon = 0); - - //�p�~�\�� - //void SetMovieToShow(std::wstring file) { _MovieToShow = file; } - //std::wstring GetMovieToShow() { return _MovieToShow; } }; diff --git a/ECTrainer2/ECTrainerGUI.cpp b/ECTrainer2/ECTrainerGUI.cpp index c155c42..b29e9a3 100644 --- a/ECTrainer2/ECTrainerGUI.cpp +++ b/ECTrainer2/ECTrainerGUI.cpp @@ -30,12 +30,13 @@ // ������ bool ECTrainerGUI::Init() { - // ���s�‹��̏��擾 - std::vector displays = mwut::GetDisplayInfo(); + // GUI�E�C���h�E cvui::init(WIN_MAIN); _MainFrame.create(MAIN_FRAME_SIZE, CV_8UC3); + // �h���񎦃E�C���h�E + std::vector displays = mwut::GetDisplayInfo(); // ���s�‹��̏��擾 if (displays.size() > 1) { // �}���`���j�^�̏ꍇ // �T�u��ʂɑ���p�l���\�� @@ -47,34 +48,36 @@ cv::moveWindow(WIN_DISP, displays[0].left, displays[0].top); cv::resizeWindow(WIN_DISP, cv::Size(640, 400)); cv::setWindowProperty(WIN_DISP, cv::WND_PROP_FULLSCREEN, cv::WINDOW_FULLSCREEN); - _DispBuffer.create(cv::Size(displays[0].right - displays[0].left, + _FullDispBuf.create(cv::Size(displays[0].right - displays[0].left, displays[0].bottom - displays[0].top), CV_8UC3); - } - else { + } else { // �V���O�����j�^�̏ꍇ cv::namedWindow(WIN_DISP, cv::WINDOW_AUTOSIZE); cv::moveWindow(WIN_DISP, displays[0].left, displays[0].top); - _DispBuffer.create(cv::Size(640, 480), CV_8UC3); + _FullDispBuf.create(cv::Size(640, 480), CV_8UC3); cv::moveWindow(WIN_MAIN, displays[0].left + 100, displays[0].top + 100); } _blank = cv::Mat(DISP_SIZE, CV_8UC3, cv::Scalar(0)); - _blank.copyTo(_DispImage); _Logo = cv::imread("../images/ECTLogo2_1480l.png"); return _dsm->InitDx(_pEct->GetInstance(), displays[0]); } -// �񃁃b�Z�[�W���̏��� +// ��{���� bool ECTrainerGUI::Routine() { // ���C���E�C���h�E�t���[���N���A _MainFrame = cv::Scalar(49, 52, 49); - // �\���o�b�t�@���� + // ����摜�o�b�t�@���� cv::Mat sceneBuf = _pEct->PImageProc()->GetImage(); if (sceneBuf.empty()) sceneBuf = _blank; - cv::Mat CurDisplay = _DispImage.clone(); + // �\���o�b�t�@���� + bool isNew = _pEct->PStimulus()->IsNewDisplay(); + cv::Mat dispBuf = _pEct->PStimulus()->GetDisplay().clone(); + if (dispBuf.empty()) dispBuf = _blank; + if (isNew && !_dsm->IsPlaying()) this->MakeFullDispBuffer(dispBuf); // �����_�̕\�� if (_pEct->PEyeTrack()->GetGazeV().x >= 0) { @@ -90,13 +93,13 @@ ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::CALIB_START); } if (cvui::button(140, 30, "START")) { - ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::STIM_START); + ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::EXP_START); } break; case APP_STATUS::STIM: if (cvui::button(140, 30, "STOP")) { if (!_dsm->StopMovie()) _pEct->StopApp(); - ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::STIM_STOP); + ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::EXP_STOP); } //cvui::trackbar(140, &targetSize, (float)0, (float)3.0); //cvui::checkbox("Show Eyes", &fShowEyesPos); @@ -122,13 +125,12 @@ // �摜�\�� cvui::text(_MainFrame, SCENE_BUFFER_POS.x, 100, "SCENE CAMERA"); - cv::Mat resized = KeepAspectResize(sceneBuf, DISP_SIZE.width); - cvui::image(_MainFrame, SCENE_BUFFER_POS.x, SCENE_BUFFER_POS.y, resized); + cv::Mat sceneResized = KeepAspectResize(sceneBuf, DISP_SIZE.width); + cvui::image(_MainFrame, SCENE_BUFFER_POS.x, SCENE_BUFFER_POS.y, sceneResized); cvui::text(_MainFrame, DISP_IMAGE_POS.x, 100, "STIMULUS IMAGE"); - cv::Mat disp = KeepAspectResize(CurDisplay, DISP_SIZE.width); - //cv::resize(CurDisplay, disp, cv::Size(IMAGE_WIDTH, _DispImageHeight)); - cvui::image(_MainFrame, DISP_IMAGE_POS.x, DISP_IMAGE_POS.y, disp); + cv::Mat dispResized = KeepAspectResize(dispBuf, DISP_SIZE.width); + cvui::image(_MainFrame, DISP_IMAGE_POS.x, DISP_IMAGE_POS.y, dispResized); // �h������ if (_pEct->PStimulus()->IsNewMovie()) { @@ -149,7 +151,7 @@ // ��ʕ\�� cvui::update(); cv::imshow(WIN_MAIN, _MainFrame); - if (!_dsm->IsPlaying()) cv::imshow(WIN_DISP, _DispBuffer); + if (!_dsm->IsPlaying()) cv::imshow(WIN_DISP, _FullDispBuf); if (snapshot) cv::imwrite(SNAPSHOT_FILE, _MainFrame); // �L�[���� @@ -186,11 +188,10 @@ } // �h���摜�o�b�t�@�ɉ摜��ݒ� -void ECTrainerGUI::SetDispBuffer(cv::Mat& img) { - img.copyTo(_DispImage); +void ECTrainerGUI::MakeFullDispBuffer(cv::Mat& img) { _DispImageHeight = img.rows * IMAGE_WIDTH / img.cols; - cv::Mat buf(_DispBuffer.size(), CV_8UC3, cv::Scalar(0)); + cv::Mat buf(_FullDispBuf.size(), CV_8UC3, cv::Scalar(0)); cv::Rect roiRect; if (img.rows * buf.cols / buf.rows > img.cols) { roiRect.width = img.cols * buf.rows / img.rows; @@ -205,5 +206,5 @@ if (roiRect.y + roiRect.height > buf.rows) roiRect.height = buf.rows - roiRect.y; cv::Mat roi(buf, roiRect); cv::resize(img, roi, roi.size()); - buf.copyTo(_DispBuffer); + buf.copyTo(_FullDispBuf); } diff --git a/ECTrainer2/ECTrainerGUI.h b/ECTrainer2/ECTrainerGUI.h index 0c6cb09..da43767 100644 --- a/ECTrainer2/ECTrainerGUI.h +++ b/ECTrainer2/ECTrainerGUI.h @@ -15,15 +15,15 @@ const cv::String SNAPSHOT_FILE = "snapshot.jpg"; const cv::Size MAIN_FRAME_SIZE = cv::Size(1480, 620); const int IMAGE_WIDTH = 640; - const cv::Size DISP_SIZE = cv::Size(640, 480); + const cv::Size DISP_SIZE = cv::Size(IMAGE_WIDTH, 480); const cv::Point SCENE_BUFFER_POS = cv::Point(170, 120); const cv::Point DISP_IMAGE_POS = cv::Point(820, 120); const int KEY_ESC = 27; DShowMovie* _dsm; cv::Mat _MainFrame; // ���C���E�C���h�E�t���[�� - cv::Mat _DispImage; // �h���摜�i����җp�j - cv::Mat _DispBuffer; // �h����ʁi�팱�җp�j + //cv::Mat _DispImage; // �h���摜�i����җp�j + cv::Mat _FullDispBuf; // �h����ʁi�팱�җp�j cv::Mat _Logo; // ���S cv::Mat _blank; // �u�����N int _SceneBufferHeight; @@ -32,13 +32,20 @@ HWND _hWndMain; bool _AppRunning; // ���s���t���O + // ��{���� bool Routine(); + // GUI�X���b�h���C�����[�v bool MainLoop(); + // �S��ʕ\���o�b�t�@�̐��� + void MakeFullDispBuffer(cv::Mat& img); public: + // �R���X�g���N�^ ECTrainerGUI(ECTrainer* pEct); + // ������ bool Init(); + // GUI�X���b�h���b�Z�[�W�ʒm bool Tell(ECTMSG msg, WPARAM wp = 0, LPARAM lp = 0); + // ���C����ʂ̃E�C���h�E�n���h����Ԃ� HWND GetMainHWnd() { return _hWndMain; } - void SetDispBuffer(cv::Mat& img); }; diff --git a/ECTrainer2/Stimulus.cpp b/ECTrainer2/Stimulus.cpp index 2901571..568a324 100644 --- a/ECTrainer2/Stimulus.cpp +++ b/ECTrainer2/Stimulus.cpp @@ -1,19 +1,15 @@ -//#include "common.h" #include "BaseProcess.h" #include "Stimulus.h" #include "ECTrainer.h" -#include "ECTrainerGUI.h" // �폜�\�� #include "MovieObject.h" #include "myWinUtils.h" -//#include -//#include // �R���X�g���N�^ -Stimulus::Stimulus(ECTrainer* pEct, Marker* pMarker) : BaseProcess(pEct) - , _pMarker(pMarker) +Stimulus::Stimulus(ECTrainer* pEct) : BaseProcess(pEct) , _StimNo(-1) , _StartTime(0) , _pMovieObject(NULL) + , _Display(ECTrainer::RINGBUFSIZE) , _Movie(ECTrainer::RINGBUFSIZE) { _pMovieObject = new MovieObject; @@ -26,8 +22,7 @@ // ������ bool Stimulus::Init() { - _DispBuffer = cv::imread(OPENING_FILE); - _pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer); + _Display.Put(cv::imread(OPENING_FILE)); mwut::STR_TABLE table; if (!mwut::ReadTable(STIM_CONFIG_FILE, table)) { @@ -45,12 +40,15 @@ if (st.filename.size() > 0) _StimInfoSet.push_back(st); } + mwut::DebugPrintf(_T("Stimulus::Init\n")); return true; } // ��{���� bool Stimulus::Routine() { + mwut::DebugPrintf(_T("Stimulus::Routine\n")); + if (_StimNo >= 0) { DWORD current = GetTickCount(); if ((float)(current - _StartTime) / 1000.F > _StimInfoSet[_StimNo].dulation) { @@ -59,9 +57,9 @@ } if (++_StimNo < _StimInfoSet.size()) { SetStimulus(); - ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::STIM_NEXT); + ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::EXP_NEXT); } else { - ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::STIM_END); + ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::EXP_END); } } } @@ -72,32 +70,30 @@ // �C�x���g���� bool Stimulus::EventProc(MSG& msg) { + mwut::DebugPrintf(_T("Stimulus::EventProc\n")); switch (msg.message) { case (int)ECTMSG::CALIB_START: // �L�����u���[�V�����J�n - _DispBuffer = cv::imread(CALIB_FILE); - _pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer); + mwut::DebugPrintf(_T("Stimulus::EventProc - ECTMSG::CALIB_START\n")); + _Display.Put(cv::imread(CALIB_FILE)); break; case (int)ECTMSG::CALIB_OK: // �L�����u���[�V�������� - _DispBuffer = cv::imread(CALIB_COMPLETE_FILE); - _pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer); + _Display.Put(cv::imread(CALIB_COMPLETE_FILE)); break; case (int)ECTMSG::CALIB_FAILED: // �L�����u���[�V�������s case (int)ECTMSG::CALIB_ERR: // �L�����u���[�V�����G���[ - _DispBuffer = cv::imread(CALIB_FAILED_FILE); - _pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer); + _Display.Put(cv::imread(CALIB_FAILED_FILE)); break; - case (int)ECTMSG::STIM_START: // �����J�n + case (int)ECTMSG::EXP_START: // �����J�n _StimNo = 0; SetStimulus(); break; - case (int)ECTMSG::STIM_STOP: // ������~ + case (int)ECTMSG::EXP_STOP: // ������~ _StimNo = -1; - _DispBuffer = cv::imread(OPENING_FILE); - _pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer); + _Display.Put(cv::imread(OPENING_FILE)); break; } return true; @@ -109,12 +105,7 @@ _StartTime = GetTickCount(); if (_StimInfoSet[_StimNo].type == 1) { - _DispBuffer = cv::imread(_StimInfoSet[_StimNo].filename); - if (_DispBuffer.empty()) { - MessageBox(NULL, _T("�h���摜���J���܂���"), _T(""), MB_ICONERROR); - return false; - } - _pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer); + _Display.Put(cv::imread(_StimInfoSet[_StimNo].filename)); } else { _Movie.Put(mwut::Multi2Wide(_StimInfoSet[_StimNo].filename)); } diff --git a/ECTrainer2/Stimulus.h b/ECTrainer2/Stimulus.h index 6eb8b78..e2eb484 100644 --- a/ECTrainer2/Stimulus.h +++ b/ECTrainer2/Stimulus.h @@ -29,13 +29,13 @@ const cv::String CALIB_FAILED_FILE = "../images/CalibFailed.png"; const cv::String WHITE_FILE = "../images/white.png"; const std::string STIM_CONFIG_FILE = "StimConfig.txt"; - Marker* _pMarker; - cv::Mat _DispBuffer; - std::vector _StimInfoSet; - MovieObject* _pMovieObject; - int _StimNo; // �h���f�[�^�ԍ��@-1:��~ - DWORD _StartTime; // �h���񎦊J�n���� - RingBuffer _Movie; + + std::vector _StimInfoSet; // �����ݒ� + MovieObject* _pMovieObject; // �^�[�Q�b�g��� + int _StimNo; // �h���f�[�^�ԍ��@-1:��~ + DWORD _StartTime; // �h���񎦊J�n���� + RingBuffer _Display; // �\���摜 + RingBuffer _Movie; // ������ // �h����ݒ� bool SetStimulus(); @@ -50,7 +50,7 @@ public: // �R���X�g���N�^ - Stimulus(ECTrainer* pEct, Marker* pMarker); + Stimulus(ECTrainer* pEct); // �f�X�g���N�^ ~Stimulus(); // ������ @@ -59,4 +59,8 @@ std::wstring GetMovie() { return _Movie.Get(); } // ������̍X�V��� bool IsNewMovie() { return _Movie.IsNew(); } + // �\���摜��Ԃ� + cv::Mat GetDisplay() { return _Display.Get(); } + // �\���摜�̍X�V��� + bool IsNewDisplay() { return _Display.IsNew(); } }; diff --git a/ECTrainer2/TobiiREST.cpp b/ECTrainer2/TobiiREST.cpp index e96edb6..c91ee3d 100644 --- a/ECTrainer2/TobiiREST.cpp +++ b/ECTrainer2/TobiiREST.cpp @@ -120,6 +120,10 @@ values.push_back(_T("failed")); values.push_back(_T("calibrated")); std::wstring status = REST_Handler::WaitForStatus(url.c_str(), _T("ca_state"), values); +#else + ::Sleep(1000); + std::wstring status = _T("calibrated"); +#endif if (status == _T("failed")) { ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::CALIB_FAILED); mwut::DebugPrintf(_T("Calibration failed\n")); @@ -127,10 +131,6 @@ ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::CALIB_OK); mwut::DebugPrintf(_T("Calibration successful\n")); } -#else - ((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::CALIB_OK); - mwut::DebugPrintf(_T("Calibration skipped\n")); -#endif return true; } catch (const std::exception & e) diff --git a/ECTrainer2/Worker.cpp b/ECTrainer2/Worker.cpp index 55d953f..35125d3 100644 --- a/ECTrainer2/Worker.cpp +++ b/ECTrainer2/Worker.cpp @@ -62,65 +62,65 @@ _AppStatus = APP_STATUS::CALIB; ((BaseProcess*)_pEct->PStimulus())->Tell(ECTMSG::CALIB_START); ((BaseProcess*)_pEct->PTobiiREST())->Tell(ECTMSG::CALIB_START); - this->EventLog(_T("�L�����u���[�V���� �J�n")); + this->EventLog(_T("Calibration Start")); } break; case (int)ECTMSG::CALIB_OK: // �L�����u���[�V�������� _AppStatus = APP_STATUS::IDLE; ((BaseProcess*)_pEct->PStimulus())->Tell(ECTMSG::CALIB_OK); - this->EventLog(_T("�L�����u���[�V���� ����")); + this->EventLog(_T("Calibration Success")); break; case (int)ECTMSG::CALIB_FAILED: // �L�����u���[�V�������s case (int)ECTMSG::CALIB_ERR: // �L�����u���[�V�����G���[ _AppStatus = APP_STATUS::IDLE; ((BaseProcess*)_pEct->PStimulus())->Tell(ECTMSG::CALIB_FAILED); - this->EventLog(_T("�L�����u���[�V���� ���s")); + this->EventLog(_T("Calibration Failed")); break; - case (int)ECTMSG::STIM_START: // �����J�n + case (int)ECTMSG::EXP_START: // �����J�n if (_AppStatus == APP_STATUS::IDLE) { _AppStatus = APP_STATUS::STIM; - ((BaseProcess*)_pEct->PStimulus())->Tell(ECTMSG::STIM_START); - this->EventLog(_T("���� �J�n")); + ((BaseProcess*)_pEct->PStimulus())->Tell(ECTMSG::EXP_START); + this->EventLog(_T("Experiment Start")); } break; - case (int)ECTMSG::STIM_STOP: // ������~ + case (int)ECTMSG::EXP_STOP: // ������~ if (_AppStatus == APP_STATUS::STIM) { _AppStatus = APP_STATUS::IDLE; - ((BaseProcess*)_pEct->PStimulus())->Tell(ECTMSG::STIM_STOP); - this->EventLog(_T("���� ��~")); + ((BaseProcess*)_pEct->PStimulus())->Tell(ECTMSG::EXP_STOP); + this->EventLog(_T("Experiment Stopped")); } break; - case (int)ECTMSG::STIM_END: // �����I�� + case (int)ECTMSG::EXP_END: // �����I�� if (_AppStatus == APP_STATUS::STIM) { _AppStatus = APP_STATUS::IDLE; - ((BaseProcess*)_pEct->PStimulus())->Tell(ECTMSG::STIM_STOP); - this->EventLog(_T("���� �I��")); + ((BaseProcess*)_pEct->PStimulus())->Tell(ECTMSG::EXP_STOP); + this->EventLog(_T("Experiment Finished")); } break; - case (int)ECTMSG::STIM_NEXT: // ���̎h���Ɉړ� - this->EventLog(_T("���̎h���Ɉړ�")); + case (int)ECTMSG::EXP_NEXT: // ���̎h���Ɉړ� + this->EventLog(_T("Next stimulation")); break; case (int)ECTMSG::MOVIE_START: // ����Đ��J�n - this->EventLog(_T("���� �Đ��J�n")); + this->EventLog(_T("Movie Start")); break; case (int)ECTMSG::MOVIE_STOP: // ����Đ���~ - this->EventLog(_T("���� �Đ���~")); + this->EventLog(_T("Movie Stopped")); break; case (int)ECTMSG::MOVIE_END: // ����Đ��I�� - this->EventLog(_T("���� �Đ��I��")); + this->EventLog(_T("Movie End")); break; case (int)ECTMSG::MOVIE_ERROR: // ����G���[ - this->EventLog(_T("���� �G���[")); + this->EventLog(_T("Movie Error")); break; } return true;