Beispiel #1
0
 void OnNotice(NoticeEventArgs e)
 {
     if (this.Notice != null)
     {
         this.Notice(this, e);
     }
     else
     {
         Trace.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss")}] 线程{Thread.CurrentThread.ManagedThreadId}:{e.Log}");
     }
 }
Beispiel #2
0
        private void ElevatorService_NoticeEvent(object sender, NoticeEventArgs e)
        {
            if (txtLog.InvokeRequired)
            {
                Invoke(LocalThreadAction, sender, e);
            }
            else
            {
                string    msg = DateTime.Now.ToString("mm:ss fff ");
                Displayer lcd = displayerList.Find(x => x.ID == e.ElevatorID);
                #region 消息判断
                msg += e.ElevatorID > 0 ? $"【{e.ElevatorID}】号电梯 " : "";
                switch (e.Status)
                {
                case StatusStyle.Running:
                    msg += $"运行中({e.Direction})";
                    lcd.UpdateDockMsg(e.ElevatorID, false);
                    break;

                case StatusStyle.Arrive:
                    msg += $"到达{e.Floor}层({e.Direction})";
                    lcd.MoveTo(e.Floor);
                    lcd.SetFloorNumberAndDirection(new OutsideCall {
                        Floor = e.Floor, Direction = e.Direction
                    });
                    break;

                case StatusStyle.Opening:
                    SetCallButton(ElevatorService.GetLightUpList().ToArray());
                    break;

                case StatusStyle.Closing:
                    lcd.UpdateDockMsg(e.ElevatorID, true);
                    break;

                case StatusStyle.Call:
                    msg += $"外呼:";
                    SetCallButton(ElevatorService.GetLightUpList().ToArray());
                    break;

                case StatusStyle.PersonIn:
                    lcd.SetPersonCount(ElevatorService.GetPersonCount(e.ElevatorID));
                    break;

                case StatusStyle.PersonOut:
                    lcd.SetPersonCount(ElevatorService.GetPersonCount(e.ElevatorID));
                    break;
                }
                #endregion
                msg += e.Msg;
                msg += Environment.NewLine;//换行
                txtLog.AppendText(msg);
            }
        }
Beispiel #3
0
 internal bool OnNotice(NoticeEventArgs e)
 {
     this.Notice?.Invoke(this, e);
     return(this.Notice != null);
 }
Beispiel #4
0
 void OnNotice(NoticeEventArgs e)
 {
     this.Notice?.Invoke(this, e);
 }
