Exemplo n.º 1
0
        // 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);
        }
Exemplo n.º 2
0
        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;
            }
        }