From 8f29571cffb1c48d661f3b86ae3e7aac267cd01e Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Wed, 4 Mar 2026 15:52:53 -0300 Subject: [PATCH] ajustes pontuais de conectividade --- AgroBase/AgroBase/Forms/IHM/frmAjustes.cs | 2 +- AgroBase/AgroBase/Forms/frmAcompanhamento.cs | 2 +- AgroBase/AgroBase/Models/OAKCameraModel.cs | 12 +++ .../Models/Operacoes/OperacaoModel.cs | 6 +- .../Services/CoulombCounterService.cs | 12 ++- AgroBase/AgroBase/Services/DalyBMSService.cs | 2 +- AgroBase/AgroBase/Services/GPSService.cs | 4 +- .../Operadores/HealthWorkerService.cs | 3 +- .../workers/camera_worker/camera_oak.py | 4 +- .../workers/health_worker/modulos/imu.py | 2 +- .../health_worker/modulos/sensoriamento.py | 91 +++++++++++-------- .../workers/visual_worker/camera_manager.py | 2 +- 12 files changed, 87 insertions(+), 55 deletions(-) diff --git a/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs b/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs index 16cdedc1f..1ae1d4805 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmAjustes.cs @@ -447,7 +447,7 @@ namespace AgroBase.Forms.IHM var interfaces = EthernetService.ObterNomesInterfaces().Where(x => x.Contains("Ativa")).ToList(); cmbInterface.Items.Clear(); cmbInterface.Items.AddRange(interfaces.ToArray()); - cmbInterface.SelectedIndex = interfaces.IndexOf(interfaces.FirstOrDefault(x => x.Contains(p.rover_interface))); + cmbInterface.SelectedIndex = interfaces.IndexOf(interfaces.FirstOrDefault(x => x.Contains(p.rover_interface ?? ""))); } private async void SalvarParametrosConfiguracao() diff --git a/AgroBase/AgroBase/Forms/frmAcompanhamento.cs b/AgroBase/AgroBase/Forms/frmAcompanhamento.cs index fc3f23a1e..7fdaddb09 100644 --- a/AgroBase/AgroBase/Forms/frmAcompanhamento.cs +++ b/AgroBase/AgroBase/Forms/frmAcompanhamento.cs @@ -87,7 +87,7 @@ namespace AgroBase.Forms if (DalyBMSService.Iniciado) { var Bat = DalyBMSService.DadosLeitura; - lblVBat.Text = $"Bateria: {Bat.Pack.TensaoTotal_V:F2}V {Bat.Pack.Corrente_A:F2}A {Bat.Pack.SOC_percent:F2}% {Bat.TemperaturaMax:Fw}ºC"; + lblVBat.Text = $"Bateria: {Bat.Pack.TensaoTotal_V:F2}V {Bat.Pack.Corrente_A:F2}A {Bat.Pack.SOC_percent:F2}% {Bat.TemperaturaMax:F2}ºC"; } lblVBat.ForeColor = DalyBMSService.Iniciado ? Color.Green : Color.Red; } diff --git a/AgroBase/AgroBase/Models/OAKCameraModel.cs b/AgroBase/AgroBase/Models/OAKCameraModel.cs index ddef35f80..af7f0edcc 100644 --- a/AgroBase/AgroBase/Models/OAKCameraModel.cs +++ b/AgroBase/AgroBase/Models/OAKCameraModel.cs @@ -166,4 +166,16 @@ namespace AgroBase.Models } } + public class OAKImuModel + { + public double timestamp { get; set; } + public double roll { get; set; } + public double pitch { get; set; } + public double yaw { get; set; } + public double yaw_fixed { get; set; } + public double vel_mps { get; set; } + public double latencia { get; set; } + public double frequencia { get; set; } + } + } diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 60eb2de39..00eeb1842 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -2338,7 +2338,8 @@ namespace AgroBase.Models _Reservatorio?.AtualizarConsumo(_DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0, Variaveis.OperacaoEmAndamento.TempoDecorridoSegs); _Trajetoria?.AtualizarDadosAutonomiaCorredor(); - var sIMU = LivoxManagerProcess.DadosLeitura.imu; + var sIMU = JsonConvert.DeserializeObject(RedisService.Get(RedisService.ModKey(T_Code.Imu))); + //var sIMU = LivoxManagerProcess.DadosLeitura.imu; var dadosIMU = sIMU != null ? new OperacaoSensoriamentoLogImuModel() { Iniciado = sIMU.timestamp > 0 && HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Imu)?.status != StatusModulo.Desconectado, @@ -2451,6 +2452,7 @@ namespace AgroBase.Models var dadosBateria = _Bateria != null ? new OperacaoSensoriamentoLogBateriaModel() { Iniciado = _Bateria.Iniciado, + BmsLigado = _Bateria.BmsLigado, _dt = _Bateria._dt, PercentualBateria = _Bateria.PercentualBateria, PercentualBateriaConsumida = _Bateria.PercentualConsumido, @@ -2796,6 +2798,7 @@ namespace AgroBase.Models public class OperacaoSensoriamentoLogBateriaModel { public bool Iniciado { get; set; } + public bool BmsLigado { get; set; } public double _dt { get; set; } public double PercentualBateria { get; set; } public double PercentualBateriaConsumida { get; set; } @@ -2813,6 +2816,7 @@ namespace AgroBase.Models return new OperacaoSensoriamentoLogBateriaModel() { Iniciado = Iniciado, + BmsLigado = BmsLigado, _dt = _dt, PercentualBateriaConsumida = PercentualBateriaConsumida, PercentualBateria = PercentualBateria, diff --git a/AgroBase/AgroBase/Services/CoulombCounterService.cs b/AgroBase/AgroBase/Services/CoulombCounterService.cs index 669f0e25f..cd71bdea2 100644 --- a/AgroBase/AgroBase/Services/CoulombCounterService.cs +++ b/AgroBase/AgroBase/Services/CoulombCounterService.cs @@ -32,6 +32,7 @@ namespace AgroBase.Services private readonly Queue _historicoCorrente = new Queue(); public bool Iniciado { get; private set; } + public bool BmsLigado { get; set; } private double CargaMaxima { get; set; } private double CargaAtual { get; set; } public double CargaAtualAmp @@ -133,16 +134,17 @@ namespace AgroBase.Services double sen_soc = Math.Round(FuncoesMatematicas.Map(sen_tensao, VariaveisEquipamento.TensaoMinimaBateria, VariaveisEquipamento.TensaoMaximaBateria, 0.0, 100.0), 2); Iniciado = bms_iniciado || sen_iniciado; + BmsLigado = bms_iniciado; if (!Iniciado) return; //_dt = Sensor.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.Corrente)?.atual?.dt ?? 0; - _dt = (DateTime.Now - ((bms_iniciado ? bms_ultima_leitura : sen_ultima_leitura) ?? DateTime.Now)).TotalSeconds; - TensaoInstantanea = bms_iniciado ? bms_tensao : sen_tensao; - CorrenteInstantanea = bms_iniciado ? bms_corrente : sen_corrente; - PotenciaInstantanea = bms_iniciado ? bms_potencia : sen_potencia; - PercentualBateria = bms_iniciado ? bms_soc : sen_soc; + _dt = (DateTime.Now - ((BmsLigado ? bms_ultima_leitura : sen_ultima_leitura) ?? DateTime.Now)).TotalSeconds; + TensaoInstantanea = BmsLigado ? bms_tensao : sen_tensao; + CorrenteInstantanea = BmsLigado ? bms_corrente : sen_corrente; + PotenciaInstantanea = BmsLigado ? bms_potencia : sen_potencia; + PercentualBateria = BmsLigado ? bms_soc : sen_soc; PercentualBateria = FuncoesMatematicas.Clamp(PercentualBateria, 0, 100); // Verifique se as datas são válidas (não MinValue, MaxValue ou valores anômalos) diff --git a/AgroBase/AgroBase/Services/DalyBMSService.cs b/AgroBase/AgroBase/Services/DalyBMSService.cs index 9ec772cac..07cdfc0df 100644 --- a/AgroBase/AgroBase/Services/DalyBMSService.cs +++ b/AgroBase/AgroBase/Services/DalyBMSService.cs @@ -220,7 +220,7 @@ namespace AgroBase.Services DadosLeitura.Pack.TensaoTotal_V = totalV; DadosLeitura.Pack.TensaoMedida_V = measV; - DadosLeitura.Pack.Corrente_A = current; + DadosLeitura.Pack.Corrente_A = -current; DadosLeitura.Pack.SOC_percent = soc; } diff --git a/AgroBase/AgroBase/Services/GPSService.cs b/AgroBase/AgroBase/Services/GPSService.cs index 717094c7e..b129435da 100644 --- a/AgroBase/AgroBase/Services/GPSService.cs +++ b/AgroBase/AgroBase/Services/GPSService.cs @@ -1012,9 +1012,9 @@ namespace AgroBase.Services } } - foreach (var bico in Variaveis.OperacaoEmAndamento.Controle?.Bicos?.Where(x => x.Inicializado && x.Comandar)) + foreach (var bico in Variaveis.OperacaoEmAndamento.Controle?.Bicos ?? new List()) { - if (bico._EstadoLeitura == Estado.Ligado) + if (bico.Inicializado && bico.Comandar && bico._EstadoLeitura == Estado.Ligado) { bico.TrechosAtuado[bico.TrechosAtuado.Count - 1].Add(new double[] { UltimaLeitura.Latitude, UltimaLeitura.Longitude }); } diff --git a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs index 879c9f05c..ede532c94 100644 --- a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs @@ -388,7 +388,8 @@ namespace AgroBase.Services.Operadores RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Sen), ("timestamp", agora), ("conectado", DadosSen.Conectado), - ("freq_base", DadosSen.FrequenciaBase) + ("freq_base", DadosSen.FrequenciaBase), + ("bms_ligado", _Sensoriamento.Bateria?.BmsLigado ?? false) ); var senSensoresAtualizados = new List<(string caminho, object valor)>(); var senSensoresAtivos = new List(); diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/camera_oak.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/camera_oak.py index c6122673c..1ddbd3973 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/camera_oak.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/camera_oak.py @@ -84,7 +84,7 @@ class CameraOak: _camera["modelo"] = self.modelo _camera["dispositivo"] = self.dispositivo.value _camera["tem_depht"] = self.tem_depth - _camera["tem_imu"] = iniciar_imu and self.tem_imu + _camera["tem_imu"] = self.tem_imu # Criar processo para transmissao de video try: @@ -130,7 +130,7 @@ class CameraOak: if self.tem_depth: self.q_depth = self.device.getOutputQueue(name="depth", maxSize=1, blocking=False) - if self.tem_imu: + if self.tem_imu and iniciar_imu: self.q_imu = self.device.getOutputQueue(name="imu", maxSize=50, blocking=False) self.imu = IMUCamera(self.q_imu, freq=100, angulo_inicial=26.3) diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/imu.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/imu.py index 84be3dd92..e5468e8c7 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/imu.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/imu.py @@ -128,7 +128,7 @@ class IMUCamera(ModuloDiagnosticoBase): pitch=round(-pitch, 2), # frontal yaw=round(yaw, 2), vel_mps=round(velocidade_mps, 3), - timestamp=t1, + timestamp=(t1 * 1000), latencia=latencia, frequencia=f_tick ) diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/sensoriamento.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/sensoriamento.py index 335bd3bbc..1187c72a6 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/sensoriamento.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/health_worker/modulos/sensoriamento.py @@ -18,6 +18,8 @@ class ModuloSensoriamento(ModuloDiagnosticoBase): try: agora = time.time() motivos_gerais = [] + saude_mandatorios = 0 + total_mandatorios = 0 saude_total = 0 total_ativos = 0 saude_individual = [] @@ -29,6 +31,7 @@ class ModuloSensoriamento(ModuloDiagnosticoBase): FREQ_MIN = FREQ_BASE * 0.5 SAUDE_MIN_ALERTA = 80 + bms_ligado = dados_sen.get("bms_ligado", False) sensor_bateria_ativado = False sensores_ativos = dados_sen.get("sensores", {}).get("ativos", []) @@ -88,9 +91,11 @@ class ModuloSensoriamento(ModuloDiagnosticoBase): "em_uso": aferir } saude_individual.append(saude_mod) + total_ativos += 1 + saude_total += saude if mandatorio: - total_ativos += 1 - saude_total += saude + total_mandatorios += 1 + saude_mandatorios += saude motivos_gerais.extend([f"{chave}: {m}" for m in motivos]) dados_sensor["saude"] = saude_mod @@ -148,9 +153,11 @@ class ModuloSensoriamento(ModuloDiagnosticoBase): "em_uso": controlar } saude_individual.append(saude_mod) + total_ativos += 1 + saude_total += saude if mandatorio: - total_ativos += 1 - saude_total += saude + total_mandatorios += 1 + saude_mandatorios += saude motivos_gerais.extend([f"{chave}: {m}" for m in motivos]) dados_servo["saude"] = saude_mod @@ -198,9 +205,11 @@ class ModuloSensoriamento(ModuloDiagnosticoBase): "em_uso": controlar } saude_individual.append(saude_mod) + total_ativos += 1 + saude_total += saude if mandatorio: - total_ativos += 1 - saude_total += saude + total_mandatorios += 1 + saude_mandatorios += saude motivos_gerais.extend([f"{chave}: {m}" for m in motivos]) dados_rele["saude"] = saude_mod @@ -248,50 +257,54 @@ class ModuloSensoriamento(ModuloDiagnosticoBase): "em_uso": controlar } saude_individual.append(saude_mod) + total_ativos += 1 + saude_total += saude if mandatorio: - total_ativos += 1 - saude_total += saude + total_mandatorios += 1 + saude_mandatorios += saude motivos_gerais.extend([f"{chave}: {m}" for m in motivos]) dados_led["saude"] = saude_mod cond_op_mod = [] penalidade_percentual_bateria = 0 - if sensor_bateria_ativado: - _contexto = ContextoGlobalRedis.get_contexto() - bateria_suficiente_corredor = _contexto.get("Trajetoria", {}).get("CorredorAtual", {}).get("bateria_ok", True) - percent_atual = _contexto.get("Gerais", {}).get("percentual_bateria", 0.0) - percent_min = ContextoGlobalRedis.get_equipamento().get("percentual_tensao_bateria_min", 5.0) - if percent_atual < percent_min: - penalidade_percentual_bateria = 70 + if not bms_ligado: + if sensor_bateria_ativado: + _contexto = ContextoGlobalRedis.get_contexto() + bateria_suficiente_corredor = _contexto.get("Trajetoria", {}).get("CorredorAtual", {}).get("bateria_ok", True) + percent_atual = _contexto.get("Gerais", {}).get("percentual_bateria", 0.0) + percent_min = ContextoGlobalRedis.get_equipamento().get("percentual_tensao_bateria_min", 5.0) + if percent_atual < percent_min: + penalidade_percentual_bateria = 70 + cond_op_mod.append({ + "valor": percent_atual, + "severidade": 100, + "descricao": f"Nível da bateria abaixo do limite mínimo!" + }) + elif percent_atual < 25.0: + penalidade_percentual_bateria = 25 + cond_op_mod.append({ + "valor": percent_atual, + "severidade": 30, + "descricao": f"Nível da bateria baixo!" + }) + if not bateria_suficiente_corredor: + penalidade_percentual_bateria = 25 + _motivo_bat = _contexto.get("Trajetoria", {}).get("CorredorAtual", {}).get("motivo", "Bateria insuficiente") + cond_op_mod.append({ + "valor": percent_atual, + "severidade": 30, + "descricao": _motivo_bat + }) + else: cond_op_mod.append({ - "valor": percent_atual, + "valor": 0, "severidade": 100, - "descricao": f"Nível da bateria abaixo do limite mínimo!" + "descricao": f"Sensor de nível da bateria desconectado!" }) - elif percent_atual < 25.0: - penalidade_percentual_bateria = 25 - cond_op_mod.append({ - "valor": percent_atual, - "severidade": 30, - "descricao": f"Nível da bateria baixo!" - }) - if not bateria_suficiente_corredor: - penalidade_percentual_bateria = 25 - _motivo_bat = _contexto.get("Trajetoria", {}).get("CorredorAtual", {}).get("motivo", "Bateria insuficiente") - cond_op_mod.append({ - "valor": percent_atual, - "severidade": 30, - "descricao": _motivo_bat - }) - else: - cond_op_mod.append({ - "valor": 0, - "severidade": 100, - "descricao": f"Sensor de nível da bateria desconectado!" - }) - saude_final = (saude_total // total_ativos) if total_ativos > 0 else 0 + saude_final = (saude_mandatorios // total_mandatorios) if total_mandatorios > 0 else 100 + #saude_final = (saude_total // total_ativos) if total_ativos > 0 else 0 saude_final = saude_final - penalidade_percentual_bateria status = StatusModulo.OPERANTE diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/camera_manager.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/camera_manager.py index ae0bd472a..fba33e8c3 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/camera_manager.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/camera_manager.py @@ -65,7 +65,7 @@ class CameraManager: det_config = load_det_config() try: - nova = CameraOak(self.mostrar_log, mx_id, modelo_ia_seg=None, modelo_ia_det=det_config) + nova = CameraOak(self.mostrar_log, mx_id, modelo_ia_seg=None, modelo_ia_det=det_config, iniciar_imu=True) if nova.iniciado: self.camera = nova except Exception as e: