Beispiel #1
0
        /// <summary>
        /// 完成一个命令.
        /// </summary>
        /// <param name="nextCmd"></param>
        private void FinishOneCommand(ElevatorCommand nextCmd)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("FinishOneCommand -- 完成一个命令: {0}", nextCmd);
            }

            if (ElevatorJobFinish != null)
            {
                ElevatorJobFinish(nextCmd);
            }

            // 下一个目标已到达.
            // 电梯开门.
            if (ElevatorOpen != null)
            {
                ElevatorOpen(this.CurrentFloor);
            }

            // 延迟效果.
            Thread.Sleep(3000);

            // 电梯关门.
            if (ElevatorClose != null)
            {
                ElevatorClose(this.CurrentFloor);
            }

            // 本单元项目已完成处理.
            // 将其从 todoList 中删除.
            todoList.Remove(nextCmd);
        }
Beispiel #2
0
        /// <summary>
        /// 添加一个 外部的命令.
        /// </summary>
        /// <param name="cmd"></param>
        public void AddNewOutsideCommand(CommandOutside cmd)
        {
            if (logger.IsInfoEnabled)
            {
                logger.InfoFormat("电梯外部的人,在{0}层,按了一下{1}的按钮!", cmd.FromFloorNum, cmd.CommandType);
            }


            // 如果外部命令是 “前往指定的楼层”
            // 那么判断, 该楼层是否已经在列表中了.
            var query =
                from data in todoList
                where data.StopAtFloorNum == cmd.FromFloorNum
                select data;

            if (cmd.CommandType == CommandOutside.CommandOutsideType.Up)
            {
                // 指定楼层上面,按了 向上按钮.
                query = query.Where(p => p.StopWhen == ElevatorRunningStatus.Up);
            }
            else
            {
                // 指定楼层上面,按了 向下按钮.
                query = query.Where(p => p.StopWhen == ElevatorRunningStatus.Down);
            }

            if (query.Count() == 0)
            {
                // todoList 数据列表中没有数据.
                // 那么 新增命令.

                // 停在哪层楼
                ElevatorCommand newCmd = new ElevatorCommand()
                {
                    StopAtFloorNum = cmd.FromFloorNum,
                };


                // 向上停? 向下停?
                if (cmd.CommandType == CommandOutside.CommandOutsideType.Up)
                {
                    newCmd.StopWhen = ElevatorRunningStatus.Up;
                }
                else
                {
                    newCmd.StopWhen = ElevatorRunningStatus.Down;
                }

                // 加入列表.
                todoList.Add(newCmd);
            }

            // 基本状态切换.
            SwitchRunningStatus();
        }
 /// <summary>
 /// 完成作业.
 /// </summary>
 /// <param name="cmd"></param>
 public void FinishJob(ElevatorCommand cmd)
 {
     if (cmd.StopAtFloorNum == this.FloorNo)
     {
         // 如果 命令代码  与 楼层代码相同.
         if (cmd.StopWhen == Elevator.ElevatorRunningStatus.Up)
         {
             // 恢复按钮颜色
             this.btnUp.BackColor = SystemColors.Control;
         }
         else if (cmd.StopWhen == Elevator.ElevatorRunningStatus.Down)
         {
             // 恢复按钮颜色
             this.btnDown.BackColor = SystemColors.Control;
         }
     }
 }
Beispiel #4
0
        /// <summary>
        /// 任务完成事件.
        /// </summary>
        /// <param name="cmd"></param>
        private void my_ElevatorJobFinish(ElevatorCommand cmd)
        {
            Invoke(new Action(() =>
              {
              for (int i = 0; i < myFloorArray.Length; i++)
              {
                  myFloorArray[i].FinishJob(cmd);
              }

              ucElevato.FinishJob(cmd);

              this.Refresh();

              }));

            // 模拟延迟 1秒.
            Thread.Sleep(1000);
        }
 /// <summary>
 /// 完成作业.
 /// </summary>
 /// <param name="cmd"></param>
 public void FinishJob(ElevatorCommand cmd)
 {
     buttonArray[cmd.StopAtFloorNum - 1].BackColor = SystemColors.Control;
 }
