#include "ECTrainer.h"
#include "TobiiREST.h"
#include "ECTrainerGUI.h"
#include "myWinUtils.h"
// コンストラクタ
TobiiREST::TobiiREST(ECTrainer* pEct)
:BaseProcess(pEct)
, _CalibTrigger(false)
, _CalibStatus(CALIB_STATUS::NONE)
, _BatteryLevel(999) {
}
// 初期化
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() がマルチバイト文字列なので使えない
#ifdef NDEBUG
::MessageBox(_pEct->PECTrainerGUI()->GetMainHWnd(), _T("Can't connect Tobii Device."), _T("Error"), 0);
#else
mwut::DebugPrintf(_T("Error in TobiiREST::Init()\n"));
#endif
return false;
}
}
// ループ
bool TobiiREST::MainLoop() {
DWORD lastBatteryQuery = 0;
while (_pEct->IsAppRun()) {
// キャリブレーション
if (_CalibTrigger) {
_CalibTrigger = false;
if (StartCalib()) {
QueryCalibResult();
}
}
// バッテリー情報取得
DWORD cTime = timeGetTime();
if (cTime - lastBatteryQuery > BATTERY_QUERY_INTERVAL) {
lastBatteryQuery = cTime;
QueryBatteryLevel();
}
Sleep(1);
}
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);
if (status == _T("failed")) {
_CalibStatus = CALIB_STATUS::FAIL;
mwut::DebugPrintf(_T("Calibration failed\n"));
} else {
_CalibStatus = CALIB_STATUS::DONE;
mwut::DebugPrintf(_T("Calibration successful\n"));
}
#else
_CalibStatus = CALIB_STATUS::DONE;
mwut::DebugPrintf(_T("Calibration skipped\n"));
#endif
return true;
}
catch (const std::exception & e)
{
UNREFERENCED_PARAMETER(e); // e.what() がマルチバイト文字列なので使えない
_CalibStatus = CALIB_STATUS::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;
}
}