From fccc60d8897642ef5c39176b8c872b63fe819ae2 Mon Sep 17 00:00:00 2001
From: xcd <834800634@qq.com>
Date: 星期五, 20 十一月 2020 10:44:57 +0800
Subject: [PATCH] gocator添加int4类型数据,暂时注释

---
 src/Bro.Common.Device/DeviceBase/MotionCardBase.cs |  489 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 479 insertions(+), 10 deletions(-)

diff --git a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
index 4425373..ef22a40 100644
--- a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
+++ b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
@@ -1,14 +1,18 @@
-锘縰sing Bro.Common.Helper;
+锘縰sing Autofac;
+using Bro.Common.Helper;
 using Bro.Common.Interface;
 using Bro.Common.Model;
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.ComponentModel.Design;
 using System.Drawing.Design;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using System.Windows.Forms;
+using static Bro.Common.Helper.EnumHelper;
 
 namespace Bro.Common.Base
 {
@@ -16,12 +20,134 @@
     {
         public event Action<DateTime, string, IDevice, IMonitorSet> OnMonitorInvoke;
         public event Action<DateTime, IDevice, IWarningSet> OnMonitorAlarm;
+        public event Action<int, string> OnAxisAlarmRaised;
+        public event Action<int, int, int> OnAxisStatusChanged;
+        public event Action<int, int> OnAxisPositionChanged;
+        
+        public void AxisAlarmRaised(int axisIndex, string msg)
+        {
+            OnAxisAlarmRaised?.Invoke(axisIndex, msg);
+        }
 
+        public void AxisStatusChanged(int axisIndex, int preStatus, int curStatus)
+        {
+            OnAxisStatusChanged?.Invoke(axisIndex, preStatus, curStatus);
+        }
+
+        public void AxisPositionChanged(int axisIndex, int currentPosition)
+        {
+            OnAxisPositionChanged?.Invoke(axisIndex, currentPosition);
+        }
+
+        protected override void Start()
+        {
+            AxisStatusList = IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ConvertAll(a =>
+            {
+                AxisMovingStatus axisSts = new AxisMovingStatus();
+                axisSts.AxisIndex = a.AxisIndex;
+                axisSts.AxisName = a.AxisName;
+
+                return axisSts;
+            });
+
+            Task.Run(() =>
+            {
+                Monitor();
+            });
+        }
         public abstract List<AxisInfo> GetCurrentAxisInfo(params string[] axisName);
         public abstract void Monitor();
         public abstract ResponseMessage MoveToPoint(IOperationConfig opConfig);
         public abstract void ResetAlarm();
         public abstract ResponseMessage Run(IOperationConfig config);
+        /// <summary>
+        /// 娓呴櫎鐘舵��
+        /// </summary>
+        /// <param name="startAxisIndex">璧峰杞村彿</param>
+        /// <param name="count">鏁伴噺</param>
+        /// <returns></returns>
+        public abstract bool ClearStatus(int startAxisIndex, int count);
+
+        /// <summary>
+        /// 璇诲彇杞寸姸鎬�
+        /// </summary>
+        /// <param name="axisNum">杞村彿</param>
+        /// <returns></returns>
+        public abstract int GetAxisStatus(int axisNum);
+
+        /// <summary>
+        /// 浣嶇疆娓呴浂
+        /// </summary>
+        /// <param name="startAxisIndex">璧峰杞村彿</param>
+        /// <param name="count">鏁伴噺</param>
+        /// <returns></returns>
+        public abstract bool PositionReset(int startAxisIndex, int count);
+
+        public abstract bool AllAxisOn();
+
+        public abstract bool AllAxisOff();
+
+        public abstract Task<bool> AxisOnAsync(int axisNum);
+
+        public abstract Task<bool> AxisOffAsync(int axisNum);
+
+        /// <summary>
+        /// 鍗曚釜杞� 杩愬姩(鐐瑰埌鐐� jog 鍥為浂...锛�
+        /// </summary>
+        /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
+        public abstract Task<bool> SingleAxisMoving(MovingOption optionPara);
+
+        /// <summary>
+        /// 鏌愪釜杞磋繍鍔ㄥ仠姝�
+        /// </summary>
+        /// <param name="axisNum">杞村彿</param>
+        /// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param>
+        /// <returns></returns>
+        public abstract Task<bool> MoveStop(int axisNum, int option);
+
+        public virtual void ExcuteMonitorInvoke(DateTime dateTime, string invokeDevice, IDevice device, IMonitorSet monitorSet)
+        {
+            OnMonitorInvoke?.BeginInvoke(dateTime, invokeDevice, device, monitorSet, OnMethodInvoked, null);
+        }
+
+        public abstract void OnMethodInvoked(IAsyncResult ar);
+
+        public virtual void ExcuteMonitorAlarm(DateTime dateTime, IDevice device, IWarningSet warningSet)
+        {
+            OnMonitorAlarm?.BeginInvoke(dateTime, device, warningSet, null, null);
+        }
+
+        public virtual MotionCardInitialConfigBase IConfig
+        {
+            get
+            {
+                return InitialConfig as MotionCardInitialConfigBase;
+            }
+        }
+
+        /// <summary>
+        /// IO鐨勭洃鍚��
+        /// </summary>
+        public List<IOItem> MonitorValues { get; set; } = new List<IOItem>();
+
+        /// <summary>
+        /// 杞寸殑杩愬姩鐘舵�佸��
+        /// </summary>
+        public List<AxisMovingStatus> AxisStatusList { get; set; } = new List<AxisMovingStatus>();
+
+        public abstract void WriteOutput(short index, IOValue value);
+
+        #region ImmediatePause
+        /// <summary>
+        /// 鍚姩绔嬪嵆鏆傚仠
+        /// </summary>
+        public abstract void SetImmediatePause();
+
+        /// <summary>
+        /// 鎭㈠绔嬪嵆鏆傚仠
+        /// </summary>
+        public abstract void ResetImmediatePause(bool isResumeMoving);
+        #endregion
     }
 
     public class MotionCardInitialConfigBase : InitialConfigBase, IMonitorConfig
@@ -29,7 +155,7 @@
         [Category("鏉垮崱閰嶇疆")]
         [DisplayName("鍗″彿")]
         [Description("CardNum锛氬崱鍙�")]
-        public int CardNum { get; set; }
+        public int CardNum { get; set; } = 1;
 
         [Category("鏉垮崱閰嶇疆")]
         [DisplayName("鍒濆閰嶇疆鏂囦欢璺緞")]
@@ -72,6 +198,10 @@
         [Editor(typeof(ComplexCollectionEditor<IODefinition>), typeof(UITypeEditor))]
         public List<IODefinition> IODefinitionCollection { get; set; } = new List<IODefinition>();
 
+        [Category("IO閰嶇疆")]
+        [Description("true锛氳緭鍑哄彇鍙� false锛氳緭鍑轰笉鍙栧弽")]
+        public bool IsOutputReversed { get; set; } = true;
+
         #region IMonitorConfig
         [Category("鐩戝惉璁剧疆")]
         [Description("MonitorSetCollection锛氱洃鍚搷浣滈厤缃泦鍚�")]
@@ -98,32 +228,170 @@
         public List<IMonitorSet> GetAllMonitorSet()
         {
             WarningSetCollection.ForEach(m => m.Source = this.Name);
-
             MonitorSetCollection.ForEach(m => m.SourceDevice = this.Id);
             return MonitorSetCollection;
         }
         #endregion
     }
 