Beispiel #6
0
        /// <summary>
        /// 完成一个命令.
        /// </summary>
        /// <param name="nextCmd"></param>
        private void FinishOneCommand(ElevatorCommand nextCmd)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("FinishOneCommand -- 完成一个命令: {0}", nextCmd);
            }

            if (ElevatorJobFinish != null)
            {
                ElevatorJobFinish(nextCmd);
            }

            // 下一个目标已到达.
            // 电梯开门.
            if (ElevatorOpen != null)
            {
                ElevatorOpen(this.CurrentFloor);
            }

            // 延迟效果.
            Thread.Sleep(3000);

            // 电梯关门.
            if (ElevatorClose != null)
            {
                ElevatorClose(this.CurrentFloor);
            }

            // 本单元项目已完成处理.
            // 将其从 todoList 中删除.
            todoList.Remove(nextCmd);
        }
Beispiel #7
0
        /// <summary>
        /// 添加一个 外部的命令.
        /// </summary>
        /// <param name="cmd"></param>
        public void AddNewOutsideCommand(CommandOutside cmd)
        {
            if (logger.IsInfoEnabled )
            {
                logger.InfoFormat ("电梯外部的人,在{0}层,按了一下{1}的按钮!", cmd.FromFloorNum,  cmd.CommandType);
            }

            // 如果外部命令是 “前往指定的楼层”
            // 那么判断, 该楼层是否已经在列表中了.
            var query =
                from data in todoList
                where data.StopAtFloorNum == cmd.FromFloorNum
                select data;

            if (cmd.CommandType == CommandOutside.CommandOutsideType.Up)
            {
                // 指定楼层上面,按了 向上按钮.
                query = query.Where(p => p.StopWhen == ElevatorRunningStatus.Up);
            }
            else
            {
                // 指定楼层上面,按了 向下按钮.
                query = query.Where(p => p.StopWhen == ElevatorRunningStatus.Down);
            }

            if (query.Count() == 0)
            {
                // todoList 数据列表中没有数据.
                // 那么 新增命令.

                // 停在哪层楼
                ElevatorCommand newCmd = new ElevatorCommand()
                {
                    StopAtFloorNum = cmd.FromFloorNum,
                };

                // 向上停? 向下停?
                if (cmd.CommandType == CommandOutside.CommandOutsideType.Up)
                {
                    newCmd.StopWhen = ElevatorRunningStatus.Up;
                }
                else
                {
                    newCmd.StopWhen = ElevatorRunningStatus.Down;
                }

                // 加入列表.
                todoList.Add(newCmd);
            }

            // 基本状态切换.
            SwitchRunningStatus();
        }
