Newer
Older
PrismSoftware / ECTrainer2 / Worker.h
#pragma once

#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#include "nkcOpenCV.h"
#include "RingBuffer.h"
#include "HPTimer.h"
#include "Logger.h"


class BaseProcess;
class ECTrainer;
enum class APP_STATUS;

// ワーカークラス
// アプリケーションの状態管理
// アイコンタクト判定
// ログ出力
class Worker : public BaseProcess
{
	const TCHAR* SOUND_OK = _T("../voices/OK_S.wav");
	const TCHAR* SOUND_GOOD = _T("../voices/Good_S.wav");
	const TCHAR* SOUND_NICE = _T("../voices/Nice_S.wav");
	const TCHAR* SOUND_GREAT = _T("../voices/Great_S.wav");
	const TCHAR* SOUND_EXCELLENT = _T("../voices/Excellent_S.wav");
	const TCHAR* SOUND_GOOUT = _T("../voices/KbdKeyTap.wav");
	const int FEEDBACK_TIME = 3000;	// フィードバックの時間(1レベル)msec
	const int SHIFT_LOG_STARTTIME = 2000;	// 注視点ずれ記録開始時間
	const float TRAINING_LEVEL_EFFECT = 0.1F; // トレーニングレベルによる目標領域縮小量
	const float CALIB_ERROR_TOLERANCE = 150.F; // キャリブレーション誤差の許容値
	APP_STATUS _AppStatus;			// アプリケーション状態
	nkc::HPTimer* _pExpTimer;		// 実験経過タイマー
	nkc::HPTimer* _pContactTimer;	// 目標コンタクトタイマー
	//mwut::HPTimer* _pNohitTimer;	// 視線外れ時間
	double _ContactTime;			// コンタクト累積時間
	nkc::RingBuffer<cv::Mat> _TargetImage;	// ターゲット画像
	cv::Mat _StimImage;				// 刺激画像
	nkc::RingBuffer<cv::Mat> _FullScreenImage;	// 全画面用画像
	int _FBLevel;					// フィードバックレベル 1~5
	HANDLE _Trigger;				// 処理開始トリガ
	bool _EnableTrainLevel;			// トレーニングレベル機能の有効フラグ
	int _TrainingLevel;				// トレーニングレベル(高いほど難度UP)
	std::vector<cv::Point2f> _ShiftLog;	// 注視点のずれ記録
	std::vector<cv::Point2f> _ErrorLog;	// 注視点チェックのずれ記録
	float _Error;					// 注視点チェックのずれ量
	cv::Point2f _Shift;				// 注視点のずれ
	int _StartStage;				// 開始ステージ
	Logger _DataLog;				// データログ

	// ECTrainerインスタンス取得
	ECTrainer* Ect() { return (ECTrainer*)_pUserdata; }
	// 基本処理
	bool Routine();
	// イベント処理
	bool EventProc(MSG& msg);
	// 判定パラメータをリセット
	void ResetParams();
	//// データログファイルを開く
	//void OpenDataLog();
	//// データログファイルを開く
	//void CloseDataLog();
	// FPS表示
	void FPS(double fps);
	// 結果表示ソフト起動
	void LaunchResult();

public:
	// コンストラクタ
	Worker(ECTrainer* pEct);
	// デストラクタ
	~Worker();
	// 初期化
	bool Init();
	// アプリケーション状態の取得
	APP_STATUS GetAppStatus() { return _AppStatus; }
	// ターゲット画像取得
	cv::Mat GetTargetImg() { return _TargetImage.Get(); }
	// 全画面画像の更新状態
	bool IsNewFullScreenImg() { return _FullScreenImage.IsNew(); }
	// 全画面画像取得
	cv::Mat GetFullScreenImg() { return _FullScreenImage.Get(); }
	// イベントログ出力
	void EventLog(const TCHAR* msg);
	// コンタクト累積時間を取得
	double GetContactTime();
	// 実験経過時間を取得(msec)
	double GetExpTime();
	// トリガーセット
	void SetTrigger() { ::SetEvent(_Trigger); }
	// トレーニングレベルのポインタ
	int* TrainingLevelPtr() { return &_TrainingLevel; }
	// 開始ステージのポインタ
	int* StartStagePtr() { return &_StartStage; }
	// トレーニングレベル有効フラグのポインタ
	bool* EnableTrainLevelPtr() { return &_EnableTrainLevel; }
	// ずれ記録のクリア
	void ClearShift() { _ShiftLog.clear(); }
	// キャリブレーションチェックの判定
	bool IsCalibCheckOK();
	// 注視点のずれのリセット
	void ResetShift() { _Shift = cv::Point2f(0, 0); }
	// 注視点のずれを取得
	cv::Point2f GetShift() { return _Shift; }
	// キャリブレーション検証時の誤差を取得
	float GetSoftCalibError() { return _Error; }
};