浅析OpenNI2---Driver开发(1)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇介绍了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);                                                                                       \
}                                                           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值