#pragma once
#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#include "nkcOpenCV.h"
#include "RingBuffer.h"
#include "HPTimer.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 char* DATA_LOG_FILE = "../log/%s_%s_%d.csv";
const TCHAR* EVENT_LOG_FILE = _T("../log/events.txt");
const int FEEDBACK_TIME = 3000; // フィードバックの時間(1レベル)msec
const int SHIFT_LOG_STARTTIME = 2000; // 注視点ずれ記録開始時間
const float TRAINING_LEVEL_EFFECT = 0.1F; // トレーニングレベルによる目標領域縮小量
APP_STATUS _AppStatus; // アプリケーション状態
FILE* _fpLogData; // データログファイルポインタ
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; // 注視点のずれ記録
cv::Point2f _Shift; // 注視点のずれ
int _StartStage; // 開始ステージ
// ECTrainerインスタンス取得
ECTrainer* Ect() { return (ECTrainer*)_pUserdata; }
// 基本処理
bool Routine();
// イベント処理
bool EventProc(MSG& msg);
// 判定パラメータをリセット
void ResetParams();
// データログファイルを開く
void OpenDataLog();
// データログファイルを開く
void CloseDataLog();
// FPS表示
void FPS(double fps);
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(); }
};