// Execute command public override bool Execute() { uint err = EDSDKLib.EDSDK.EDS_ERR_OK; IntPtr evfImage = IntPtr.Zero; IntPtr stream = IntPtr.Zero; UInt64 bufferSize = 2 * 1024 * 1024; IntPtr evfDataSetPtr = IntPtr.Zero; IntPtr cameraPosPtr = IntPtr.Zero; // Exit unless during live view. if ((_model.EvfOutputDevice & EDSDKLib.EDSDK.EvfOutputDevice_PC) == 0) { return(true); } // Create memory stream. err = EDSDKLib.EDSDK.EdsCreateMemoryStream(bufferSize, out stream); // Create EvfImageRef. if (err == EDSDKLib.EDSDK.EDS_ERR_OK) { err = EDSDKLib.EDSDK.EdsCreateEvfImageRef(stream, out evfImage); } // Download live view image data. if (err == EDSDKLib.EDSDK.EDS_ERR_OK) { err = EDSDKLib.EDSDK.EdsDownloadEvfImage(_model.Camera, evfImage); } // Get meta data for live view image data. if (err == EDSDKLib.EDSDK.EDS_ERR_OK) { EVFDataSet dataset = new EVFDataSet(); dataset.stream = stream; // Get magnification ratio (x1, x5, or x10). EDSDKLib.EDSDK.EdsGetPropertyData(evfImage, EDSDKLib.EDSDK.PropID_Evf_Zoom, 0, out dataset.zoom); // Get position of image data. (when enlarging) // Upper left coordinate using JPEG Large size as a reference. EDSDKLib.EDSDK.EdsGetPropertyData(evfImage, EDSDKLib.EDSDK.PropID_Evf_ImagePosition, 0, out dataset.imagePosition); // Get rectangle of the focus border. EDSDKLib.EDSDK.EdsGetPropertyData(evfImage, EDSDKLib.EDSDK.PropID_Evf_ZoomRect, 0, out dataset.zoomRect); // Get the size as a reference of the coordinates of rectangle of the focus border. EDSDKLib.EDSDK.EdsGetPropertyData(evfImage, EDSDKLib.EDSDK.PropID_Evf_CoordinateSystem, 0, out dataset.sizeJpegLarge); _model.SetPropertyRect(EDSDKLib.EDSDK.PropID_Evf_ZoomRect, dataset.zoomRect); int size = Marshal.SizeOf(dataset); evfDataSetPtr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(dataset, evfDataSetPtr, false); } // Live view image transfer complete notification. if (err == EDSDKLib.EDSDK.EDS_ERR_OK) { CameraEvent e = new CameraEvent(CameraEvent.Type.EVFDATA_CHANGED, evfDataSetPtr); _model.NotifyObservers(e); } // Get Evf_RollingPitching data. if (err == EDSDKLib.EDSDK.EDS_ERR_OK) { if (_model.RollPitch == 0) { EDSDKLib.EDSDK.EdsCameraPos cameraPos = new EDSDKLib.EDSDK.EdsCameraPos(); err = EDSDKLib.EDSDK.EdsGetPropertyData(evfImage, EDSDKLib.EDSDK.PropID_Evf_RollingPitching, 0, out cameraPos); if (err == EDSDKLib.EDSDK.EDS_ERR_OK) { int size = Marshal.SizeOf(cameraPos); cameraPosPtr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(cameraPos, cameraPosPtr, false); CameraEvent e = new CameraEvent(CameraEvent.Type.ANGLEINFO, cameraPosPtr); _model.NotifyObservers(e); } } } if (stream != IntPtr.Zero) { EDSDKLib.EDSDK.EdsRelease(stream); stream = IntPtr.Zero; } if (evfImage != IntPtr.Zero) { EDSDKLib.EDSDK.EdsRelease(evfImage); evfImage = IntPtr.Zero; } if (evfDataSetPtr != IntPtr.Zero) { Marshal.FreeHGlobal(evfDataSetPtr); } //Notification of error if (err != EDSDKLib.EDSDK.EDS_ERR_OK) { // Retry getting image data if EDS_ERR_OBJECT_NOTREADY is returned // when the image data is not ready yet. if (err == EDSDKLib.EDSDK.EDS_ERR_OBJECT_NOTREADY) { return(false); } // It retries it at device busy if (err == EDSDKLib.EDSDK.EDS_ERR_DEVICE_BUSY) { CameraEvent e = new CameraEvent(CameraEvent.Type.DEVICE_BUSY, IntPtr.Zero); _model.NotifyObservers(e); return(false); } { CameraEvent e = new CameraEvent(CameraEvent.Type.ERROR, (IntPtr)err); _model.NotifyObservers(e); } } return(true); }
public void Update(Observable from, CameraEvent e) { CameraEvent.Type eventType = e.GetEventType(); switch (eventType) { case CameraEvent.Type.SHUT_DOWN: MessageBox.Show("Camera is disconnected"); if (_remoteCapture != null && !_remoteCapture.IsDisposed) { _remoteCapture.Close(); _remoteCapture.Dispose(); } this.Close(); break; case CameraEvent.Type.PROPERTY_CHANGED: if (null != _remoteCapture) { uint propertyID = (uint)e.GetArg(); if (propertyID == EDSDKLib.EDSDK.PropID_Evf_AFMode) { (_remoteCapture as RemoteCapture).controlFocusButton((int)EDSDKLib.EDSDK.EdsEvfAFMode.Evf_AFMode_LiveFace != _controller.GetModel().EvfAFMode); } if (propertyID == EDSDKLib.EDSDK.PropID_FixedMovie) { (_remoteCapture as RemoteCapture).updateFixedMovie(_controller.GetModel().FixedMovie); } if (propertyID == EDSDKLib.EDSDK.PropID_MirrorUpSetting) { (_remoteCapture as RemoteCapture).updateMirrorLockup(_controller.GetModel().MirrorUpSetting); } } break; case CameraEvent.Type.ANGLEINFO: if (null != _remoteCapture) { IntPtr cameraPosPtr = e.GetArg(); if (cameraPosPtr != IntPtr.Zero) { EDSDKLib.EDSDK.EdsCameraPos cameraPos = (EDSDKLib.EDSDK.EdsCameraPos)Marshal.PtrToStructure(cameraPosPtr, typeof(EDSDKLib.EDSDK.EdsCameraPos)); double pos = cameraPos.position; // Convert to floating point double roll = cameraPos.rolling * 0.01; double pitc = cameraPos.pitching * 0.01; (_remoteCapture as RemoteCapture).updateAngleInfoLabel(pos.ToString(), roll.ToString(), pitc.ToString()); } else { uint err = EDSDKLib.EDSDK.EdsSendCommand(_controller.GetModel().Camera, EDSDKLib.EDSDK.CameraCommand_RequestRollPitchLevel, 1); (_remoteCapture as RemoteCapture).updateAngleInfoLabel("-", "-", "-"); } } break; case CameraEvent.Type.MOUSE_CURSOR: if (null != _remoteCapture) { IntPtr onOffPtr = e.GetArg(); if (onOffPtr != IntPtr.Zero) { (_remoteCapture as RemoteCapture).changeMouseCursor(true); } else { (_remoteCapture as RemoteCapture).changeMouseCursor(false); _actionSource.FireEvent(ActionEvent.Command.CLICK_MOUSE, IntPtr.Zero); } } break; default: break; } }