#include "ECTrainer.h"
#include "TobiiREST.h"
#include "ECTrainerGUI.h"
#include "Worker.h"
#include "nkcWinUtils.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() がマルチバイト文字列なので使えない
Ect()->PWorker()->EventLog(_T("Can't connect Tobii Device."));
Ect()->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 {
Ect()->PWorker()->PostMsg((int)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() がマルチバイト文字列なので使えない
nkc::wut::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")) {
Ect()->PWorker()->PostMsg((int)ECTMSG::CALIB_FAILED);
} else {
Ect()->PWorker()->PostMsg((int)ECTMSG::CALIB_OK);
}
return true;
}
catch (const std::exception & e)
{
UNREFERENCED_PARAMETER(e); // e.what() がマルチバイト文字列なので使えない
Ect()->PWorker()->PostMsg((int)ECTMSG::CALIB_ERR);
nkc::wut::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() がマルチバイト文字列なので使えない
nkc::wut::DebugPrintf(_T("Error in TobiiREST::QueryBatteryLevel()\n"));
return false;
}
}