Camera::Camera(const EdsCameraRef& camera) { if (!camera) { throw std::runtime_error(""); } EdsRetain(camera); mCamera = camera; EdsError error = EdsGetDeviceInfo(mCamera, &mDeviceInfo); if (error != EDS_ERR_OK) { std::cerr << "ERROR - failed to get device info" << std::endl; // TODO - NULL out mDeviceInfo } mHasOpenSession = false; mIsLiveView = false; // set event handlers error = EdsSetObjectEventHandler(mCamera, kEdsObjectEvent_All, Camera::handleObjectEvent, this); if (error != EDS_ERR_OK) { std::cerr << "ERROR - failed to set object event handler" << std::endl; } error = EdsSetPropertyEventHandler(mCamera, kEdsPropertyEvent_All, Camera::handlePropertyEvent, this); if (error != EDS_ERR_OK) { std::cerr << "ERROR - failed to set property event handler" << std::endl; } error = EdsSetCameraStateEventHandler(mCamera, kEdsStateEvent_All, Camera::handleStateEvent, this); if (error != EDS_ERR_OK) { std::cerr << "ERROR - failed to set object event handler" << std::endl; } }
int CanonEDCamera::Initialize() { EdsError err = EDS_ERR_OK; // Initialize SDK err = EdsInitializeSDK(); if(err == EDS_ERR_OK) { isSDKLoaded_ = true; } // Get first camera if(err == EDS_ERR_OK) { err = getFirstCamera (&camera_); } if (err == EDS_ERR_DEVICE_NOT_FOUND) return ERR_NO_CAMERA; // event handlers are static functions that need a reference to this camera object to function // provide that static ref here. This approach will fail with multiple cameras. In that case, // consider making a map with cameras and references to our CanonEDCamera objects g_Self = this; // Set event handler if(err == EDS_ERR_OK) { err = EdsSetObjectEventHandler(camera_, kEdsObjectEvent_All, &CanonEDCamera::handleObjectEvent, NULL); } // Set event handler if(err == EDS_ERR_OK) { err = EdsSetPropertyEventHandler(camera_, kEdsPropertyEvent_All, &CanonEDCamera::handlePropertyEvent, NULL); } // Set event handler if(err == EDS_ERR_OK) { err = EdsSetCameraStateEventHandler(camera_, kEdsStateEvent_All, &CanonEDCamera::handleStateEvent, NULL); } if(err == EDS_ERR_OK) { err = EdsOpenSession(camera_); } // Camera name if (err == EDS_ERR_OK) { EdsDeviceInfo deviceInfo; err = EdsGetDeviceInfo(camera_, &deviceInfo); if (err == EDS_ERR_OK) { std::ostringstream os; os << "Canon SLR device subtype: " << deviceInfo.deviceSubType; LogMessage(os.str().c_str()); if (deviceInfo.deviceSubType == 0) isLegacy_ = true; cameraModel_ = deviceInfo.szDeviceDescription; int nRet = CreateProperty("Model", cameraModel_.c_str(), MM::String, true); if (nRet != DEVICE_OK) return nRet; } // Set and Get various camera properties // lock the UI before setting properties - only needed on legacy cameras if (isLegacy_) EdsSendStatusCommand (camera_, kEdsCameraStatusCommand_UILock, 0); EdsSaveTo toPC = kEdsSaveTo_Host; err = EdsSetPropertyData(camera_, kEdsPropID_SaveTo, 0 , sizeof(EdsSaveTo), &toPC); if (isLegacy_) EdsSendStatusCommand (camera_, kEdsCameraStatusCommand_UIUnLock, 0); } if (err == EDS_ERR_OK) { CPropertyAction* pAct = new CPropertyAction(this, &CanonEDCamera::OnBinning); int nRet = CreateProperty(MM::g_Keyword_Binning, "1", MM::Integer, false, pAct); if (nRet != DEVICE_OK) return nRet; } if (err == EDS_ERR_OK) { return DEVICE_OK; } std::ostringstream os; os << "Error during initialization: " << std::hex << err; LogMessage(os.str().c_str()); return err; }