Newer
Older
PrismSoftware / ECTrainer2 / Stimulus.cpp
#include "BaseProcess.h"
#include "Stimulus.h"
#include "ECTrainer.h"
#include "MovieObject.h"
#include "myWinUtils.h"

// コンストラクタ
Stimulus::Stimulus(ECTrainer* pEct) : BaseProcess(pEct)
	, _StimNo(-1)
	, _StartTime(0)
	, _pMovieObject(NULL)
	, _Display(ECTrainer::RINGBUFSIZE)
	, _Movie(ECTrainer::RINGBUFSIZE)
{
	_pMovieObject = new MovieObject;
	_Movie.Put(L"STOP");
}

Stimulus::~Stimulus() {
	mwut::SafeDelete((void**)&_pMovieObject);
}

// 初期化
bool Stimulus::Init() {
	_Display.Put(cv::imread(OPENING_FILE));

	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);
	}

	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) {
			if (_StimInfoSet[_StimNo].type == 2) {
				_Movie.Put(L"STOP");
			}
			if (++_StimNo < _StimInfoSet.size()) {
				SetStimulus();
				((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::EXP_NEXT);
			} else {
				((BaseProcess*)_pEct->PWorker())->Tell(ECTMSG::EXP_END);
			}
		}
	}
	Sleep(30);

	return true;
}

// イベント処理
bool Stimulus::EventProc(MSG& msg) {
	mwut::DebugPrintf(_T("Stimulus::EventProc\n"));
	switch (msg.message) {
	case (int)ECTMSG::CALIB_START: // キャリブレーション開始
		mwut::DebugPrintf(_T("Stimulus::EventProc - ECTMSG::CALIB_START\n"));
		_Display.Put(cv::imread(CALIB_FILE));
		break;

	case (int)ECTMSG::CALIB_OK:	// キャリブレーション成功
		_Display.Put(cv::imread(CALIB_COMPLETE_FILE));
		break;

	case (int)ECTMSG::CALIB_FAILED:	// キャリブレーション失敗
	case (int)ECTMSG::CALIB_ERR:	// キャリブレーションエラー
		_Display.Put(cv::imread(CALIB_FAILED_FILE));
		break;

	case (int)ECTMSG::EXP_START: // 実験開始
		_StimNo = 0;
		SetStimulus();
		break;

	case (int)ECTMSG::EXP_STOP: // 実験停止
		_StimNo = -1;
		_Display.Put(cv::imread(OPENING_FILE));
		break;
	}
	return true;
}

// 刺激提示
bool Stimulus::SetStimulus() {
	if (_StimNo < 0 || _StimNo >= _StimInfoSet.size()) return false;

	_StartTime = GetTickCount();
	if (_StimInfoSet[_StimNo].type == 1) {
		_Display.Put(cv::imread(_StimInfoSet[_StimNo].filename));
	} 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);
//}