#pragma once
#include <Windows.h>
#include <tchar.h>
#include <string>
#include "myOpenCV.h"
#define ADDR "192.168.71.50"
class ECTrainerGUI;
class SceneCamera;
class Stimulus;
class Marker;
class ImageProc;
class EyeTrack;
class TobiiREST;
class ECTrainer
{
private:
HINSTANCE _hInstance;
ECTrainerGUI* _pGui;
SceneCamera* _pSceneCam;
Stimulus* _pStimulus;
Marker* _pMarker;
ImageProc* _pImageProc;
EyeTrack* _pEyeTrack;
TobiiREST* _pTobiiREST;
bool _Running; // 実行中フラグ
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:
ECTrainer(HINSTANCE hInstance);
~ECTrainer();
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 IsRunning() { return _Running; }
void Stop() { _Running = 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; }
static std::wstring Multi2Wide(std::string const& src)
{
//std::size_t converted{};
//std::vector<wchar_t> dest(src.size(), L'\0');
//if (::_mbstowcs_s_l(&converted, dest.data(), dest.size(), src.data(), _TRUNCATE, ::_create_locale(LC_ALL, "jpn")) != 0) {
// throw std::system_error{ errno, std::system_category() };
//}
//dest.resize(std::char_traits<wchar_t>::length(dest.data()));
//dest.shrink_to_fit();
//return std::wstring(dest.begin(), dest.end());
auto const dest_size = ::MultiByteToWideChar(CP_ACP, 0U, src.data(), -1, nullptr, 0U);
std::vector<wchar_t> dest(dest_size, L'\0');
if (::MultiByteToWideChar(CP_ACP, 0U, src.data(), -1, dest.data(), dest.size()) == 0) {
throw std::system_error{ static_cast<int>(::GetLastError()), std::system_category() };
}
dest.resize(std::char_traits<wchar_t>::length(dest.data()));
dest.shrink_to_fit();
return std::wstring(dest.begin(), dest.end());
}
};