Example #1
0
        public Elevador(int qtdAndares, int qtdMaxPessoas)
        {
            //1.O elevador começa parado no térreo(Andar Zero), com as portas abertas;
            AndarAtual     = 0;
            StatusElevador = Enums.StatusElevador.Parado;
            StatusPorta    = Enums.StatusPorta.Aberta;
            Rota           = null;

            QtdAndares    = qtdAndares;
            QtdMaxPessoas = qtdMaxPessoas;

            Andares = new bool[QtdAndares + 1];

            //Inicializa o timer
            m_mainTimer           = new System.Timers.Timer();
            m_mainTimer.Interval  = interval;
            m_mainTimer.Elapsed  += m_mainTimer_Elapsed;
            m_mainTimer.AutoReset = false;
            m_mainTimer.Start();
        }
Example #2
0
        /// <summary>
        /// Método para movimentar o elevador até uma rota (andar) destino
        /// </summary>
        /// <param name="rota">Rota que contem a direção e o andar a seguir</param>
        protected void MoverPara(Rota rota)
        {
            //Move entres os andares até o destino atualizando o status
            while (AndarAtual != rota.Andar)
            {
                //2. Ao mover o elevador, deve-se atualizar o seu status (subindo ou descendo);
                if (rota.Direcao == Enums.DirecaoRota.Cima)
                {
                    AndarAtual++;
                }
                else
                {
                    AndarAtual--;
                }

                //Timer para conseguir visualizar o movimento
                Thread.Sleep(TempoEntreAndares);
                MostrarVisor();
            }
            Andares[AndarAtual] = false;
            //Ao chegar no destino, abra a porta e atualize o status para parado
            AbrirPorta();
        }
Example #3
0
        /// <summary>
        /// Metodo para criação da rota a ser seguida
        /// Este item foi modificado - 5. A rota deve conter apenas os andares que ainda não foram visitados;
        /// Para poder selecionar um andar, em uma pausa durante o percurso,
        /// defini que a rota só retorna o próximo andar a seguir, e não o caminho completo
        /// </summary>
        protected void CriaRota()
        {
            //8. Uma rota não pode ser feita com um número superior à capacidade máxima de pessoas;
            if (QtdPessoas > QtdMaxPessoas)
            {
                Rota = null;
                return;
            }
            //10. Assim que selecionado os andares o elevador cria a rota;
            var acima  = GetProximoAcima();
            var abaixo = GetProximoAbaixo();

            if (!acima.HasValue && !abaixo.HasValue)
            {
                Rota = null;
            }

            //Se já existir uma rota, verifica a direção para criar a nova rota
            if (Rota != null)
            {
                //3.O elevador deve levar em consideração se está descendo ou subindo para definir a rota, ou seja,
                //  se estiver subindo deve subir até o ultimo andar definido antes de começar a descer;
                if (Rota.Direcao == Enums.DirecaoRota.Cima && acima.HasValue)
                {
                    Rota.Andar = acima.Value;
                }
                else if (Rota.Direcao == Enums.DirecaoRota.Cima && abaixo.HasValue)
                {
                    Rota.Andar   = abaixo.Value;
                    Rota.Direcao = Enums.DirecaoRota.Baixo;
                }
                else if (Rota.Direcao == Enums.DirecaoRota.Baixo && abaixo.HasValue)
                {
                    Rota.Andar = abaixo.Value;
                }
                else if (Rota.Direcao == Enums.DirecaoRota.Baixo && acima.HasValue)
                {
                    Rota.Andar   = acima.Value;
                    Rota.Direcao = Enums.DirecaoRota.Cima;
                }
                else
                {
                    Rota = null;
                }
            }
            else
            {
                //Se não existe rota definida, cria rota para o andar mais próximo
                if (acima.HasValue && !abaixo.HasValue)
                {
                    Rota = new Rota {
                        Andar = acima.Value, Direcao = Enums.DirecaoRota.Cima
                    }
                }
                ;
                else if (!acima.HasValue && abaixo.HasValue)
                {
                    Rota = new Rota {
                        Andar = abaixo.Value, Direcao = Enums.DirecaoRota.Baixo
                    }
                }
                ;
                else if (acima.HasValue && abaixo.HasValue)
                {
                    //Se tiver andar solicitado acima e abaixo, verificar o mais perto
                    if (Math.Abs(AndarAtual - acima.Value) > Math.Abs(AndarAtual - abaixo.Value))
                    {
                        Rota = new Rota {
                            Andar = abaixo.Value, Direcao = Enums.DirecaoRota.Baixo
                        }
                    }
                    ;
                    else
                    {
                        Rota = new Rota {
                            Andar = acima.Value, Direcao = Enums.DirecaoRota.Cima
                        }
                    };
                }
            }
        }