#ifndef MY_CALLBACK
#define MY_CALLBACK

#include <XnCppWrapper.h>
#include <iostream>

using namespace std;

// ユーザ検出
void XN_CALLBACK_TYPE UserDetected( xn::UserGenerator& generator, XnUserID nId, void* pCookie )
{
    std::cout << "ユーザ検出:" << nId << " " << generator.GetNumberOfUsers() << "人目" << std::endl;

    generator.GetSkeletonCap().RequestCalibration(nId, TRUE);
}

// ユーザ消失
void XN_CALLBACK_TYPE UserLost( xn::UserGenerator& generator, XnUserID nId, void* pCookie )
{
	
	cout << "ユーザID : " << nId  << "が消失しました" << endl;
}

//ポーズ検出
void XN_CALLBACK_TYPE PoseDetected(xn::PoseDetectionCapability& capability,const XnChar* strPose, XnUserID nId, void* pCookie)
{
	cout << "ポーズ検出 : " << strPose <<"ユーザ : " << nId << endl;

	xn::UserGenerator* user = (xn::UserGenerator*)pCookie;
	user->GetPoseDetectionCap().StopPoseDetection(nId);
	user->GetSkeletonCap().RequestCalibration(nId,TRUE);
}

//ポーズ消失
void XN_CALLBACK_TYPE PoseLost(xn::PoseDetectionCapability& capability,const XnChar* strPose, XnUserID nId, void* pCookie)
{
	cout << "ポーズ消失 : " << strPose <<"ユーザ : " << nId << endl;
}

// キャリブレーションの開始
void XN_CALLBACK_TYPE CalibrationStart(xn::SkeletonCapability& capability, XnUserID nId, void* pCookie)
{
	cout << "キャリブレーション開始．ユーザ : " << nId << endl;
}

// キャリブレーションの終了
void XN_CALLBACK_TYPE CalibrationEnd(xn::SkeletonCapability& capability, XnUserID nId, XnBool bSuccess, void* pCookie)
{
    // キャリブレーション成功
    if ( bSuccess ) {
        std::cout << "キャリブレーション成功。ユーザー:" << nId << std::endl;
        capability.StartTracking(nId);
    }
    // キャリブレーション失敗
    else {
        std::cout << "キャリブレーション失敗。ユーザー:" << nId << std::endl;
    }
}

void XN_CALLBACK_TYPE SessionStart(const XnPoint3D& pfocus, void* UserCxt)
{
	cout << "Session Start" << endl;
}

void XN_CALLBACK_TYPE SessionEnd( void* UserCxt)
{
	cout << "Session End" << endl;
}

void XN_CALLBACK_TYPE Wave( void* pUserCxt)
{
	cout << "WAVE" << endl;
}


#endif