#pragma once
#include <Windows.h>
#include "myOpenCV.h"
#define ADDR "192.168.71.50"
class BaseProcess;
class ECTrainerGUI;
class ImageProc;
class SceneCamera;
class Stimulus;
class EyeTrack;
class TobiiREST;
class BitalMonitor;
class Worker;
class Marker;
class ECTrainer
{
private:
enum PROC { GUI, IMGPROC, SCNCAM, STIM, EYETR, REST, BITAL, WORKER, NUM };
BaseProcess* _pProcs[PROC::NUM];
HINSTANCE _hInstance;
Marker* _pMarker;
bool _AppRunning; // 実行中フラグ
bool _HomographyOK; // 変換行列の獲得有無
int _CalibResult; // キャリブレーション結果 0:未実施 1:成功 -1:失敗
cv::Size _SceneSize; // 視界カメラの画像サイズ
std::wstring _MovieToShow; // 再生する動画ファイル
// スレッド開始点
static DWORD WINAPI ThreadEntry(LPVOID lpParameter);
static DWORD WINAPI KeepAliveThreadEntry(LPVOID lpParameter);
public:
static const int RINGBUFSIZE = 4;
ECTrainer(HINSTANCE hInstance);
~ECTrainer();
ECTrainerGUI* PECTrainerGUI() { return (ECTrainerGUI*)_pProcs[GUI]; }
ImageProc* PImageProc() { return (ImageProc*)_pProcs[IMGPROC]; }
SceneCamera* PSceneCamera() { return (SceneCamera*)_pProcs[SCNCAM]; }
Stimulus* PStimulus() { return (Stimulus*)_pProcs[STIM]; }
EyeTrack* PEyeTrack() { return (EyeTrack*)_pProcs[EYETR]; }
TobiiREST* PTobiiREST() { return (TobiiREST*)_pProcs[REST]; }
BitalMonitor* PBitalMonitor() { return (BitalMonitor*)_pProcs[BITAL]; }
Worker* PWorker() { return (Worker*)_pProcs[WORKER]; }
Marker* PMarker() { return _pMarker; }
bool Process();
void CalibStart();
int CheckCalibResult();
void StartStim();
void StopStim();
void NextStim();
void SetSceneBuffer(cv::Mat& img);
void SetDispBuffer(cv::Mat& img);
void SetGazeV(cv::Point gazeV);
int BatteryLevel();
cv::Point GetGazeV();
cv::Point2f GetGazeI();
cv::Point2f GetEyeR();
cv::Point2f GetEyeL();
// インライン関数
bool IsAppRun() { return _AppRunning; } // アプリケーション実行中かどうか
void StopApp() { _AppRunning = false; } // アプリケーションを停止
void SetHomographyStatus(bool ok) { _HomographyOK = ok; }
bool GetHomographyStatus() { return _HomographyOK; }
void SetSceneSize(cv::Size s) { _SceneSize = s; }
cv::Size GetSceneSize() { return _SceneSize; }
void SetCalibResult(int result) { _CalibResult = result; }
void SetMovieToShow(std::wstring file) { _MovieToShow = file; }
std::wstring GetMovieToShow() { return _MovieToShow; }
};