diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 912fe6243..101fa7ce8 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -17,6 +17,7 @@ using static AgroBase.Services.OIDCanService.OidHandler; using AgroBase.Models.Operadores; using AgroBase.Services.Operadores; using AgroMonitor; +using Newtonsoft.Json.Linq; namespace AgroBase.Models { @@ -843,6 +844,8 @@ namespace AgroBase.Models Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.Add(new OperacaoModulosMandatoriosModel() { Dispositivo = T_Code.Bat, Mandatorio = true, Utilizar = true }); Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.ForEach(m => m.ComponentesEmUso = Variaveis.OperacaoEmAndamento.PreencherComponentesEmUso(m.Dispositivo)); + + Variaveis.OperacaoEmAndamento.Trajetoria = new TrajetoriaMapaOperacaoModel(new List>()); Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = new OperacaoSensoriamentoLogModel(); if (Variaveis.OperacaoEmAndamento.DispSen != null) @@ -1563,8 +1566,8 @@ namespace AgroBase.Models case BotoesJoystick.R1: // Libera a operacao interrompida mediante supervisao humana if (!(Variaveis.OperacaoEmAndamento.Trajetoria?.AutonomiaCorredor?.Liberado ?? false)) { - (bool b_liberada, bool h_liberado) = ((bool, bool))controleBase._comp_value; - Variaveis.OperacaoEmAndamento.Trajetoria?.AtualizarDadosAutonomiaCorredor(bat_liberada: b_liberada, herb_liberado: h_liberado); + var (idx_corredor, b_liberada, h_liberado) = ((JObject)controleBase._comp_value).ToObject<(int, bool, bool)>(); + Variaveis.OperacaoEmAndamento.Trajetoria?.AtualizarDadosAutonomiaCorredor(idxCorredor: idx_corredor, bat_liberada: b_liberada, herb_liberado: h_liberado); } break; } @@ -2312,10 +2315,12 @@ namespace AgroBase.Models public void AtualizarDados() { Variaveis.OperacaoEmAndamento.AtualizarDadosContexto(); + Variaveis.OperacaoEmAndamento.DadosPerformance.AtualizarDadosPerformance(); VisualWorkerService.AtualizarAnalise(); WeedWorkerService.AtualizarAnalise(); GPSService.AtualizaDadosRedis(); LivoxManagerProcess.AtualizarLeitura(); + MovimentacaoMovimentoCompensadoModel.AtualizarDados(); var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria; var _DispMvd = Variaveis.OperacaoEmAndamento.DispMvd; @@ -2325,12 +2330,10 @@ namespace AgroBase.Models var _Bateria = _DispSen?.Dados?.ContadorCarga; var _Reservatorio = _DispAtu?.Dados?.ContadorCarga; - Variaveis.OperacaoEmAndamento.DadosPerformance.AtualizarDadosPerformance(); - - MovimentacaoMovimentoCompensadoModel.AtualizarDados(); _DispMvd?.Dados?.AtualizarDadosFreio(); _Bateria?.AtualizarConsumo(_DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0); _Reservatorio?.AtualizarConsumo(_DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0, Variaveis.OperacaoEmAndamento.TempoDecorridoSegs); + _Trajetoria.AtualizarDadosAutonomiaCorredor(); var sIMU = LivoxManagerProcess.DadosLeitura.imu; var dadosIMU = sIMU != null ? new OperacaoSensoriamentoLogImuModel() diff --git a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs index 301657ce1..ab31e3073 100644 --- a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs +++ b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs @@ -15,6 +15,7 @@ namespace AgroBase.Models public TrajetoriaMapaOperacaoModel(List> RuasMapa) { RuasPlantacao = new List>(RuasMapa); + AutonomiaCorredor = new AutonomiaCorredorModel(); } #region PARAMETROS @@ -32,7 +33,7 @@ namespace AgroBase.Models #endregion public DateTime UltimaAtualizacaoDados { get; set; } = DateTime.MinValue; - public AutonomiaCorredorModel AutonomiaCorredor = new AutonomiaCorredorModel(); + public AutonomiaCorredorModel AutonomiaCorredor { get; set; } [JsonProperty] public double TempoEntreLeituras { get; private set; } @@ -640,8 +641,6 @@ namespace AgroBase.Models { if (!_TrajetoriaFixaDefinida) return; - AtualizarDadosAutonomiaCorredor(); - AtualizarTempoEntreLeituras(); AtualizarDistanciaMaximaEntreLeituras(); @@ -849,8 +848,8 @@ namespace AgroBase.Models public void AtualizarDadosAutonomiaCorredor(int? idxCorredor = null, bool? bat_liberada = null, bool? herb_liberado = null) { if (idxCorredor == null) idxCorredor = CorredorAtual?.Idx ?? 0; - if (bat_liberada == null) bat_liberada = Variaveis.OperacaoEmAndamento.Simulando; - if (herb_liberado == null) herb_liberado = Variaveis.OperacaoEmAndamento.Simulando; + if (bat_liberada == null) bat_liberada = false; + if (herb_liberado == null) herb_liberado = false; AutonomiaCorredor.AtualizarDados((int)idxCorredor, (bool)bat_liberada, (bool)herb_liberado); } @@ -1429,6 +1428,8 @@ namespace AgroBase.Models DistanciaTotal = GPSUtils.DistanciaDoTrecho(_trajetoriaFixa.Where(x => x.Tipo != TipoPontoRua.PosicaoRobo).Select(x => x.Posicao).ToList()); + AutonomiaCorredor.Iniciar(); + AtualizarDadosTrajetoria(); LoopAtualizaDados(); @@ -1864,14 +1865,21 @@ namespace AgroBase.Models public class AutonomiaCorredorModel { + [JsonProperty] + public bool Iniciado { get; private set; } + [JsonProperty] public AutonomiaCorredorStatus Status { get; private set; } private bool _liberado => Status == AutonomiaCorredorStatus.OkCompleto || Status == AutonomiaCorredorStatus.OkSomenteTransito || Status == AutonomiaCorredorStatus.OkSupervisionado; + [JsonProperty] public bool Liberado { get; private set; } + [JsonProperty] public double DistanciaCorredor_m { get; private set; } + [JsonProperty] public double DistanciaSeguraBateria_m { get; private set; } + [JsonProperty] public double DistanciaSeguraHerbicida_m { get; private set; } private Dictionary CorredoresLiberados { get; set; } = new Dictionary(); @@ -1880,13 +1888,30 @@ namespace AgroBase.Models public bool HerbicidaSuficiente => DistanciaSeguraHerbicida_m >= DistanciaCorredor_m; // Texto pra UI/log + [JsonProperty] public string Motivo { get; private set; } = ""; + public void Iniciar() + { + Iniciado = true; + } + public void AtualizarDados(int idxCorredor, bool bateria_liberada, bool reservatorio_liberado) { + if (!Iniciado) + { + Liberado = true; + Motivo = "Não iniciado"; + Status = AutonomiaCorredorStatus.Desconhecido; + return; + } + if (Variaveis.OperacaoEmAndamento.Trajetoria?._Corredores?.Count <= idxCorredor) return; + if (CorredoresLiberados.ContainsKey(idxCorredor) && CorredoresLiberados[idxCorredor].Liberado) + return; + double distanciaCorredor = Variaveis.OperacaoEmAndamento.Trajetoria._Corredores[idxCorredor]?.DistanciaTotal ?? 0; var _Bateria = Variaveis.OperacaoEmAndamento.DispSen?.Dados?.ContadorCarga; diff --git a/AgroBase/AgroBase/Services/CoulombCounterService.cs b/AgroBase/AgroBase/Services/CoulombCounterService.cs index a0d9aeee0..bcfdcd0a3 100644 --- a/AgroBase/AgroBase/Services/CoulombCounterService.cs +++ b/AgroBase/AgroBase/Services/CoulombCounterService.cs @@ -139,6 +139,7 @@ namespace AgroBase.Services double deltaEnergia_Wh = potenciaInst_W * _dt / 3600.0; // Wh EnergiaConsumida_Wh += deltaEnergia_Wh; + //EnergiaConsumida_Wh = Sensor.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Energia)?.atual?.valor ?? 0; // --- HISTÓRICO P/ TEMPO ESTIMADO --- _historicoCorrente.Enqueue(CorrenteInstantanea); diff --git a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs index 5e8a045b6..64b0c29f8 100644 --- a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs @@ -144,10 +144,10 @@ namespace AgroBase.Services.Operadores dist_dir = _t.DistanciaDireita, angulo = _t.AnguloMedioCorredor, pontos_restantes = _t.CorredorAtual.QtdPontos - pontoComparar.idxPontoCorredor, - liberado = _t.AutonomiaCooredor.Liberado, - motivo = _t.AutonomiaCooredor.Motivo, - bateria_ok = _t.AutonomiaCooredor.BateriaSuficiente, - herbicida_ok = _t.AutonomiaCooredor.HerbicidaSuficiente + liberado = _t.AutonomiaCooredor?.Liberado ?? false, + motivo = _t.AutonomiaCooredor?.Motivo ?? "", + bateria_ok = _t.AutonomiaCooredor?.BateriaSuficiente ?? false, + herbicida_ok = _t.AutonomiaCooredor?.HerbicidaSuficiente ?? false }, } : null ), @@ -601,7 +601,7 @@ namespace AgroBase.Services.Operadores var DadosTrj = _Sensoriamento?.Trajetoria; RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Trj), ("timestamp", agora), - ("carregado", DadosTrj?.QtdPontos > 0), + ("iniciado", DadosTrj?.AutonomiaCooredor?.Iniciado ?? false), ("liberado", DadosTrj?.AutonomiaCooredor?.Liberado ?? false), ("bateria_ok", DadosTrj?.AutonomiaCooredor?.BateriaSuficiente ?? false), ("herbicida_ok", DadosTrj?.AutonomiaCooredor?.HerbicidaSuficiente ?? false), diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/trajetoria.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/trajetoria.py index 7f5a52e17..fa5c12b1e 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/trajetoria.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/trajetoria.py @@ -1,4 +1,3 @@ -import time from shared.contexto_global_redis import ContextoGlobalRedis from shared.enums import StatusModulo, T_Code from health_worker.modulos.base import ModuloDiagnosticoBase @@ -12,12 +11,10 @@ class ModuloTrajetorira(ModuloDiagnosticoBase): def atualizar_saude(self): try: m = ContextoGlobalRedis.get_modulo(self.t_code) or {} - _operacao = ContextoGlobalRedis.get_operacao() - + SAUDE_MIN_ALERTA = 50 - op_iniciada = bool(_operacao.get("iniciado", False)) - carregado = bool(m.get("carregado", False)) + iniciado = bool(m.get("iniciado", False)) liberado = bool(m.get("liberado", False)) bateria_ok = bool(m.get("bateria_ok", False)) herbicida_ok = bool(m.get("herbicida_ok", False)) @@ -26,27 +23,23 @@ class ModuloTrajetorira(ModuloDiagnosticoBase): saude = 100 motivos = [] - if op_iniciada: - if not carregado: - saude -= 100 - motivos.append("mapa não carregado") - else: - if not bateria_ok: - saude -= 50 - if not herbicida_ok: - saude -= 50 - motivos.append(motivo) + if iniciado: + if not bateria_ok: + saude -= 50 + if not herbicida_ok: + saude -= 50 + motivos.append(motivo) saude = max(saude, 0) status = StatusModulo.OPERANTE - if op_iniciada and not carregado: + if not iniciado: status = StatusModulo.DESCONECTADO elif saude < SAUDE_MIN_ALERTA: status = StatusModulo.ALERTA payload = { - "carregado": carregado, + "conectado": iniciado, "status": status.value, "saude": saude, "motivos": motivos, diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/shared/contexto_global_redis.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/shared/contexto_global_redis.py index 8b588b2f2..deba8110d 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/shared/contexto_global_redis.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/shared/contexto_global_redis.py @@ -380,7 +380,7 @@ class ContextoGlobalRedis: if _motivo_traj: motivos_dos_modulos_mandatorios.append(_motivo_traj) - liberou = (base_ok and parametros_ok and emergencia_ok and pausa_ok and trajetoria_ok) or debug_mode + liberou = ((base_ok and parametros_ok and emergencia_ok and pausa_ok) or debug_mode) and trajetoria_ok cls.atualizar_ctx_dict( CtxKey.DadosOperacao, diff --git a/AgroBase/OperationControl/Models/Variaveis.cs b/AgroBase/OperationControl/Models/Variaveis.cs index 03a9ddbde..f97998feb 100644 --- a/AgroBase/OperationControl/Models/Variaveis.cs +++ b/AgroBase/OperationControl/Models/Variaveis.cs @@ -331,14 +331,14 @@ namespace OperationControl.Models }); } - public static void EnviarConfirmacaoHumanaTrajetoria(bool bat_liberada, bool herb_liberado) + public static void EnviarConfirmacaoHumanaTrajetoria(int idx_corredor, bool bat_liberada, bool herb_liberado) { EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel() { Momento = DateTime.Now, Dispositivo = AgroBase.Models.Enums.T_Code.Mod, Tecla = AgroBase.Models.Enums.BotoesJoystick.R1, - _comp_value = (bat_liberada, herb_liberado) + _comp_value = (idx_corredor, bat_liberada, herb_liberado) }); } diff --git a/AgroBase/OperationControl/Windows/MainWindow.xaml.cs b/AgroBase/OperationControl/Windows/MainWindow.xaml.cs index 3af19b510..b4f04407e 100644 --- a/AgroBase/OperationControl/Windows/MainWindow.xaml.cs +++ b/AgroBase/OperationControl/Windows/MainWindow.xaml.cs @@ -422,7 +422,7 @@ namespace OperationControl.Windows // Aplica cor de acordo com o status AplicarStatusModuloNaLabel(lbl, individual?.status ?? _saude?.status ?? AgroBase.Models.Enums.StatusModulo.Desconectado, em_uso); - if (lbl.Name == _labelModuloSelecionado.Name) + if (lbl.Name == _labelModuloSelecionado?.Name) { PreencherAbaAcompanhamento(false); PreencherAbaOpcoes(false); @@ -1289,14 +1289,16 @@ namespace OperationControl.Windows if (modulo != AgroBase.Models.Enums.T_Code.Trj) return; + var _Trajetoria = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Trajetoria; + int idx_corredor = (_Trajetoria?.PontoAtual?.idxCorredor ?? 0); bool bat_liberada = chbTrajetoria_BatLiberada.IsChecked ?? false; bool herb_liberado = chbTrajetoria_HerbLiberado.IsChecked ?? false; - string motivo = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Trajetoria?.AutonomiaCooredor?.Motivo ?? ""; + string motivo = _Trajetoria?.AutonomiaCooredor?.Motivo ?? ""; - if ((bat_liberada || herb_liberado) && MessageBox.Show("Confirmação", $"Tem certeza que deseja liberar a entrada do equipamento na próxima rua?\r\n{motivo}", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) + if ((bat_liberada || herb_liberado) && MessageBox.Show($"Tem certeza que deseja liberar a entrada do equipamento na próxima rua?\r\n{motivo}", "Confirmação", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes) return; - VariaveisControleOperacao.EnviarConfirmacaoHumanaTrajetoria(bat_liberada, herb_liberado); + VariaveisControleOperacao.EnviarConfirmacaoHumanaTrajetoria(idx_corredor, bat_liberada, herb_liberado); } #endregion @@ -1558,7 +1560,7 @@ namespace OperationControl.Windows private void AtualizarDadosTela_Mapa(AgroBase.Models.OperacaoSensoriamentoLogTrajetoriaModel Trajetoria) { lblMapaInfo_Debug.Content = $"" + - $"Status: {Trajetoria.AutonomiaCooredor.Status} | " + + $"Status: {Trajetoria.AutonomiaCooredor?.Status ?? AgroBase.Models.AutonomiaCorredorStatus.Desconhecido} | " + $"Próximo Ponto: {Trajetoria.ProximoPonto.idxPonto} | " + (Trajetoria.ProximoPonto.Aproximando ? "Aproximando" : "Afastando") + " | " + $"Distância próximo ponto: {Trajetoria.ProximoPonto.DistanciaAtual.ToString("0.00")} m | " +