#include "common.h"
#include <iostream>
#include <fstream>
// コンストラクタ
Stimulus::Stimulus(ECTrainer* pEct, Marker* pMarker)
:BaseProcess(pEct)
, _pMarker(pMarker)
, _StimNo(-1)
, _StartTime(0)
{
}
// 初期化
bool Stimulus::Init() {
SetPage(STIM_PAGE::OPENING);
std::ifstream ifs(DATA_FILE);
if (!ifs)
{
OutputDebugString(_T("Can't open stim data file."));
return false;
}
while (!ifs.eof()) {
StimInfo st;
ifs >> st.type >> st.filename >> st.dulation >> st.csvfile >> st.target;
std::cout << st.type << "," << st.filename << "," << st.dulation << ","
<< st.csvfile << "," << st.target << std::endl;
if (st.filename.size() > 0) _StimInfoSet.push_back(st);
}
return true;
}
// ループ
bool Stimulus::MainLoop() {
while (_pEct->IsAppRun()) {
if (_StimNo >= 0) {
DWORD current = GetTickCount();
if ((float)(current - _StartTime) / 1000.F > _StimInfoSet[_StimNo].dulation) {
if (_StimInfoSet[_StimNo].type == 2) {
SetPage(STIM_PAGE::WHITE);
_pEct->SetMovieToShow(L"STOP");
}
if (++_StimNo < _StimInfoSet.size()) {
SetStimulus();
} else {
SetPage(STIM_PAGE::STOP);
}
}
}
Sleep(30);
}
return true;
}
// 刺激提示
bool Stimulus::SetStimulus() {
if (_StimNo < 0 || _StimNo >= _StimInfoSet.size()) return false;
_StartTime = GetTickCount();
if (_StimInfoSet[_StimNo].type == 1) {
_DispBuffer = cv::imread(_StimInfoSet[_StimNo].filename);
if (_DispBuffer.empty()) {
MessageBox(NULL, _T("刺激画像が開けません"), _T(""), MB_ICONERROR);
return false;
}
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
} else {
std::wstring mov = mwut::Multi2Wide(_StimInfoSet[_StimNo].filename);
_pEct->SetMovieToShow(mov);
}
if (_StimInfoSet[_StimNo].csvfile[0] != '_') {
this->ReadCsv();
}
return true;
}
// 固定ページ表示
void Stimulus::SetPage(STIM_PAGE st) {
switch (st) {
case STIM_PAGE::OPENING:
_DispBuffer = cv::imread(OPENING_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
case STIM_PAGE::CALIB:
_DispBuffer = cv::imread(CALIB_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
case STIM_PAGE::CALIB_COMPLETE:
_DispBuffer = cv::imread(CALIB_COMPLETE_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
case STIM_PAGE::CALIB_FAILED:
_DispBuffer = cv::imread(CALIB_FAILED_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
case STIM_PAGE::WHITE:
_DispBuffer = cv::imread(WHITE_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
case STIM_PAGE::START:
_StimNo = 0;
SetStimulus();
break;
case STIM_PAGE::STOP:
_StimNo = -1;
_DispBuffer = cv::imread(OPENING_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
case STIM_PAGE::NEXT:
if (++_StimNo >= _StimInfoSet.size()) _StimNo = -1;
SetStimulus();
break;
}
}
// 刺激をセット
//void Stimulus::StimWithMarker() {
// cv::Mat img = cv::imread(_StimImages[_StimNo].filename);
// _pMarker->Generate(img.size());
// _pMarker->DrawMarker(img);
// img.copyTo(_DispBuffer);
//}
// CSV読み込み
void Stimulus::ReadCsv() {
if (_MovieObject.GetNumFrames() > 0) return; // 読み込み済み
int nFrames = _MovieObject.SetData(_StimInfoSet[_StimNo].csvfile);
mwut::DebugPrintf(_T("CSV file '%s' - %d frames read.\n"),
mwut::Multi2Wide(_StimInfoSet[_StimNo].csvfile).c_str(), nFrames);
}