#include "Stimulus.h"
#include "ECTrainer.h"
#include "Marker.h"
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <tchar.h>
#include "MyWinUtils.h"
// コンストラクタ
Stimulus::Stimulus(ECTrainer* pEct, Marker* pMarker)
:BaseProcess(pEct)
, _pMarker(pMarker)
, _StimNo(-1)
, _StartTime(0)
{
}
// 初期化
bool Stimulus::Init() {
SetPage(PAGES::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->IsRunning()) {
if (_StimNo >= 0) {
DWORD current = GetTickCount();
if ((float)(current - _StartTime) / 1000.F > _StimInfoSet[_StimNo].dulation) {
if (_StimInfoSet[_StimNo].type == 2) {
SetPage(PAGES::WHITE);
_pEct->SetMovieToShow(L"STOP");
}
if (++_StimNo < _StimInfoSet.size()) {
SetStimulus();
} else {
SetPage(PAGES::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 = Multi2Wide(_StimInfoSet[_StimNo].filename);
_pEct->SetMovieToShow(mov);
}
if (_StimInfoSet[_StimNo].csvfile[0] != '_') {
this->ReadCsv();
}
return true;
}
// 固定ページ表示
void Stimulus::SetPage(PAGES st) {
switch (st) {
case PAGES::OPENING:
_DispBuffer = cv::imread(OPENING_FILE);
_pEct->SetDispBuffer(_DispBuffer);
break;
case PAGES::CALIB:
_DispBuffer = cv::imread(CALIB_FILE);
_pEct->SetDispBuffer(_DispBuffer);
break;
case PAGES::CALIB_COMPLETE:
_DispBuffer = cv::imread(CALIB_COMPLETE_FILE);
_pEct->SetDispBuffer(_DispBuffer);
break;
case PAGES::CALIB_FAILED:
_DispBuffer = cv::imread(CALIB_FAILED_FILE);
_pEct->SetDispBuffer(_DispBuffer);
break;
case PAGES::WHITE:
_DispBuffer = cv::imread(WHITE_FILE);
_pEct->SetDispBuffer(_DispBuffer);
break;
case PAGES::START:
_StimNo = 0;
SetStimulus();
break;
case PAGES::STOP:
_StimNo = -1;
_DispBuffer = cv::imread(OPENING_FILE);
_pEct->SetDispBuffer(_DispBuffer);
break;
case PAGES::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 (_StimInfoSet[_StimNo].frame.size() > 0) return; // 読み込み済み
std::vector<std::vector<std::string>> table;
if (!ReadTable(_StimInfoSet[_StimNo].csvfile, table)) return;
if (table.size() < 2) return;
for (int r = 1; r < table.size(); r++) {
if (table[r].size() < 5) continue;
FrameInfo fi;
fi.time = (float)atof(table[r][0].c_str());
fi.target.push_back(TargetInfo(
(float)atof(table[r][1].c_str()),
(float)atof(table[r][2].c_str()), 10.F));
fi.target.push_back(TargetInfo(
(float)atof(table[r][3].c_str()),
(float)atof(table[r][4].c_str()), 10.F));
_StimInfoSet[_StimNo].frame.push_back(fi);
}
DebugPrintf(_T("CSV file '%s' - %d frames read.\n"),
Multi2Wide(_StimInfoSet[_StimNo].csvfile).c_str(),
_StimInfoSet[_StimNo].frame.size());
}