Newer
Older
PrismSoftware / ECTrainer2 / ECTrainer.cpp

#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("Init done\n"));

	// スレッド開始
	for (int i = 0; i < (int)PROC::NUM; i++) {
		if (i != (int)PROC::GUI) _pProcs[i]->Launch();
	}
	mwut::DebugPrintf(_T("Threading done\n"));
	_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);
}