Newer
Older
PrismSoftware / ECTrainer2 / ECTrainer.h
#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());
	}
};