上一篇介绍了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); \
} \

本文深入探讨OpenNI2的Driver开发,解析OniDriverAPI.h及PSLink的driver目录结构,阐述如何使设备接入OpenNI2。内容包括DriverBase、DeviceBase、StreamBase类的实现,以及驱动加载过程,涉及libPSLink.so的dlopen加载和dlsym函数调用。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