Beispiel #8
0
        /// <summary>
        /// 获取 最接近当前楼层的 一个命令.
        /// </summary>
        /// <param name="direction"></param>
        /// <returns></returns>
        private ElevatorCommand GetNearestCommand(ElevatorRunningStatus status)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("GetNearestCommand -- 获取最接近当前楼层的一个命令:方向= {0}", status);
            }

            if (status == ElevatorRunningStatus.Up ||
                status == ElevatorRunningStatus.Ready)
            {
                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("GetNearestCommand --电梯正在向上运行.查询目前还有哪些楼层, 要在向上的过程中,停下来的。");
                }

                //  电梯正在向上运行.
                // 查询目前还有哪些楼层, 要在向上的过程中,停下来的。
                var todoQuery =
                    from data in todoList
                    where
                    // 停靠楼层大于当前楼层.
                    data.StopAtFloorNum >= this.CurrentFloor
                    // 向上停靠.
                    && data.StopWhen == ElevatorRunningStatus.Up
                    // 按楼层从小到大排序.
                    orderby data.StopAtFloorNum
                    select data;

                ElevatorCommand result = todoQuery.FirstOrDefault();


                if (result == null)
                {
                    if (logger.IsDebugEnabled)
                    {
                        logger.DebugFormat("GetNearestCommand --不存在正在向上停的楼层, 要在向下楼层进行查询。");
                    }

                    todoQuery =
                        from data in todoList
                        where
                        // 停靠楼层大于当前楼层.
                        data.StopAtFloorNum >= this.CurrentFloor
                        // 向下停靠.
                        && data.StopWhen == ElevatorRunningStatus.Down
                        // 按楼层从大到小排序.
                        orderby data.StopAtFloorNum descending
                        select data;

                    // 也就是要迁移到 最上面那个  按“向下”的按钮.
                    result = todoQuery.FirstOrDefault();
                }



                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("GetNearestCommand -Up-返回结果:{0}", result);
                }

                return(result);
            }

            if (status == ElevatorRunningStatus.Down)
            {
                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("GetNearestCommand --电梯正在向下运行.查询目前还有哪些楼层, 要在向下的过程中,停下来的。");
                }

                //  电梯正在向下运行.
                // 查询目前还有哪些楼层, 要在向下的过程中,停下来的。
                var todoQuery =
                    from data in todoList
                    where
                    // 停靠楼层小于当前楼层.
                    data.StopAtFloorNum <= this.CurrentFloor
                    // 向下停靠.
                    && data.StopWhen == ElevatorRunningStatus.Down
                    // 按楼层从大到小排序
                    orderby data.StopAtFloorNum descending
                    select data;

                ElevatorCommand result = todoQuery.FirstOrDefault();

                if (result == null)
                {
                    if (logger.IsDebugEnabled)
                    {
                        logger.DebugFormat("GetNearestCommand --不存在正在向下停的楼层, 要在向上楼层进行查询。");
                    }

                    todoQuery =
                        from data in todoList
                        where
                        // 停靠楼层小于当前楼层.
                        data.StopAtFloorNum <= this.CurrentFloor
                        // 向上停靠.
                        && data.StopWhen == ElevatorRunningStatus.Up
                        // 按楼层从小到大排序
                        orderby data.StopAtFloorNum
                        select data;

                    // 也就是要迁移到 最下面那个  按“向上”的按钮.
                    result = todoQuery.FirstOrDefault();
                }


                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("GetNearestCommand -Down-返回结果:{0}", result);
                }

                return(result);
            }

            // 其他未知状况下, 简单返回 null
            return(null);
        }
Beispiel #9
0
        /// <summary>
        /// 完成业务处理.
        /// </summary>
        public void DoJob()
        {
            if (logger.IsInfoEnabled)
            {
                logger.Info("DoJob -- 电梯开始完成 todoList 中的任务!!!");
            }


            // 基本状态切换.
            SwitchRunningStatus();

            if (todoList.Count() == 0 && this.RunningStatus != ElevatorRunningStatus.Ready)
            {
                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("没有待完成任务,即将迁移到底层,进入待机状态... 目前楼层:{0}", this.CurrentFloor);
                }

                // 如果没有 待完成任务.
                // 那么迁移到底层,进入待机状态.
                if (this.CurrentFloor > this.MinFloor)
                {
                    // 如果不是底层.
                    // 向下移动.
                    this.Down();
                }
                return;
            }


            // 如果有 待完成任务.
            // 根据 电梯当前位置、状态。 判断如何处理.

            // 当前状态为 正在向上.
            if (this.RunningStatus == ElevatorRunningStatus.Up)
            {
                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("当前状态为 正在向上!目前楼层:{0}", this.CurrentFloor);
                }

                //  电梯正在向上运行.
                // 获取下一行命令.
                ElevatorCommand nextCmd = this.GetNearestCommand(ElevatorRunningStatus.Up);
                if (nextCmd.StopAtFloorNum > this.CurrentFloor)
                {
                    // 下一个目标还没有到.
                    this.Up();
                    // 结束本单元判断处理.
                    return;
                }
                // 完成一个命令.
                FinishOneCommand(nextCmd);
                return;
            }


            // 当前状态为 正在向下.
            if (this.RunningStatus == ElevatorRunningStatus.Down)
            {
                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("当前状态为 正在向下!目前楼层:{0}", this.CurrentFloor);
                }

                //  电梯正在向下运行.

                // 获取下一行命令.
                ElevatorCommand nextCmd = this.GetNearestCommand(ElevatorRunningStatus.Down);
                if (nextCmd.StopAtFloorNum < this.CurrentFloor)
                {
                    // 下一个目标还没有到.
                    this.Down();
                    // 结束本单元判断处理.
                    return;
                }
                // 完成一个命令.
                FinishOneCommand(nextCmd);
                return;
            }
        }