LiftContext.cs 4.8 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary.lift
{
    public class LiftContext
    {
        /// <summary>
        /// 所有电梯
        /// </summary>
        static Dictionary<string, LiftStatus> lifts = new Dictionary<string, LiftStatus>();
        public static void Init()
        {
            string[] names = Common.AppConfigHelper.GetValue(Common.SettingString.Lift_Names).Split(',');
            foreach (var item in names)
            {
                lifts.Add(item, new LiftStatus());
            }
            Common.LogUtil.info($"加载电梯信息完成:{string.Join(",",names)}");
        }
        /// <summary>
        /// 电梯是否开门
        /// </summary>
        /// <param name="liftId"></param>
        /// <returns></returns>
        public static bool IsDoorOpen(string liftId,int floor)
        {
            LiftStatus liftStatus = GetLiftStatus(liftId);
            if (liftStatus.door.Equals("opened") && liftStatus.floor.Equals(floor))
                return true;
            return false;
        }
        /// <summary>
        /// 电梯关门
        /// </summary>
        /// <param name="liftId"></param>
        public static void CloseDoor(string liftId,AgvInfo agvInfo)
        {
          bool rtn=  HttpManager.CloseDoor(new service.model.DoorInfo() { liftId=liftId,sourceClient=agvInfo.Client,sourceFloor=agvInfo.Scope.Floor});
            Common.LogUtil.info($"{agvInfo.Name} 关门 {rtn}");
        }
        /// <summary>
        /// 请求使用电梯
        /// </summary>
        /// <param name="liftId"></param>
        /// <param name="missionInfo"></param>
        /// <param name="isback">是否是返回</param>
        public static void Request(string liftId,service.model.MissionInfo missionInfo,bool isback=false)
        {
            service.model.SendInInfo info;
            if(isback)
            {
                info = new service.model.SendInInfo() { };
            }
            else
            {
                info = new service.model.SendInInfo() { };
            }
            HttpManager.RequestSendIn(info);
        }
        public static void SwitchControl(string liftId, service.model.MissionInfo missionInfo)
        {

        }
        /// <summary>
        /// 电梯开门
        /// </summary>
        /// <param name="liftId"></param>
        public static void OpenDoor(string liftId,AgvInfo agvInfo)
        {
            bool rtn = HttpManager.OpenDoor(new service.model.DoorInfo() { liftId = liftId, sourceClient = agvInfo.Client, sourceFloor = agvInfo.Scope.Floor });
            Common.LogUtil.info($"{agvInfo.Name} 开门 {rtn}");
        }
        /// <summary>
        /// 运行到指定楼层
        /// </summary>
        /// <param name="liftId"></param>
        /// <param name="floor"></param>
        public static void RunTo(string liftId,int floor)
        {

        }
        /// <summary>
        /// 有架子需要离开电梯
        /// </summary>
        /// <param name="liftId"></param>
        /// <returns></returns>
        public static bool HasShelfNeedLeave(string liftId,string client,out LiftStatus liftStatus)
        {
            liftStatus = GetLiftStatus(liftId);
            if (liftStatus.destinationClient.Equals(client))
                return true;
            return false;
        }
        /// <summary>
        /// 检查该任务agv是否获得电梯控制权
        /// </summary>
        /// <param name="liftId"></param>
        /// <param name="missionId"></param>
        /// <returns></returns>
        public static bool CheckIfRequestOk(string liftId,service.model.MissionInfo mission)
        {
            LiftStatus liftStatus = GetLiftStatus(liftId);
            if (liftStatus.missionId.Equals(mission.missionId))
                return true;
            return false;
        }
        /// <summary>
        /// 获取电梯状态
        /// </summary>
        /// <param name="liftId"></param>
        /// <returns></returns>
        static LiftStatus GetLiftStatus(string liftId)
        {
            if (lifts.ContainsKey(liftId))
            {
                return lifts[liftId];
            }
            else
                return new LiftStatus();
        }
        public static string[] GetLiftNames()
        {
            return lifts.Keys.ToArray();
        }
        static void UpdateStatus(ClientStatus status)
        {
            try
            {
               LiftStatus lift =  HttpManager.UpdateStatusToLift(status);
                if(lift!=null)
                {
                    lifts[status.liftId] = lift;
                }
            }
            catch(Exception e)
            {
                Common.LogUtil.error($"上报状态给电梯失败:{status.ToString()}",e);
            }
        }

    }
}