#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"
#include "DShowMovie.h"
#include "myWinUtils.h"
// コンストラクタ
ECTrainer::ECTrainer(HINSTANCE hInstance)
{
_pProcs[(int)PROC::GUI] = new ECTrainerGUI(this);
_pProcs[(int)PROC::IMGPROC] = new ImageProc(this);
_pProcs[(int)PROC::SCNCAM] = new SceneCamera(this);
_pProcs[(int)PROC::STIM] = new Stimulus(this);
_pProcs[(int)PROC::ALIVE] = new KeepAlive(this);
_pProcs[(int)PROC::EYETR] = new EyeTrack(this);
_pProcs[(int)PROC::REST] = new TobiiREST(this);
_pProcs[(int)PROC::BITAL] = new BitalMonitor(this);
_pProcs[(int)PROC::WORKER] = new Worker(this);
_pMarker = new Marker();
_pDSMovie = new DShowMovie(hInstance);
}
// デストラクタ
ECTrainer::~ECTrainer() {
for (int i = 0; i < (int)PROC::NUM; i++) {
if (_pProcs[i]) delete _pProcs[i];
}
}
// 初期化
bool ECTrainer::Process() {
// プロセス初期化
for (int i = 0; i < (int)PROC::NUM; i++) {
if (!_pProcs[i]->Init()) return false;
//mwut::DebugPrintf(_T("Thread %d initialized.\n"), i);
}
// スレッド開始
for (int i = 0; i < (int)PROC::NUM; i++) {
if (i != (int)PROC::GUI) _pProcs[i]->Launch();
//mwut::DebugPrintf(_T("Thread %d start.\n"), i);
}
_pProcs[(int)PROC::GUI]->MainLoop();
// スレッド終了
for (int i = (int)PROC::REST; i < (int)PROC::NUM; i++) {
auto rv = _pProcs[i]->WaitForExit();
//mwut::DebugPrintf(_T("Process %d exit %s\n"), i, rv ? _T("ok") : _T("ng"));
}
return true;
}
// アプリケーションを停止
void ECTrainer::StopApp() {
for (int i = 0; i < (int)PROC::NUM; i++) _pProcs[i]->PostMsg(ECTMSG::QUIT);
}
// メッセージボックス表示
void ECTrainer::MsgBox(LPCWSTR msg, UINT icon) {
::MessageBox(PECTrainerGUI()->GetMainHWnd(), msg,
_T("Eye Communication Trainer"), MB_OK | icon);
}