#include "ECTrainer.h"
#include "ECTrainerGUI.h"
#include "SceneCamera.h"
#include "Stimulus.h"
#include "Marker.h"
#include "ImageProc.h"
#ifdef _DEBUG
#include <iostream>
#endif
// コンストラクタ
ECTrainer::ECTrainer()
: _pGui(NULL)
, _pSceneCam(NULL)
, _pStimulus(NULL)
, _pMarker(NULL)
, _pImageProc(NULL)
, _Running(true)
, _HomographyOK(false)
{
_pMarker = new Marker();
_pGui = new ECTrainerGUI(this);
_pImageProc = new ImageProc(this, _pMarker);
_pSceneCam = new SceneCamera(this, _pImageProc);
_pStimulus = new Stimulus(this, _pMarker);
}
// デストラクタ
ECTrainer::~ECTrainer() {
if (_pGui) delete _pGui;
if (_pSceneCam) delete _pSceneCam;
if (_pStimulus) delete _pStimulus;
if (_pMarker) delete _pMarker;
if (_pImageProc) delete _pImageProc;
}
// 初期化
bool ECTrainer::Process() {
if (!_pGui->Init()) return false;
if (!_pSceneCam->Init()) return false;
if (!_pStimulus->Init()) return false;
if (!_pImageProc->Init()) return false;
DWORD dwThreadIdSceneCam, dwThreadIdStimulus, dwThreadIdImageProc;
HANDLE hThreadSceneCam = CreateThread(NULL, 0, SceneCamThreadEntry, this, 0, &dwThreadIdSceneCam);
HANDLE hThreadStimulus = CreateThread(NULL, 0, StimulusThreadEntry, this, 0, &dwThreadIdStimulus);
HANDLE hThreadImageProc = CreateThread(NULL, 0, ImageProcThreadEntry, this, 0, &dwThreadIdImageProc);
_pGui->MainLoop();
HANDLE handles[] = { hThreadSceneCam , hThreadStimulus, hThreadImageProc };
DWORD timeOut = 1000; // タイムアウト(ms)
if (WaitForMultipleObjects(sizeof(handles) / sizeof(HANDLE), handles, TRUE, timeOut) != WAIT_TIMEOUT) {
#ifdef _DEBUG
std::cout << "All threads properly ended." << std::endl;
#endif
}
if (hThreadSceneCam) CloseHandle(hThreadSceneCam);
if (hThreadStimulus) CloseHandle(hThreadStimulus);
if (hThreadImageProc) CloseHandle(hThreadImageProc);
return true;
}
// キャリブレーション
void ECTrainer::Calib() {
_pStimulus->StartCalib();
}
// 開始
void ECTrainer::Start() {
_pStimulus->StartImage();
}
// 視野画像バッファに画像を設定
void ECTrainer::SetSceneBuffer(cv::Mat& img) {
_pGui->SetSceneBuffer(img);
}
// 刺激画像バッファに画像を設定
void ECTrainer::SetDispBuffer(cv::Mat& img) {
_pGui->SetDispBuffer(img);
}
// 視野カメラスレッド開始点
DWORD WINAPI ECTrainer::SceneCamThreadEntry(LPVOID lpParameter) {
((ECTrainer*)lpParameter)->_pSceneCam->MainLoop();
return 0;
}
// 刺激画像スレッド開始点
DWORD WINAPI ECTrainer::StimulusThreadEntry(LPVOID lpParameter) {
((ECTrainer*)lpParameter)->_pStimulus->MainLoop();
return 0;
}
// 画像処理スレッド開始点
DWORD WINAPI ECTrainer::ImageProcThreadEntry(LPVOID lpParameter) {
((ECTrainer*)lpParameter)->_pImageProc->MainLoop();
return 0;
}