From 5918194fccdb2a2303e713b8d2f3335243b9e2ef Mon Sep 17 00:00:00 2001
From: wells.liu <wells.liu@broconcentric.com>
Date: 星期二, 07 七月 2020 14:53:13 +0800
Subject: [PATCH] 板卡驱动

---
 src/Bro.Device.GTSCard/GTSCardDriver.cs |  132 ++++++++++++++++++++++++++++++++++---------
 1 files changed, 103 insertions(+), 29 deletions(-)

diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs
index 28e82b1..c2cc8e6 100644
--- a/src/Bro.Device.GTSCard/GTSCardDriver.cs
+++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs
@@ -37,6 +37,13 @@
         /// </summary>
         bool _isResetting = false;
 
+        /// <summary>
+        /// 杩愬姩杞寸珛鍗虫殏鍋�
+        /// </summary>
+        Dictionary<int, ManualResetEvent> axisImmediatePauseHandleDict = new Dictionary<int, ManualResetEvent>();
+
+        Dictionary<int, CancellationTokenSource> axisMoveCancelDict = new Dictionary<int, CancellationTokenSource>();
+
         public void SetResetFlag(bool isReset)
         {
             _isResetting = isReset;
@@ -52,16 +59,24 @@
         protected override void Init()
         {
             InitialMotionCard();
+            axisImmediatePauseHandleDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new ManualResetEvent(true));
+            axisMoveCancelDict = IConfig.AxisSettings.ToDictionary(a => a.AxisIndex, a => new CancellationTokenSource());
+
+            axisMoveCancelDict.Values.ToList().ForEach(c =>
+            {
+                c = new CancellationTokenSource();
+            });
         }
 
+        ManualResetEvent _pauseHandle = new ManualResetEvent(true);
         protected override void Pause()
         {
-            throw new NotImplementedException();
+
         }
 
         protected override void Resume()
         {
-            throw new NotImplementedException();
+
         }
 
         protected override void Start()
@@ -83,13 +98,16 @@
         public override ResponseMessage Run(IOperationConfig config)
         {
             ResponseMessage responseMessage = new ResponseMessage();
-            var motionCardOperationConfig = config as MotionCardOperationConfigBase;
-            foreach (var operationSet in motionCardOperationConfig.OperationCollection)
+            if (config is MotionCardOperationConfigBase motionCardOperationConfig)
             {
-                responseMessage = RunOperationSet(operationSet);
-                if (!responseMessage.Result)
+                _pauseHandle.WaitOne();
+                foreach (var operationSet in motionCardOperationConfig.OperationCollection)
                 {
-                    return responseMessage;
+                    responseMessage = RunOperationSet(operationSet);
+                    if (!responseMessage.Result)
+                    {
+                        return responseMessage;
+                    }
                 }
             }
             return responseMessage;
@@ -185,6 +203,43 @@
         }
         #endregion
 
+        #region ImmediatePause
+        /// <summary>
+        /// 鍚姩绔嬪嵆鏆傚仠
+        /// </summary>
+        public void SetImmediatePause()
+        {
+            if (!_isResetting)
+            {
+                var immediatePauseAxis = IConfig.AxisSettings.Where(u => u.IsImmediatePause).Select(u => u.AxisIndex).ToList();
+
+                immediatePauseAxis.ForEach(async axisIndex =>
+                {
+                    axisImmediatePauseHandleDict[axisIndex].Reset();
+
+                    axisMoveCancelDict[axisIndex].Cancel();
+
+                    await MoveStop(axisIndex, 0);
+                });
+            }
+        }
+
+        /// <summary>
+        /// 鎭㈠绔嬪嵆鏆傚仠
+        /// </summary>
+        public void ResetImmediatePause()
+        {
+            var immediatePauseAxis = IConfig.AxisSettings.Where(u => u.IsImmediatePause).Select(u => u.AxisIndex).ToList();
+
+            immediatePauseAxis.ForEach(axisIndex =>
+            {
+                axisMoveCancelDict[axisIndex] = new CancellationTokenSource();
+
+                axisImmediatePauseHandleDict[axisIndex].Set();
+            });
+        }
+        #endregion
+
         #region GTSCard
 
         /// <summary>
@@ -266,19 +321,22 @@
         public override ResponseMessage MoveToPoint(IOperationConfig opConfig)
         {
             ResponseMessage responseMessage = new ResponseMessage();
-            var gtsOperationCollection = opConfig as MotionOperationCollection;
-            List<Task<bool>> taskList = new List<Task<bool>>();
-            foreach (var movingOp in gtsOperationCollection.MovingOps)
+            if (opConfig is MotionOperationCollection gtsOperationCollection)
             {
-                var task = SingleAxisMoving(movingOp);
-                taskList.Add(task);
-            }
+                _pauseHandle.WaitOne();
+                List<Task<bool>> taskList = new List<Task<bool>>();
+                foreach (var movingOp in gtsOperationCollection.MovingOps)
+                {
+                    var task = SingleAxisMoving(movingOp);
+                    taskList.Add(task);
+                }
 
-            Task.WaitAll(taskList.ToArray());
-            responseMessage.Result = taskList.All(u => u.GetAwaiter().GetResult());
-            if (!responseMessage.Result)
-            {
-                responseMessage.Message = $"鐐逛綅杩愬姩寮傚父";
+                Task.WaitAll(taskList.ToArray());
+                responseMessage.Result = taskList.All(u => u.GetAwaiter().GetResult());
+                if (!responseMessage.Result)
+                {
+                    responseMessage.Message = $"鐐逛綅杩愬姩寮傚父";
+                }
             }
             return responseMessage;
         }
