using AgroBase.Comum; using AgroBase.Forms.Operacoes; using AgroBase.Models.Modules; using AgroBase.Models.Operacoes; using AgroBase.Services; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using static AgroBase.Models.Enums; using System.Drawing; using System.Text; using static AgroBase.Services.OIDCanService.OidHandler; using AgroBase.Models.Operadores; using AgroBase.Services.Operadores; using AgroMonitor; using Newtonsoft.Json.Linq; namespace AgroBase.Models { public class OperacaoModel { public OperacaoModel(ModoOperacao Modo) { this.Modo = Modo; if (Variaveis.OperacaoEmAndamento != null) { tmrLogs?.Dispose(); tmrLogs = new AsyncTaskTimerModel("tmrLogs", tmrLogs_Tick, 1000); tmrLeituras?.Dispose(); tmrLeituras = new AsyncTaskTimerModel("tmrLeitura", tmrLeituras_Tick, 500); tmrLeituras.Start(); tmrComunicacao?.Dispose(); tmrComunicacao = new AsyncTaskTimerModel("tmrComunicacao", tmrComunicacao_Tick, 1000); tmrComunicacao.Start(); } } public ModoOperacao Modo { get; set; } public StatusModulo Status { get; set; } public string Descricao { get; set; } public string OprPath { get; set; } public OperacaoControleModel Controle { get; set; } = new OperacaoControleModel(); public OperacaoControleModel ControleAnterior { get; set; } = new OperacaoControleModel(); public DispositivosService DispMvd { get; set; } public DispositivosService DispSen { get; set; } public DispositivosService DispAtu { get; set; } public MapasModel Mapa { get; set; } = new MapasModel(); public TrajetoriaMapaOperacaoModel Trajetoria { get; set; } public List GPSTrajetoria { get; set; } = new List(); public OperacaoParametrosModel Parametros { get; set; } = new OperacaoParametrosModel(); public OperacaoSensoriamentoLogModel Sensoriamento { get; set; } = new OperacaoSensoriamentoLogModel(); public PerformanceModel DadosPerformance { get; set; } = new PerformanceModel(); public Form frmOperacao { get; set; } #region STATUS DE CONTEXTO public StatusOperacao StatusAtual { get; private set; } = StatusOperacao.NaoIniciado; public StatusOperacao StatusAnterior { get; private set; } = StatusOperacao.NaoIniciado; public bool Emergencia { get; set; } = false; public bool Pausa { get; set; } = false; public bool OperacaoLiberada { get; private set; } = false; public bool OperacaoConfigurada { get; private set; } = false; public string ErroOperacaoLiberada { get; set; } public DateTime TempoAguardando { get; private set; } = DateTime.Now; public double TempoAguardandoSegs => (TempoAguardando.AddSeconds(TempoIniciarOperacao) - DateTime.Now).TotalSeconds; public bool Iniciado { get; set; } public bool Finalizando { get; set; } = false; public bool Calibrando { get; set; } = false; public DateTime DataInicio { get; set; } = DateTime.MinValue; public DateTime DataFim { get; set; } = DateTime.MinValue; public double TempoDecorridoSegs { get { return (StatusAtual == StatusOperacao.Parametrizando ? 0 : ((Variaveis.OperacaoEmAndamento.DataFim != DateTime.MinValue ? Variaveis.OperacaoEmAndamento.DataFim : DateTime.Now) - Variaveis.OperacaoEmAndamento.DataInicio).TotalSeconds); } } public void AtualizarDadosContexto() { HealthWorkerService.AtualizarDadosContexto(); Variaveis.OperacaoEmAndamento.StatusAtual = (StatusOperacao)RedisService.GetField(CtxKey.DadosOperacao, "status", 0); Variaveis.OperacaoEmAndamento.OperacaoLiberada = RedisService.GetField(CtxKey.DadosOperacao, "liberado", false); Variaveis.OperacaoEmAndamento.OperacaoConfigurada = RedisService.GetField(CtxKey.DadosOperacao, "configurado", false); Variaveis.OperacaoEmAndamento.Controle.Motivos = RedisService.GetField>(CtxKey.DadosControle, "motivos", new List()); var tempoAguardando = RedisService.GetField(CtxKey.DadosOperacao, "tempo_aguardando", 0); Variaveis.OperacaoEmAndamento.TempoAguardando = DateTimeOffset.FromUnixTimeSeconds(tempoAguardando).UtcDateTime.AddSeconds(tempoAguardando % 1).ToLocalTime(); Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada = RedisService.GetField(CtxKey.DadosOperacao, "motivo_nao_liberado"); GPSService.CorrecaoRTK_Ntrip = RedisService.GetField(RedisService.ModKey(T_Code.Gps), "correcao_ntrip", false); if (Variaveis.OperacaoEmAndamento.StatusAtual != Variaveis.OperacaoEmAndamento.StatusAnterior) { AudioAlertaService.AlertaSonoroPorStatus(Variaveis.OperacaoEmAndamento.StatusAtual); } Variaveis.OperacaoEmAndamento.StatusAnterior = Variaveis.OperacaoEmAndamento.StatusAtual; List saudeAnterior = new List(HealthWorkerService.ModulosSaude ?? new List()); HealthWorkerService.ModulosSaude = RedisService.GetField(CtxKey.DadosOperacao, "status_modulos").ToList(); foreach (var mod in HealthWorkerService.ModulosSaude) { var mod_ant = saudeAnterior.FirstOrDefault(x => x.modulo == mod.modulo); if (mod.status != mod_ant?.status) { string msg = mod.motivos.Any() ? string.Join("; ", mod.motivos) : $"{mod.status} ({mod.saude:0}%)"; string msg2 = mod.condicoes_operacionais.Any() ? string.Join("; ", mod.condicoes_operacionais.Select(x => x.descricao)) : null; Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(mod.modulo, mod.status, mod.saude, msg, condicoes: msg2); } if (mod.saude_individual.Any()) { foreach (var ind in mod.saude_individual) { var ind_ant = saudeAnterior.FirstOrDefault(x => x.modulo == mod.modulo && x.saude_individual.Any(y => y.id == ind.id))?.saude_individual?.FirstOrDefault(x => x.id == ind.id); if (ind.status != ind_ant?.status) { string msg = ind.motivos.Any() ? string.Join("; ", ind.motivos) : $"{ind.status} ({ind.saude:0}%)"; string msg2 = ind.condicoes_operacionais.Any() ? string.Join("; ", ind.condicoes_operacionais.Select(x => x.descricao)) : null; Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(mod.modulo, ind.status, ind.saude, msg, condicoes: msg2, id: ind.label); } } } } double saude_geral = HealthWorkerService.ModulosSaude.DefaultIfEmpty().Average(x => x?.saude ?? 0); Variaveis.OperacaoEmAndamento.Status = !Variaveis.OperacaoEmAndamento.OperacaoLiberada ? StatusModulo.Falha : saude_geral <= 0.0 ? StatusModulo.Desconectado : saude_geral < 80.0 ? StatusModulo.Alerta : StatusModulo.Operante; SerialService.DispositivosMapeados.ForEach(d => d.AtualizarDados()); } #endregion public bool Treinando { get; set; } = false; public bool Simulando { get; set; } = false; public double SimulacaoAnguloControle { get; set; } = 0; public double SimulacaoRpmControle { get; set; } = 0; public Dictionary> ModsCalibragem { get; set; } = new Dictionary>(); //public List ModulosMandatorios { get; set; } = new List(); //public List ParametrosMandatorios { get; set; } = new List(); public int TempoIniciarOperacao { get; set; } = 10; public string ID { get; set; } public double tmrLogsInterval { get { return tmrLogs.Interval; } set { tmrLogs.SetInterval((int)value); } } private static AsyncTaskTimerModel tmrLogs; public double tmrLeiturasInterval { get { return tmrLeituras.Interval; } set { tmrLeituras.SetInterval((int)value); } } private static AsyncTaskTimerModel tmrLeituras; private static AsyncTaskTimerModel tmrComunicacao; #region PARAMETRIZACAO public bool SalvarParametrizacaoOperacao( string descricao, double capacidadeReservatorio, double pressaoLinha, int duracaoAtuacao, int percentualAtuacao, int anguloMaximo, int velocidadeMovimento, int velocidadeServasPercent, int velocidadeCervasPercent, UltrasonicA05Configuracoes ConfigUltrassom, bool sonarAtivado, int qtdCamerasSolo, TiposControladorDirecional tipoControleDirecional, bool movimentoAutomatico, bool direcionalAutomatico, bool pulverizadorAutomatico, bool frenagemAutomatica) { if (string.IsNullOrEmpty(descricao)) { MessageBox.Show("Preencha a descrição para identificação da operação!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } if (Variaveis.OperacaoEmAndamento.Parametros.ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Mapa && x.Mandatorio) && string.IsNullOrEmpty(Variaveis.OperacaoEmAndamento.Mapa?.mapaService?.CaminhoMapa) && !(Variaveis.OperacaoEmAndamento.Mapa?.RuasPercorrer ?? new List()).Any()) { MessageBox.Show("Selecione o mapa da operação e selecione as ruas a serem percorridas!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } OperacaoParametrosModel Parametros = new OperacaoParametrosModel() { Modo = Variaveis.OperacaoEmAndamento.Modo, Descricao = descricao, CapacidadeReservatorio = capacidadeReservatorio, Controle = new OperacaoParametrosControleModel() { SonarAtivado = sonarAtivado, MovimentoAutomatico = movimentoAutomatico, DirecionalAutomatico = direcionalAutomatico, PulverizadorAutomatico = pulverizadorAutomatico, FrenagemAutomaticaAoParar = frenagemAutomatica, AtuDuracaoAtuacao = duracaoAtuacao, AtuPercentualInicioPulverizacao = percentualAtuacao, AtuPressaoLinha = pressaoLinha, DirAnguloMaximo = anguloMaximo, DirVelocidadeMovimento = velocidadeMovimento, DirTipoMovimento = tipoControleDirecional, MovVelocidadeCErvasPercent = velocidadeCervasPercent, MovVelocidadeSErvasPercent = velocidadeServasPercent, }, ModulosMandatorios = new List(Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios), ParametrosMandatorios = new List(Variaveis.OperacaoEmAndamento.Parametros.ParametrosMandatorios), //Mapa = Variaveis.OperacaoEmAndamento.Mapa, //ConfiguracaoUltrassom = ConfigUltrassom, QtdCamerasSolo = qtdCamerasSolo, }; //Parametros.Mapa.LimparDados(true); string ParametrosJson = JsonConvert.SerializeObject(Parametros, Formatting.None); SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Arquivo de Operação (*.opr)|*.opr"; saveFileDialog.DefaultExt = "opr"; saveFileDialog.AddExtension = true; saveFileDialog.InitialDirectory = Variaveis.CaminhoSistema + Variaveis.CaminhoOperacoes; saveFileDialog.FileName = descricao; if (saveFileDialog.ShowDialog() == DialogResult.OK) { string filePath = saveFileDialog.FileName; File.WriteAllText(filePath, ParametrosJson, Encoding.UTF8); MessageBox.Show("Operação salva com sucesso!", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); } return true; } public (bool, List) CarregarParametrizacaoOperacao(Panel pnlMapa, Label lblMapa, string opPath = "") { string path = Variaveis.CaminhoSistema + Variaveis.CaminhoOperacoes + MapasVariaveisModel.NomeArquivoMapaInterativoSaida; OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Arquivo de Operação (*.opr)|*.opr"; openFileDialog.DefaultExt = "opr"; openFileDialog.AddExtension = true; openFileDialog.InitialDirectory = Variaveis.CaminhoSistema + Variaveis.CaminhoOperacoes; if (!string.IsNullOrEmpty(opPath) || openFileDialog.ShowDialog() == DialogResult.OK) { string opr_path = !string.IsNullOrEmpty(opPath) ? opPath : openFileDialog.FileName; if (!File.Exists(opr_path)) return (false, new List()); string ParametrosJson = File.ReadAllText(opr_path, Encoding.UTF8); var Parametros = JsonConvert.DeserializeObject(ParametrosJson); if (Parametros.Modo == null) return (false, new List()); CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo, true); Variaveis.OperacaoEmAndamento.Parametros = Parametros; Variaveis.OperacaoEmAndamento.Descricao = Parametros.Descricao; Variaveis.OperacaoEmAndamento.OprPath = opr_path; if (Variaveis.OperacaoEmAndamento.DispSen == null) { Variaveis.OperacaoEmAndamento.DispSen = new DispositivosService(); } //Variaveis.OperacaoEmAndamento.DispSen.Dados.ConfiguracaoSensorUltrassom = Parametros.ConfiguracaoUltrassom; List ruasSelecionadas = new List(); //if (Parametros.Mapa.mapaService.DadosMapa != null) //{ // ruasSelecionadas = Parametros.Mapa.RuasPercorrer.ToList(); // string geoJson = JsonConvert.SerializeObject(Parametros.Mapa.mapaService.DadosMapa, Formatting.None); // File.WriteAllText(path, geoJson, Encoding.UTF8); // Variaveis.OperacaoEmAndamento.Mapa = Parametros.Mapa; // // /*Panel pnlMapa = FuncoesGlobais.FindControlRecursive(Variaveis.OperacaoEmAndamento.frmOperacao, "pnlMapa"); // Label lblMapa = FuncoesGlobais.FindControlRecursive