00001 
00008 #include  "OpenNiDevice.h"
00009 #include  "tools++.h"
00010 
00011 
00012 using namespace jbxl;
00013 
00014 
00015 
00016 #ifdef  ENABLE_OPENNI
00017 
00018 
00019 
00020 COpenNiDevice::COpenNiDevice(void)
00021 {
00022     context      = NULL;
00023     image        = NULL;
00024     user         = NULL;
00025     depth        = NULL;
00026     player       = NULL;
00027 
00028     imageMD      = NULL;
00029     depthMD      = NULL;
00030     sceneMD      = NULL;
00031 
00032     m_enu_dev    = EnuDev_Unknown;
00033     m_has_camera = TRUE;
00034     m_err_mesg   = make_Buffer(LMESG);
00035 
00036     m_state      = NI_STATE_DETECT_STOPPED;
00037     m_xsize      = OPENNI_DEPTH_XSIZE;
00038     m_ysize      = OPENNI_DEPTH_YSIZE;
00039     m_nfps       = OPENNI_DEPTH_FPS;
00040 
00041     
00042     recorder     = NULL;
00043     skeleton     = NULL;
00044 
00045 
00046     usb_dev      = NULL;
00047     devPath      = NULL;
00048 
00049     userCallbacks   = NULL;
00050     poseCallbacks   = NULL;
00051     calibCallbacks  = NULL;
00052 
00053     memset(dUsers, 0, sizeof(XnUserID)*OPENNI_USERS_NUM);
00054 }
00055 
00056 
00057 
00058 BOOL  COpenNiDevice::init(BOOL use_image)
00059 {
00060     outputMode.nXRes = OPENNI_DEPTH_XSIZE; 
00061     outputMode.nYRes = OPENNI_DEPTH_YSIZE; 
00062     outputMode.nFPS  = OPENNI_DEPTH_FPS; 
00063 
00064     m_enu_dev = EnuDev_None;
00065 
00066     BOOL ret = create_Context();
00067     if (ret && use_image) create_Image();
00068     if (ret) ret = create_Depth();
00069     if (ret) m_enu_dev = EnuDev_PS1080;
00070 
00071     return ret;
00072 }
00073 
00074 
00075 
00076 BOOL  COpenNiDevice::init(char* fname, BOOL use_image)
00077 {
00078     m_enu_dev = EnuDev_None;
00079 
00080     if (fname==NULL) {
00081         copy_s2Buffer("COpenNiDevice::init ERROR: File name is NULL", &m_err_mesg);
00082         return FALSE;
00083     }
00084 
00085     
00086     BOOL ret = create_Context(fname);
00087     if (ret) ret = create_Player(TRUE);
00088     if (!ret) {
00089         copy_s2Buffer("COpenNiDevice::init ERROR: create error!!", &m_err_mesg);
00090         return FALSE;
00091     }
00092     
00093     
00094     xn::NodeInfoList nodeList;
00095     player->EnumerateNodes(nodeList);
00096 
00097     for (xn::NodeInfoList::Iterator node=nodeList.Begin(); node!=nodeList.End(); node++) {
00098         if ((*node).GetDescription().Type==XN_NODE_TYPE_IMAGE) {
00099             if (use_image) {
00100                 ret = create_Image(TRUE);
00101                 if (!ret) break;
00102             }
00103         }
00104         if ((*node).GetDescription().Type==XN_NODE_TYPE_DEPTH) {
00105             ret = create_Depth(TRUE);
00106             if (!ret) break;
00107         }
00108     }
00109 
00110     
00111     if (image!=NULL && use_image) {
00112         image->GetMapOutputMode(outputMode);
00113     }
00114     else if (depth!=NULL) {
00115         depth->GetMapOutputMode(outputMode);
00116     }
00117     else {
00118         copy_s2Buffer("COpenNiDevice::init ERROR: No Generators", &m_err_mesg);
00119         return FALSE;
00120     }
00121 
00122     m_enu_dev = EnuDev_OniFile;
00123     return TRUE;
00124 }
00125 
00126 
00127 
00128 void  COpenNiDevice::free(void)
00129 {
00130     clear_Tracking();
00131     clear_CallBacks();
00132     clear_Skeleton();
00133 
00134     delete_User();
00135     delete_Depth();
00136     delete_Image();
00137     delete_Player();
00138     delete_Context();
00139 
00140     free_Buffer(&m_err_mesg);
00141 }
00142 
00143 
00144 
00145 
00147 
00148 
00149 BOOL  COpenNiDevice::create_Context(char* fname)
00150 {
00151     if (context==NULL) {
00152         context = new xn::Context();
00153         if (context==NULL) {
00154             copy_s2Buffer("COpenNiDevice::create_Context ERROR: context is NULL", &m_err_mesg);
00155             return FALSE;
00156         }
00157     }
00158 
00159     XnStatus rc = context->Init();
00160     if (rc==XN_STATUS_OK && fname!=NULL) rc = context->OpenFileRecording(fname);
00161 
00162     if (rc!=XN_STATUS_OK) {
00163         copy_s2Buffer("COpenNiDevice::create_Context ERROR: ", &m_err_mesg);
00164         cat_s2Buffer (::xnGetStatusString(rc), &m_err_mesg);
00165         return FALSE;
00166     }
00167 
00168     return TRUE;
00169 }
00170 
00171 
00172 
00173 BOOL  COpenNiDevice::create_Image(BOOL easy)
00174 {
00175     if (!m_has_camera) return FALSE;
00176 
00177     if (context==NULL) {
00178         copy_s2Buffer("COpenNiDevice::create_Image ERROR: context is NULL", &m_err_mesg);
00179         return FALSE;
00180     }
00181 
00182     if (image==NULL) {
00183         image = new xn::ImageGenerator();
00184         if (image==NULL) {
00185             copy_s2Buffer("COpenNiDevice::create_Image ERROR: fail to create image generator", &m_err_mesg);
00186             m_has_camera = FALSE;
00187             return FALSE;
00188         }
00189     }
00190 
00191     XnStatus rc = XN_STATUS_ERROR;
00192     if (easy) {
00193         rc = context->FindExistingNode(XN_NODE_TYPE_IMAGE, *image);
00194     }
00195     else {
00196         rc = image->Create(*context);
00197         if (rc==XN_STATUS_OK) rc = image->StartGenerating();
00198         if (rc==XN_STATUS_OK) rc = image->SetMapOutputMode(outputMode); 
00199     }
00200 
00201     if (rc!=XN_STATUS_OK) {
00202         copy_s2Buffer("COpenNiDevice::create_Image ERROR: ", &m_err_mesg);
00203         cat_s2Buffer (::xnGetStatusString(rc), &m_err_mesg);
00204         delete_Image();
00205         return FALSE;
00206     }
00207 
00208     imageMD = new xn::ImageMetaData();
00209     
00210 
00211     return TRUE;
00212 }
00213 
00214 
00215 
00216 BOOL  COpenNiDevice::create_Depth(BOOL easy)
00217 {
00218     if (context==NULL) {
00219         copy_s2Buffer("COpenNiDevice::create_Depth ERROR: context is NULL", &m_err_mesg);
00220         return FALSE;
00221     }
00222 
00223     if (depth==NULL) {
00224         depth = new xn::DepthGenerator();
00225         if (depth==NULL) {
00226             copy_s2Buffer("COpenNiDevice::create_Depth ERROR: fail to create depth generator", &m_err_mesg);
00227             return FALSE;
00228         }
00229     }
00230 
00231     XnStatus rc = XN_STATUS_ERROR;
00232     if (easy) {
00233         rc = context->FindExistingNode(XN_NODE_TYPE_DEPTH, *depth);
00234     }
00235     else {
00236         rc = depth->Create(*context);
00237         if (rc==XN_STATUS_OK) rc = depth->StartGenerating();
00238         if (rc==XN_STATUS_OK) rc = depth->SetMapOutputMode(outputMode);
00239         if (rc==XN_STATUS_OK && image!=NULL) {
00240             rc = depth->GetAlternativeViewPointCap().SetViewPoint(*image);
00241             
00242 
00243 
00244 
00245 
00246         }
00247     }
00248     
00249     if (rc!=XN_STATUS_OK) {
00250         copy_s2Buffer("COpenNiDevice::create_Depth ERROR: ", &m_err_mesg);
00251         cat_s2Buffer (::xnGetStatusString(rc), &m_err_mesg);
00252         delete_Depth();
00253         return FALSE;
00254     }
00255 
00256     depthMD = new xn::DepthMetaData();
00257     
00258 
00259     return TRUE;
00260 }
00261 
00262 
00263 
00264 BOOL  COpenNiDevice::create_User(BOOL easy)
00265 {
00266     if (context==NULL) {
00267         copy_s2Buffer("COpenNiDevice::create_User ERROR: context is NULL", &m_err_mesg);
00268         return FALSE;
00269     }
00270 
00271     if (user==NULL) {
00272         user = new xn::UserGenerator();
00273         if (user==NULL) {
00274             copy_s2Buffer("COpenNiDevice::create_User ERROR: fail to create user generator", &m_err_mesg);
00275             return FALSE;
00276         }
00277     }
00278 
00279     XnStatus rc = XN_STATUS_ERROR;
00280     if (easy) {
00281         rc = context->FindExistingNode(XN_NODE_TYPE_USER, *user);
00282     }
00283     else {
00284         rc = user->Create(*context);
00285         if (rc==XN_STATUS_OK) rc = user->StartGenerating();
00286     }
00287 
00288     if (rc!=XN_STATUS_OK) {
00289         copy_s2Buffer("COpenNiDevice::create_User ERROR: ", &m_err_mesg);
00290         cat_s2Buffer (::xnGetStatusString(rc), &m_err_mesg);
00291         delete_User();
00292         return FALSE;
00293     }
00294 
00295     sceneMD = new xn::SceneMetaData();
00296     return TRUE;
00297 }
00298 
00299 
00300 
00301 BOOL  COpenNiDevice::create_Player(BOOL easy)
00302 {
00303     if (context==NULL) {
00304         copy_s2Buffer("COpenNiDevice::create_Player ERROR: context is NULL", &m_err_mesg);
00305         return FALSE;
00306     }   
00307 
00308     if (player==NULL) {
00309         player = new xn::Player();
00310         if (player==NULL) {
00311             copy_s2Buffer("COpenNiDevice::create_Player ERROR: fail to create player generator", &m_err_mesg);
00312             return FALSE;
00313         }
00314     }
00315 
00316     XnStatus rc = XN_STATUS_ERROR;
00317     if (easy) {
00318         rc = context->FindExistingNode(XN_NODE_TYPE_PLAYER, *player);
00319     }
00320     else {
00321         rc = player->Create(*context, "oni");
00322     }
00323     
00324     if (rc!=XN_STATUS_OK) {
00325         copy_s2Buffer("COpenNiDevice::create_Player EROR: ", &m_err_mesg);
00326         cat_s2Buffer (::xnGetStatusString(rc), &m_err_mesg);
00327         delete_Player();
00328         return FALSE;
00329     }
00330 
00331     return TRUE;
00332 }
00333 
00334 
00335 
00336 
00338 
00339 
00340 void  COpenNiDevice::delete_Context(void)
00341 {
00342     if (context!=NULL) {
00343         context->Release();
00344         delete(context);
00345     }
00346     context = NULL;
00347 }
00348 
00349 
00350 
00351 void  COpenNiDevice::delete_Image(void)
00352 {
00353     if (image!=NULL) {
00354         if (image->IsValid()) {
00355             if (image->IsGenerating()) image->StopGenerating();
00356         }
00357         image->Release();
00358         delete(image);
00359     }
00360     if (imageMD!=NULL) delete(imageMD);
00361 
00362     image   = NULL;
00363     imageMD = NULL;
00364 }
00365 
00366 
00367 
00368 void  COpenNiDevice::delete_Depth(void)
00369 {
00370     if (depth!=NULL) {
00371         if (depth->IsValid()) {
00372             if (depth->IsGenerating()) depth->StopGenerating();
00373         }
00374         depth->Release();
00375         delete(depth);
00376     }
00377     if (depthMD!=NULL) delete(depthMD);
00378 
00379     depth   = NULL;
00380     depthMD = NULL;
00381 }
00382 
00383 
00384 
00385 void  COpenNiDevice::delete_User(void)
00386 {
00387     if (user!=NULL) {
00388         if (user->IsValid()) {
00389             if (user->IsGenerating()) user->StopGenerating();
00390         }
00391         user->Release();
00392         delete(user);
00393     }
00394     if (sceneMD!=NULL) delete(sceneMD);
00395 
00396     user    = NULL;
00397     sceneMD = NULL;
00398 }
00399 
00400 
00401 
00402 void   COpenNiDevice::delete_Player(void)
00403 {
00404     if (player!=NULL) {
00405         player->Release();
00406         delete(player);
00407         player = NULL;  
00408     }   
00409 }
00410 
00411 
00412 
00413 
00415 
00416 
00417 BOOL  COpenNiDevice::setup_Tracking(int profile, double smooth)
00418 {
00419     if (user==NULL) {
00420         copy_s2Buffer("COpenNiDevice::setup_Tracking ERROR: user is NULL", &m_err_mesg);
00421         return FALSE;
00422     }
00423     if (!user->IsCapabilitySupported(XN_CAPABILITY_SKELETON)) {
00424         copy_s2Buffer("COpenNiDevice::setup_Tracking ERROR: not support skeleton", &m_err_mesg);
00425         return FALSE;
00426     }
00427 
00428     if (skeleton==NULL) {
00429         skeleton = new xn::SkeletonCapability(*user);
00430         if (skeleton==NULL) {
00431             copy_s2Buffer("COpenNiDevice::setup_Tracking ERROR: fail to make skeleton capability", &m_err_mesg);
00432             return FALSE;
00433         }
00434     }
00435 
00436     
00437     skeleton->SetSkeletonProfile((XnSkeletonProfile)profile);
00438     skeleton->SetSmoothing((XnFloat)smooth);
00439     
00440     return TRUE;
00441 }
00442 
00443 
00444 
00445 
00447 
00448 
00449 
00450 void  COpenNiDevice::clear_Skeleton(void)
00451 {
00452     if (skeleton!=NULL) delete(skeleton);
00453     skeleton = NULL;
00454 }
00455 
00456 
00457 
00458 void  COpenNiDevice::clear_Tracking(void)
00459 {
00460     if (user!=NULL) {
00461         nUsers = OPENNI_USERS_NUM;
00462         user->GetUsers(dUsers, nUsers);
00463         for (int i=0; i<nUsers; i++) {
00464             if (skeleton!=NULL && skeleton->IsTracking(dUsers[i])) {
00465                 skeleton->StopTracking(dUsers[i]);
00466             }
00467         }
00468     }
00469 }
00470 
00471 
00472 
00473 
00475 
00476 
00477 BOOL  COpenNiDevice::create_Recorder(char* file_name, BOOL use_image)
00478 {
00479     if (context==NULL) {
00480         copy_s2Buffer("COpenNiDevice::create_Recorder ERROR: context is NULL", &m_err_mesg);
00481         return FALSE;
00482     }   
00483     if (depth==NULL) {
00484         copy_s2Buffer("COpenNiDevice::create_Recorder ERROR: depth is NULL", &m_err_mesg);
00485         return FALSE;
00486     }
00487 
00488     recorder = new xn::Recorder();
00489     rc = recorder->Create(*context);
00490     if (rc==XN_STATUS_OK) rc = recorder->SetDestination(XN_RECORD_MEDIUM_FILE, file_name);
00491     if (rc==XN_STATUS_OK && use_image && image!=NULL) rc = recorder->AddNodeToRecording(*image, XN_CODEC_JPEG);
00492     if (rc==XN_STATUS_OK) rc = recorder->AddNodeToRecording(*depth, XN_CODEC_16Z);  
00493     
00494     if (rc!=XN_STATUS_OK) {
00495         copy_s2Buffer("COpenNiDevice::create_Recorder ERROR: ", &m_err_mesg);
00496         cat_s2Buffer (::xnGetStatusString(rc), &m_err_mesg);
00497         return FALSE;
00498     }
00499 
00500     return TRUE;
00501 }
00502 
00503 
00504 
00505 void   COpenNiDevice::delete_Recorder(void)
00506 {
00507     if (recorder!=NULL) {
00508         int prev_state = m_state;
00509         m_state = NI_STATE_SAVE_WORKING;
00510         {
00511             Sleep(NI_WORKING_WAIT_TIME);
00512             if (depth!=NULL) recorder->RemoveNodeFromRecording(*depth);
00513             if (image!=NULL) recorder->RemoveNodeFromRecording(*image);
00514             
00515             recorder->Release();
00516             delete(recorder);
00517         }
00518         m_state = prev_state;
00519     }   
00520     recorder = NULL;
00521 }
00522 
00523 
00524 
00525 BOOL  COpenNiDevice::start_Recorde(char* file_name, BOOL use_image)
00526 {
00527     BOOL ret = FALSE;
00528     unlink(file_name);
00529 
00530     int prev_state = m_state;
00531     m_state = NI_STATE_SAVE_WORKING;
00532     {
00533         Sleep(NI_WORKING_WAIT_TIME);
00534         ret = create_Recorder(file_name, use_image);
00535         if (ret) {
00536             rc = recorder->Record();
00537             if (rc!=XN_STATUS_OK) {
00538                 copy_s2Buffer("COpenNiDevice::start_Recorde ERROR: ", &m_err_mesg);
00539                 cat_s2Buffer (::xnGetStatusString(rc), &m_err_mesg);
00540                 ret = FALSE;
00541             }
00542         }
00543     }
00544     m_state = prev_state;
00545 
00546     if (!ret) {
00547         delete_Recorder();
00548         unlink(file_name);
00549     }
00550     return ret;
00551 }
00552 
00553 
00554 
00555 void  COpenNiDevice::stop_Recorde(void)
00556 {
00557     delete_Recorder();
00558 }
00559 
00560 
00561 
00562 
00564 
00565 
00566 BOOL  COpenNiDevice::open_USB_Device(void)
00567 {
00568     rc = ::xnUSBInit();
00569     if (rc!=XN_STATUS_OK && rc!=XN_STATUS_USB_ALREADY_INIT) return FALSE;
00570     
00571 #ifdef WIN32
00572 
00573     XnUInt32 count;
00574     rc = ::xnUSBEnumerateDevices(NI_VID_MICROSOFT, NI_PID_NUI_MOTOR, (const XnUSBConnectionString**)&devPath, &count);
00575     if (rc!=XN_STATUS_OK) {
00576         ::xnUSBShutdown();
00577         return FALSE;
00578     }
00579 
00580     rc = ::xnUSBOpenDeviceByPath(*devPath, &usb_dev);
00581     if (rc!=XN_STATUS_OK) {
00582         ::xnUSBFreeDevicesList(devPath);
00583         return FALSE;
00584     }
00585 
00586 #else
00587 
00588     rc = ::xnUSBOpenDevice(OPENNI_VID_MICROSOFT, OPENNI_PID_NUI_MOTOR, NULL, NULL, &usb_dev);
00589     if (rc!=XN_STATUS_OK) {
00590         ::xnUSBShutdown();
00591         return FALSE;
00592     }
00593 
00594 #endif
00595 
00596     return TRUE;
00597 }
00598 
00599 
00600 
00601 void  COpenNiDevice::close_USB_Device(void)
00602 {
00603     if (usb_dev!=NULL) {
00604         ::xnUSBCloseDevice(usb_dev);
00605         usb_dev = NULL;
00606     }
00607 
00608 #ifdef WIN32
00609 
00610     if (devPath!=NULL) {
00611         ::xnUSBFreeDevicesList(devPath);
00612         devPath = NULL;
00613     }
00614 
00615 #endif
00616 
00617     ::xnUSBShutdown();
00618 }
00619 
00620 
00621 
00622 void  COpenNiDevice::set_LED_Color(int col)
00623 {
00624     if (usb_dev==NULL) return;
00625 
00626     ::xnUSBSendControl(usb_dev, XN_USB_CONTROL_TYPE_VENDOR, 0x06, (XnUInt16)col, 0, NULL, 0, 0);
00627 
00628     return;
00629 }
00630 
00631 
00632 
00633 void  COpenNiDevice::set_Tilt_Motor(int ang)
00634 {
00635     if (usb_dev==NULL) return;
00636     
00637 
00638     ::xnUSBSendControl(usb_dev, XN_USB_CONTROL_TYPE_VENDOR, 0x31, (XnUInt16)(ang*2), 0, NULL, 0, 0);
00639 
00640     
00641     Sleep(1000);
00642     return;
00643 }
00644 
00645 
00646 
00647 
00649 
00650 
00652 BOOL  COpenNiDevice::setup_CallBacks()
00653 {
00654     BOOL     ret = set_UserCallbacks (&userDetect, &userLost, this);
00655     if (ret) ret = set_CalibCallbacks(&calibStart, &calibEnd, this);
00656     if (!ret) return FALSE;
00657 
00658     return TRUE;
00659 }
00660 
00661 
00662 
00663 void  COpenNiDevice::clear_CallBacks()
00664 {
00665     unset_UserCallbacks();
00666     unset_CalibCallbacks();
00667 }
00668 
00669 
00670 
00671 BOOL  COpenNiDevice::set_UserCallbacks(xn::UserGenerator::UserHandler newUser, xn::UserGenerator::UserHandler lostUser, void* cookie)
00672 {
00673     if (user==NULL) {
00674         copy_s2Buffer("COpenNiDevice::set_UserCallbacks ERROR: user is NULL", &m_err_mesg);
00675         return FALSE;
00676     }
00677 
00678     rc = user->RegisterUserCallbacks(newUser, lostUser, cookie, userCallbacks);
00679     if (rc!=XN_STATUS_OK) {
00680         copy_s2Buffer("COpenNiDevice::set_UserCallbacks ERROR: ", &m_err_mesg);
00681         cat_s2Buffer (::xnGetStatusString(rc), &m_err_mesg);
00682         unset_UserCallbacks();
00683         return FALSE;
00684     }
00685     return TRUE;
00686 }
00687 
00688 
00689 
00690 BOOL  COpenNiDevice::set_CalibCallbacks(xn::SkeletonCapability::CalibrationStart calibStart, xn::SkeletonCapability::CalibrationEnd calibEnd, void* cookie)
00691 {
00692     if (skeleton==NULL) {
00693         copy_s2Buffer("COpenNiDevice::set_CalibCallbacks ERROR: skeleton is NULL", &m_err_mesg);
00694         return FALSE;
00695     }
00696 
00697     rc = skeleton->RegisterCalibrationCallbacks(calibStart, calibEnd, cookie, calibCallbacks);
00698     if (rc!=XN_STATUS_OK) {
00699         copy_s2Buffer("COpenNiDevice::set_CalibCallbacks ERROR: ", &m_err_mesg);
00700         cat_s2Buffer (::xnGetStatusString(rc), &m_err_mesg);
00701         unset_CalibCallbacks();
00702         return FALSE;
00703     }
00704     return TRUE;
00705 }
00706 
00707 
00708 
00709 void  COpenNiDevice::unset_UserCallbacks()
00710 {
00711     if (user!=NULL && userCallbacks!=NULL) {
00712         user->UnregisterUserCallbacks(userCallbacks);
00713         userCallbacks = NULL;
00714     }
00715     return;
00716 }
00717 
00718 
00719 
00720 void  COpenNiDevice::unset_CalibCallbacks()
00721 {
00722     if (skeleton!=NULL && calibCallbacks!=NULL) {
00723         skeleton->UnregisterCalibrationCallbacks(calibCallbacks);
00724         calibCallbacks = NULL;
00725     }
00726     return;
00727 }
00728 
00729 
00730 
00731 
00733 
00734 
00735 
00736 void  XN_CALLBACK_TYPE jbxl::userDetect(xn::UserGenerator& user, unsigned int nId, void* cookie)
00737 {
00738     DEBUG_INFO("jbxl::userDetect(): User is detected. (%d)", nId);
00739     if (cookie==NULL) return;
00740     
00741     user.GetSkeletonCap().RequestCalibration(nId, TRUE);
00742     
00743     DEBUG_INFO("jbxl::userDetect(): Start Pose Detection. (%d)", nId);
00744 }
00745 
00746 
00747 
00748 void  XN_CALLBACK_TYPE jbxl::userLost(xn::UserGenerator& user, unsigned int nId, void* cookie)
00749 {
00750     DEBUG_INFO("jbxl::userLost(): Lost user. (%d)", nId);
00751 
00752     if (user.GetSkeletonCap().IsValid()) {
00753         if (user.GetSkeletonCap().IsTracking(nId)) {
00754             user.GetSkeletonCap().StopTracking(nId);
00755             DEBUG_INFO("jbxl::userLost(): Stop Tracking. (%d)", nId);
00756         }
00757     }
00758 }
00759 
00760 
00761 
00762 
00763 
00764 void  XN_CALLBACK_TYPE jbxl::calibStart(xn::SkeletonCapability& skeleton, unsigned int nId, void* cookie)
00765 {
00766     DEBUG_INFO("jbxl::calibStart(): Start Calibration. (%d)", nId);
00767 }
00768 
00769 
00770 
00771 void  XN_CALLBACK_TYPE jbxl::calibEnd(xn::SkeletonCapability& skeleton, unsigned int nId, XnBool success, void* cookie)
00772 {
00773     DEBUG_INFO("jbxl::calibEnd(): End Calibration. (%d)", nId);
00774     if (cookie==NULL) return;
00775 
00776     
00777     xn::UserGenerator* user = ((COpenNiDevice*)cookie)->user;
00778     if (user!=NULL) {
00779         if (success) {
00780             if (user!=NULL) {
00781                 user->GetSkeletonCap().StartTracking(nId);
00782                 DEBUG_INFO("jbxl::calibEnd(): Start Tracking. (%d)", nId);
00783             }
00784         }
00785     }
00786 }
00787 
00788 
00789 #endif      // ENABLE_OPENNI