pequenos ajustes na instancia geral OperacaoEmAndamento

This commit is contained in:
Diego Freitas 2026-06-29 09:36:15 -03:00
parent afc3f41b5f
commit 1e82065e91
4 changed files with 126 additions and 86 deletions

View File

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

View File

@ -270,6 +270,8 @@ namespace AgroBase.Models.Modules
{
return new ModuloIMUModel
{
Momento = Momento,
valido = valido,
modo = modo,

View File

@ -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<T_Code, Dictionary<string, bool>> ModsCalibragem { get; set; } = new Dictionary<T_Code, Dictionary<string, bool>>();
//public List<OperacaoModulosMandatoriosModel> ModulosMandatorios { get; set; } = new List<OperacaoModulosMandatoriosModel>();
//public List<OperacaoParametrosMandatoriosModel> ParametrosMandatorios { get; set; } = new List<OperacaoParametrosMandatoriosModel>();
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<string>());
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<string, (bool, bool)> PreencherComponentesEmUso(T_Code Modulo)
{
var op = Variaveis.OperacaoEmAndamento;
var op = this;
Dictionary<string, (bool, bool)> d = new Dictionary<string, (bool, bool)>();
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<string, (bool, bool)>();
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<string>());
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<string> ruasSelecionadas = Parametros.RuasPercorrer ?? new List<string>();
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<T_Code, Dictionary<string, bool>>();
op.Sensoriamento.Operacao.ModsCalibragem = modsCalibragem;
}
if (!modsCalibragem.ContainsKey(T_Code.Mov))
modsCalibragem[T_Code.Mov] = new Dictionary<string, bool>();
if (!modsCalibragem.ContainsKey(T_Code.Dir))
modsCalibragem[T_Code.Dir] = new Dictionary<string, bool>();
if (!modsCalibragem.ContainsKey(T_Code.Atu))
modsCalibragem[T_Code.Atu] = new Dictionary<string, bool>();
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<T>(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<OperacaoControleTipoModel>(TiposControle),
SimulacaoMPC = new List<MPCSimulacaoModel>(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<string>(x.Comandos ?? new List<string>()),
DirecaoAtual = x.DirecaoAtual,
UltimaDirecao = x.UltimaDirecao
}).ToList() ?? new List<OperacaoControleTipoModel>(),
SimulacaoMPC = new List<MPCSimulacaoModel>(SimulacaoMPC ?? new List<MPCSimulacaoModel>()),
DebugCustoMpc = new Dictionary<string, ManagerWorkerMessageResponseDebugCustoModel>(DebugCustoMpc ?? new Dictionary<string, ManagerWorkerMessageResponseDebugCustoModel>()),
Motivos = new List<string>(Motivos ?? new List<string>())
};
clone._tipoMovimento = _tipoMovimento;
return clone;
}
}
@ -3356,6 +3359,18 @@ namespace AgroBase.Models
var op = Variaveis.OperacaoEmAndamento;
op.Controle.Motivos = RedisService.GetField<List<string>>(CtxKey.DadosControle, "motivos", new List<string>());
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<ModuloIMUModel>(imu);
sIMU.Momento = agora;
IMU = sIMU;
try
{
string imu = RedisService.Get(RedisService.ModKey(T_Code.Imu)) ?? "";
var sIMU = JsonConvert.DeserializeObject<ModuloIMUModel>(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()
{

View File

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