Newer
Older
PrismSoftware / ECTrainer2 / TobiiREST.cpp
#include "ECTrainer.h"
#include "TobiiREST.h"
#include "ECTrainerGUI.h"
#include "Worker.h"
#include "myWinUtils.h"

// コンストラクタ
TobiiREST::TobiiREST(ECTrainer* pEct) : BaseProcess(pEct)
	, _BatteryLevel(999) 
	, _lastBatteryQuery(0)
{
}

// 初期化
bool TobiiREST::Init() {
	try
	{
#if defined(EYEDEVICE_GLASS2)
		// Project ID取得
		json::value json = REST_Handler::POST_Request(SERVER _T("/api/projects")).extract_json().get();
		_ProjectID = json[_T("pr_id")].as_string();
		mwut::DebugPrintf(_T("Tobii Project ID : %s\n"), _ProjectID.c_str());
		
		// Participant ID取得
		json::value postData;
		postData[L"pa_project"] = json::value::string(_ProjectID);
		json = REST_Handler::POST_Request(SERVER _T("/api/participants"), postData).extract_json().get();
		_ParticipantID = json[_T("pa_id")].as_string();
		mwut::DebugPrintf(_T("Tobii Prarticipant ID : %s\n"), _ParticipantID.c_str());
#endif

		return true;
	}
	catch (const std::exception & e)
	{
		UNREFERENCED_PARAMETER(e);	// e.what() がマルチバイト文字列なので使えない
		_pEct->PWorker()->EventLog(_T("Can't connect Tobii Device."));
		_pEct->MsgBox(_T("Can't connect Tobii Device."), MB_ICONERROR);
		return false;
	}
}

// 基本処理
bool TobiiREST::Routine() {

	// バッテリー情報取得
	DWORD cTime = timeGetTime();
	if (cTime - _lastBatteryQuery > BATTERY_QUERY_INTERVAL) {
		_lastBatteryQuery = cTime;
		QueryBatteryLevel();
	}

	Sleep(30);

	return true;
}

// イベント処理
bool TobiiREST::EventProc(MSG& msg) {
	switch (msg.message) {
	case (int)ECTMSG::CALIB_START:	// キャリブレーション
		if (StartCalib()) {
			QueryCalibResult();
		} else {
			((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::CALIB_ERR);
		}
		break;
	}
	return true;
}

// キャリブレーション開始
bool TobiiREST::StartCalib() {
	try
	{
#if defined(EYEDEVICE_GLASS2)
		// Calibration ID取得
		json::value postData;
		postData[L"ca_project"] = json::value::string(_ProjectID);
		postData[L"ca_type"] = json::value::string(L"default");
		postData[L"ca_participant"] = json::value::string(_ParticipantID);
		json::value json = REST_Handler::POST_Request(SERVER _T("/api/calibrations"), postData).extract_json().get();
		_CalibrationID = json[_T("ca_id")].as_string();
		mwut::DebugPrintf(_T("Tobii Calibration ID : %s\n"), _CalibrationID.c_str());

		// Calibration開始
		std::wstring url = SERVER _T("/api/calibrations/") + _CalibrationID + _T("/start");
		json = REST_Handler::POST_Request(url.c_str()).extract_json().get();
		mwut::DebugPrintf(_T("Calibration start\n"));
#endif
		return true;
	}
	catch (const std::exception& e)
	{
		UNREFERENCED_PARAMETER(e);	// e.what() がマルチバイト文字列なので使えない
		mwut::DebugPrintf(_T("Error in TobiiREST::StartCalib()\n"));
		return false;
	}
}

// GetCalibResult
// 戻り値 -1:エラー 0:失敗 1:成功
bool TobiiREST::QueryCalibResult() {
	try
	{
#if defined(EYEDEVICE_GLASS2)
		std::wstring url = SERVER _T("/api/calibrations/") + _CalibrationID + _T("/status");
		std::vector<std::wstring> values;
		values.push_back(_T("failed"));
		values.push_back(_T("calibrated"));
		std::wstring status = REST_Handler::WaitForStatus(url.c_str(), _T("ca_state"), values);
#else
		::Sleep(1000);
		std::wstring status = _T("calibrated");
#endif
		if (status == _T("failed")) {
			((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::CALIB_FAILED);
		} else {
			((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::CALIB_OK);
		}
		return true;
	}
	catch (const std::exception & e)
	{
		UNREFERENCED_PARAMETER(e);	// e.what() がマルチバイト文字列なので使えない
		((BaseProcess*)_pEct->PWorker())->PostMsg(ECTMSG::CALIB_ERR);
		mwut::DebugPrintf(_T("Error in TobiiREST::QueryCalibResult()\n"));
		return false;
	}
}

// バッテリー残量取得
bool TobiiREST::QueryBatteryLevel() {
	try	{
#if defined(EYEDEVICE_GLASS2)
		std::wstring url = SERVER _T("/api/system/status");
		auto response = REST_Handler::GET_Request(url.c_str());
		json::value json = response.extract_json().get();
		_BatteryLevel = json[L"sys_battery"][L"level"].as_integer();
#elif defined(EYEDEVICE_NONE)
		_BatteryLevel = 999;
#endif
		return true;
	} catch (const std::exception & e) {
		UNREFERENCED_PARAMETER(e);	// e.what() がマルチバイト文字列なので使えない
		mwut::DebugPrintf(_T("Error in TobiiREST::QueryBatteryLevel()\n"));
		return false;
	}
}