From aaae1139f2bb3a55910fff0aa907b3ba6395deea Mon Sep 17 00:00:00 2001 From: xcd <834800634@qq.com> Date: 星期二, 30 六月 2020 08:54:06 +0800 Subject: [PATCH] 添加goactor驱动 --- src/Bro.Device.Gocator/GocatorDriver.cs | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 213 insertions(+), 6 deletions(-) diff --git a/src/Bro.Device.Gocator/GocatorDriver.cs b/src/Bro.Device.Gocator/GocatorDriver.cs index 0290bd1..bdfac10 100644 --- a/src/Bro.Device.Gocator/GocatorDriver.cs +++ b/src/Bro.Device.Gocator/GocatorDriver.cs @@ -1,9 +1,14 @@ 锘縰sing Bro.Common.Base; using Bro.Common.Helper; using Bro.Common.Interface; +using Lmi3d.GoSdk; +using Lmi3d.GoSdk.Messages; +using Lmi3d.Zen; +using Lmi3d.Zen.Io; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; @@ -12,34 +17,236 @@ [Device("Gocator", "Gocator婵�鍏夋壂鎻忎华", EnumHelper.DeviceAttributeType.Device)] public class GocatorDriver : CameraBase { + #region CameraBase public override IOperationConfig GetOperationConfigFromDevice() { - throw new NotImplementedException(); + var opConfig = new GocatorOperationConfig(); + GoSetup setup = sensor.Setup; + opConfig.Exposure = (float)setup.GetExposure(GoRole.Main); + opConfig.JobName = sensor.DefaultJob; + + return opConfig; } public override void Snapshot() { - throw new NotImplementedException(); + if (IIConfig.IsAsyncMode) + { + + } + else + { + GoDataSet dataSet = null; + + try + { + dataSet = system.ReceiveData(IIConfig.SnapshotTimeout); + } + catch (Exception ex) + { + LogAsync(DateTime.Now, $"{Name}鑾峰彇鍥惧儚寮傚父", ex.GetExceptionMessage()); + return; + } + + HandleGoData(dataSet); + } } + private void HandleGoData(GoDataSet dataSet) + { + if (dataSet == null) + return; + + for (UInt32 i = 0; i < dataSet.Count; i++) + { + GoDataMsg dataObj = (GoDataMsg)dataSet.Get(i); + switch (dataObj.MessageType) + { + //case GoDataMessageType.Stamp: + // { + // GoStampMsg stampMsg = (GoStampMsg)dataObj; + // for (UInt32 j = 0; j < stampMsg.Count; j++) + // { + // GoStamp stamp = stampMsg.Get(j); + // Console.WriteLine("Frame Index = {0}", stamp.FrameIndex); + // Console.WriteLine("Time Stamp = {0}", stamp.Timestamp); + // Console.WriteLine("Encoder Value = {0}", stamp.Encoder); + // } + // } + // break; + case GoDataMessageType.Surface: + { + GoSurfaceMsg surfaceMsg = (GoSurfaceMsg)dataObj; + long width = surfaceMsg.Width; + long height = surfaceMsg.Length; + long bufferSize = width * height; + IntPtr bufferPointer = surfaceMsg.Data; + + //Console.WriteLine("Whole Part Height Map received:"); + //Console.WriteLine(" Buffer width: {0}", width); + //Console.WriteLine(" Buffer height: {0}", height); + + //short[] ranges = new short[bufferSize]; + //Marshal.Copy(bufferPointer, ranges, 0, ranges.Length); + + Generate16GrayImageByPointer((int)(width / 1), (int)(height / 1), bufferPointer, ""); + } + break; + //case GoDataMessageType.SurfaceIntensity: + // { + // GoSurfaceIntensityMsg surfaceMsg = (GoSurfaceIntensityMsg)dataObj; + // long width = surfaceMsg.Width; + // long height = surfaceMsg.Length; + // long bufferSize = width * height; + // IntPtr bufferPointeri = surfaceMsg.Data; + + // //Console.WriteLine("Whole Part Intensity Image received:"); + // //Console.WriteLine(" Buffer width: {0}", width); + // //Console.WriteLine(" Buffer height: {0}", height); + // //byte[] ranges = new byte[bufferSize]; + // //Marshal.Copy(bufferPointeri, ranges, 0, ranges.Length); + // //GenerateGrayImageByPointer((int)width, (int)height, bufferPointeri, ""); + // } + // break; + } + } + } + + public override ImageSet Snapshot(IOperationConfig config) + { + ImageSet imgSet = base.Snapshot(config); + + return imgSet; + } + + + float _currentExposure = 0; + string _currentJob = ""; public override void UploadOperationConfig(IOperationConfig config) { - throw new NotImplementedException(); + if (config is GocatorOperationConfig opConfig) + { + if (opConfig.Exposure > 0 && opConfig.Exposure != _currentExposure) + { + sensor.Setup.SetExposure(GoRole.Main, opConfig.Exposure); + _currentExposure = opConfig.Exposure; + } + + if (!string.IsNullOrWhiteSpace(opConfig.JobName) && _currentJob != opConfig.JobName) + { + _currentJob = sensor.DefaultJob = opConfig.JobName; + } + + sensor.Flush(); + } } protected override void Init() { - throw new NotImplementedException(); + KApiLib.Construct(); + GoSdkLib.Construct(); + + system = new GoSystem(); + + if (IIConfig.IsUseAccelerator) + { + accelerator = new GoAccelerator(); + } + + KIpAddress ip = KIpAddress.Parse(IConfig.CameraIP); + + if (IIConfig.IsUseAccelerator) + { + accelerator.Start(); + } + + sensor = system.FindSensorByIpAddress(ip); + + if (IIConfig.IsUseAccelerator) + { + accelerator.Attach(sensor); + } + sensor.Connect(); + + if (IIConfig.IsUseAccelerator) + { + sensor.Flush(); + accelerator.Start(); + } + + sensor.Setup.ScanMode = GoMode.Surface; + + system.EnableData(true); + + if (IIConfig.IsAsyncMode) + { + system.SetDataHandler(onData); + } + + _currentExposure = (float)sensor.Setup.GetExposure(GoRole.Main); + if (IIConfig.DefaultExposure > 0 && _currentExposure != IIConfig.DefaultExposure) + { + sensor.Setup.SetExposure(GoRole.Main, IIConfig.DefaultExposure); + _currentExposure = (float)sensor.Setup.GetExposure(GoRole.Main); + } + + _currentJob = sensor.DefaultJob; + if (!string.IsNullOrWhiteSpace(IIConfig.DefaultJob) && _currentJob != IIConfig.DefaultJob) + { + _currentJob = sensor.DefaultJob = IIConfig.DefaultJob; + } + + sensor.Flush(); + } + + protected override void Start() + { + base.Start(); + + if (IIConfig.IsAsyncMode) + system.Start(); + } + + protected override void Stop() + { + base.Stop(); + + if (IIConfig.IsAsyncMode) + system.Stop(); + + if (IIConfig.IsUseAccelerator) + { + accelerator.Stop(); + } + + sensor.Disconnect(); } protected override void Pause() { - throw new NotImplementedException(); } protected override void Resume() { - throw new NotImplementedException(); + } + #endregion + + GoSystem system = null; + GoAccelerator accelerator = null; + GoSensor sensor = null; + + public GocatorInitialConfig IIConfig + { + get => InitialConfig as GocatorInitialConfig; + } + + /// <summary> + /// 寮傛妯″紡鑾峰彇鏁版嵁 + /// </summary> + /// <param name="data"></param> + private void onData(KObject data) + { + GoDataSet dataSet = (GoDataSet)data; } } } -- Gitblit v1.8.0