上一篇介绍了OpenNI2的整体框架和API使用,这篇直接到最底层来梳理下OpenNI2 Driver开发,如何让自己的设备接入到OpenNI2
OniDriverAPI.h OpenNI Core 与Driver的交互
// OniDriverAPI.h
#ifndef _ONI_DRIVER_API_H_
#define _ONI_DRIVER_API_H_
namespace oni { namespace driver {
class StreamBase;
class DeviceBase;
class DriverBase;
class StreamServices;
}}
#define ONI_EXPORT_DRIVER(DriverClass)
#endif // _ONI_DRIVER_API_H_
Driver 相关的类都放在命名空间oni::driver中,主要的类有DriverBase、DeviceBase、StreamBase;各个设备Driver都需要实现这些类,同时将DriverClass通过宏ONI_EXPORT_DRIVER导出
PSLink的driver目录如下:
├── PSLink
│ ├── DriverImpl
│ │ ├── LinkExportedOniDriver.cpp
│ │ ├── LinkOniDepthStream.cpp
│ │ ├── LinkOniDepthStream.h
│ │ ├── LinkOniDevice.cpp
│ │ ├── LinkOniDevice.h
│ │ ├── LinkOniDriver.cpp
│ │ ├── LinkOniDriver.h
│ │ ├── LinkOniIRStream.cpp
│ │ ├── LinkOniIRStream.h
│ │ ├── LinkOniMapStream.cpp
│ │ ├── LinkOniMapStream.h
│ │ ├── LinkOniStream.cpp
│ │ └── LinkOniStream.h
LinkExportedOniDriver.cpp 的代码如下:
// LinkExportedOniDriver.cpp
//---------------------------------------------------------------------------
// Includes
//---------------------------------------------------------------------------
#include "LinkOniDriver.h"
//---------------------------------------------------------------------------
// LinkOniDriver EXPORT
//---------------------------------------------------------------------------
ONI_EXPORT_DRIVER(LinkOniDriver);
这部分代码的主要作用是将LinkOniDriver通过ONI_EXPORT_DRIVER导出;
ONI_EXPORT_DRIVER的具体定义如下,主要定义一个全局变量g_pDriver,然后将oni::driver::DriverBase、oni::driver::DeviceBase、oni::driver::StreamBase的操作封装为C函数,这样OpenNI Core就可以调用这些函数了
#define ONI_EXPORT_DRIVER(DriverClass) \
\
oni::driver::DriverBase* g_pDriver = NULL; \
\
/* As Driver */ \
ONI_C_API_EXPORT void oniDriverCreate(OniDriverServices* driverServices) { \
g_pDriver = XN_NEW(DriverClass, driverServices); \
} \
ONI_C_API_EXPORT void oniDriverDestroy() \
{ \
g_pDriver->shutdown(); \
XN_DELETE(g_pDriver); g_pDriver = NULL; \
} \
ONI_C_API_EXPORT OniStatus oniDriverInitialize(oni::driver::DeviceConnectedCallback deviceConnectedCallback, \
oni::driver::DeviceDisconnectedCallback deviceDisconnectedCallback, \
oni::driver::DeviceStateChangedCallback deviceStateChangedCallback, \
void* pCookie) \
{ \
return g_pDriver->initialize(deviceConnectedCallback, deviceDisconnectedCallback, deviceStateChangedCallback, pCookie); \
} \
\
ONI_C_API_EXPORT OniStatus oniDriverTryDevice(const char* uri) \
{ \
return g_pDriver->tryDevice(uri); \
}