+    [Device("MotionCardBase", "鏉垮崱鎿嶄綔閰嶇疆鍩虹被", EnumHelper.DeviceAttributeType.OperationConfig)]
     public class MotionCardOperationConfigBase : OperationConfigBase, IComplexDisplay
     {
-        [Category("IO鎿嶄綔閰嶇疆")]
+        [Category("鏉垮崱鎿嶄綔")]
+        [Description("鏉垮崱鎿嶄綔閰嶇疆鍩虹被闆嗗悎锛屼緷娆℃墽琛�")]
+        [TypeConverter(typeof(CollectionCountConvert))]
+        [Editor(typeof(MotionCardOperationSetEditor), typeof(UITypeEditor))]
+        public List<MotionCardOperationSet> OperationCollection { get; set; } = new List<MotionCardOperationSet>();
+
+        public string GetDisplayText()
+        {
+            //OperationCollection.ForEach(o =>
+            //{
+            //    o.MotionCardId = DeviceId;
+            //});
+
+            return string.Join(" ", OperationCollection.Select(u => u.GetDisplayText()));
+        }
+    }
+
+    public class MotionCardOperationSetEditor : ComplexCollectionEditor<MotionCardOperationSet>
+    {
+        public MotionCardOperationSetEditor(Type type) : base(type) { }
+
+        IOperationConfig opConfig = null;
+        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+        {
+            if (context.Instance is IOperationConfig config && value is List<MotionCardOperationSet> setList)
+            {
+                opConfig = config;
+                setList.ForEach(set => set.MotionCardId = opConfig.DeviceId);
+            }
+
+            return base.EditValue(context, provider, value);
+        }
+
+        protected override object CreateInstance(Type itemType)
+        {
+            object obj = base.CreateInstance(itemType);
+
+            if (obj is MotionCardOperationSet set)
+            {
+                set.MotionCardId = opConfig?.DeviceId;
+            }
+
+            return obj;
+        }
+
+    }
+
+    [Device("MotionOperationSet", "杩愬姩鎿嶄綔閰嶇疆鍩虹被", EnumHelper.DeviceAttributeType.OperationConfig)]
+    public class MotionCardOperationSet : IComplexDisplay
+    {
+        [Category("1.IO鎿嶄綔閰嶇疆")]
+        [DisplayName("1.IO棰勬鏌�")]
         [Description("IO棰勬鏌ュ畾涔夐泦鍚�")]
         [TypeConverter(typeof(CollectionCountConvert))]
-        [Editor(typeof(IORefrenceItemCollectionEditor),typeof(UITypeEditor))]
+        [Editor(typeof(IORefrenceItemCollectionEditor), typeof(UITypeEditor))]
         public List<IORefrenceItem> PreCheckIOCollection { get; set; } = new List<IORefrenceItem>();
 
-        [Category("IO鎿嶄綔閰嶇疆")]
+        [Category("1.IO鎿嶄綔閰嶇疆")]
+        [Description("瓒呮椂璁剧疆锛屽崟浣嶏細ms")]
+        [DisplayName("2.IO棰勬鏌ヨ秴鏃�")]
+        public int PreCheckIOTimeout { get; set; } = 0;
+
+        [Category("1.IO鎿嶄綔閰嶇疆")]
+        [DisplayName("3.IO杈撳嚭")]
         [Description("IO杈撳嚭瀹氫箟闆嗗悎")]
         [TypeConverter(typeof(CollectionCountConvert))]
+        [Editor(typeof(IORefrenceItemCollectionEditor), typeof(UITypeEditor))]
         public List<IORefrenceItem> IOOutputCollection { get; set; } = new List<IORefrenceItem>();
 
-        [Category("IO鎿嶄綔閰嶇疆")]
+        [Category("1.IO鎿嶄綔閰嶇疆")]
+        [DisplayName("4.IO杈撳嚭纭")]
         [Description("IO纭瀹氫箟闆嗗悎")]
         [TypeConverter(typeof(CollectionCountConvert))]
+        [Editor(typeof(IORefrenceItemCollectionEditor), typeof(UITypeEditor))]
         public List<IORefrenceItem> IOConfirmCollection { get; set; } = new List<IORefrenceItem>();
 
-        [Category("鏉垮崱杩愬姩閰嶇疆")]
+        [Category("1.IO鎿嶄綔閰嶇疆")]
+        [Description("瓒呮椂璁剧疆锛屽崟浣嶏細ms")]
+        [DisplayName("5.IO杈撳嚭纭瓒呮椂")]
+        public int IOConfirmTimeout { get; set; } = 0;
+
+        [Category("2.鏉垮崱杩愬姩閰嶇疆")]
+        [DisplayName("杩愬姩閰嶇疆闆嗗悎")]
+        [Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")]
+        [TypeConverter(typeof(CollectionCountConvert))]
+        [Editor(typeof(MovingOpsCollectionEditor), typeof(UITypeEditor))]
+        public List<MovingOption> MovingOps { get; set; } = new List<MovingOption>();
+
+        [Category("3.杩愬姩寤舵椂")]
+        [Description("鎿嶄綔鍓嶅欢鏃讹紝鍗曚綅ms")]
+        public int DelayBefore { get; set; } = 0;
+
+        [Category("3.杩愬姩寤舵椂")]
+        [Description("鎿嶄綔鍚庡欢鏃讹紝鍗曚綅ms")]
+        public int DelayAfter { get; set; } = 0;
+
+        public string MotionCardId = "";
+
+        //[Category("鏉垮崱杩愬姩閰嶇疆")]
+        //[DisplayName("杩愬姩閰嶇疆闆嗗悎")]
+        //[Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")]
+        //[TypeConverter(typeof(ComplexObjectConvert))]
+        //[Editor(typeof(PropertyObjectEditor), typeof(UITypeEditor))]
+        //public MotionOperationCollection MotionOperationCollection { get; set; } = new MotionOperationCollection();
+
+
+        public string GetDisplayText()
+        {
+            string preCheck = "";
+            PreCheckIOCollection.ForEach(i =>
+            {
+                preCheck += i.GetDisplayText() + " ";
+            });
+            if (preCheck != "")
+            {
+                preCheck = " 棰勬锛�" + preCheck;
+            }
+
+            string output = "";
+            IOOutputCollection.ForEach(i =>
+            {
+                output += i.GetDisplayText() + " ";
+            });
+            if (output != "")
+            {
+                output = " 杈撳嚭锛�" + output;
+            }
+            string confirm = "";
+            IOConfirmCollection.ForEach(i =>
+            {
+                confirm += i.GetDisplayText() + " ";
+            });
+            if (confirm != "")
+            {
+                confirm = " 纭锛�" + confirm;
+            }
+
+            string moving = "";
+            MovingOps.ForEach(i =>
+            {
+                moving += i.GetDisplayText() + " ";
+            });
+
+            if (moving != "")
+            {
+                moving = " 杩愬姩锛�" + moving;
+            }
+
+            return (preCheck + output + confirm + moving).Trim();
+        }
+    }
+
+    public class MotionOperationCollection : OperationConfigBase, IComplexDisplay
+    {
+        [Category("杩愬姩閰嶇疆")]
         [DisplayName("杩愬姩閰嶇疆闆嗗悎")]
         [Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")]
         [TypeConverter(typeof(CollectionCountConvert))]
@@ -132,9 +400,210 @@
 
         public string GetDisplayText()
         {
-            throw new NotImplementedException();
+            return $"{string.Join(" ", MovingOps.Select(u => u.GetDisplayText()))}";
         }
     }
 
-    
+    //[Device("MotionCardOperationConfigCollection", "鏉垮崱鎿嶄綔閰嶇疆鍩虹被闆嗗悎", EnumHelper.DeviceAttributeType.OperationConfig)]
+    //public class MotionCardOperationConfigCollection : OperationConfigBase
+    //{
+    //    [Category("澶嶄綅鎿嶄綔")]
+    //    [Description("鏉垮崱鎿嶄綔閰嶇疆鍩虹被闆嗗悎锛屼緷娆℃墽琛�")]
+    //    [TypeConverter(typeof(CollectionCountConvert))]
+    //    [Editor(typeof(ComplexCollectionEditor<MotionCardOperationConfigBase>), typeof(UITypeEditor))]
+    //    public List<MotionCardOperationConfigBase> MotionCardOpsCollection { get; set; } = new List<MotionCardOperationConfigBase>();
+    //}
+
+    public class IORefrenceItemCollectionEditor : CollectionEditor
+    {
+        protected override CollectionForm CreateCollectionForm()
+        {
+            var form = base.CreateCollectionForm();
+
+            var prop = form.GetType().GetField("propertyBrowser", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+
+            if (prop != null)
+            {
+                if (prop.GetValue(form) is PropertyGrid grid)
+                {
+                    grid.HelpVisible = true;
+                    grid.ToolbarVisible = false;
+                }
+            }
+
+            return form;
+        }
+
+        protected override object CreateInstance(Type itemType)
+        {
+            if (itemType == typeof(IORefrenceItem))
+            {
+                IORefrenceItem item = new IORefrenceItem();
+                if (this.Context.Instance is MotionCardOperationSet set)
+                {
+                    using (var scope = GlobalVar.Container.BeginLifetimeScope())
+                    {
+                        List<IDevice> deviceList = scope.Resolve<List<IDevice>>();
+
+                        var device = deviceList.FirstOrDefault(u => u.Id == set.MotionCardId);
+
+                        if (device != null && (device is MotionCardBase motionCard))
+                        {
+                            item.IOItemSource = (motionCard.InitialConfig as MotionCardInitialConfigBase).IODefinitionCollection;
+                        }
+                    }
+                }
+
+                return item;
+            }
+
+            return base.CreateInstance(itemType);
+        }
+
+        //protected override object[] GetItems(object editValue)
+        //{
+        //    return base.GetItems(editValue);
+        //}
+
+        //protected override object SetItems(object editValue, object[] value)
+        //{
+        //    return base.SetItems(editValue, value);
+        //}
+
+        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+        {
+            if (context.Instance is MotionCardOperationSet set)
+            {
+                if (string.IsNullOrWhiteSpace(set.MotionCardId))
+                {
+                    return base.EditValue(context, provider, value);
+                }
+
+                using (var scope = GlobalVar.Container.BeginLifetimeScope())
+                {
+                    List<IDevice> deviceList = scope.Resolve<List<IDevice>>();
+
+                    var device = deviceList.FirstOrDefault(u => u.Id == set.MotionCardId);
+
+                    if (device == null)
+                    {
+                        return base.EditValue(context, provider, value);
+                    }
+
+                    if (device is MotionCardBase motionCard)
+                    {
+                        if (value is List<IORefrenceItem> items)
+                        {
+                            items.ForEach(item =>
+                            {
+                                item.IOItemSource = (motionCard.InitialConfig as MotionCardInitialConfigBase).IODefinitionCollection;
+                            });
+                        }
+                    }
+                }
+            }
+
+            return base.EditValue(context, provider, value);
+        }
+
+        public IORefrenceItemCollectionEditor(Type type) : base(type)
+        {
+        }
+
+        /// <summary> 
+        /// 闄愬埗涓�娆¢�変竴涓疄渚� 
+        /// </summary> 
+        /// <returns></returns> 
+        protected override bool CanSelectMultipleInstances()
+        {
+            return false;
+        }
+
+        /// <summary> 
+        /// 鎸囧畾鍒涘缓鐨勫璞$被鍨� 
+        /// </summary> 
+        /// <returns></returns> 
+        protected override Type CreateCollectionItemType()
+        {
+            return typeof(IORefrenceItem);
+        }
+
+        protected override string GetDisplayText(object value)
+        {
+            if (value is IComplexDisplay)
+            {
+                return (value as IComplexDisplay).GetDisplayText();
+            }
+
+            return base.GetDisplayText(value);
+        }
+
+        //protected override void DestroyInstance(object instance)
+        //{
+        //    base.DestroyInstance(instance);//閲嶈锛佽嚜鍔ㄥ垹闄ょ粍浠剁殑璁捐鏃朵唬鐮侊紒 
+        //}
+    }
+
+    public class MovingOpsCollectionEditor : ComplexCollectionEditor<MovingOption>
+    {
+        public MovingOpsCollectionEditor(Type type) : base(type)
+        {
+        }
+
+        MotionCardBase motionCard = null;
+        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+        {
+            if (context.Instance is MotionCardOperationSet set)
+            {
+                if (!string.IsNullOrWhiteSpace(set.MotionCardId))
+                {
+                    using (var scope = GlobalVar.Container.BeginLifetimeScope())
+                    {
+                        var deviceList = scope.Resolve<List<IDevice>>();
+                        if (deviceList != null)
+                        {
+                            motionCard = deviceList.FirstOrDefault(u => u.Id == set.MotionCardId) as MotionCardBase;
+                        }
+                    }
+                }
+
+                if (motionCard != null && value is List<MovingOption> ops)
+                {
+                    ops.ForEach(o => o.SetAxisSetting(motionCard.IConfig.AxisSettings));
+                }
+            }
+
+            return base.EditValue(context, provider, value);
+        }
+
+        protected override object SetItems(object editValue, object[] value)
+        {
+            Array.ForEach(value, v =>
+             {
+                 if (v is MovingOption op && motionCard != null)
+                 {
+                     op.SetAxisSetting(motionCard.IConfig.AxisSettings);
+                 }
+             });
+
+            return base.SetItems(editValue, value);
+        }
+        ///// <summary> 
+        ///// 闄愬埗涓�娆¢�変竴涓疄渚� 
+        ///// </summary> 
+        ///// <returns></returns> 
+        //protected override bool CanSelectMultipleInstances()
+        //{
+        //    return false;
+        //}
+        ///// <summary> 
+        ///// 鎸囧畾鍒涘缓鐨勫璞$被鍨� 
+        ///// </summary> 
+        ///// <returns></returns> 
+        //protected override Type CreateCollectionItemType()
+        //{
+        //    return typeof(MovingOption);
+        //}
+    }
+
 }

--
Gitblit v1.8.0