#include "ECTrainer.h"
#include "ECTrainerGUI.h"
#include "SceneCamera.h"
#include "Stimulus.h"
#include "Marker.h"
#include "ImageProc.h"
#include "EyeTrack.h"
#include "TobiiREST.h"
#include "BitalMonitor.h"
#include "Worker.h"
#include "KeepAlive.h"
// コンストラクタ
ECTrainer::ECTrainer(HINSTANCE hInstance)
: _AppRunning(true)
//, _CalibResult(0)
, _hInstance(hInstance)
{
_pMarker = new Marker();
_pProcs[GUI] = new ECTrainerGUI(this);
_pProcs[IMGPROC] = new ImageProc(this);
_pProcs[SCNCAM] = new SceneCamera(this);
_pProcs[STIM] = new Stimulus(this, _pMarker);
_pProcs[ALIVE] = new KeepAlive(this);
_pProcs[EYETR] = new EyeTrack(this);
_pProcs[REST] = new TobiiREST(this);
_pProcs[BITAL] = new BitalMonitor(this);
_pProcs[WORKER] = new Worker(this);
_MovieToShow = _T("");
}
// デストラクタ
ECTrainer::~ECTrainer() {
for (int i = 0; i < PROC::NUM; i++) {
if (_pProcs[i]) delete _pProcs[i];
}
}
// 初期化
bool ECTrainer::Process() {
// プロセス初期化
if (!((ECTrainerGUI*)_pProcs[GUI])->Init(_hInstance)) return false;
for (int i = 0; i < PROC::NUM - 1; i++) {
if (!_pProcs[i]->Init()) return false;
}
// スレッド開始
const int N_THREADS = PROC::NUM - 1; // GUIはメインスレッドで実行するので -1
DWORD thIds[N_THREADS];
HANDLE thHandles[N_THREADS];
for (int i = 0; i < N_THREADS; i++) {
thHandles[i] = CreateThread(NULL, 0, ThreadEntry, _pProcs[i], 0, &thIds[i]);
}
_pProcs[GUI]->MainLoop();
// スレッド終了
DWORD timeOut = 1000; // タイムアウト(ms)
if (WaitForMultipleObjects(N_THREADS, thHandles, TRUE, timeOut) != WAIT_TIMEOUT) {
OutputDebugString(_T("All threads stopped sccessfully.\n"));
} else {
OutputDebugString(_T("Waiting threads stop timeout.\n"));
}
for (int i = 0; i < N_THREADS; i++) {
if (thHandles[i]) CloseHandle(thHandles[i]);
}
return true;
}
//// 刺激画像バッファに画像を設定
//void ECTrainer::SetDispBuffer(cv::Mat& img) {
// ((ECTrainerGUI*)_pProcs[GUI])->SetDispBuffer(img);
//}
// 共通スレッド開始点
DWORD WINAPI ECTrainer::ThreadEntry(LPVOID lpParameter) {
((BaseProcess*)lpParameter)->MainLoop();
return 0;
}