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