//#include "common.h"
#include "BaseProcess.h"
#include "Stimulus.h"
#include "ECTrainer.h"
#include "ECTrainerGUI.h" // 削除予定
#include "MovieObject.h"
#include "myWinUtils.h"
//#include <iostream>
//#include <fstream>
// コンストラクタ
Stimulus::Stimulus(ECTrainer* pEct, Marker* pMarker) : BaseProcess(pEct)
, _pMarker(pMarker)
, _StimNo(-1)
, _StartTime(0)
, _pMovieObject(NULL)
, _Movie(ECTrainer::RINGBUFSIZE)
{
_pMovieObject = new MovieObject;
_Movie.Put(L"STOP");
}
Stimulus::~Stimulus() {
mwut::SafeDelete((void**)&_pMovieObject);
}
// 初期化
bool Stimulus::Init() {
_DispBuffer = cv::imread(OPENING_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
mwut::STR_TABLE table;
if (!mwut::ReadTable(STIM_CONFIG_FILE, table)) {
mwut::DebugPrintf(_T("Can't open config file : %d\n"), STIM_CONFIG_FILE.c_str());
return false;
}
for (int r = 0; r < table.size(); r++) {
if (table[r].size() != 4 || atoi(table[r][0].c_str()) < 1) continue;
StimInfo st;
st.type = atoi(table[r][0].c_str());
st.filename = table[r][1];
st.dulation = (float)atof(table[r][2].c_str());
st.csvfile = table[r][3];
if (st.filename.size() > 0) _StimInfoSet.push_back(st);
}
return true;
}
// 基本処理
bool Stimulus::Routine() {
if (_StimNo >= 0) {
DWORD current = GetTickCount();
if ((float)(current - _StartTime) / 1000.F > _StimInfoSet[_StimNo].dulation) {
if (_StimInfoSet[_StimNo].type == 2) {
_Movie.Put(L"STOP");
}
if (++_StimNo < _StimInfoSet.size()) {
SetStimulus();
((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::STIM_NEXT);
} else {
((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::STIM_END);
}
}
}
Sleep(30);
return true;
}
// イベント処理
bool Stimulus::EventProc(MSG& msg) {
switch (msg.message) {
case (int)ECTMSG::CALIB_START: // キャリブレーション開始
_DispBuffer = cv::imread(CALIB_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
case (int)ECTMSG::CALIB_OK: // キャリブレーション成功
_DispBuffer = cv::imread(CALIB_COMPLETE_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
case (int)ECTMSG::CALIB_FAILED: // キャリブレーション失敗
case (int)ECTMSG::CALIB_ERR: // キャリブレーションエラー
_DispBuffer = cv::imread(CALIB_FAILED_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
case (int)ECTMSG::STIM_START: // 実験開始
_StimNo = 0;
SetStimulus();
break;
case (int)ECTMSG::STIM_STOP: // 実験停止
_StimNo = -1;
_DispBuffer = cv::imread(OPENING_FILE);
_pEct->PECTrainerGUI()->SetDispBuffer(_DispBuffer);
break;
}
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 {
_Movie.Put(mwut::Multi2Wide(_StimInfoSet[_StimNo].filename));
}
if (_StimInfoSet[_StimNo].csvfile[0] != '_') {
this->LoadMovieObject();
}
return true;
}
// CSV読み込み
void Stimulus::LoadMovieObject() {
if (_pMovieObject->GetNumFrames() > 0) return; // 読み込み済み
int nFrames = _pMovieObject->SetData(_StimInfoSet[_StimNo].csvfile);
mwut::DebugPrintf(_T("Movie object '%s' - %d frames read.\n"),
mwut::Multi2Wide(_StimInfoSet[_StimNo].csvfile).c_str(), nFrames);
}
// 画像にマーカーを描画
//void Stimulus::StimWithMarker() {
// cv::Mat img = cv::imread(_StimImages[_StimNo].filename);
// _pMarker->Generate(img.size());
// _pMarker->DrawMarker(img);
// img.copyTo(_DispBuffer);
//}