diff --git a/ECTrainer2/BitalMonitor.cpp b/ECTrainer2/BitalMonitor.cpp index 1b4591e..ad8051b 100644 --- a/ECTrainer2/BitalMonitor.cpp +++ b/ECTrainer2/BitalMonitor.cpp @@ -41,7 +41,10 @@ // ���[�v bool BitalMonitor::Routine() { - if (!_useDevice) return true; + if (!_useDevice) { + Sleep(100); + return true; + } // �o�C�^�� char comBuf[BUF_LEN] = { '\0' }; diff --git a/ECTrainer2/BitalMonitor.h b/ECTrainer2/BitalMonitor.h index 2332d91..fc11379 100644 --- a/ECTrainer2/BitalMonitor.h +++ b/ECTrainer2/BitalMonitor.h @@ -17,6 +17,9 @@ DWORD _lastRR; // �O���RR�擾���ԁi�^�C���A�E�g�� 0�j char lastBuf[BUF_LEN]; + //std::string ClassName() { return "BitalMonitor"; } // FPS�\�� + + public: BitalMonitor(ECTrainer* pEct); bool Init(); diff --git a/ECTrainer2/ECTrainer.cpp b/ECTrainer2/ECTrainer.cpp index 3c74597..2560f56 100644 --- a/ECTrainer2/ECTrainer.cpp +++ b/ECTrainer2/ECTrainer.cpp @@ -42,14 +42,14 @@ // �v���Z�X������ for (int i = 0; i < (int)PROC::NUM; i++) { if (!_pProcs[i]->Init()) return false; + //mwut::DebugPrintf(_T("Thread %d initialized.\n"), i); } - mwut::DebugPrintf(_T("Init done\n")); // �X���b�h�J�n for (int i = 0; i < (int)PROC::NUM; i++) { if (i != (int)PROC::GUI) _pProcs[i]->Launch(); + //mwut::DebugPrintf(_T("Thread %d start.\n"), i); } - mwut::DebugPrintf(_T("Threading done\n")); _pProcs[(int)PROC::GUI]->MainLoop(); // �X���b�h�I�� diff --git a/ECTrainer2/ECTrainer.h b/ECTrainer2/ECTrainer.h index 4626807..b40426b 100644 --- a/ECTrainer2/ECTrainer.h +++ b/ECTrainer2/ECTrainer.h @@ -6,8 +6,8 @@ //#define TOBII_ADDR "192.168.71.50" #define TOBII_ADDR "192.168.23.155" -#define EYEDEVICE_GLASS2 -//#define EYEDEVICE_NONE +//#define EYEDEVICE_GLASS2 +#define EYEDEVICE_NONE class BaseProcess; class ECTrainerGUI; @@ -56,7 +56,7 @@ class ECTrainer { // �v���Z�X�ꗗ�i���������j GUI < REST << SCNCAM < ALIVE < EYETR << STIM - enum class PROC { GUI, REST, WORKER, IMGPROC, ALIVE, EYETR, BITAL, STIM, SCNCAM, NUM }; + enum class PROC { GUI, REST, WORKER, IMGPROC, SCNCAM, ALIVE, EYETR, BITAL, STIM, NUM }; BaseProcess* _pProcs[(int)PROC::NUM]; Marker* _pMarker; diff --git a/ECTrainer2/ECTrainerGUI.cpp b/ECTrainer2/ECTrainerGUI.cpp index 9538696..20e66f5 100644 --- a/ECTrainer2/ECTrainerGUI.cpp +++ b/ECTrainer2/ECTrainerGUI.cpp @@ -17,9 +17,6 @@ // �R���X�g���N�^ ECTrainerGUI::ECTrainerGUI(ECTrainer* pEct) : BaseProcess(pEct) - , _SceneBufferHeight(0) - , _DispImageHeight(0) - , _SceneBufferScale(1.F) , _hWndMain(NULL) , _Booting(true) { @@ -54,11 +51,11 @@ cv::moveWindow(WIN_DISP, displays[0].left, displays[0].top); } - _FullDispBuf.create(cv::Size(displays[0].right - displays[0].left, - displays[0].bottom - displays[0].top), CV_8UC3); - _hWndMain = ::FindWindowA(NULL, WIN_MAIN.c_str()); + _FullDispBuf = cv::Mat(cv::Size(displays[0].right - displays[0].left, + displays[0].bottom - displays[0].top), CV_8UC3, cv::Scalar(0)); _blank = cv::Mat(DISP_SIZE, CV_8UC3, cv::Scalar(0)); _Logo = cv::imread(HEADER_FILE); + _hWndMain = ::FindWindowA(NULL, WIN_MAIN.c_str()); _pEct->PDSMovie()->Init(displays[0]); @@ -77,10 +74,9 @@ // �\���o�b�t�@�����i��������Worker�N���X�̐����摜�C���������Stimulus�N���X�̉摜���g���j bool fTarget = _pEct->PWorker()->GetAppStatus() == APP_STATUS::STIM; - bool isNew = fTarget ? _pEct->PWorker()->IsNewTargetImg() : _pEct->PStimulus()->IsNewDisplay(); + //bool isNew = fTarget ? : _pEct->PStimulus()->IsNewDisplay(); cv::Mat dispBuf = fTarget ? _pEct->PWorker()->GetTargetImg().clone() : _pEct->PStimulus()->GetDisplay().clone(); if (dispBuf.empty()) dispBuf = _blank; - if (isNew && !_pEct->PDSMovie()->IsPlaying()) this->MakeFullDispBuffer(dispBuf); // �����_�̕\�� if (_pEct->PEyeTrack()->GetGazeV().x >= 0) { @@ -138,31 +134,22 @@ cv::Mat dispResized = gocv::KeepAspectResize(dispBuf, DISP_SIZE.width); cvui::image(_MainFrame, DISP_IMAGE_POS.x, DISP_IMAGE_POS.y, dispResized); - //// �h������ - //if (_pEct->PStimulus()->IsNewMovie()) { - // std::wstring movie = _pEct->PStimulus()->GetMovie(); - // //if (movie.size() < 1 || movie == L"STOP") { - // // mwut::DebugPrintf(_T("ECTMSG::MOVIE_STOP [%s]\n"), movie.c_str()); - // // ((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::MOVIE_STOP); - // //} else { - // if (_pEct->PDSMovie()->PlayMovie(movie)) { - // ((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::MOVIE_START); - // } else { - // _pEct->PDSMovie()->StopMovie(); - // ((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::SYSTEM_ERROR); - // } - // //} - //} - // ����̖����܂ōĐ��`�F�b�N if (_pEct->PDSMovie()->IsReachToEnd()) { ((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::MOVIE_END); } - // ��ʕ\�� + // ���C����ʕ\�� cvui::update(); cv::imshow(WIN_MAIN, _MainFrame); - if (!_pEct->PDSMovie()->IsPlaying()) cv::imshow(WIN_DISP, _FullDispBuf); + + // �S��ʕ\�� + if (_pEct->PWorker()->IsNewFullScreenImg() && !_pEct->PDSMovie()->IsPlaying()) { + this->MakeFullDispBuffer(_pEct->PWorker()->GetFullScreenImg()); + cv::imshow(WIN_DISP, _FullDispBuf); + } + + // �X�i�b�v�V���b�g�ۑ� if (snapshot) cv::imwrite(SNAPSHOT_FILE, _MainFrame); // �E�C���h�E�~�{�^���ŕ‚����� @@ -176,6 +163,8 @@ ((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::SOFTWARE_START); } + Sleep(1); + return true; } @@ -211,9 +200,7 @@ } // �h���摜�o�b�t�@�ɉ摜��ݒ� -void ECTrainerGUI::MakeFullDispBuffer(cv::Mat& img) { - _DispImageHeight = img.rows * IMAGE_WIDTH / img.cols; - +void ECTrainerGUI::MakeFullDispBuffer(cv::Mat img) { cv::Mat buf(_FullDispBuf.size(), CV_8UC3, cv::Scalar(0)); cv::Rect roiRect; if (img.rows * buf.cols / buf.rows > img.cols) { diff --git a/ECTrainer2/ECTrainerGUI.h b/ECTrainer2/ECTrainerGUI.h index 689fb5c..5062b8e 100644 --- a/ECTrainer2/ECTrainerGUI.h +++ b/ECTrainer2/ECTrainerGUI.h @@ -25,18 +25,17 @@ cv::Mat _FullDispBuf; // �h����ʁi�팱�җp�j cv::Mat _Logo; // ���S cv::Mat _blank; // �u�����N - int _SceneBufferHeight; - float _SceneBufferScale; - int _DispImageHeight; HWND _hWndMain; // ���C���E�C���h�E�̃n���h�� - BOOL _Booting; + BOOL _Booting; // �N������t���O // ��{���� bool Routine(); // �C�x���g���� bool EventProc(MSG& msg); // �S��ʕ\���o�b�t�@�̐��� - void MakeFullDispBuffer(cv::Mat& img); + void MakeFullDispBuffer(cv::Mat img); + + std::string ClassName() { return "GUI"; } // FPS�\�� public: // �R���X�g���N�^ diff --git a/ECTrainer2/EyeTrack.cpp b/ECTrainer2/EyeTrack.cpp index 9181d09..46432dd 100644 --- a/ECTrainer2/EyeTrack.cpp +++ b/ECTrainer2/EyeTrack.cpp @@ -37,10 +37,11 @@ std::cerr << "Data Receive Error" << std::endl; Sleep(10); return true; -} + } //std::cout << buf << std::endl; // ��M�f�[�^��� + bool rv = false; GazeData gd(buf); if (gd.gidx > _lastGidx) { if (_gazePoint.x > 0 && _gazePoint.y > 0) { @@ -53,16 +54,18 @@ _gazePoint = cv::Point2f(-1.F, -1.F); _lastGidx = gd.gidx; + rv = true; } if (gd.isGP && gd.s == 0) { _gazePoint = gd.gp; } if (gd.isPDR && gd.s == 0) _pupilD.r = gd.pdr; + return rv; + #elif defined(EYEDEVICE_NONE) _GazeV.Put(cv::Point2f(-1.F, -1.F)); Sleep(10); -#endif - return true; +#endif } diff --git a/ECTrainer2/EyeTrack.h b/ECTrainer2/EyeTrack.h index 2b4bcfd..2187ea4 100644 --- a/ECTrainer2/EyeTrack.h +++ b/ECTrainer2/EyeTrack.h @@ -23,6 +23,8 @@ cv::Point2f _gazePoint; MeanBuffer _gpCx, _gpCy; // �ړ����σo�b�t�@ + //std::string ClassName() { return "EyeTrack"; } // FPS�\�� + public: // �R���X�g���N�^ EyeTrack(ECTrainer* pEct); diff --git a/ECTrainer2/Marker.h b/ECTrainer2/Marker.h index b615ee4..be91ad4 100644 --- a/ECTrainer2/Marker.h +++ b/ECTrainer2/Marker.h @@ -6,7 +6,6 @@ class Marker { - const cv::Size IMGSIZE= cv::Size(1920, 1080); // �񎦉摜�T�C�Y const cv::Point SIZE = cv::Point(100, 100); // AR�}�[�J�[�̃T�C�Y const cv::Point MARGIN = cv::Point(10, 10); // AR�}�[�J�[���͘g�̕� const float OUTER_MARGIN = 0.01F; // �}�[�J�[�`��p @@ -20,6 +19,8 @@ void CalcMarkerCorners(cv::Size imgsize); public: + const cv::Size IMGSIZE = cv::Size(1920, 1080); // �񎦉摜�T�C�Y + // �R���X�g���N�^ Marker(); // �}�[�J�[���o diff --git a/ECTrainer2/RingBuffer.h b/ECTrainer2/RingBuffer.h index 29acccf..77115e8 100644 --- a/ECTrainer2/RingBuffer.h +++ b/ECTrainer2/RingBuffer.h @@ -14,11 +14,24 @@ int _read; bool _update; public: + // �R���X�g���N�^ + // size �o�b�t�@�̃T�C�Y + // initial �S�v�f�̏����l RingBuffer(int size = DEEFAULT_SIZE); RingBuffer(int size, T initial); + + // �f�X�g���N�^ ~RingBuffer(); + + // �f�[�^���i�[���� void Put(T value); - T Get(int past = 0); + + // �ŐV�̃f�[�^���o�� + // peeking true ���o���L�^���Ȃ� false (�f�t�H���g�j���o���L�^���� + // past �ߋ��ɂ����̂ڂ�i�f�t�H���g=0�j + T Get(bool peeking = false, int past = 0); + + // �V�����f�[�^���lj����ꂽ�� bool IsNew() { return _update; }; }; @@ -67,15 +80,17 @@ } template -T RingBuffer::Get(int past) { +T RingBuffer::Get(bool peeking, int past) { int read = (_read + _size - past) % _size; _mtxData[read].lock(); T value = _data[read]; _mtxData[read].unlock(); - _mtxIndex.lock(); - _update = false; - _mtxIndex.unlock(); + if (!peeking) { + _mtxIndex.lock(); + _update = false; + _mtxIndex.unlock(); + } return value; } diff --git a/ECTrainer2/StimConfig.txt b/ECTrainer2/StimConfig.txt index f28ca23..6b6d22e 100644 --- a/ECTrainer2/StimConfig.txt +++ b/ECTrainer2/StimConfig.txt @@ -1,6 +1,7 @@ -1,../images/SoftCalib1.png,4,_ -#1,../images/SoftCalib2.png,4,_ -#1,../images/SoftCalib3.png,4,_ -#1,../images/SoftCalib4.png,4,_ -1,../images/visit01/visit01_004.png,5,_ -2,../movies/visit01_004.avi,30,../movies/visit01_004.csv +���, +1,../images/SoftCalib1.png,4,_,_ +#1,../images/SoftCalib2.png,4,_,_ +#1,../images/SoftCalib3.png,4,_,_ +#1,../images/SoftCalib4.png,4,_,_ +#1,../images/visit01/visit01_004.png,5,_,_ +2,../movies/visit01_004_15asl4.avi,30,../movies/visit01_004.csv,../movies/visit01_004vga.avi diff --git a/ECTrainer2/Stimulus.cpp b/ECTrainer2/Stimulus.cpp index 7562f25..47f49ad 100644 --- a/ECTrainer2/Stimulus.cpp +++ b/ECTrainer2/Stimulus.cpp @@ -30,7 +30,7 @@ // �e�[�u������\���̂֊i�[ for (int r = 0; r < table.size(); r++) { - if (table[r].size() != 4 || atoi(table[r][0].c_str()) < 1) continue; + if (table[r].size() != 5 || atoi(table[r][0].c_str()) < 1) continue; StimInfo st; st.type = atoi(table[r][0].c_str()); st.filepath = table[r][1]; @@ -38,6 +38,7 @@ st.filename = idx == std::string::npos ? st.filepath : st.filepath.substr(idx + 1); st.dulation = (float)atof(table[r][2].c_str()); st.csvfile = table[r][3]; + st.smallmovie = table[r][4]; if (st.filepath.size() > 0) _StimInfoSet.push_back(st); } @@ -62,8 +63,7 @@ if (!frame.empty()) _Display.Put(frame); } } - - Sleep(0); + Sleep(15); return true; } @@ -139,9 +139,9 @@ if (_StimInfoSet[newStimNo].type == 1) { this->SetImage(_StimInfoSet[newStimNo].filepath); } else { - _cap.open(_StimInfoSet[newStimNo].filepath); + _cap.open(_StimInfoSet[newStimNo].smallmovie); if (!_cap.isOpened()) { - mwut::DebugPrintf(_T("Can't open movie file: %s\n"), + mwut::DebugPrintf(_T("Can't open small movie file: %s\n"), mwut::Multi2Wide(_StimInfoSet[newStimNo].filepath).c_str()); ((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::SYSTEM_ERROR); return false; diff --git a/ECTrainer2/Stimulus.h b/ECTrainer2/Stimulus.h index 7765884..88a7863 100644 --- a/ECTrainer2/Stimulus.h +++ b/ECTrainer2/Stimulus.h @@ -17,6 +17,7 @@ int type; // 1:�摜 2:���� std::string filepath; // �񎦃t�@�C�����i�p�X�t���j std::string filename; // �񎦃t�@�C�����i�p�X�Ȃ��j + std::string smallmovie; // �k������t�@�C���� float dulation; // ����(sec) std::string csvfile; // �^�[�Q�b�g���W�t�@�C���i�����ꍇ��_�A���_�[�o�[�j }; @@ -58,6 +59,8 @@ // �摜�Ƀ}�[�J�[��`�� //void StimWithMarker(); + std::string ClassName() { return "Stimulus"; } // FPS�\�� + public: // �R���X�g���N�^ Stimulus(ECTrainer* pEct); diff --git a/ECTrainer2/TobiiREST.cpp b/ECTrainer2/TobiiREST.cpp index 029e77d..4167f1e 100644 --- a/ECTrainer2/TobiiREST.cpp +++ b/ECTrainer2/TobiiREST.cpp @@ -48,7 +48,7 @@ QueryBatteryLevel(); } - Sleep(1); + Sleep(30); return true; } diff --git a/ECTrainer2/TobiiREST.h b/ECTrainer2/TobiiREST.h index c55f682..863bfcf 100644 --- a/ECTrainer2/TobiiREST.h +++ b/ECTrainer2/TobiiREST.h @@ -24,6 +24,8 @@ // �ʏ폈�� bool Routine(); + //std::string ClassName() { return "TobiiREST"; } // FPS�\�� + public: // �R���X�g���N�^ TobiiREST(ECTrainer* pEct); diff --git a/ECTrainer2/Worker.cpp b/ECTrainer2/Worker.cpp index 794d193..74fd794 100644 --- a/ECTrainer2/Worker.cpp +++ b/ECTrainer2/Worker.cpp @@ -16,6 +16,7 @@ , _pExpTimer(NULL) , _pContactTimer(NULL) , _TargetImage() + , _FullScreenImage() , _FBLevel(1) , _IsInside(false) { @@ -57,27 +58,35 @@ // �������X�V��҂� if (!_pEct->PEyeTrack()->IsNewGazeV()) { - Sleep(1); - return true; + Sleep(0); + return false; } + cv::Point2f gazeV = (_pEct->PEyeTrack()->GetGazeV()); int stimNo = _pEct->PStimulus()->GetStimNo(); // �����_���摜���W�ɕϊ� auto gazeI = gazeV.x < 0 ? cv::Point2f(-1, -1) : _pEct->PMarker()->ConvV2I(gazeV); + // �\���摜�擾 + if (_StimImage.empty() || _pEct->PStimulus()->IsNewDisplay()) { + _StimImage = _pEct->PStimulus()->GetDisplay(); + _FullScreenImage.Put(_StimImage); + } + // �^�[�Q�b�g�摜���� int hit = -1; double dtMin = 0; int fb = 0; std::vector elems = _pEct->PStimulus()->GetMovieObject(); if (stimNo >= 0) { - cv::Mat stimImg = _pEct->PStimulus()->GetDisplay().clone(); + cv::Mat stimImg = _StimImage.clone(); + float scale = (float)stimImg.cols / _pEct->PMarker()->IMGSIZE.width; if (elems.size() > 0) { for (int e = 0; e < elems.size(); e++) { // �^�[�Q�b�g�`�� auto target = cv::Point2f(elems[e].x, elems[e].y); - cv::circle(stimImg, target, (int)elems[e].d, CV_RGB(255, 0, 0), 2); + cv::circle(stimImg, target * scale, (int)(elems[e].d * scale), CV_RGB(255, 0, 0), 2); if (gazeI.x >= 0) { // �^�[�Q�b�g���� auto dt = cv::norm(gazeI - target); @@ -90,7 +99,7 @@ } if (gazeI.x >= 0) { // �摜��̒����_�`�� - cv::circle(stimImg, gazeI, 20, CV_RGB(0, 0, 255), 3); + cv::circle(stimImg, gazeI * scale, (int)(20 * scale), CV_RGB(0, 0, 255), 3); if (hit >= 0) { _pNohitTimer->Reset(); diff --git a/ECTrainer2/Worker.h b/ECTrainer2/Worker.h index c25111d..18ebef7 100644 --- a/ECTrainer2/Worker.h +++ b/ECTrainer2/Worker.h @@ -38,6 +38,8 @@ mwut::HPTimer* _pContactTimer; // �ڕW�R���^�N�g���� mwut::HPTimer* _pNohitTimer; // �����O�ꎞ�� RingBuffer _TargetImage; // �^�[�Q�b�g�摜 + cv::Mat _StimImage; // �h���摜 + RingBuffer _FullScreenImage; // �S��ʗp�摜 int _FBLevel; // �t�B�[�h�o�b�N���x�� 1�`5 bool _IsInside; // �������^�[�Q�b�g�ɂ��邩 @@ -50,6 +52,8 @@ // ����p�����[�^�����Z�b�g void ResetParams(); + std::string ClassName() { return "Worker"; } // FPS�\�� + public: // �R���X�g���N�^ Worker(ECTrainer* pEct); @@ -59,8 +63,10 @@ bool Init(); // �A�v���P�[�V������Ԃ̎擾 APP_STATUS GetAppStatus() { return _AppStatus; } - // �^�[�Q�b�g�摜�̍X�V��� - bool IsNewTargetImg() { return _TargetImage.IsNew(); } // �^�[�Q�b�g�摜�擾 cv::Mat GetTargetImg() { return _TargetImage.Get(); } + // �S��ʉ摜�̍X�V��� + bool IsNewFullScreenImg() { return _FullScreenImage.IsNew(); } + // �S��ʉ摜�擾 + cv::Mat GetFullScreenImg() { return _FullScreenImage.Get(); } };