StepInfo.cs 6.6 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public class StepInfo<T> where T : Enum
    {
        private T step;
        private string msg = "";
        public string Msg
        {
            get { return msg; }
            set {
                if (!string.IsNullOrEmpty(value))
                {
                    //不为空,且与上一个消息不一样才打印
                    if (!value.Equals(msg))
                    {
                        LogUtil.info(this.step+" : "+ value);
                    }
                }
                msg = value;
            }

        }
        private DateTime startTime = DateTime.Now;
        private List<WaitInfo> EndWaitList = new List<WaitInfo>();

        public StepInfo(T initStep)
        {
            this.step = initStep;
            this.msg = "";
        }


        /// <summary>
        /// 当前步骤是否是某个步骤
        /// </summary>
        /// <param name="step"></param>
        /// <returns></returns>
        public bool IsStep(T step)
        {
            return this.step.Equals(step);
        }
        /// <summary>
        /// 返回当前步骤
        /// </summary>
        /// <returns></returns>
        public T GetCurStep()
        {
            return this.step;
        }
        /// <summary>
        /// 当前步骤是否完成(检查是否达到等待条件)
        /// </summary>
        /// <returns></returns>
        public bool IsFinished()
        {
             return IsWaitListOk(EndWaitList);
        }

        /// <summary>
        /// 是否超时
        /// </summary>
        /// <param name="timeOutMilliseconds"></param>
        /// <returns></returns>
        public bool IsTimeOut(int timeOutMilliseconds)
        {
            TimeSpan span = DateTime.Now - startTime;
            if (span.TotalMilliseconds > timeOutMilliseconds)
            {
                return true;
            }
            return false;
        }

        /// <summary>
        /// 进入下一个步骤
        /// </summary>
        /// <param name="nextStep"></param>
        public void ToNextStep(T nextStep)
        {
            step = nextStep;
            startTime = DateTime.Now;
            EndWaitList = new List<WaitInfo>();
        }
        

        /// <summary>
        /// 添加IO等待
        /// </summary>
        /// <param name="ioType"></param>
        /// <param name="ioValue"></param>
        public void AddIoWait(string ioType, IO_VALUE ioValue, int lastTimeInMillis = 0)
        {
            WaitInfo waitInfo = new WaitInfo
            {
                IoType = ioType,
                IoValue = ioValue,
                IoLastTime = lastTimeInMillis
            };

            EndWaitList.Add(waitInfo);
        }

        public string StatusStr()
        {
            return step.ToString();
        }
        

        /// <summary>
        /// 添加等待时间
        /// </summary>
        /// <param name="milliseconds"></param>
        public void AddTimeWait(int milliseconds)
        {
            WaitInfo waitInfo = new WaitInfo
            {
                EndWaitTimeMSeconds = milliseconds
            };

            EndWaitList.Add(waitInfo);
        }

        private bool IsWaitListOk(List<WaitInfo> WaitList)
        {
            try
            {
                if (WaitList.Count <= 0)
                {
                    return true;
                }

                //当等待超过一分钟时,需要打印提示 
                TimeSpan span = DateTime.Now - startTime;
                bool isOk = true;
                foreach (WaitInfo waitInfo in WaitList)
                {
                    if (waitInfo.IsEnd)
                    {
                        continue;
                    }
                    if (waitInfo.IoType != null)
                    {
                        bool reachIoValue = IOManager.IOValue(waitInfo.IoType).Equals(waitInfo.IoValue);
                        if (reachIoValue)
                        {
                            //满足给定的IO值,计算持续时间
                            if (waitInfo.IoStartTime  == DateTime.MaxValue)
                            {
                                waitInfo.IoStartTime = DateTime.Now;
                            }

                            if(waitInfo.IoLastTime > 0)
                            {
                                //持续时间
                                TimeSpan lastTimeSpan = DateTime.Now - waitInfo.IoStartTime;
                                waitInfo.IsEnd = (lastTimeSpan.TotalMilliseconds >= waitInfo.IoLastTime);
                            }
                            else
                            {
                                waitInfo.IsEnd = true;
                            }
                        }
                        else
                        {
                            //重新计时
                            waitInfo.IoStartTime = DateTime.MinValue;
                        }
                        
                    }
                    else
                    {
                        waitInfo.IsEnd = (span.TotalMilliseconds >= waitInfo.EndWaitTimeMSeconds);
                    }

                    //NotOkMsg = " [" + waitInfo.ToStr() + "] ";
                    if (!waitInfo.IsEnd)
                    {
                        isOk = false;
                    }
                }
                return isOk;
            }
            catch (Exception ex)
            {
                LogUtil.error(step + "  Wait Error:", ex);
            }
            return false;
        }

        private class WaitInfo
        {

            /// <summary>
            /// IO类型
            /// </summary>
            public String IoType { get; set; }
            /// <summary>
            /// IO值
            /// </summary>
            public IO_VALUE IoValue { get; set; }
            /// <summary>
            /// IO信号持续时间
            /// </summary>
            public int IoLastTime { get; set; }
            /// <summary>
            /// 满足IO值的时间
            /// </summary>
            public DateTime IoStartTime = DateTime.MaxValue;
            /// <summary>
            /// 等待的毫秒
            /// </summary>
            public int EndWaitTimeMSeconds { get; set; }


            /// <summary>
            /// 是否已经结束
            /// </summary>
            public bool IsEnd { get; set; }
        }
    }

     
}