Ajustes liberacao da operacao mediante autonomia

This commit is contained in:
Diego Freitas 2025-12-10 16:06:22 -03:00
parent 9a638aa7a6
commit 3df756a69d
8 changed files with 64 additions and 40 deletions

View File

@ -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<List<GPSModel>>());
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()

View File

@ -15,6 +15,7 @@ namespace AgroBase.Models
public TrajetoriaMapaOperacaoModel(List<List<GPSModel>> RuasMapa)
{
RuasPlantacao = new List<List<GPSModel>>(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<int, AutonomiaCorredorModel> CorredoresLiberados { get; set; } = new Dictionary<int, AutonomiaCorredorModel>();
@ -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;

View File

@ -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);

View File

@ -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),

View File

@ -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,

View File

@ -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,

View File

@ -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)
});
}

View File

@ -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 | " +