using AgroBase.Comum; using AgroBase.Forms; using AgroBase.Forms.Operacoes; using AgroBase.Models.Modules; using AgroBase.Models.Operacoes; using AgroBase.Services; using CefSharp.DevTools.Network; using Emgu.CV.CvEnum; using Newtonsoft.Json; using OpenTK.Graphics.ES11; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using static AgroBase.Models.Enuns; namespace AgroBase.Models { public class OperacaoModel { public OperacaoModel(ModoOperacao Modo, DispositivosService Mov = null, DispositivosService Dir = null, DispositivosService Atu = null) { this.Modo = Modo; this.DispMov = Mov; this.DispDir = Dir; this.DispAtu = Atu; if (Modo == ModoOperacao.MapaGPS) { this.OpMapaGPS.Controle = new OperacaoControleModel() { PIDdirecional = new PIDModel(), TiposControle = new List() { new OperacaoControleTipoModel() { Tipo = T_Code.Mov, DelayEnvioComando = 500, Comandos = new List(), UltimoComando = DateTime.Now }, new OperacaoControleTipoModel() { Tipo = T_Code.Dir, DelayEnvioComando = 1000, Comandos = new List(), UltimoComando = DateTime.Now }, new OperacaoControleTipoModel() { Tipo = T_Code.Atu, DelayEnvioComando = 100, Comandos = new List(), UltimoComando = DateTime.Now }, }, }; this.OpMapaGPS.ControleAnterior = new OperacaoControleModel(); this.OpMapaGPS.Sensoriamento.AtuacoesPorBico = new List(); if (DispAtu != null) { for (int i = 0; i < DispAtu.Dados.QuantidadeBicos; i++) { this.OpMapaGPS.Sensoriamento.AtuacoesPorBico.Add(0); } } } if (!this.tmrLogs.Enabled) { this.tmrLogs.Tick -= TmrLogs_Tick; this.tmrLogs.Tick += TmrLogs_Tick; this.tmrLogs.Start(); } } public ModoOperacao Modo { get; set; } public OperacaoMapaGPSModel OpMapaGPS { get; set; } = new OperacaoMapaGPSModel(); public OperacaoManualModel OpManual { get; set; } = new OperacaoManualModel(); public DispositivosService DispSen { get; set; } public DispositivosService DispMov { get; set; } public DispositivosService DispDir { get; set; } public DispositivosService DispAtu { get; set; } public MapasModel Mapa { get; set; } = new MapasModel(); public OperacaoSensoriamentoModel Sensoriamento { get; set; } public Form frmOperacao { get; set; } private StatusOperacao _EtapaAtual; private StatusOperacao _EtapaAnteriorParada = StatusOperacao.Parado; public StatusOperacao StatusAtual { get { StatusOperacao etapaAtual = _EtapaAtual; // Se a operação não estiver iniciada if (!Variaveis.OperacaoEmAndamento.Iniciado) { // Etapa atual não é Finalizado, então a etapa é Parametrizando if (_EtapaAtual != StatusOperacao.Concluido) { etapaAtual = StatusOperacao.Parametrizando; } } // Operação em andamento else { // Se a operacao atual for manual if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.Manual) { etapaAtual = StatusOperacao.EmAndamento; } // Se o trajeto foi finalizado else if (Variaveis.OperacaoEmAndamento.OpMapaGPS.Concluido) { etapaAtual = StatusOperacao.Concluido; } // Se a operação tiver algum item mandatório interrompido else if (!Variaveis.OperacaoEmAndamento.OperacaoLiberada) { // Da primeira vez, salva a etapa atual anterior à parada para possível retomada if (etapaAtual != StatusOperacao.Parado) { _EtapaAnteriorParada = etapaAtual; } etapaAtual = StatusOperacao.Parado; } // Se a etapa atual for parado, mas a operação foi liberada, retoma de onde parou else if (etapaAtual == StatusOperacao.Parado && Variaveis.OperacaoEmAndamento.OperacaoLiberada) { Variaveis.OperacaoEmAndamento.TempoAguardando = DateTime.Now; etapaAtual = StatusOperacao.Aguardando; } // Etapa atual é finalizada, então finaliza a operação else if (_EtapaAtual == StatusOperacao.Concluido) { if (Variaveis.OperacaoEmAndamento.Iniciado) { Variaveis.OperacaoEmAndamento.FinalizarOperacao(); } } // Contagem regressiva para iniciar a operação else if (Variaveis.OperacaoEmAndamento.TempoAguardando.AddSeconds(Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) > DateTime.Now) { etapaAtual = StatusOperacao.Aguardando; } else if (_EtapaAnteriorParada != StatusOperacao.Parado) { etapaAtual = _EtapaAnteriorParada; _EtapaAnteriorParada = StatusOperacao.Parado; } else { etapaAtual = StatusOperacao.EmAndamento; } } _EtapaAtual = etapaAtual; //_EtapaAtual = StatusOperacao.EmAndamento; return _EtapaAtual; } } public bool ModulosConectados { get { ModulosMandatorios.ForEach(Modulo => { if (Modulo.Dispositivo == T_Code.Gps) { Modulo.Conectado = GPSService.PortaGPS != null && GPSService.PortaGPS.IsOpen; } else { Modulo.Conectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == Modulo.Dispositivo && x._Porta.IsOpen); } }); bool _modulosConectados = (ModulosMandatorios.Where(x => x.Mandatorio).All(x => x.Conectado) && ModulosMandatorios.Any(x => x.Mandatorio)) || (ModulosMandatorios.All(x => !x.Mandatorio) && ModulosMandatorios.Any(x => x.Conectado)); return _modulosConectados; } } public bool OperacaoLiberada { get { bool _operacaoLiberada = ModulosConectados; if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.CameraSolo && x.Mandatorio) && CamerasSolo.Count(x => x.Iniciada) < QuantidadeCamerasSolo) _operacaoLiberada = false; if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.CameraCaminho && x.Mandatorio) && (CameraCaminho == null || !CameraCaminho.Iniciada)) _operacaoLiberada = false; if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Mapa && x.Mandatorio) && !Mapa.mapaService.Carregado) _operacaoLiberada = false; if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Joystick && x.Mandatorio && GeneralJoystick.JoystickConectado == null)) _operacaoLiberada = false; if (frmInstancial.frmPrincipal.chbDebugMode.Checked) _operacaoLiberada = true; return _operacaoLiberada; } } public string ErroOperacaoLiberada { get { string MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Modo) + ", é necessário que todos os módulos mandatórios estejam devidamente conectados ao equipamento, ou pelo menos um dos módulos:\r\n"; ModulosMandatorios.ForEach(Modulo => { MensagemErro += Enum.GetName(typeof(T_Code), Modulo.Dispositivo) + ": ( " + (Modulo.Conectado ? "OK" : " ") + " ) - Mandatório: " + (Modulo.Mandatorio ? "Sim" : "Não") + "\r\n"; }); return MensagemErro; } } public bool Iniciado { get; set; } public long TimestampInicio { get; set; } public long TimestampFim { get; set; } public TimeSpan Tempo { get { return TimeSpan.FromTicks(Variaveis.OperacaoEmAndamento.Iniciado ? ((Variaveis.OperacaoEmAndamento.TimestampFim > 0 ? Variaveis.OperacaoEmAndamento.TimestampFim : DateTime.Now.Ticks) - Variaveis.OperacaoEmAndamento.TimestampInicio) : 0); } } public DateTime TempoAguardando { get; set; } public List ModulosMandatorios { get; set; } = new List(); public List ParametrosMandatorios { get; set; } = new List(); public List Logs { get; set; } = new List(); public List GPSTrajetoria { get; set; } = new List(); public List> GPSTrajetoriaRua { get; set; } = new List>(); public DirecaoCarroRua DirecaoCaminho { get { DirecaoCarroRua direcaoCaminho = Mapa.IdxRuaAtual % 2 == 0 ? DirecaoCarroRua.Ida : DirecaoCarroRua.Volta; return direcaoCaminho; } } public int QuantidadeCamerasSolo { get; set; } = 2; public List CamerasSolo { get; set; } = new List(); public CameraCaminhoModel CameraCaminho { get; set; } public int TempoIniciarOperacao { get; set; } = 25; public string ID { get; set; } public Timer tmrLogs = new Timer() { Interval = 5000 }; public static OperacaoModel CarregarParametrosOperacaoPadrao(ModoOperacao Modo) { var SenConectado = (DispositivosService)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Sen); var MovConectado = (DispositivosService)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov); var DirConectado = (DispositivosService)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Dir); var AtuConectado = (DispositivosService)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu); Variaveis.OperacaoEmAndamento.tmrLogs.Stop(); OperacaoModel OperacaoCarregar = new OperacaoModel(Modo) { Iniciado = false, TimestampInicio = 0, TimestampFim = 0, DispAtu = AtuConectado, DispDir = DirConectado, DispMov = MovConectado, DispSen = SenConectado, Logs = new List(), Sensoriamento = new OperacaoSensoriamentoModel(), }; switch (Modo) { case ModoOperacao.Manual: OperacaoCarregar.frmOperacao = (Form)Activator.CreateInstance(Variaveis.OperacaoEmAndamento.OpManual.frmOperacao.GetType()); OperacaoCarregar.OpManual.Controle = new OperacaoControleModel() { TiposControle = new List() { new OperacaoControleTipoModel() { Tipo = T_Code.Mov, DelayEnvioComando = 10, Comandos = new List(), UltimoComando = DateTime.Now }, new OperacaoControleTipoModel() { Tipo = T_Code.Dir, DelayEnvioComando = 10, Comandos = new List(), UltimoComando = DateTime.Now }, }, }; OperacaoCarregar.ModulosMandatorios = new List() { new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Mov, Mandatorio = false, }, new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Dir, Mandatorio = false, }, }; OperacaoCarregar.ParametrosMandatorios = new List() { new OperacaoParametrosMandatoriosModel() { Parametro = ParametrosOperacao.Joystick, Mandatorio = false, } }; OperacaoCarregar.Sensoriamento.SonarFrontal = new SonarModel(FuncoesGlobais.FindControlRecursive(OperacaoCarregar.frmOperacao, "picSonar")); break; case ModoOperacao.MapaGPS: OperacaoCarregar.frmOperacao = (Form)Activator.CreateInstance(Variaveis.OperacaoEmAndamento.OpMapaGPS.frmOperacao.GetType()); OperacaoCarregar.Logs = new List(); OperacaoCarregar.OpMapaGPS.ControleAnterior = new OperacaoControleModel(); OperacaoCarregar.OpMapaGPS.Controle = new OperacaoControleModel() { RPM_Max = 45, RPM_Min = 15, Angulo_Max = 30, Angulo_Min = -30, VelocidadeMP = 50, TiposControle = new List() { new OperacaoControleTipoModel() { Tipo = T_Code.Mov, DelayEnvioComando = 500, Comandos = new List(), UltimoComando = DateTime.Now }, new OperacaoControleTipoModel() { Tipo = T_Code.Dir, DelayEnvioComando = 1000, Comandos = new List(), UltimoComando = DateTime.Now }, new OperacaoControleTipoModel() { Tipo = T_Code.Atu, DelayEnvioComando = 500, Comandos = new List(), UltimoComando = DateTime.Now }, }, }; OperacaoCarregar.ModulosMandatorios = new List() { new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Mov, Mandatorio = true, }, new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Dir, Mandatorio = true, }, new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Atu, Mandatorio = true, }, new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Gps, Mandatorio = true, }, new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Sen, Mandatorio = false, } }; OperacaoCarregar.ParametrosMandatorios = new List() { new OperacaoParametrosMandatoriosModel() { Parametro = ParametrosOperacao.CameraSolo, Mandatorio = true, }, new OperacaoParametrosMandatoriosModel() { Parametro = ParametrosOperacao.CameraCaminho, Mandatorio = true, }, new OperacaoParametrosMandatoriosModel() { Parametro = ParametrosOperacao.Mapa, Mandatorio = true, } }; OperacaoCarregar.OpMapaGPS.Sensoriamento = new OperacaoMapaGPSSensoriamentoModel(); if (OperacaoCarregar.DispAtu != null) { for (int i = 0; i < OperacaoCarregar.DispAtu.Dados.QuantidadeBicos; i++) { OperacaoCarregar.OpMapaGPS.Sensoriamento.AtuacoesPorBico.Add(0); } } break; } if (OperacaoCarregar.DispSen != null && OperacaoCarregar.DispSen.Dados.Conectado) { OperacaoCarregar.DispSen.Dados.Sinaleiros.ForEach(x => x.Comportamento = Variaveis.ComportamentoPorStatus(StatusOperacao.NaoIniciado)); OperacaoCarregar.DispSen.Dados.Sinaleiros.First(x => x.ID == (Modo == ModoOperacao.Manual ? "LEDMN" : "LEDAT")).Comportamento.statusLED = StatusLED.Aceso; OperacaoCarregar.DispSen.Dados.Sinaleiros.First(x => x.ID == "LEDOP").Comportamento = Variaveis.ComportamentoPorStatus(); OperacaoCarregar.DispSen.Dados.Sinaleiros.ForEach(x => OperacaoCarregar.DispSen.AdicionarMensagemFila(x.ProtocoloComando())); } return OperacaoCarregar; } public static void SalvarOperacaoPersonalizada(OperacaoModel Operacao) { if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.MapaGPS) { Operacao.OpMapaGPS.frmOperacaoNome = Operacao.OpMapaGPS.frmOperacao.Name; Form frm = Operacao.OpMapaGPS.frmOperacao; Operacao.OpMapaGPS.frmOperacao = null; //File.WriteAllText("operacao" + Enum.GetName(typeof(ModoOperacao), Operacao.Modo) + ".opr", JsonConvert.SerializeObject(Operacao)); Operacao.OpMapaGPS.frmOperacao = frm; } } public static OperacaoModel CarregarOperacaoPersonalizada(string nomeArquivo) { string modoOpStr = nomeArquivo.Split('\\')[nomeArquivo.Split('\\').Length - 1].Replace("operacao", "").Split('.')[0]; ModoOperacao modo = (ModoOperacao)Enum.Parse(typeof(ModoOperacao), modoOpStr); return CarregarParametrosOperacaoPadrao(modo); OperacaoModel Operacao = new OperacaoModel(modo); if (!File.Exists(nomeArquivo)) { Operacao = CarregarParametrosOperacaoPadrao(modo); SalvarOperacaoPersonalizada(Operacao); } var operacaoText = File.ReadAllText(nomeArquivo); Operacao = JsonConvert.DeserializeObject(operacaoText); Type tipoDoForm = Type.GetType(Operacao.OpMapaGPS.frmOperacaoNome); if (tipoDoForm != null) { Operacao.OpMapaGPS.frmOperacao = (Form)Activator.CreateInstance(tipoDoForm); } return Operacao; } public void IniciarOperacao(OperacaoControleModel controle = null, bool DaIHM = true) { Iniciado = true; TimestampInicio = DateTime.Now.Ticks; TempoAguardando = DateTime.Now; TimestampFim = 0; Mapa.IdxRuaAtual = 0; if (DispMov != null) { DispMov.Dados.DistanciaPercorridaOperacao = 0; DispMov.Dados.TempoEmAtividade = 0; } if (DispDir != null) { DispDir.Dados.Motores.ForEach(x => { x.Referenciado = false; x.Referenciando = false; }); } Sensoriamento.DistanciaPercorrida = new List(); if (Modo == ModoOperacao.MapaGPS) { OpMapaGPS.Sensoriamento = new OperacaoMapaGPSSensoriamentoModel(); OpMapaGPS.Logs = new List(); if (DispAtu != null) { DispAtu.Dados.BombaPressurizadora.BombaAtuada = false; for (int i = 0; i < DispAtu.Dados.QuantidadeBicos; i++) { OpMapaGPS.Sensoriamento.AtuacoesPorBico.Add(0); DispAtu.Dados.BicosPulverizadores[i].Atuado = false; } DispAtu.Dados.VolumeVazaoML = 0; } OpMapaGPS.Controle.PIDdirecional = new PIDModel() { LimiteSaida = OpMapaGPS.Controle.Angulo_Max, SetPoint = 0, Kp = 1.0, Ki = 0.1, Kd = 0.01, }; if (controle != null) { OpMapaGPS.Controle = controle; } } Logs = new List(); GPSTrajetoria = new List(); ID = (new DateTime(TimestampInicio)).ToString("dd_MM_yyyy_HH_mm_ss"); Directory.CreateDirectory(Variaveis.CaminhoOperacoes + ID + "/"); GPSService.IniciarRecepcaoDados(); //Controle = new OperacaoControleModel(); //ControleAnterior = new OperacaoControleModel(); //tmrParametrizacao.Stop(); RealizarCalibracaoInicialAsync().ConfigureAwait(false); } public void FinalizarOperacao() { if (Modo == ModoOperacao.MapaGPS) { OpMapaGPS.Controle.Angulo = 0; OpMapaGPS.Controle.RPM = 0; OpMapaGPS.AtualizarDadosControle(); } if (DispAtu.Dados.BombaPressurizadora.Inicializado) { DispAtu.Dados.BombaPressurizadora.BombaAtuada = false; string Protocolo = DispAtu.Dados.BombaPressurizadora.ProtocoloComando(); DispAtu.AdicionarMensagemFila(Protocolo); } Iniciado = false; TimestampFim = DateTime.Now.Ticks; //tmrLogs.Stop(); //tmrParametrizacao.Start(); SalvarLog(true); GPSService.PararRecepcaoDados(); AtualizarSinaleiroOperacao(); } public async Task RealizarCalibracaoInicialAsync() { if (DispAtu != null) { // Ligar bomba if (DispAtu.Dados.BombaPressurizadora.Inicializado) { DispAtu.Dados.BombaPressurizadora.BombaAtuada = true; string Protocolo = DispAtu.Dados.BombaPressurizadora.ProtocoloComando(); DispAtu.AdicionarMensagemFila(Protocolo); } await Task.Delay(5000); // Testar os bicos for (int i = 0; i < DispAtu.Dados.QuantidadeBicos; i++) { var Bico = DispAtu.Dados.BicosPulverizadores[i]; if (Bico.Inicializado) { Bico.Atuado = true; DispAtu.AdicionarMensagemFila(Bico.ProtocoloComando()); await Task.Delay(1000); Bico.Atuado = false; DispAtu.AdicionarMensagemFila(Bico.ProtocoloComando()); } } await Task.Delay(1000); } // Referenciar o direcional if (DispDir != null) { foreach (var Motor in DispDir.Dados.Motores) { DispDir.AdicionarMensagemFila(Motor.ProtocoloComando(Direcao.Parado, true)); while (Motor.Referenciando) { await Task.Delay(500); } } } } public void SalvarLog(bool Fim) { if (!string.IsNullOrEmpty(ID)) { Logs.Add(new OperacaoSensoriamentoModel() { Momento = DateTime.Now, BateriaConsumida = Sensoriamento.BateriaConsumida, DistanciaDireita = Sensoriamento.DistanciaDireita, DistanciaEsquerda = Sensoriamento.DistanciaEsquerda, DistanciaPercorrida = new List(Sensoriamento.DistanciaPercorrida), PorcentagemBateria = Sensoriamento.PorcentagemBateria, AnguloCarroBussola = Sensoriamento.AnguloCarroBussola }); if (!Directory.Exists(Variaveis.CaminhoOperacoes + ID)) { Directory.CreateDirectory(Variaveis.CaminhoOperacoes + ID); } if (!File.Exists(Variaveis.CaminhoOperacoes + ID + "/logsGerais.json")) { string jsonLog = JsonConvert.SerializeObject(Logs, Formatting.None); File.WriteAllText(Variaveis.CaminhoOperacoes + ID + "/logsGerais.json", jsonLog.Substring(0, jsonLog.Length - 1)); } else { string jsonLog = JsonConvert.SerializeObject(Logs[Logs.Count - 1], Formatting.None); File.AppendAllText(Variaveis.CaminhoOperacoes + ID + "/logsGerais.json", "," + jsonLog + (Fim ? "]" : "")); } File.WriteAllText(Variaveis.CaminhoOperacoes + ID + "/trajetoria.json", JsonConvert.SerializeObject(GPSTrajetoria, Formatting.None)); } } private void TmrLogs_Tick(object sender, EventArgs e) { if (Iniciado) { SalvarLog(false); } AtualizarSinaleiroOperacao(); } public void AtualizarSinaleiroOperacao() { if (DispSen != null && DispSen.Dados.Conectado) { DispSen.Dados.Sinaleiros.FirstOrDefault(x => x.ID == "LEDOP").Comportamento = Variaveis.ComportamentoPorStatus(); DispSen.Dados.Sinaleiros.FirstOrDefault(x => x.ID == "LEDAT").Comportamento.statusLED = Modo == ModoOperacao.MapaGPS ? StatusLED.Aceso : StatusLED.Apagado; DispSen.Dados.Sinaleiros.FirstOrDefault(x => x.ID == "LEDMN").Comportamento.statusLED = Modo == ModoOperacao.Manual ? StatusLED.Aceso : StatusLED.Apagado; DispSen.Dados.Sinaleiros.ForEach(x => DispSen.AdicionarMensagemFila(x.ProtocoloComando())); } } public void AbrirForm() { if (Variaveis.OperacaoEmAndamento.OperacaoLiberada) { frmOperacao = (Form)Activator.CreateInstance(( Modo == ModoOperacao.Manual ? Variaveis.OperacaoEmAndamento.OpManual.frmOperacao : Modo == ModoOperacao.MapaGPS ? Variaveis.OperacaoEmAndamento.OpMapaGPS.frmOperacao : new Form() ).GetType()); Variaveis.OperacaoEmAndamento.Sensoriamento.SonarFrontal = new SonarModel(FuncoesGlobais.FindControlRecursive(frmOperacao, "picSonar")); frmOperacao.Show(); } else { MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } public string TextoFormOperacao(string ModoNome) { var statusAtual = Variaveis.OperacaoEmAndamento.StatusAtual; if (statusAtual == StatusOperacao.Parametrizando) { return "Operação " + ModoNome + " - Parametrização"; } else if (statusAtual == StatusOperacao.Aguardando) { return "Operação " + ModoNome + " - Iniciando em " + (Variaveis.OperacaoEmAndamento.TempoAguardando.AddSeconds(Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) - DateTime.Now).TotalSeconds.ToString("0") + " segundo" + ((Variaveis.OperacaoEmAndamento.TempoAguardando.AddSeconds(Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) - DateTime.Now).TotalSeconds < 1 ? "" : "s") + "..."; } else if (statusAtual == StatusOperacao.Concluido) { return "Operação " + ModoNome + " - Concluída"; } else if (statusAtual == StatusOperacao.EmAndamento) { return "Operação " + ModoNome + " - Em andamento"; } else { return "Operação " + ModoNome; } } } public class OperacaoSensoriamentoModel { public DateTime Momento { get; set; } public double VelocidadeMedia { get { return Variaveis.OperacaoEmAndamento.DispMov.Dados.Motores.Average(x => x.VelocidadeInstantanea); } } public double PorcentagemBateria { get; set; } = 0; public double BateriaConsumida { get; set; } = 0; public List DistanciaPercorrida { get; set; } = new List(); public double DistanciaEsquerda { get; set; } = 0; public double DistanciaDireita { get; set; } = 0; public double AnguloCarroGPS { get { int PontosConsiderarAngulo = 2; double Angulo = 0; int Indice = Variaveis.OperacaoEmAndamento.Mapa.mapaService.MapaUrl != "" ? Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual : 0; try { double somaAngulo = 0; var Pontos = !Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua.Any() || Indice >= Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua.Count() ? new List() : Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Indice].Count > PontosConsiderarAngulo ? Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Indice].OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() : Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Indice].OrderByDescending(x => x.DataHora).ToList(); Pontos = Pontos.OrderBy(x => x.DataHora).ToList(); for (int i = 0; i < Pontos.Count() - 1; i++) { somaAngulo += GPSService.CalcularOrientacao(Pontos[i + 1], Pontos[i]); } double mediaAngulo = somaAngulo / (Pontos.Count() - 1); Angulo = (!(mediaAngulo >= 0 || mediaAngulo <= 0)) ? 0 : mediaAngulo; } catch { Angulo = 0; } return Angulo; } } public double AnguloCarroBussola { get; set; } = 0; public double AnguloCarro { get { if (Variaveis.OperacaoEmAndamento.DispSen._Porta.IsOpen && Variaveis.OperacaoEmAndamento.DispSen.Dados.Sensores.Any(x => x.Componente == S_Code.sMAG && x.Inicializado)) { return AnguloCarroBussola; } else { return AnguloCarroGPS; } } } public SonarModel SonarFrontal { get; set; } } public class OperacaoControleModel { public int RPM_Max { get; set; } = 45; public int RPM_Min { get; set; } = 15; public double Angulo_Max { get; set; } = 30; public double Angulo_Min { get; set; } = -30; public double VelocidadeMP { get; set; } = 50; public double Angulo { get; set; } = 0; public int RPM { get; set; } = 0; public Direcao Direcao { get; set; } = Direcao.Parado; public List BicosAtuados { get; set; } = new List(); public List TiposControle { get; set; } public PIDModel PIDdirecional { get; set; } = new PIDModel(); } public class OperacaoControleTipoModel { public T_Code Tipo { get; set; } public int DelayEnvioComando { get; set; } public DateTime UltimoComando { get; set; } public List Comandos { get; set; } } public class OperacaoModulosMandatoriosModel { public T_Code Dispositivo { get; set; } public bool Mandatorio { get; set; } public bool Utilizar { get; set; } public bool Conectado { get; set; } } public class OperacaoParametrosMandatoriosModel { public ParametrosOperacao Parametro { get; set; } public bool Mandatorio { get; set; } public bool Utilizar { get; set; } public bool Pronto { get; set; } } }