@@ -322,6 +380,8 @@
                 {
                     if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false)
                     {
+                        axisImmediatePauseHandleDict[optionPara.AxisIndex].WaitOne();
+
                         string _position = "";
                         string motionType = optionPara.MoveMode == EnumHelper.MotionMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString();
 
@@ -472,7 +532,7 @@
 
                     if (ret != (short)GTSRetCode.GRCRunOK)
                     {
-                        LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "APS_absolute_move寮傚父", "閿欒鐮侊細" + ret + ";" + "閲嶈瘯娆℃暟锛�" + repeatTime);
+                        LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "JogMove寮傚父", "閿欒鐮侊細" + ret + ";" + "閲嶈瘯娆℃暟锛�" + repeatTime);
                         Thread.Sleep(10);
                     }
                     repeatTime--;
@@ -552,7 +612,7 @@
                 repeatTime = 1000;
                 do
                 {
-                    isStop = IsStop((short)IConfig.CardNum, (short)optionPara.AxisIndex);
+                    isStop = IsStop((short)optionPara.AxisIndex);
                     Thread.Sleep(50);
                     repeatTime--;
                 } while (!isStop && repeatTime > 0);
@@ -575,6 +635,8 @@
         {
             try
             {
+                axisImmediatePauseHandleDict[optionPara.AxisIndex].WaitOne();
+
                 if (_isResetting)
                 {
                     LogAsync(DateTime.Now, "澶嶄綅杩囩▼寮傚父", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄥ浣嶈繃绋嬩腑杩愬姩");
@@ -624,7 +686,7 @@
                 repeatTime = 1000;
                 do
                 {
-                    isStop = IsStop((short)IConfig.CardNum, (short)optionPara.AxisIndex);
+                    isStop = IsStop((short)optionPara.AxisIndex);
                     Thread.Sleep(50);
                     repeatTime--;
                 } while (!isStop && repeatTime > 0);
@@ -667,7 +729,7 @@
                 int repeatTime = 100;
                 do
                 {
-                    isStop = IsStop((short)IConfig.CardNum, (short)axisNum);
+                    isStop = IsStop((short)axisNum);
                     Thread.Sleep(10);
                     repeatTime--;
                 } while (!isStop && repeatTime > 0);
@@ -799,18 +861,29 @@
         /// <param name="cardNum">鏉垮崱鍙�</param>
         /// <param name="axisNum">杞村彿</param>
         /// <returns></returns>
-        public bool IsStop(short cardNum, short axisNum)
+        public bool IsStop(short axisNum)
+        {
+            int sts = GetAxisStatus(axisNum);
+            if ((sts & 0x400) == 0) return true;//鍋滄杩斿洖true
+            else return false;              //杩愯涓繑鍥瀎alse
+        }
+
+        /// <summary>
+        /// 璇诲彇杞寸姸鎬�
+        /// </summary>
+        /// <param name="cardNum">鏉垮崱鍙�</param>
+        /// <param name="axisNum">杞村彿</param>
+        /// <returns></returns>
+        public int GetAxisStatus(int axisNum)
         {
             lock (moveLock)
             {
                 int sts = 0;
                 uint pclock = 0;
-                GTSCardAPI.GT_GetSts(cardNum, axisNum, out sts, 1, out pclock);
-                if ((sts & 0x400) == 0) return true;//鍋滄杩斿洖true
-                else return false;              //杩愯涓繑鍥瀎alse
+                GTSCardAPI.GT_GetSts((short)IConfig.CardNum, (short)axisNum, out sts, 1, out pclock);
+                return sts;
             }
         }
-
         #endregion
 
         #region IMonitor
@@ -827,6 +900,8 @@
                 axisMovingStatus.Destination = Convert.ToInt32(GetPrfPosition(axisMovingStatus.AxisIndex));
                 axisMovingStatus.CurVelocity = GetVelocity(axisMovingStatus.AxisIndex);
                 axisMovingStatus.PrfVelocity = GetPrfVelocity(axisMovingStatus.AxisIndex);
+                axisMovingStatus.AxisStatus = GetAxisStatus(axisMovingStatus.AxisIndex);
+
                 axisMovingStatusesList.Add(axisMovingStatus);
 
             }
@@ -997,12 +1072,11 @@
         public override void ResetAlarm()
         {
             int axis_sts;
-            uint clk;
             var axisSettings = IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled);
             GTSCardAPI.GT_ClrSts((short)IConfig.CardNum, 1, (short)axisSettings.Count);
             foreach (var axisSetting in axisSettings)
             {
-                GTSCardAPI.GT_GetSts((short)IConfig.CardNum, (short)axisSetting.AxisIndex, out axis_sts, 1, out clk);
+                axis_sts = GetAxisStatus((short)axisSetting.AxisIndex);
                 if ((axis_sts & 0x200) == 0)
                 {
                     var rst = GTSCardAPI.GT_AxisOn((short)IConfig.CardNum, (short)axisSetting.AxisIndex);

--
Gitblit v1.8.0