diff --git a/ECTrainer2/Logger.cpp b/ECTrainer2/Logger.cpp index 3bc47c9..08e6c39 100644 --- a/ECTrainer2/Logger.cpp +++ b/ECTrainer2/Logger.cpp @@ -1,6 +1,9 @@ #include "Logger.h" #include "nkcWinUtils.h" +const char* Logger::DATA_LOG_FILE = LOG_DIR "%s_%s_%d.csv"; +const TCHAR* Logger::EVENT_LOG_FILE = _T(LOG_DIR "events.txt"); + // コンストラクタ Logger::Logger() : _logFileName(_T("")) @@ -8,73 +11,66 @@ } -// ファイル出力(static) -bool Logger::Write(TCHAR* filename, TCHAR* msg) { +// ログを追記 +bool Logger::Append(const TCHAR* filename, const TCHAR* msg) { if (_tcslen(filename) < 1) return false; + FILE* fp = NULL; if (_tfopen_s(&fp, filename, _T("a")) != 0) { nkc::wut::DebugPrintf(_T("Can't open data log file.\n")); return false; } + _ftprintf(fp, msg); + + fclose(fp); + return true; } -// ログ開始 -void Logger::Start(std::string subject, int visit) { +// データログ開始 +void Logger::StartRecord(std::string subject, int visit) { + CreateDirectory(_T(LOG_DIR), NULL); _logFileName = nkc::wut::Multi2Wide( cv::format(DATA_LOG_FILE, nkc::wut::DateTimeStr().c_str(), subject, visit)); - nkc::wut::DebugPrintf(_T("Log file : %s\n"), _logFileName.c_str()); + nkc::wut::DebugPrintf(_T("Log start: %s\n"), _logFileName.c_str()); - FILE* fp; - if (_tfopen_s(&fp, _logFileName.c_str(), _T("w")) != 0) { - nkc::wut::DebugPrintf(_T("Can't open data log file.\n")); - return; - } + TCHAR msg[1024]; + _stprintf_s(msg, 1024, _T("time,stimNo,stimTime,gazeVx,gazeVy,shiftX,shiftY," + "gazeIx,gazeIy,target,contact time,Feedback,TrainLevel,RR,pupilR,pupilL," + "H11,H12,H13,H21,H22,H23,H31,H32,H33\n")); - // ヘッダ行 - _ftprintf(fp, _T("time,stimNo,stimTime,gazeVx,gazeVy,shiftX,shiftY," - "gazeIx,gazeIy,target,contact time,Feedback,TrainLevel,RR,pupilR,pupilL," - "H11,H12,H13,H21,H22,H23,H31,H32,H33\n")); - - fclose(fp); + Append(_logFileName.c_str(), msg); } -// ログ出力 -void Logger::Write(Record& r) { +// データログ出力 +void Logger::WriteRecord(Record& r) { - if (_logFileName.length() < 1) { - nkc::wut::DebugPrintf(_T("Log file is not set.\n")); - return; + double* ptr = r.H.ptr(0); + TCHAR msg[1024]; + _stprintf_s(msg, 1024, _T("%.3f,%d,%.3f,%.1f,%.1f,%.1f,%.1f" + ",%.1f,%.1f,%d,%.2f,%d,%d,%d,%.1f,%.1f,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf\n"), + r.ElapTime, r.StimNo, r.SceneTime, r.GazeV.x, r.GazeV.y, r.Shift.x, r.Shift.y, + r.GazeI.x, r.GazeI.y, r.Target, r.ContactTime, r.Feedback, r.TrainingLevel, + r.RR, r.PupilR, r.PupilL, *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3), *(ptr + 4), + *(ptr + 5), *(ptr + 6), *(ptr + 7), *(ptr + 8)); + + Append(_logFileName.c_str(), msg); +} + +// イベントログ出力 +void Logger::WriteEvent(const TCHAR* msg) { + CreateDirectory(_T(LOG_DIR), NULL); + + if (_tcslen(msg) < 1) { + Append(EVENT_LOG_FILE, _T("\n")); + } else { + std::wstring datestr = nkc::wut::Multi2Wide(nkc::wut::DateTimeStr()); + TCHAR msgOut[1024]; + _stprintf_s(msgOut, 1024, _T("%s %s\n"), datestr.c_str(), msg); + Append(EVENT_LOG_FILE, msgOut); + nkc::wut::DebugPrintf(msgOut); } - - FILE* fp = NULL; - if (_tfopen_s(&fp, _logFileName.c_str(), _T("a")) != 0) { - nkc::wut::DebugPrintf(_T("Can't open data log file.\n")); - return; - } - - _ftprintf(fp, _T("%.3f"), r.ElapTime); // 経過時間 - _ftprintf(fp, _T(",%d"), r.StimNo); // 刺激データ番号 - _ftprintf(fp, _T(",%.3f"), r.SceneTime); // 刺激提示の経過時間 - _ftprintf(fp, _T(",%.1f,%.1f"), r.GazeV.x, r.GazeV.y); // 注視点(視野カメラ座標) - _ftprintf(fp, _T(",%.1f,%.1f"), r.Shift.x, r.Shift.y); // ずれ - _ftprintf(fp, _T(",%.1f,%.1f"), r.GazeI.x, r.GazeI.y); // 注視点(画像座標) - _ftprintf(fp, _T(",%d"), r.Target); // ターゲット判定 - _ftprintf(fp, _T(",%.2f"), r.ContactTime); // 目標コンタクト時間 - _ftprintf(fp, _T(",%d"), r.Feedback); // フィードバック - _ftprintf(fp, _T(",%d"), r.TrainingLevel); // トレーニングレベル - _ftprintf(fp, _T(",%d"), r.RR); // バイタル出力(RR間隔) - _ftprintf(fp, _T(",%.1f,%.1f"), r.PupilR, r.PupilL); // 瞳孔径 - if (!r.H.empty() && r.H.rows == 3 && r.H.cols == 3) { // ホモグラフィ行列出力 - double* ptr = r.H.ptr(0); - for (int i = 0; i < 9; i++) { - _ftprintf(fp, _T(",%lf"), *(ptr + i)); - } - } - _ftprintf(fp, _T("\n")); - - fclose(fp); } // ログ停止 diff --git a/ECTrainer2/Logger.h b/ECTrainer2/Logger.h index 065c355..f22c0dc 100644 --- a/ECTrainer2/Logger.h +++ b/ECTrainer2/Logger.h @@ -25,15 +25,17 @@ // ログ記録クラス class Logger { - const char* DATA_LOG_FILE = LOG_DIR "%s_%s_%d.csv"; - const TCHAR* EVENT_LOG_FILE = _T(LOG_DIR "events.txt"); std::wstring _logFileName; + public: + static const char* DATA_LOG_FILE; + static const TCHAR* EVENT_LOG_FILE; Logger(); - static bool Write(TCHAR* filename, TCHAR* msg); - void Start(std::string subject, int visit); - void Write(Record& r); + static bool Append(const TCHAR* filename, const TCHAR* msg); + static void WriteEvent(const TCHAR* msg); + void StartRecord(std::string subject, int visit); + void WriteRecord(Record& r); void Stop(); }; diff --git a/ECTrainer2/Worker.cpp b/ECTrainer2/Worker.cpp index 98b3b31..a5f506f 100644 --- a/ECTrainer2/Worker.cpp +++ b/ECTrainer2/Worker.cpp @@ -150,7 +150,7 @@ r.PupilL = pd.l; r.PupilR = pd.r; r.H = Ect()->PMarker()->GetHomography(); // ホモグラフィ行列 - _DataLog.Write(r); + _DataLog.WriteRecord(r); } return true; @@ -199,7 +199,7 @@ case (int)ECTMSG::EXP_START: // 実験開始 if (_AppStatus == APP_STATUS::IDLE) { - _DataLog.Start(Ect()->Subject(), Ect()->Visit()); + _DataLog.StartRecord(Ect()->Subject(), Ect()->Visit()); this->EventLog(_T("Experiment Start")); _pExpTimer->Reset(); this->ResetParams(); @@ -210,7 +210,6 @@ case (int)ECTMSG::EXP_STOP: // 実験停止 if (_AppStatus == APP_STATUS::STIM) { - _DataLog.Stop(); _AppStatus = APP_STATUS::IDLE; Ect()->PStimulus()->PostMsg((int)ECTMSG::EXP_STOP); this->EventLog(_T("Experiment Stopped")); @@ -219,7 +218,6 @@ case (int)ECTMSG::EXP_END: // 実験終了 if (_AppStatus == APP_STATUS::STIM) { - _DataLog.Stop(); _AppStatus = APP_STATUS::IDLE; Ect()->PStimulus()->PostMsg((int)ECTMSG::EXP_END); this->EventLog(_T("Experiment Finished")); @@ -270,53 +268,27 @@ return true; } -//// データログファイルを開く -//void Worker::OpenDataLog() { -// this->CloseDataLog(); // 念のため閉じる -// -// auto filename = nkc::wut::Multi2Wide(cv::format(DATA_LOG_FILE, nkc::wut::DateTimeStr().c_str(), -// Ect()->Subject().c_str(), Ect()->Visit())); -// -// if (_tfopen_s(&_fpLogData, filename.c_str(), _T("w")) != 0) { -// Ect()->MsgBox(_T("Can't open data log file."), MB_ICONERROR); -// return; -// } -// -// // ヘッダ行 -// _ftprintf(_fpLogData, -// _T("time,stimNo,stimTime,gazeVx,gazeVy,shiftX,shiftY," -// "gazeIx,gazeIy,target,contact time,Feedback,TrainLevel,RR,pupilR,pupilL," -// "H11,H12,H13,H21,H22,H23,H31,H32,H33\n")); -//} -// -//// データログファイルを開く -//void Worker::CloseDataLog() { -// if (_fpLogData) { -// fclose(_fpLogData); -// _fpLogData = NULL; -// } -//} - // イベントログ出力 void Worker::EventLog(const TCHAR* msg) { + Logger::WriteEvent(msg); - CreateDirectory(_T(LOG_DIR), NULL); - FILE* fp = NULL; // イベントログファイルポインタ + //CreateDirectory(_T(LOG_DIR), NULL); + //FILE* fp = NULL; // イベントログファイルポインタ - if (_tfopen_s(&fp, _T("../log/events.txt"), _T("a")) != 0) { - Ect()->MsgBox(_T("Can't open event log file."), MB_ICONERROR); - return; - } + //if (_tfopen_s(&fp, _T("../log/events.txt"), _T("a")) != 0) { + // Ect()->MsgBox(_T("Can't open event log file."), MB_ICONERROR); + // return; + //} - if (_tcslen(msg) < 1) { - _ftprintf(fp, _T("\n")); - } else { - std::wstring datestr = nkc::wut::Multi2Wide(nkc::wut::DateTimeStr()); - _ftprintf(fp, _T("%s %s\n"), datestr.c_str(), msg); - nkc::wut::DebugPrintf(_T("%s %s\n"), datestr.c_str(), msg); - } + //if (_tcslen(msg) < 1) { + // _ftprintf(fp, _T("\n")); + //} else { + // std::wstring datestr = nkc::wut::Multi2Wide(nkc::wut::DateTimeStr()); + // _ftprintf(fp, _T("%s %s\n"), datestr.c_str(), msg); + // nkc::wut::DebugPrintf(_T("%s %s\n"), datestr.c_str(), msg); + //} - fclose(fp); + //fclose(fp); } // コンタクト累積時間を取得