Newer
Older
PrismSoftware / ECTrainer2 / Worker.cpp
//#include "common.h"
#include "Worker.h"
#include "ECTrainer.h"
#include "EyeTrack.h"
#include "Stimulus.h"
#include "BitalMonitor.h"
#include "Marker.h"
#include "myWinUtils.h"

// コンストラクタ
Worker::Worker(ECTrainer* pEct) : BaseProcess(pEct)
	, _AppStatus(APP_STATUS::BOOT)
	, _fpLog(NULL)
	, _pTimer(NULL)
{

}

// デストラクタ
Worker::~Worker() {
	if (_fpLog) fclose(_fpLog);
	mwut::SafeDelete((void**)&_pTimer);
}

bool Worker::Init() {
	if (_tfopen_s(&_fpLog, LOG_FILENAME.c_str(), _T("w")) != 0) {
		_pEct->MsgBox(_T("Can't open log file."), MB_ICONERROR);
		return false;
	}
	_ftprintf(_fpLog, _T("time,gazeVx,gazeVy,H11,H12,H13,H21,H22,H23,H31,H32,H33,RR\n"));

	_AppStatus = APP_STATUS::IDLE;
	_pTimer = new mwut::HPTimer();

	return true;
}

// 基本処理
bool Worker::Routine() {

	// 視線情報更新を待つ
	Sleep(0);
	if (!_pEct->PEyeTrack()->IsNewGazeV()) return true;

	this->WriteLog();

	return true;
}

// イベント処理
bool Worker::EventProc(MSG& msg) {
	switch (msg.message) {
	case (int)ECTMSG::CALIB_START:
		if (_AppStatus == APP_STATUS::IDLE) {
			_pEct->PStimulus()->SetPage(STIM_PAGE::CALIB);
			((BaseProcess*)_pEct->PTobiiREST())->Tell(ECTMSG::CALIB_START);
			_AppStatus = APP_STATUS::CALIB;
			this->WriteLog(_T("Calibration start."));
		}
		break;

	case (int)ECTMSG::CALIB_END:
		if (msg.wParam == (int)CALIB_STATUS::DONE) {
			_pEct->PStimulus()->SetPage(STIM_PAGE::CALIB_COMPLETE);
			this->WriteLog(_T("Calibration complete."));
		} else {
			_pEct->PStimulus()->SetPage(STIM_PAGE::CALIB_FAILED);
			this->WriteLog(_T("Calibration failed."));
		}
		_AppStatus = APP_STATUS::IDLE;
		break;
	}
	return true;
}

// タスク開始
bool Worker::StartStim() {
	if (_AppStatus != APP_STATUS::IDLE) return false;
	_AppStatus = APP_STATUS::EXEC;
	_pEct->PStimulus()->SetPage(STIM_PAGE::START);
	return true;
}

// タスク停止
bool Worker::StopStim() {
	if (_AppStatus != APP_STATUS::EXEC) return false;
	_pEct->PStimulus()->SetPage(STIM_PAGE::STOP);
	_AppStatus = APP_STATUS::IDLE;
	return true;
}

// ログ出力
void Worker::WriteLog(const TCHAR* msg) {
	_mtxLog.lock();

	_ftprintf(_fpLog, _T("%.1f"), _pTimer->Elapse());

	if (msg) {
		_ftprintf(_fpLog, msg);
	} else {
		cv::Point2f gazeV = (_pEct->PEyeTrack()->GetGazeV());
		_ftprintf(_fpLog, _T(",%.1f,%.1f"), gazeV.x, gazeV.y);
		cv::Mat h = _pEct->PMarker()->GetHomography();
		if (!h.empty() && h.rows == 3 && h.cols == 3) {
			double* ptr = h.ptr<double>(0);
			for (int i = 0; i < 9; i++) {
				_ftprintf(_fpLog, _T(",%lf"), *(ptr + i));
			}
		}
		
		_ftprintf(_fpLog, _T(",%d"), _pEct->PBitalMonitor()->GetRR());
		_ftprintf(_fpLog, _T("\n"));
	}

	_mtxLog.unlock();
}