Newer
Older
PrismSoftware / ECTrainer2 / Stimulus.cpp
#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->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->SetDispBuffer(_DispBuffer);
		break;
	case STIM_PAGE::CALIB:
		_DispBuffer = cv::imread(CALIB_FILE);
		_pEct->SetDispBuffer(_DispBuffer);
		break;
	case STIM_PAGE::CALIB_COMPLETE:
		_DispBuffer = cv::imread(CALIB_COMPLETE_FILE);
		_pEct->SetDispBuffer(_DispBuffer);
		break;
	case STIM_PAGE::CALIB_FAILED:
		_DispBuffer = cv::imread(CALIB_FAILED_FILE);
		_pEct->SetDispBuffer(_DispBuffer);
		break;
	case STIM_PAGE::WHITE:
		_DispBuffer = cv::imread(WHITE_FILE);
		_pEct->SetDispBuffer(_DispBuffer);
		break;
	case STIM_PAGE::START:
		_StimNo = 0;
		SetStimulus();
		break;
	case STIM_PAGE::STOP:
		_StimNo = -1;
		_DispBuffer = cv::imread(OPENING_FILE);
		_pEct->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);
}