#include "common.h"
Worker::Worker(ECTrainer* pEct)
: BaseProcess(pEct)
, _AppStatus(APP_STATUS::BOOT)
, _fpLog(NULL)
, _StartTime(0) {
}
bool Worker::Init() {
if (_tfopen_s(&_fpLog, LOG_FILENAME.c_str(), _T("w")) != 0) {
::MessageBox(_pEct->PECTrainerGUI()->GetMainHWnd(), _T("Can't open log file."), _T("Error"), 0);
return false;
}
_ftprintf(_fpLog, _T("time,gazeVx,gazeVy,H11,H12,H13,H21,H22,H23,H31,H32,H33,RR\n"));
return true;
}
bool Worker::MainLoop() {
_AppStatus = APP_STATUS::IDLE;
_StartTime = cv::getTickCount();
while (_pEct->IsAppRun()) {
// 視線情報更新を待つ
Sleep(0);
if (!_pEct->PEyeTrack()->IsNewGazeV()) continue;
// 状態更新
if (_AppStatus == APP_STATUS::CALIB) {
switch (_pEct->PTobiiREST()->GetCalibStatus()) {
case CALIB_STATUS::DONE:
_pEct->PStimulus()->SetPage(STIM_PAGE::CALIB_COMPLETE);
this->WriteLog(_T("Calibration complete."));
_AppStatus = APP_STATUS::IDLE;
break;
case CALIB_STATUS::FAIL:
case CALIB_STATUS::ERR:
_pEct->PStimulus()->SetPage(STIM_PAGE::CALIB_FAILED);
this->WriteLog(_T("Calibration failed."));
_AppStatus = APP_STATUS::IDLE;
break;
}
}
this->WriteLog();
}
fclose(_fpLog);
return true;
}
// キャリブレーション開始
bool Worker::StartCalibration() {
if (_AppStatus != APP_STATUS::IDLE) return false;
_pEct->PStimulus()->SetPage(STIM_PAGE::CALIB);
_pEct->PTobiiREST()->StartCalibration();
_AppStatus = APP_STATUS::CALIB;
this->WriteLog(_T("Calibration start."));
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();
auto elapse = (cv::getTickCount() - _StartTime) * 1000. / cv::getTickFrequency();
_ftprintf(_fpLog, _T("%.1f"), 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();
}