From 1e82065e918bbbaccc5c8fd9b9f896c0dbbb8f79 Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Mon, 29 Jun 2026 09:36:15 -0300 Subject: [PATCH] pequenos ajustes na instancia geral OperacaoEmAndamento --- AgroBase/AgroBase/Models/LivoxModel.cs | 3 + .../AgroBase/Models/Modules/ModuloIMUModel.cs | 2 + .../Models/Operacoes/OperacaoModel.cs | 202 ++++++++++-------- .../AgroBase/Services/CoolerControlService.cs | 5 +- 4 files changed, 126 insertions(+), 86 deletions(-) diff --git a/AgroBase/AgroBase/Models/LivoxModel.cs b/AgroBase/AgroBase/Models/LivoxModel.cs index eb7f20d8f..ad7afa7b0 100644 --- a/AgroBase/AgroBase/Models/LivoxModel.cs +++ b/AgroBase/AgroBase/Models/LivoxModel.cs @@ -12,6 +12,8 @@ namespace AgroBase.Models { public class LivoxModel { + public DateTime Momento { get; set; } + public long timestamp { get; set; } public bool conectado { get; set; } public bool executando { get; set; } @@ -31,6 +33,7 @@ namespace AgroBase.Models { return new LivoxModel() { + Momento = Momento, timestamp = timestamp, conectado = conectado, executando = executando, diff --git a/AgroBase/AgroBase/Models/Modules/ModuloIMUModel.cs b/AgroBase/AgroBase/Models/Modules/ModuloIMUModel.cs index 79779619d..45a7cb262 100644 --- a/AgroBase/AgroBase/Models/Modules/ModuloIMUModel.cs +++ b/AgroBase/AgroBase/Models/Modules/ModuloIMUModel.cs @@ -270,6 +270,8 @@ namespace AgroBase.Models.Modules { return new ModuloIMUModel { + Momento = Momento, + valido = valido, modo = modo, diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index a0e5989b5..3e5424955 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -61,39 +61,11 @@ namespace AgroBase.Models public OperacaoSensoriamentoConjuntoModel Sensoriamento { get; set; } = new OperacaoSensoriamentoConjuntoModel(); 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); - // } - //} - #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 @@ -233,8 +205,10 @@ namespace AgroBase.Models if (Parametros.Modo == null) return (false, new List()); CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo, true); + op = Variaveis.OperacaoEmAndamento; op.Parametros = Parametros; + op.DefinirComponentesEmUso(); op.Descricao = Parametros.Descricao; op.OprPath = opr_path; @@ -955,44 +929,55 @@ namespace AgroBase.Models p.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Npc, Mandatorio = true, Utilizar = true }); p.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Can, Mandatorio = true, Utilizar = true }); p.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Bat, Mandatorio = true, Utilizar = true }); - p.ModulosMandatorios.ForEach(m => m.ComponentesEmUso = op?.PreencherComponentesEmUso(m.Dispositivo)); if (isagrobase) { op.Parametros = p; + Variaveis.OperacaoEmAndamento = op; + p.ModulosMandatorios.ForEach(m => m.ComponentesEmUso = op?.PreencherComponentesEmUso(m.Dispositivo)); op.DefinirComponentesEmUso(); RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); op.Sensoriamento.AtualizarDados(); - - Variaveis.OperacaoEmAndamento = op; } - + else + { + p.ModulosMandatorios.ForEach(m => m.ComponentesEmUso = op?.PreencherComponentesEmUso(m.Dispositivo)); + } + return p; } private Dictionary PreencherComponentesEmUso(T_Code Modulo) { - var op = Variaveis.OperacaoEmAndamento; + var op = this; Dictionary d = new Dictionary(); switch (Modulo) { case T_Code.Mov: - op.DispMvd?.Dados?.Modulos?.ForEach(m => d.Add(m.MovMotor.Mod_ID, (true, m.MovMotor.Comandar))); + if (op.DispMvd != null) + op.DispMvd?.Dados?.Modulos?.ForEach(m => d.Add(m.MovMotor.Mod_ID, (true, m.MovMotor.Comandar))); break; case T_Code.Dir: - op.DispMvd?.Dados?.Modulos?.ForEach(m => d.Add(m.DirMotor.Mod_ID, (true, m.DirMotor.Comandar))); + if (op.DispMvd != null) + op.DispMvd?.Dados?.Modulos?.ForEach(m => d.Add(m.DirMotor.Mod_ID, (true, m.DirMotor.Comandar))); break; case T_Code.Atu: - op.DispAtu?.Dados?.Sensores?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); - op.DispAtu?.Dados?.BombasPressurizadoras?.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); - op.DispAtu?.Dados?.BicosPulverizadores?.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); + if (op.DispAtu != null) + { + op.DispAtu?.Dados?.Sensores?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); + op.DispAtu?.Dados?.BombasPressurizadoras?.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); + op.DispAtu?.Dados?.BicosPulverizadores?.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); + } break; case T_Code.Sen: - op.DispSen?.Dados?.Sensores?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); - op.DispSen?.Dados?.Sinaleiros?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); - op.DispSen?.Dados?.Servos?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); - op.DispSen?.Dados?.Reles?.ForEach(r => d.Add(r.ID, (r.Mandatorio, r.Controlar))); + if (op.DispSen != null) + { + op.DispSen?.Dados?.Sensores?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); + op.DispSen?.Dados?.Sinaleiros?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); + op.DispSen?.Dados?.Servos?.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); + op.DispSen?.Dados?.Reles?.ForEach(r => d.Add(r.ID, (r.Mandatorio, r.Controlar))); + } break; } return d; @@ -1000,14 +985,15 @@ namespace AgroBase.Models private void DefinirComponentesEmUso() { - var op = Variaveis.OperacaoEmAndamento; + var op = this; op.Parametros.ModulosMandatorios?.ForEach(m => { + var comp = m.ComponentesEmUso ?? new Dictionary(); switch (m.Dispositivo) { case T_Code.Mov: - foreach (var c in m.ComponentesEmUso) + foreach (var c in comp) { var d = op.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x?.MovMotor?.Mod_ID == c.Key)?.MovMotor; if (d != null) @@ -1015,7 +1001,7 @@ namespace AgroBase.Models } break; case T_Code.Dir: - foreach (var c in m.ComponentesEmUso) + foreach (var c in comp) { var d = op.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x?.DirMotor?.Mod_ID == c.Key)?.DirMotor; if (d != null) @@ -1024,7 +1010,7 @@ namespace AgroBase.Models break; case T_Code.Atu: var da = op.DispAtu?.Dados; - foreach (var c in m.ComponentesEmUso) + foreach (var c in comp) { var s = da?.Sensores?.FirstOrDefault(x => x.ID == c.Key); if (s != null) @@ -1051,7 +1037,7 @@ namespace AgroBase.Models break; case T_Code.Sen: var ds = op.DispSen?.Dados; - foreach (var c in m.ComponentesEmUso) + foreach (var c in comp) { var s = ds?.Sensores?.FirstOrDefault(x => x.ID == c.Key); if (s != null) @@ -1091,9 +1077,8 @@ namespace AgroBase.Models { if (Parametros.Modo == null) return (false, new List()); - var op = Variaveis.OperacaoEmAndamento; - CarregarParametrosOperacaoPadrao((ModoOperacao)Parametros.Modo, true); + var op = Variaveis.OperacaoEmAndamento; op.Descricao = Parametros.Descricao; op.OprPath = $"Base ({VariaveisEquipamento.Parametros.base_ip})"; @@ -1110,6 +1095,8 @@ namespace AgroBase.Models p.ModulosMandatorios = Parametros.ModulosMandatorios; p.ParametrosMandatorios = Parametros.ParametrosMandatorios; + op.DefinirComponentesEmUso(); + List ruasSelecionadas = Parametros.RuasPercorrer ?? new List(); if (Parametros.Mapa != null) { @@ -1243,8 +1230,30 @@ namespace AgroBase.Models if (op.Sensoriamento.Operacao.Calibrando) return; var modsCalibragem = op.Sensoriamento.Operacao.ModsCalibragem; + if (modsCalibragem == null) + { + modsCalibragem = new Dictionary>(); + op.Sensoriamento.Operacao.ModsCalibragem = modsCalibragem; + } + + if (!modsCalibragem.ContainsKey(T_Code.Mov)) + modsCalibragem[T_Code.Mov] = new Dictionary(); + + if (!modsCalibragem.ContainsKey(T_Code.Dir)) + modsCalibragem[T_Code.Dir] = new Dictionary(); + + if (!modsCalibragem.ContainsKey(T_Code.Atu)) + modsCalibragem[T_Code.Atu] = new Dictionary(); + + bool modsCalibrados = + modsCalibragem != null && + modsCalibragem.Any() && + modsCalibragem.All(x => + x.Value != null && + x.Value.Values.Count > 0 && + x.Value.Values.All(y => y == true) + ); - bool modsCalibrados = modsCalibragem.All(x => x.Value.Values.Count > 0 && x.Value.Values.All(y => y == true)); if (!forcar && modsCalibrados) { op.Sensoriamento.InserirLog(T_Code.Mod, StatusModulo.Operante, 100, "Todos os módulos já foram calibrados anteriormente, não irá calibrar novamente."); @@ -2827,27 +2836,6 @@ namespace AgroBase.Models ); } - private void SalvarLog(string Arquivo, T Objeto, bool Fim) - { - var Caminho = Variaveis.CaminhoOperacoes + Variaveis.OperacaoEmAndamento.ID; - if (!Directory.Exists(Caminho)) - { - Directory.CreateDirectory(Caminho); - } - - Caminho += "/" + Arquivo + ".json"; - string jsonLog = JsonConvert.SerializeObject(Objeto, Formatting.None); - - if (!File.Exists(Caminho)) - { - File.WriteAllText(Caminho, "[" + jsonLog); - } - else - { - File.AppendAllText(Caminho, "," + jsonLog + (Fim ? "]" : "")); - } - } - private void SalvarLogCameraSolo() { var cameras = CameraWorkerService.CamerasSolo.ToList(); @@ -3146,6 +3134,7 @@ namespace AgroBase.Models public class OperacaoControleModel { + public DateTime Momento { get; set; } public double Angulo { get; set; } public int heartbeat { get; set; } = 1; public DateTime ticks_sem_resposta { get; set; } = DateTime.MinValue; @@ -3257,23 +3246,37 @@ namespace AgroBase.Models public OperacaoControleModel Clone() { - return new OperacaoControleModel() + var clone = new OperacaoControleModel() { + Momento = Momento, + Angulo = Angulo, - PercentualVelocidadeSP = PercentualVelocidadeSP, - _tipoMovimento = _tipoMovimento, - TipoMovimento = TipoMovimento, - TiposControle = new List(TiposControle), - SimulacaoMPC = new List(SimulacaoMPC), + PercentualVelocidadeSP = PercentualVelocidadeSP, AlturaBarra = AlturaBarra, heartbeat = heartbeat, ticks_sem_resposta = ticks_sem_resposta, Latencia = Latencia, EmFreio = EmFreio, ErroLateral = ErroLateral, + TiposControle = TiposControle?.Select(x => new OperacaoControleTipoModel() + { + Tipo = x.Tipo, + DelayEnvioComandoBase = x.DelayEnvioComandoBase, + DelayEnvioComando = x.DelayEnvioComando, + DelayEnvioComandoExtra = x.DelayEnvioComandoExtra, + UltimoComando = x.UltimoComando, + Comandos = new List(x.Comandos ?? new List()), + DirecaoAtual = x.DirecaoAtual, + UltimaDirecao = x.UltimaDirecao + }).ToList() ?? new List(), + SimulacaoMPC = new List(SimulacaoMPC ?? new List()), DebugCustoMpc = new Dictionary(DebugCustoMpc ?? new Dictionary()), Motivos = new List(Motivos ?? new List()) }; + + clone._tipoMovimento = _tipoMovimento; + + return clone; } } @@ -3356,6 +3359,18 @@ namespace AgroBase.Models var op = Variaveis.OperacaoEmAndamento; op.Controle.Motivos = RedisService.GetField>(CtxKey.DadosControle, "motivos", new List()); + double tempoDecorridoSeg = 0; + + if (Operacao.DataInicio != DateTime.MinValue) + { + DateTime fim = + Operacao.DataFim != DateTime.MinValue + ? Operacao.DataFim + : agora; + + tempoDecorridoSeg = Math.Max(0, (fim - Operacao.DataInicio).TotalSeconds); + } + var operacaoAtualizada = new OperacaoSensoriamentoLogModel() { Momento = agora, @@ -3370,7 +3385,7 @@ namespace AgroBase.Models Finalizando = Operacao.Finalizando, DataInicio = Operacao.DataInicio, DataFim = Operacao.DataFim, - TempoDecorridoSeg = Operacao.TempoDecorridoSeg, + TempoDecorridoSeg = tempoDecorridoSeg, TipoCanAtivo = CanManager.TipoServico, OperacaoLiberada = RedisService.GetField(CtxKey.DadosOperacao, "liberado", false), @@ -4292,24 +4307,40 @@ namespace AgroBase.Models public ModuloIMUModel IMU { get; set; } = new ModuloIMUModel(); public void AtualizarImu(DateTime agora) { - string imu = RedisService.Get(RedisService.ModKey(T_Code.Imu)) ?? ""; - var sIMU = JsonConvert.DeserializeObject(imu); - sIMU.Momento = agora; - IMU = sIMU; + try + { + string imu = RedisService.Get(RedisService.ModKey(T_Code.Imu)) ?? ""; + var sIMU = JsonConvert.DeserializeObject(imu) ?? new ModuloIMUModel(); + + sIMU.Momento = agora; + IMU = sIMU; + } + catch + { + IMU = new ModuloIMUModel() + { + Momento = agora + }; + } } // Gps public GPSModel Gps { get; set; } = new GPSModel(); public void AtualizarGps(DateTime agora) { - Gps = GPSService.GetSnapshot(); + Gps = GPSService.GetSnapshot() ?? new GPSModel(); + Gps.Momento = agora; + + if (VariaveisOperacao.PosicaoBase != null) + VariaveisOperacao.PosicaoBase.Momento = agora; } // Lvx public LivoxModel LivoxLidar { get; set; } = new LivoxModel(); public void AtualizarLivox(DateTime agora) { - LivoxLidar = LivoxManagerProcess.DadosLeitura?.Clone(); + LivoxLidar = LivoxManagerProcess.DadosLeitura?.Clone() ?? new LivoxModel(); + LivoxLidar.Momento = agora; } // Bat @@ -4526,7 +4557,8 @@ namespace AgroBase.Models var dadosVisualWorker = OperadorVisual?.Clone(); var dadosHealthWorker = OperadorSaude?.Clone(); var dadosLivox = LivoxLidar?.Clone(); - var dadosCooler = _Cooler?.GetResumo(); + var dadosCooler = _Cooler?.GetResumo(agora); + op.Controle.Momento = agora; OperacaoSensoriamentoConjuntoModel dadosAtualizados = new OperacaoSensoriamentoConjuntoModel() { diff --git a/AgroBase/AgroBase/Services/CoolerControlService.cs b/AgroBase/AgroBase/Services/CoolerControlService.cs index 08075293a..c7b8c787a 100644 --- a/AgroBase/AgroBase/Services/CoolerControlService.cs +++ b/AgroBase/AgroBase/Services/CoolerControlService.cs @@ -163,10 +163,11 @@ namespace AgroBase.Services } } - public CoolerControlDataModel GetResumo() + public CoolerControlDataModel GetResumo(DateTime agora) { return new CoolerControlDataModel() { + Momento = agora, Modo = ModoAtual, UltimaMudanca = UltimaMudancaModo, TemperaturaLigar = TempOn, @@ -191,6 +192,7 @@ namespace AgroBase.Services public class CoolerControlDataModel { + public DateTime Momento { get; set; } public CoolerMode Modo { get; set; } public DateTime UltimaMudanca { get; set; } public double TemperaturaLigar { get; set; } @@ -206,6 +208,7 @@ namespace AgroBase.Services { return new CoolerControlDataModel() { + Momento = Momento, Modo = Modo, UltimaMudanca = UltimaMudanca, TemperaturaLigar = TemperaturaLigar,