Bladeren bron

修复OPT图像软触发采集方式

孝锋 徐 7 maanden geleden
bovenliggende
commit
b6b4bc7edb
1 gewijzigde bestanden met toevoegingen van 73 en 41 verwijderingen
  1. 73 41
      TeamAAS-VM/Core/Cameras/OptCamera.cs

+ 73 - 41
TeamAAS-VM/Core/Cameras/OptCamera.cs

@@ -2,6 +2,7 @@
 using Microsoft.Win32;
 using netDxf.Entities;
 using NPOI.POIFS.Crypt.Dsig;
+using NPOI.SS.Formula;
 using NPOI.SS.Formula.Eval;
 using SciCamera.Net;
 using System;
@@ -16,6 +17,7 @@ using System.Runtime.InteropServices;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
+using System.Web.Configuration;
 using TeamAAS_VP.Enums;
 using TeamAAS_VP.Interfaces;
 using TeamAAS_VP.Models;
@@ -357,7 +359,7 @@ namespace TeamAAS_VP.Core.Cameras
                 nReVal = mvCameraAcq.SetEnumValueByStringEx(SciCam.SciCamDeviceXmlType.SciCam_DeviceXml_Camera, "TriggerMode", "On");
                 nReVal = mvCameraAcq.SetEnumValueByString("TriggerSource", "Software");
                 // ch:注册事件回调 | en:Register event callback
-                nReVal = mvCameraAcq.RegisterPayloadCallBack(new SciCam.fnOnPayloadDelegate(ImageCallBack), IntPtr.Zero, true);
+                //nReVal = mvCameraAcq.RegisterPayloadCallBack(new SciCam.fnOnPayloadDelegate(ImageCallBack), IntPtr.Zero, true);
                 // ch:设置采集策略 | en:Set Grab Strategy
                 nReVal = mvCameraAcq.SetGrabStrategy(CurrentGrabStrategy);
                 if (nReVal != SciCam.SCI_CAMERA_OK)
@@ -368,7 +370,7 @@ namespace TeamAAS_VP.Core.Cameras
                 {
                     CameraConnectChangedEvent?.Invoke(ID, true);
                 }
-                mvCameraAcq.SetGrabTimeout(2000);
+                mvCameraAcq.SetGrabTimeout(5000);
                 IsConnected = mvCameraAcq.IsDeviceOpen();
                 if (IsConnected)
                 {
@@ -405,6 +407,7 @@ namespace TeamAAS_VP.Core.Cameras
             {
                 mvCameraAcq?.StopGrabbing();
                 mvCameraAcq?.CloseDevice();
+                mvCameraAcq?.DeleteDevice();
             }
             finally
             {
@@ -435,24 +438,26 @@ namespace TeamAAS_VP.Core.Cameras
                         }
 
                         // 重置TaskCompletionSource
-                        _tcs?.TrySetCanceled();
-                        _tcs = new TaskCompletionSource<ICogImage>();
+                        //_tcs?.TrySetCanceled();
+                        //_tcs = new TaskCompletionSource<ICogImage>();
 
                         // 注册取消令牌
-                        CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(2000); // 2秒超时
-                        cancellationTokenSource.Token.Register(() => _tcs.TrySetCanceled());
+                        //CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(2000000); // 2秒超时
+                        //cancellationTokenSource.Token.Register(() => _tcs.TrySetCanceled());
 
                         // 触发图像采集
                         // ch:发送软触发命令 | en:Send Trigger Software command
                         nReVal = mvCameraAcq.SetCommandValueEx(SciCam.SciCamDeviceXmlType.SciCam_DeviceXml_Camera, "TriggerSoftware");
                         if (nReVal == SciCam.SCI_CAMERA_OK)
                         {
-                            // 等待图像接收事件
-                            Image = _tcs.Task.Result;
-                            TotalTime = sw.Elapsed;
-                            ErrorMessage = $"{i + 1}";
-                            if (Image != null)
+                            nReVal = mvCameraAcq.Grab(ref payload);
+                            if (nReVal == SciCam.SCI_CAMERA_OK)
                             {
+                                Image = GetConvertedInfo(payload);
+                                mvCameraAcq.FreePayload(payload);
+                                //nReVal = mvCameraAcq.StopGrabbing();
+                                TotalTime = sw.Elapsed;
+                                ErrorMessage = $"{i + 1}";
                                 return Image;
                             }
                             else
@@ -464,7 +469,6 @@ namespace TeamAAS_VP.Core.Cameras
                                 OpenDevice();
                                 ErrorMessage = "图像采集失败!";
                             }
-
                         }
                         else
                         {
@@ -473,7 +477,7 @@ namespace TeamAAS_VP.Core.Cameras
                             //_operationSemaphore.Release();
                             CloseDevice();
                             OpenDevice();
-                            ErrorMessage = "图像采集失败!";
+                            ErrorMessage = "软触发失败!";
                         }
                     }
                     catch (Exception ex)
@@ -626,25 +630,31 @@ namespace TeamAAS_VP.Core.Cameras
                     return 0;
 
                 uint nReVal = SciCam.SCI_CAMERA_OK;
