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

// コンストラクタ
TobiiREST::TobiiREST(ECTrainer* pEct)
	:BaseProcess(pEct), _Start(false) {

}

// 初期化
bool TobiiREST::Init() {
	try
	{
		json::value json = REST_Handler::POST_Request(SERVER _T("/api/projects")).extract_json().get();
		_ProjectID = json[_T("pr_id")].as_string();
		std::wcout << "prId=" << _ProjectID << std::endl;

		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();
		std::wcout << "paId=" << _ParticipantID << std::endl;

		return true;
	}
	catch (const std::exception & e)
	{
		std::cout << "Error " << e.what() << std::endl;
		return false;
	}
}

// ループ
bool TobiiREST::MainLoop() {
	while (_pEct->IsAppRun()) {
		if (_Start) {
			_Start = false;
			if (StartCalibration()) {
				int res = GetCalibResult();
				if (res != 0) _pEct->SetCalibResult(res);
			}
		}
		Sleep(1);
	}
	return true;
}

// キャリブレーション開始
bool TobiiREST::StartCalibration() {
	try
	{
		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();
		std::wcout << "caId=" << _CalibrationID << std::endl;

		std::wstring url = SERVER _T("/api/calibrations/") + _CalibrationID + _T("/start");
		json = REST_Handler::POST_Request(url.c_str()).extract_json().get();
		std::wcout << "Calibration start" << std::endl;
		return true;
	}
	catch (const std::exception& e)
	{
		std::cout << "Error " << e.what() << std::endl;
		return false;
	}
}

// GetCalibResult
// 戻り値 -1:エラー 0:失敗 1:成功
int TobiiREST::GetCalibResult() {
	try
	{
		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);
		if (status == _T("failed")) {
			std::wcout << _T("Calibration failed.") << std::endl;
			return -1;
		}
		std::wcout << _T("Calibration successful.") << std::endl;
		return 1;
	}
	catch (const std::exception & e)
	{
		std::cout << "Error " << e.what() << std::endl;

		return 0;
	}
}

// バッテリー残量取得
int TobiiREST::BatteryLevel() {
	try	{
		std::wstring url = SERVER _T("/api/system/status");
		auto response = REST_Handler::GET_Request(url.c_str());
		json::value json = response.extract_json().get();
		return json[L"sys_battery"][L"level"].as_integer();

	} catch (const std::exception & e) {
		std::cout << "Error " << e.what() << std::endl;
		return 0;
	}
}