oni::driver::DeviceBase* XnOniDriver::deviceOpen(const char* uri, const char* mode) { XnOniDevice* pDevice = NULL; // if device was already opened for this uri, return the previous one if (m_devices.Get(uri, pDevice) == XN_STATUS_OK) { getServices().errorLoggerAppend("Device is already open."); return NULL; } pDevice = XN_NEW(XnOniDevice, uri, getServices(), this); XnStatus nRetVal = pDevice->Init(mode); if (nRetVal != XN_STATUS_OK) { getServices().errorLoggerAppend("Could not open \"%s\": %s", uri, xnGetStatusString(nRetVal)); return NULL; } // Register to error state property changed. XnCallbackHandle handle; nRetVal = pDevice->GetSensor()->RegisterToPropertyChange(XN_MODULE_NAME_DEVICE, XN_MODULE_PROPERTY_ERROR_STATE, OnDevicePropertyChanged, pDevice, handle); if (nRetVal != XN_STATUS_OK) { XN_DELETE(pDevice); return NULL; } // Add the device and return it. m_devices[uri] = pDevice; return pDevice; }
void XN_CALLBACK_TYPE XnOniDriver::OnDevicePropertyChanged(const XnChar* ModuleName, XnUInt32 nPropertyId, void* pCookie) { XnOniDevice* pDevice = (XnOniDevice*)pCookie; XnOniDriver* pThis = pDevice->GetDriver(); if (nPropertyId == XN_MODULE_PROPERTY_ERROR_STATE) { XnSensor* pSensor = (XnSensor*)pDevice->GetSensor(); // Get the property value. XnUInt64 errorState = 0; XnStatus nRetVal = pSensor->GetProperty(ModuleName, XN_MODULE_PROPERTY_ERROR_STATE, &errorState); if (nRetVal == XN_STATUS_OK) { if (errorState == XN_STATUS_DEVICE_NOT_CONNECTED) { pThis->deviceDisconnected(pDevice->GetInfo()); } else { int errorStateValue = XN_ERROR_STATE_OK; switch (errorState) { case XN_STATUS_OK: { errorStateValue = XN_ERROR_STATE_OK; break; } case XN_STATUS_DEVICE_PROJECTOR_FAULT: { errorStateValue = XN_ERROR_STATE_DEVICE_PROJECTOR_FAULT; break; } case XN_STATUS_DEVICE_OVERHEAT: { errorStateValue = XN_ERROR_STATE_DEVICE_OVERHEAT; break; } default: { // Invalid value. XN_ASSERT(FALSE); } } pThis->deviceStateChanged(pDevice->GetInfo(), errorStateValue); } } } }
void* XnOniDriver::enableFrameSync(oni::driver::StreamBase** pStreams, int streamCount) { // Make sure all the streams belong to same device. XnOniDevice* pDevice = NULL; for (int i = 0; i < streamCount; ++i) { XnOniStream* pStream = dynamic_cast<XnOniStream*>(pStreams[i]); if (pStreams == NULL) { // Not allowed. return NULL; } // Check if device was not set before. if (pDevice == NULL) { pDevice = pStream->GetDevice(); } // Compare device to stream's device. else if (pDevice != pStream->GetDevice()) { // Streams from different devices are currently not allowed. return NULL; } } // Create the frame sync group handle. FrameSyncGroup* pFrameSyncGroup = XN_NEW(FrameSyncGroup); if (pFrameSyncGroup == NULL) { return NULL; } pFrameSyncGroup->pDevice = pDevice; // Enable the frame sync. OniStatus rc = pDevice->EnableFrameSync((XnOniStream**)pStreams, streamCount); if (rc != ONI_STATUS_OK) { XN_DELETE(pFrameSyncGroup); return NULL; } // Return the created handle. return pFrameSyncGroup; }