-                SciCam.SCI_NODE_VAL_INT iNodeVal = new SciCam.SCI_NODE_VAL_INT();
-                nReVal = mvCameraAcq.GetIntValue("ExposureTime", ref iNodeVal);
-                if (nReVal != SciCam.SCI_CAMERA_OK)
+                string[] nodeName = new string[]
+            {
+                "ExposureTime",
+                "ExposureTimeAbs",
+                "ExposureTimeRaw"
+            };
+                for (int i = 0; i < nodeName.Count(); i++)
                 {
-                    SciCam.SCI_NODE_VAL_FLOAT fNodeVal = new SciCam.SCI_NODE_VAL_FLOAT();
-                    nReVal = mvCameraAcq.GetFloatValue("ExposureTime", ref fNodeVal);
-                    if (nReVal == SciCam.SCI_CAMERA_OK)
+                    SciCam.SCI_NODE_VAL_INT iNodeVal = new SciCam.SCI_NODE_VAL_INT();
+                    nReVal = mvCameraAcq.GetIntValueEx(SciCam.SciCamDeviceXmlType.SciCam_DeviceXml_Camera, nodeName[i], ref iNodeVal);
+                    if (nReVal != SciCam.SCI_CAMERA_OK)
                     {
-                        return (float)fNodeVal.dVal;
+                        SciCam.SCI_NODE_VAL_FLOAT fNodeVal = new SciCam.SCI_NODE_VAL_FLOAT();
+                        nReVal = mvCameraAcq.GetFloatValueEx(SciCam.SciCamDeviceXmlType.SciCam_DeviceXml_Camera, nodeName[i], ref fNodeVal);
+                        if (nReVal == SciCam.SCI_CAMERA_OK)
+                        {
+                            return Convert.ToSingle(fNodeVal.dVal);
+                        }
                     }
                     else
                     {
-                        return 0;
+                        return Convert.ToSingle(iNodeVal.nVal);
                     }
                 }
-                else
-                {
-                    return (float)iNodeVal.nVal;
-                }
+                return 0;
             }
             finally
             {
@@ -665,12 +675,29 @@ namespace TeamAAS_VP.Core.Cameras
                 if (!mvCameraAcq.IsDeviceOpen())
                     return false;
                 uint nReVal = SciCam.SCI_CAMERA_OK;
-                nReVal = mvCameraAcq.SetIntValue("Gain", (int)Gain);
-                if (nReVal != SciCam.SCI_CAMERA_OK)
+                string[] nodeName = new string[]
+            {
+                "Gain",
+                "GainRaw"
+            };
+                for (int i = 0; i < nodeName.Count(); i++)
                 {
-                    mvCameraAcq.SetFloatValue("Gain", Gain);
+                    nReVal = mvCameraAcq.SetIntValueEx(SciCam.SciCamDeviceXmlType.SciCam_DeviceXml_Camera, nodeName[i], (int)Gain);
+                    if (nReVal != SciCam.SCI_CAMERA_OK)
+                    {
+                        nReVal = mvCameraAcq.SetFloatValueEx(SciCam.SciCamDeviceXmlType.SciCam_DeviceXml_Camera, nodeName[i], Gain);
+                        if (nReVal == SciCam.SCI_CAMERA_OK)
+                        {
+                            return true;
+                        }
+                    }
+                    else
+                    {
+                        return true;
+
+                    }
                 }
-                return true;
+                return false;
             }
             finally
             {
@@ -690,25 +717,30 @@ namespace TeamAAS_VP.Core.Cameras
                 if (!mvCameraAcq.IsDeviceOpen())
                     return 0;
                 uint nReVal = SciCam.SCI_CAMERA_OK;
-                SciCam.SCI_NODE_VAL_INT iNodeVal = new SciCam.SCI_NODE_VAL_INT();
-                nReVal = mvCameraAcq.GetIntValue("Gain", ref iNodeVal);
-                if (nReVal != SciCam.SCI_CAMERA_OK)
+                string[] nodeName = new string[]
+            {
+                "Gain",
+                "GainRaw"
+            };
+                for (int i = 0; i < nodeName.Count(); i++)
                 {
-                    SciCam.SCI_NODE_VAL_FLOAT fNodeVal = new SciCam.SCI_NODE_VAL_FLOAT();
-                    nReVal = mvCameraAcq.GetFloatValue("Gain", ref fNodeVal);
-                    if (nReVal == SciCam.SCI_CAMERA_OK)
+                    SciCam.SCI_NODE_VAL_INT iNodeVal = new SciCam.SCI_NODE_VAL_INT();
+                    nReVal = mvCameraAcq.GetIntValueEx(SciCam.SciCamDeviceXmlType.SciCam_DeviceXml_Camera, nodeName[i], ref iNodeVal);
+                    if (nReVal != SciCam.SCI_CAMERA_OK)
                     {
-                        return (float)fNodeVal.dVal;
+                        SciCam.SCI_NODE_VAL_FLOAT fNodeVal = new SciCam.SCI_NODE_VAL_FLOAT();
+                        nReVal = mvCameraAcq.GetFloatValueEx(SciCam.SciCamDeviceXmlType.SciCam_DeviceXml_Camera, nodeName[i], ref fNodeVal);
+                        if (nReVal == SciCam.SCI_CAMERA_OK)
+                        {
+                            return Convert.ToSingle(fNodeVal.dVal);
+                        }
                     }
                     else
                     {
-                        return 0;
+                        return Convert.ToSingle(iNodeVal.nVal);
                     }
                 }
-                else
-                {
-                    return (float)iNodeVal.nVal;
-                }
+                return 0;
             }
             finally
             {