Beispiel #5
0
        private static void Elev_NoticeEvent(object sender, NoticeEventArgs e)
        {
            Elevator elev = (Elevator)sender;

            NoticeEvent(sender, e);
            switch (e.Status)
            {
            case StatusStyle.Arrive:
                #region 到达:如果有下梯或上梯的则“开门”,判断是否要“调头”,是否“前进”
                if (elev.CurrentFloor == Building.AboveFloorCount || elev.CurrentFloor == -Building.UnderFloorCount) //电梯到顶或到底
                {
                    elev.Direction = elev.Direction == DirectionStyle.Up ? DirectionStyle.Down : DirectionStyle.Up;  //调头
                    elev.OpenDoorAsync();
                    return;
                }
                if (elev.PersonList.Exists(x => x.ToFloor == elev.CurrentFloor) || elev.ReachList.Exists(x => x.Direction == elev.Direction && x.Floor == elev.CurrentFloor))    //有下梯或同方向上梯的
                {
                    elev.OpenDoorAsync();
                    return;
                }
                if (elev.PersonList.Count == 0)
                {
                    if (elev.ReachList.Count == 0)    //无内呼 + 无外呼,则“空闲”
                    {
                        elev.Status    = StatusStyle.Free;
                        elev.Direction = DirectionStyle.None;
                    }
                    else if ((elev.Direction == DirectionStyle.Up && !elev.ReachList.Exists(x => x.Floor > elev.CurrentFloor)) || (elev.Direction == DirectionStyle.Down && !elev.ReachList.Exists(x => x.Floor < elev.CurrentFloor)))
                    {
                        elev.Direction = elev.Direction == DirectionStyle.Up ? DirectionStyle.Down : DirectionStyle.Up;    //调头
                        if (elev.ReachList.Exists(x => x.Floor == elev.CurrentFloor && x.Direction == elev.Direction))
                        {
                            elev.OpenDoorAsync();
                        }
                        else
                        {
                            elev.RunAsync();
                        }
                    }
                    else
                    {
                        elev.RunAsync();    //前进
                    }
                }
                else
                {
                    elev.RunAsync();    //前进
                }
                #endregion
                break;

            case StatusStyle.Opened:
                #region 开门后:根据内呼和外呼情况进行“下梯、上梯”动作,最后“关门”
                Func <Person[], bool> AllIn = (arrIn) =>   //如果全部进入电梯则返回True,否则False
                {
                    bool result = false;
                    if (elev.FreeSpace < arrIn.Count())
                    {
                        var tmpIn = arrIn.Take(elev.FreeSpace).ToArray();
                        CallPersons.RemoveEx(tmpIn);
                        elev.PersonIn(tmpIn);
                    }
                    else
                    {
                        CallPersons.RemoveEx(arrIn);
                        elev.PersonIn(arrIn);
                        result = true;
                    }
                    return(result);
                };
                if (elev.PersonList.Exists(x => x.ToFloor == elev.CurrentFloor))    //有下梯的
                {
                    elev.PersonOut(elev.PersonList.Where(x => x.ToFloor == elev.CurrentFloor).ToArray());
                }
                if (CallPersons.Exists(x => x.Direction == elev.Direction && x.FromFloor == elev.CurrentFloor))    //有同方向上梯的
                {
                    Person[] pIn = CallPersons.Where(x => x.Direction == elev.Direction && x.FromFloor == elev.CurrentFloor).ToArray();
                    if (!AllIn(pIn))
                    {
                        Call(CallPersons.Where(x => x.Direction == elev.Direction && x.FromFloor == elev.CurrentFloor).ToArray());
                    }
                }
                if (elev.PersonList.Count == 0)    //梯内无人,同方向无外呼,反方向有叫梯,则转换方向,上梯
                {
                    if (elev.Direction == DirectionStyle.Up && !elev.ReachList.Exists(x => x.Floor > elev.CurrentFloor) && elev.ReachList.Exists(x => x.Floor < elev.CurrentFloor))
                    {
                        elev.Direction = DirectionStyle.Down;                                                           //调头
                        if (CallPersons.Exists(x => x.Direction == elev.Direction && x.FromFloor == elev.CurrentFloor)) //有上梯的
                        {
                            Person[] pIn = CallPersons.Where(x => x.Direction == elev.Direction && x.FromFloor == elev.CurrentFloor).ToArray();
                            if (!AllIn(pIn))
                            {
                                Call(CallPersons.Where(x => x.Direction == elev.Direction && x.FromFloor == elev.CurrentFloor).ToArray());
                            }
                        }
                    }
                    else if (elev.Direction == DirectionStyle.Down && !elev.ReachList.Exists(x => x.Floor < elev.CurrentFloor) && elev.ReachList.Exists(x => x.Floor > elev.CurrentFloor))
                    {
                        elev.Direction = DirectionStyle.Up;                                                             //调头
                        if (CallPersons.Exists(x => x.Direction == elev.Direction && x.FromFloor == elev.CurrentFloor)) //有上梯的
                        {
                            Person[] pIn = CallPersons.Where(x => x.Direction == elev.Direction && x.FromFloor == elev.CurrentFloor).ToArray();
                            if (!AllIn(pIn))
                            {
                                Call(CallPersons.Where(x => x.Direction == elev.Direction && x.FromFloor == elev.CurrentFloor).ToArray());
                            }
                        }
                    }
                }
                elev.CloseDoorAsync();
                #endregion
                break;

            case StatusStyle.Closed:
                #region 关门后: 根据内呼和外呼情况决定电梯“前进、调头、停止(空闲)”
                if (elev.PersonList.Count > 0)    //有内呼
                {
                    elev.RunAsync();
                    return;
                }
                else if (elev.ReachList.Count == 0)    //无内呼 + 无外呼
                {
                    elev.Status    = StatusStyle.Free;
                    elev.Direction = DirectionStyle.None;
                    return;
                }
                else if (elev.ReachList.Exists(x => x.Direction == elev.Direction))                                                                                                 //无内呼 + 有外呼 + 同向
                {
                    if (elev.Direction == DirectionStyle.Up && !elev.ReachList.Exists(x => x.Floor > elev.CurrentFloor) && elev.ReachList.Exists(x => x.Floor < elev.CurrentFloor)) //电梯向上 + 上面无外呼 + 下面有外呼
                    {
                        elev.RunAsync(DirectionStyle.Down);                                                                                                                         //调头
                        return;
                    }
                    if (elev.Direction == DirectionStyle.Down && !elev.ReachList.Exists(x => x.Floor < elev.CurrentFloor) && elev.ReachList.Exists(x => x.Floor > elev.CurrentFloor)) //电梯向下 + 下面无外呼 + 上面有外呼
                    {
                        elev.RunAsync(DirectionStyle.Up);                                                                                                                             //调头
                        return;
                    }
                    elev.RunAsync();
                    return;
                }
                else if (elev.ReachList.Exists(x => x.Direction != elev.Direction))    //无内呼 + 有外呼 + 反向
                {
                    elev.Direction = elev.Direction == DirectionStyle.Up ? DirectionStyle.Down : DirectionStyle.Up;
                    elev.RunAsync(elev.Direction);
                }
                #endregion
                break;

            case StatusStyle.Opening:
                elev.RemoveFromReachList();
                break;
            }
        }