/// <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); }
/// <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; } } }
/// <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; }
/// <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); }
/// <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="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); }
/// <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; } }