00001 
00005 #include  "OpenNi2Device.h"
00006 
00007 
00008 #ifdef  ENABLE_OPENNI2
00009 
00010 
00011 using namespace jbxl;
00012 
00013 
00014 COpenNi2Device::COpenNi2Device(void)
00015 {
00016     context      = NULL;
00017     recorder     = NULL;
00018 
00019     image        = NULL;
00020     depth        = NULL;
00021 
00022     user         = NULL;
00023 
00024     m_enu_dev    = EnuDev_Unknown;
00025     m_has_camera = TRUE;
00026     m_err_mesg   = make_Buffer(LMESG);
00027 
00028     m_state      = NI_STATE_DETECT_STOPPED;
00029     m_xsize      = OPENNI_DEPTH_XSIZE;
00030     m_ysize      = OPENNI_DEPTH_YSIZE;
00031     m_nfps       = OPENNI_DEPTH_FPS;
00032 
00033     
00034     m_has_image_data = TRUE;
00035     m_has_depth_data = TRUE;
00036 
00037 
00038     
00039     imageMode.setFps(m_nfps);
00040     imageMode.setResolution(m_xsize, m_ysize);
00041     imageMode.setPixelFormat(openni::PIXEL_FORMAT_RGB888);
00042 
00043     depthMode.setFps(m_nfps);
00044     depthMode.setResolution(m_xsize, m_ysize);
00045     depthMode.setPixelFormat(openni::PIXEL_FORMAT_DEPTH_1_MM);
00046 }
00047 
00048 
00049 
00050 BOOL  COpenNi2Device::init(BOOL use_image)
00051 {
00052     m_stream_flg = 0x00; 
00053     m_stream_num = 0;
00054     for (int s=0; s<OPENNI2_STREAM_DATA_NUM; s++) m_streams[s] = NULL;
00055 
00056     m_enu_dev = EnuDev_None;
00057 
00058     BOOL ret = create_Context();
00059     if (ret && use_image) ret = create_Image();
00060     if (ret) ret = create_Depth();
00061     if (ret) {
00062         const openni::DeviceInfo info = context->getDeviceInfo();
00063         DEBUG_INFO("COpenNi2Device::init(): INFO: Device Name = %s", info.getName());
00064         
00065         if      (!strcasecmp(info.getName(), OPENNI2_DEVICE_PS1080))  m_enu_dev = EnuDev_PS1080;
00066         else if (!strcasecmp(info.getName(), OPENNI2_DEVICE_KINECT))  m_enu_dev = EnuDev_Kinect;
00067         else if (!strcasecmp(info.getName(), OPENNI2_DEVICE_ONIFILE)) m_enu_dev = EnuDev_OniFile;
00068     }
00069 
00070     return ret;
00071 }
00072 
00073 
00074 
00075 BOOL  COpenNi2Device::init(char* fname, BOOL use_image)
00076 {
00077     m_enu_dev = EnuDev_None;
00078 
00079     if (fname==NULL) {
00080         copy_s2Buffer("COpenNi2Device::init(): ERROR: File name is NULL.", &m_err_mesg);
00081         return FALSE;
00082     }
00083 
00084     m_stream_flg = 0x00; 
00085     m_stream_num = 0;
00086     for (int s=0; s<OPENNI2_STREAM_DATA_NUM; s++) m_streams[s] = NULL;
00087 
00088     BOOL ret = create_Context(fname);
00089     if (ret && use_image) ret = create_Image();
00090     if (ret) ret = create_Depth();
00091     if (ret) m_enu_dev = EnuDev_OniFile;
00092 
00093     return ret;
00094 }
00095 
00096 
00097 
00098 void  COpenNi2Device::free(void)
00099 {
00100     DEBUG_LOG("COpenNi2Device::free(): deleting Recorder ...");
00101     delete_Recorder();
00102     
00103     DEBUG_LOG("COpenNi2Device::free(): deleting Image ...");
00104     delete_Image();
00105     DEBUG_LOG("COpenNi2Device::free(): deleting Depth ...");
00106     delete_Depth();
00107     DEBUG_LOG("COpenNi2Device::free(): deleting Context ...");
00108     delete_Context();
00109     DEBUG_LOG("COpenNi2Device::free(): deleted Generators.");
00110     
00111     free_Buffer(&m_err_mesg);
00112 
00113     DEBUG_LOG("COpenNi2Device::free(): END");
00114 }
00115 
00116 
00117 
00118 
00120 
00121 
00122 BOOL  COpenNi2Device::create_Context(char* fname)
00123 {
00124     if (context==NULL) {
00125         context = new openni::Device();
00126         if (context==NULL) {
00127             DEBUG_ERR("COpenNi2Device::create_Context(): context is NULL!!");
00128             return FALSE;
00129         }
00130     }
00131     else context->close();
00132 
00133     const char* uri = fname;
00134     if (uri==NULL) uri = openni::ANY_DEVICE;
00135 
00136     openni::Status ret = context->open(uri);
00137     if (ret!=openni::STATUS_OK) {
00138         DEBUG_ERR("COpenNi2Device::create_Context(): Device Open Error!! (%d)", ret);
00139         deleteNull(context);
00140         return FALSE;
00141     }
00142 
00143     
00144     
00145 
00146     DEBUG_INFO("COpenNi2Device::create_Context(): created Context.");
00147     return TRUE;
00148 }
00149 
00150 
00151 
00152 BOOL  COpenNi2Device::create_Recorder(char* fname, BOOL use_image)
00153 {
00154     if (fname==NULL) {
00155         copy_s2Buffer("COpenNi2Device::create_Recorder(): ERROR: File name is NULL.", &m_err_mesg);
00156         return FALSE;
00157     }
00158     if (depth==NULL || (use_image && image==NULL)) {
00159         copy_s2Buffer("COpenNi2Device::create_Recorder(): ERROR: Image or Depth Stream is NULL.", &m_err_mesg);
00160         return FALSE;
00161     }
00162 
00163     if (recorder==NULL) {
00164         recorder = new openni::Recorder();
00165         if (recorder==NULL) {
00166             DEBUG_ERR("COpenNi2Device::create_Recorder(): recorder is NULL!!");
00167             return FALSE;
00168         }
00169     }
00170     else recorder->stop();
00171     
00172     openni::Status ret = recorder->create(fname);
00173     if (ret!=openni::STATUS_OK) {
00174         deleteNull(recorder);
00175         DEBUG_ERR("COpenNi2Device::create_Recorder ERROR: File Open Error.");
00176         copy_s2Buffer("COpenNi2Device::create_Recorder ERROR: File Open Error.", &m_err_mesg);
00177         return FALSE;
00178     }   
00179     
00180     ret = recorder->attach(*depth, true);
00181     if (ret==openni::STATUS_OK && use_image) ret = recorder->attach(*image, true);
00182     if (ret!=openni::STATUS_OK) {
00183         deleteNull(recorder);
00184         DEBUG_ERR("COpenNi2Device::create_Recorder ERROR: Stream Attach Error.");
00185         copy_s2Buffer("COpenNi2Device::create_Recorder ERROR: Stream Attach Error.", &m_err_mesg);
00186         return FALSE;
00187     }
00188 
00189     DEBUG_INFO("COpenNi2Device::create_Recorder(): created Recorder.");
00190     return TRUE;
00191 }
00192 
00193 
00194 
00195 BOOL  COpenNi2Device::create_Image(void)
00196 {
00197     if (!m_has_camera) return FALSE;
00198 
00199     if (context==NULL) {
00200         copy_s2Buffer("COpenNi2Device::create_Image(): ERROR: context is NULL.", &m_err_mesg);
00201         return FALSE;
00202     }
00203 
00204     image = new openni::VideoStream();
00205     if (image==NULL) return FALSE;
00206 
00207     openni::Status ret = image->create(*context, openni::SENSOR_COLOR);
00208     if (ret!=openni::STATUS_OK) {
00209         deleteNull(image);
00210         copy_s2Buffer("COpenNi2Device::create_Image(): ERROR: Craete Error.", &m_err_mesg);
00211         return FALSE;
00212     }
00213 
00214     ret = image->start();
00215     if (ret!=openni::STATUS_OK) {
00216         deleteNull(image);
00217         copy_s2Buffer("COpenNi2Device::create_Image(): ERROR: Start Error.", &m_err_mesg);
00218         return FALSE;
00219     }
00220 
00221     image->setVideoMode(imageMode);
00222 
00223     m_streams[OPENNI2_IMAGE_INDEX] = image;
00224     m_stream_flg |= OPENNI2_IMAGE_FLAG;
00225     m_stream_num++;
00226 
00227     DEBUG_INFO("COpenNi2Device::create_Image(): created Image Stream.");
00228     return TRUE;
00229 }
00230 
00231 
00232 
00233 BOOL  COpenNi2Device::create_Depth(void)
00234 {
00235     if (context==NULL) {
00236         copy_s2Buffer("COpenNi2Device::create_Depth(): ERROR: context is NULL.", &m_err_mesg);
00237         return FALSE;
00238     }
00239 
00240     depth = new openni::VideoStream();
00241     if (depth==NULL) return FALSE;
00242 
00243     openni::Status ret = depth->create(*context, openni::SENSOR_DEPTH);
00244     if (ret!=openni::STATUS_OK) {
00245         deleteNull(depth);
00246         copy_s2Buffer("COpenNi2Device::create_Depth(): ERROR: Craete Error.", &m_err_mesg);
00247         return FALSE;
00248     }
00249 
00250     ret = depth->start();
00251     if (ret!=openni::STATUS_OK) {
00252         deleteNull(depth);
00253         copy_s2Buffer("COpenNi2Device::create_Depth(): ERROR: Start Error.", &m_err_mesg);
00254         return FALSE;
00255     }
00256 
00257     depth->setVideoMode(depthMode);
00258 
00259     m_streams[OPENNI2_DEPTH_INDEX] = depth;
00260     m_stream_flg |= OPENNI2_DEPTH_FLAG;
00261     m_stream_num++;
00262 
00263     DEBUG_INFO("COpenNi2Device::create_Depth(): created Depth Stream.");
00264     return TRUE;
00265 }
00266 
00267 
00268 
00269 BOOL  COpenNi2Device::create_User(void)
00270 {
00271     user = new nite::UserTracker();
00272     if (user==NULL) return FALSE;
00273 
00274     nite::Status ret = user->create(context);   
00275     if (ret!=nite::STATUS_OK) {
00276         deleteNull(user);
00277         copy_s2Buffer("COpenNi2Device::create_Depth(): ERROR: Create Error", &m_err_mesg);
00278         return FALSE;
00279     }
00280 
00281     DEBUG_INFO("COpenNi2Device::create_User(): created User Tracker.");
00282     return TRUE;
00283 }
00284 
00285 
00286 
00287 
00289 
00290 
00291 void  COpenNi2Device::delete_Context(void)
00292 {
00293     if (context==NULL || !context->isValid()) return;
00294 
00295     
00296     context->close();
00297     delete(context);
00298     context = NULL;
00299 
00300     return;
00301 }
00302 
00303 
00304 
00305 void    COpenNi2Device::delete_Recorder(void)
00306 {
00307     if (recorder==NULL || !recorder->isValid()) return;
00308 
00309     
00310     int prev_state = m_state;
00311     m_state = NI_STATE_SAVE_WORKING;
00312     {
00313         recorder->stop();
00314         DEBUG_INFO("COpenNi2Device::delete_Recorder(): Recorder Stopped.");
00315         delete(recorder);
00316         recorder = NULL;
00317     }
00318     m_state = prev_state;
00319 
00320     return;
00321 }
00322 
00323 
00324 
00325 void  COpenNi2Device::delete_Image(void)
00326 {
00327     m_stream_num--;
00328     m_streams[OPENNI2_IMAGE_INDEX] = NULL;
00329     m_stream_flg &= ~OPENNI2_IMAGE_FLAG;
00330 
00331     if (image==NULL || !image->isValid()) return;
00332 
00333     
00334     image->stop();
00335 
00336     if (imageFrame.isValid()) imageFrame.release();
00337     delete(image);
00338     image = NULL;
00339     return;
00340 }
00341 
00342 
00343 
00344 void  COpenNi2Device::delete_Depth(void)
00345 {
00346     m_stream_num--;
00347     m_streams[OPENNI2_DEPTH_INDEX] = NULL;
00348     m_stream_flg &= ~OPENNI2_DEPTH_FLAG;
00349     
00350     if (depth==NULL || !depth->isValid()) return;
00351 
00352     
00353     depth->stop();
00354 
00355     if (depthFrame.isValid()) depthFrame.release();
00356     delete(depth);
00357     depth = NULL;
00358     return;
00359 }
00360 
00361 
00362 
00363 void  COpenNi2Device::delete_User(void)
00364 {
00365     if (user==NULL || !user->isValid()) return;
00366 
00367     
00368     if (userFrame.isValid()) userFrame.release();
00369     delete(user);
00370     user = NULL;
00371 
00372     return;
00373 }
00374 
00375 
00376 
00377 
00379 
00380 
00381 BOOL  COpenNi2Device::start_Recorde(char* file_name, BOOL use_image)
00382 {
00383     DEBUG_INFO("COpenNi2Device::delete_Recorder(): Recorder Starting ...");
00384 
00385     BOOL ret = FALSE;
00386     unlink(file_name);
00387     
00388     int prev_state = m_state;
00389     m_state = NI_STATE_SAVE_WORKING;
00390     {
00391         Sleep(NI_WORKING_WAIT_TIME);
00392         ret = create_Recorder(file_name, use_image);
00393         if (ret) {
00394             openni::Status nc = recorder->start();
00395             if (nc!=openni::STATUS_OK) {
00396                 copy_s2Buffer("COpenNi2Device::start_Recorde ERROR: Start Error.", &m_err_mesg);
00397                 ret = FALSE;
00398             }
00399         }
00400     }
00401     m_state = prev_state;
00402 
00403     if (ret) {
00404         DEBUG_INFO("COpenNi2Device::delete_Recorder(): Recorder Started.");
00405     }
00406     else {
00407         delete_Recorder();
00408         unlink(file_name);
00409         DEBUG_INFO("COpenNi2Device::delete_Recorder(): Recorder can not Start.");
00410     }
00411     
00412     return ret;
00413 }
00414 
00415 
00416 
00417 void  COpenNi2Device::stop_Recorde(void)
00418 {
00419     DEBUG_INFO("COpenNi2Device::delete_Recorder(): Recorder Stopping ...");
00420     if (recorder!=NULL && recorder->isValid()) {
00421         delete_Recorder();
00422     }
00423 }
00424 
00425 
00426 
00427 
00429 
00430 
00431 BOOL  COpenNi2Device::setup_Tracking(int profile, double smooth)
00432 {
00433     if (user!=NULL) {
00434         nite::Status nc = user->setSkeletonSmoothingFactor(smooth);
00435         if (nc==nite::STATUS_OK) return TRUE;
00436     }
00437 
00438     return FALSE;
00439 }
00440 
00441 
00442 
00443 
00445 
00446 
00447 void   COpenNi2Device::wait_StreamData(void) 
00448 {
00449 
00450 
00451     openni::Status rc;
00452     unsigned char flag = 0x00;
00453     int stream_idx;
00454     
00455     m_has_image_data = FALSE;
00456     m_has_depth_data = FALSE;
00457 
00458 
00459     Loop {
00460         rc = openni::OpenNI::waitForAnyStream(m_streams, m_stream_num, &stream_idx, 0);
00461         if (rc==openni::STATUS_OK) {
00462             if (stream_idx==OPENNI2_IMAGE_INDEX) {
00463                 if (image!=NULL) {
00464                     image->readFrame(&imageFrame);
00465                     flag |= OPENNI2_IMAGE_FLAG;
00466                     m_has_image_data = TRUE;
00467                 }
00468             }
00469             else if (stream_idx==OPENNI2_DEPTH_INDEX) {
00470                 if (depth!=NULL) {
00471                     depth->readFrame(&depthFrame);
00472                     flag |= OPENNI2_DEPTH_FLAG;
00473                     m_has_depth_data = TRUE;
00474                 }
00475             }
00476             
00477 
00478 
00479 
00480 
00481 
00482 
00483 
00484 
00485             if ((flag & m_stream_flg)==m_stream_flg) break;
00486         }
00487     }
00488 }
00489 
00490 
00491 
00492 BOOL  COpenNi2Device::set_ImageData(void) 
00493 {
00494     if (image!=NULL) {
00495 
00496         if (imageFrame.isValid()) return TRUE;
00497     }
00498     return FALSE;
00499 }
00500 
00501 
00502 
00503 BOOL  COpenNi2Device::set_DepthData(void)
00504 {
00505     if (depth!=NULL) {
00506         
00507         if (depthFrame.isValid()) return TRUE;      
00508     }
00509     return FALSE;
00510 }
00511 
00512 
00513 
00514 BOOL  COpenNi2Device::set_SceneData(void) 
00515 {
00516     if (user!=NULL) {
00517         user->readFrame(&userFrame);
00518         if (userFrame.isValid()) return TRUE;
00519     }
00520 
00521     return FALSE;
00522 }
00523 
00524 
00525 
00526 
00528 
00529 
00530 
00531 
00532 
00533 Buffer  jbxl::initialize_OpenNI2(void)
00534 {
00535     Buffer mesg = init_Buffer();
00536 
00537     openni::Status rc = openni::OpenNI::initialize();
00538     if (rc!=openni::STATUS_OK) {
00539         mesg = make_Buffer(LMESG);
00540         copy_s2Buffer("jbxl::initializeOpenNI2(): ERROR: Initialize OpenNI Error!!\n", &mesg);
00541         cat_s2Buffer (openni::OpenNI::getExtendedError(), &mesg);
00542         DEBUG_WARN("%s", mesg.buf);
00543     }
00544     else DEBUG_INFO("jbxl::initialize_OpenNI2(): initialize OpenNI2");
00545 
00546     return mesg;
00547 }
00548 
00549 
00550 
00551 void  jbxl::shutdown_OpenNI2(void)
00552 { 
00553     openni::OpenNI::shutdown();
00554     DEBUG_INFO("jbxl::shutdown_OpenNI2(): shutdown OpenNI2");
00555 }
00556 
00557 
00558 
00559 
00560 Buffer  jbxl::initialize_NiTE2(void)
00561 {
00562     Buffer mesg = init_Buffer();
00563     
00564     nite::Status nc = nite::NiTE::initialize();
00565     if (nc!=nite::STATUS_OK) {
00566         mesg = make_Buffer(LMESG);
00567         copy_s2Buffer("jbxl::initializeNiTE2(): ERROR: Initialize NiTE Error!!\n", &mesg);
00568         DEBUG_WARN("%s", mesg.buf);
00569     }
00570     else DEBUG_INFO("jbxl::initialize_NiTE2(): initialize NiTE2");
00571 
00572     return mesg;
00573 }
00574 
00575 
00576 
00577 void  jbxl::shutdown_NiTE2(void)
00578 { 
00579     nite::NiTE::shutdown();
00580     DEBUG_INFO("jbxl::shutdown_NiTE2(): shutdown NiTE2");
00581 }
00582 
00583 
00584 #endif      // ifdef ENABLE_OPENNI2x