Ajuste no contrato de dados transmitido entre rover e base

This commit is contained in:
Diego Freitas 2025-12-17 16:27:06 -03:00
parent b3b64a9aed
commit bdc70d89bf
44 changed files with 1029 additions and 427 deletions

View File

@ -1227,7 +1227,7 @@ namespace AgroBase.Forms.IHM
bool PzmConectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Enums.T_Code.Pzm);
idx = PreencheDadosLinha(grid, Testes, idx, PzmConectado ? 1 : 0);
var S36V = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Bateria;
var S36V = Variaveis.OperacaoEmAndamento.Sensoriamento.Bateria;
bool S36VInicializado = S36V.Iniciado;
idx = PreencheDadosLinha(grid, Testes, idx, S36VInicializado ? 1 : 0);
@ -1264,7 +1264,7 @@ namespace AgroBase.Forms.IHM
double Corrente12V = S12V.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.Corrente).atual.valor;
idx = PreencheDadosLinha(grid, Testes, idx, Corrente12V);
var SImu = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU;
var SImu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU;
double Orientacao = SImu.Iniciado ? SImu.Rotacao : -1;
idx = PreencheDadosLinha(grid, Testes, idx, Orientacao);
@ -1274,13 +1274,13 @@ namespace AgroBase.Forms.IHM
bool GpsInicializado = GPSService.Iniciado;
idx = PreencheDadosLinha(grid, Testes, idx, GpsInicializado ? 1 : 0);
double Precisao = GpsInicializado ? (int)Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.QualidadeFix : -1;
double Precisao = GpsInicializado ? (int)Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.QualidadeFix : -1;
idx = PreencheDadosLinha(grid, Testes, idx, Precisao);
double Satelites = GpsInicializado ? Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.NumeroSatelites : -1;
double Satelites = GpsInicializado ? Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.NumeroSatelites : -1;
idx = PreencheDadosLinha(grid, Testes, idx, Satelites);
double OrientacaoGPS = GpsInicializado ? Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.OrientacaoReal : -1;
double OrientacaoGPS = GpsInicializado ? Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.OrientacaoReal : -1;
idx = PreencheDadosLinha(grid, Testes, idx, OrientacaoGPS);
bool A05Conectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Enums.T_Code.A05);

View File

@ -136,7 +136,7 @@ namespace AgroBase.Forms.IHM
public void AtualizarMapaDinamico()
{
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria;
if (_Trajetoria != null && _Trajetoria.CorredorAtual != null)
@ -160,7 +160,7 @@ namespace AgroBase.Forms.IHM
pnlOrientacao.Invalidate();
pnlInclinacao.Invalidate();
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
lblUltimaLeituraSolo.Text = "Última Leitura Solo: " + _Sensoriamento.OperadorErvas.UltimaMensagem.ToString("HH:mm:ss.fff");
lblUltimaLeituraCaminho.Text = "Última Leitura Caminho: " + _Sensoriamento.OperadorVisual.UltimaMensagem.ToString("HH:mm:ss.fff");
@ -293,8 +293,8 @@ namespace AgroBase.Forms.IHM
{
try
{
double angulo = Variaveis.OperacaoEmAndamento.Parametros?.DadosLeitura?.Gps?.AnguloCarroDefinido ?? 0;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)(Variaveis.OperacaoEmAndamento.Parametros?.DadosLeitura?.Trajetoria?.AnguloCaminho ?? 0));
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento?.Gps?.AnguloCarroDefinido ?? 0;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)(Variaveis.OperacaoEmAndamento.Sensoriamento?.Trajetoria?.AnguloCaminho ?? 0));
}
catch { }
}

View File

@ -151,7 +151,7 @@ namespace AgroBase.Forms.Operacoes
AtualizarInformacoesGerais();
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
lblDistanciaEsquerda.Text = "Distancia Esq: " + _Sensoriamento.Trajetoria.DistanciaEsquerda.ToString("0.00") + " cm";
lblDistanciaDireita.Text = "Distancia Dir: " + _Sensoriamento.Trajetoria.DistanciaDireita.ToString("0.00") + " cm";
@ -173,7 +173,7 @@ namespace AgroBase.Forms.Operacoes
chbPulverizador.Checked = false;
}
bool sonarAtivado = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual.Status == StatusModulo.Operante;
bool sonarAtivado = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual.Status == StatusModulo.Operante;
chbSonarAtivado.Enabled = sonarAtivado;
if (!sonarAtivado)
{
@ -425,8 +425,8 @@ namespace AgroBase.Forms.Operacoes
{
try
{
double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.OrientacaoReal;
double angulo2 = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido;
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.OrientacaoReal;
double angulo2 = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -90, (float)angulo2);
}
catch { }
@ -434,7 +434,7 @@ namespace AgroBase.Forms.Operacoes
private void pnlAnguloMagnetometro_Paint(object sender, PaintEventArgs e)
{
var imu = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU;
var imu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU;
try
{
double angulo = imu.Rotacao;
@ -515,7 +515,7 @@ namespace AgroBase.Forms.Operacoes
private void AtualizarInformacoesGerais()
{
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
var _Barramentos = _Sensoriamento.Bateria.Barramentos;
gridDados.Rows[0].Cells[1].Value = _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss");
@ -548,8 +548,8 @@ namespace AgroBase.Forms.Operacoes
gridDados.Rows[27].Cells[1].Value = _Sensoriamento.Atuador.DistanciaEstimadaRestanteMetros.ToString("0.00");
gridDados.Rows[28].Cells[1].Value = _Sensoriamento.Atuador.PressaoLinha.ToString("0.00");
gridDados.Rows[29].Cells[1].Value = _Sensoriamento.Atuador.LeituraPotenciaBomba.ToString("0.00");
gridDados.Rows[30].Cells[1].Value = _Sensoriamento.Atuador.VazaoInstantanea.ToString("0.00");
gridDados.Rows[31].Cells[1].Value = $"{_Sensoriamento.Atuador.VazaoMedia:0.000} ({Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.VazaoFluxoMLpSInstantaneaCalc:0.000})";
gridDados.Rows[30].Cells[1].Value = $"{_Sensoriamento.Atuador.VazaoInstantanea:0.000} ({Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.VazaoFluxoMLpSInstantaneaCalc:0.000})";
gridDados.Rows[31].Cells[1].Value = $"{_Sensoriamento.Atuador.VazaoMedia:0.000}";
gridDados.Rows[32].Cells[1].Value = _Sensoriamento.Atuador.VolumeVazaoMl.ToString("0.00");
gridDados.Rows[33].Cells[1].Value = _Sensoriamento.Atuador.AnguloBarraEsquerda.ToString("0.00");
gridDados.Rows[34].Cells[1].Value = _Sensoriamento.Atuador.AnguloBarraDireita.ToString("0.00");
@ -629,8 +629,7 @@ namespace AgroBase.Forms.Operacoes
if (Bico != null)
{
bool comando = !Bico.ComandoAtuar;
Variaveis.OperacaoEmAndamento.Controle.BicosAtuados.FirstOrDefault(x => x.ID == Bico.ID).ComandoAtuar = comando;
GeneralJoystick.EnviarComandoAtuador(S_Code.sBIC, Bico.ID, Status: comando);
GeneralJoystick.EnviarComandoAtuador(Bico.Componente, Bico.ID, Status: comando, Forcar: true);
pnlAtuadores.Controls.OfType<Label>().First(x => x.Name == "lblCmd_" + ID).Text = "Comando: " + (comando ? "Ligado" : "Desligado");
btn.Text = comando ? "Desligar" : "Ligar";
@ -640,29 +639,25 @@ namespace AgroBase.Forms.Operacoes
private void btnLigarBomba_Click(object sender, EventArgs e)
{
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault();
Variaveis.OperacaoEmAndamento.Controle.BombaAtuada = true;
GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ID, Status: true);
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: true, Valor: Convert.ToInt32(nudPressaoSP.Value), Forcar: true);
}
private void btnDesligarBomba_Click(object sender, EventArgs e)
{
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault();
Variaveis.OperacaoEmAndamento.Controle.BombaAtuada = false;
GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ID, Status: false);
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: false, Valor: Convert.ToInt32(nudPressaoSP.Value), Forcar: true);
}
private void nudPressaoSP_ValueChanged(object sender, EventArgs e)
{
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault();
Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha = Convert.ToInt32(((NumericUpDown)sender).Value);
GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ID, Status: Bomba.ComandoAtuar);
}
private void pnlAtuadores_Paint(object sender, PaintEventArgs e)
{
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu.Dados;
bool ligado = Atuador.BombasPressurizadoras.FirstOrDefault()?._Potencia > 0;
bool ligado = Atuador.BombasPressurizadoras.FirstOrDefault()?._BombaLigada ?? false;
AtuadorFuncoesGerais.DesenharAtuadores(
pnlAtuadores,
e,

View File

@ -68,7 +68,7 @@ namespace AgroBase.Forms.Operacoes
pnlCaminho.Invalidate();
pnlAnguloCamera.Invalidate();
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
/*var ultimaLeitura = Variaveis.OperacaoEmAndamento.CamerasSolo.OrderByDescending(x => x.Leitura.timestamp).FirstOrDefault();
if (ultimaLeitura != null)
@ -180,7 +180,7 @@ namespace AgroBase.Forms.Operacoes
Posicao = x.Posicao,
StatusBico = x._EstadoLeitura == Enums.Estado.Ligado,
TempoAtuado = x.TempoAtuado,
}).ToList(), Atuador.BombasPressurizadoras.FirstOrDefault()._Potencia > 0, Atuador.PressaoLinha, Atuador.TempoAtuado);
}).ToList(), Atuador.BombasPressurizadoras.FirstOrDefault()?._BombaLigada ?? false, Atuador.PressaoLinha, Atuador.TempoAtuado);
}
private void pnlCaminho_Paint(object sender, PaintEventArgs e)
@ -282,7 +282,7 @@ namespace AgroBase.Forms.Operacoes
{
try
{
double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido;
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, -90);
}
catch { }

View File

@ -1274,7 +1274,8 @@ namespace AgroBase.Forms.Operacoes
private void AtualizarInformacoesMotorDirecional(string ID)
{
var Log = LogsDirecional.Where(x => x.Modulo_ID == ID).FirstOrDefault(x => x.Momento == MomentoAtual);
//var Log = LogsDirecional.Where(x => x.Mod_ID == ID).FirstOrDefault(x => x.Momento == MomentoAtual);
var Log = LogsDirecional.Where(x => x.Mod_ID == ID).FirstOrDefault();
var LogSen = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual);
double Angulo = Log?.AnguloLeitura ?? 0;
@ -1295,7 +1296,7 @@ namespace AgroBase.Forms.Operacoes
pic.Image = FuncoesGlobais.RotacionarImagem(img, Angulo * Multiplicador);
Label lbl = FuncoesGlobais.FindControlRecursive<Label>(tabDirecional, "lblDIR_" + ID);
lbl.ForeColor = Log.Inicializado ? Color.Green : Color.Red;
lbl.ForeColor = Log.Iniciado ? Color.Green : Color.Red;
TextBox txtAnguloSP = FuncoesGlobais.FindControlRecursive<TextBox>(tabDirecional, "txtDIR_AnguloSP_" + ID);
txtAnguloSP.Text = (Log?.Angulo_SP ?? 0).ToString();

View File

@ -116,7 +116,7 @@ namespace AgroBase.Forms
return;
AtualizandoTela = true;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria;
if (_Trajetoria == null)
@ -265,7 +265,7 @@ namespace AgroBase.Forms
// Obtém os parâmetros
double anguloAtual = double.Parse(txtAnguloGPS.Text);
var _Gps = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps;
var _Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
double anguloControle = 0.0;
TipoMovimentoDirecional tipoMovimento = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento;
@ -327,7 +327,7 @@ namespace AgroBase.Forms
AtualizarPosicaoGPS();
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.AtualizarDados();
Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados();
if (!chbAutomatico.Checked)
{
@ -453,7 +453,7 @@ namespace AgroBase.Forms
{
try
{
double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.Gps?.AnguloCarroDefinido ?? 0;
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento?.Gps?.AnguloCarroDefinido ?? 0;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90);
}
catch { }
@ -464,7 +464,7 @@ namespace AgroBase.Forms
try
{
double angulo = Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle;
double dif = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.Trajetoria?.ErroOrientacaoAngularProximoPonto ?? 0;
double dif = Variaveis.OperacaoEmAndamento.Sensoriamento?.Trajetoria?.ErroOrientacaoAngularProximoPonto ?? 0;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)dif);
}
catch { }

View File

@ -69,7 +69,7 @@ namespace AgroBase.Forms.Simuladores
Task.Run(async () =>
{
OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(CameraFrameType.Segmentacao);
var dadosSeg = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual.Analises.segmentacao;
var dadosSeg = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual.Analises.segmentacao;
DesenharCorredor(frame?.image(), dadosSeg.centros_corredor, dadosSeg.width, dadosSeg.height, 80);
this.Invoke((MethodInvoker)(() =>

View File

@ -214,7 +214,7 @@ namespace AgroBase.Forms
{
try
{
double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido;
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90);
}
catch { }
@ -476,7 +476,7 @@ namespace AgroBase.Forms
{
Latitude = GPSService.UltimaLeitura.Latitude,
Longitude = GPSService.UltimaLeitura.Longitude,
Orientation = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido
Orientation = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido
});
_robotState.UpdateCurrentRobotState();

View File

@ -69,9 +69,9 @@ namespace AgroBase.Forms
AtualizarDadosSensorCorrente("AB36V", lblB36V);
}
lblMagnetometro.ForeColor = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU.Iniciado ? Color.Green : Color.Red;
lblMagnetometro.ForeColor = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU.Iniciado ? Color.Green : Color.Red;
var Gps = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps;
var Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
lblGPS.ForeColor = Gps.Inicializado ? Color.Green : Color.Red;
if (Gps.Inicializado)
{
@ -395,7 +395,7 @@ namespace AgroBase.Forms
private void pnlOrientacaoGPS_Paint(object sender, PaintEventArgs e)
{
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
double Angulo = _Sensoriamento.Gps.OrientacaoReal;
double AnguloMovimento = _Sensoriamento.Gps.OrientacaoMovimento;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, -90, (float)AnguloMovimento);
@ -403,7 +403,7 @@ namespace AgroBase.Forms
private void pnlOrientacaoMagnetometro_Paint(object sender, PaintEventArgs e)
{
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
double Angulo = _Sensoriamento.IMU.Rotacao;
double AnguloCorrigido = _Sensoriamento.IMU.RotacaoCorrigida;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, -90, (float)AnguloCorrigido);

View File

@ -41,7 +41,7 @@ namespace AgroBase.Forms
private async Task tmrLeitura_Tick()
{
var Gps = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps;
var Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
lblAltitude.Text = "Altitude: " + Gps.Altitude.ToString("0.0") + " m";
lblDatahora.Text = "Ultima Leitura: " + Gps.DataHora.ToString("HH:mm:ss");

View File

@ -62,7 +62,7 @@ namespace AgroBase.Forms
private void btnRegistrarPontos_Click(object sender, EventArgs e)
{
GPSModel P1 = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Clone();
GPSModel P1 = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Clone();
if (Pontos[idxRua].Count == 0)
{
@ -127,8 +127,8 @@ namespace AgroBase.Forms
{
try
{
double angulo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido;
double anguloCorredor = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.OrientacaoMovimento;
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido;
double anguloCorredor = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.OrientacaoMovimento;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)anguloCorredor);
}
catch { }
@ -180,7 +180,7 @@ namespace AgroBase.Forms
ultimoPonto = Pontos[Pontos.Count - 2][Pontos[Pontos.Count - 2].Count - 1];
}
var Gps = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps;
var Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
pnlOrientacaoGps.Invalidate();
lblStatusGPS.Text = $"GPS - Precisão: {Gps.PrecisaoCm} cm, " +

View File

@ -59,7 +59,7 @@ namespace AgroBase.Forms
private async Task tmrLeitura_Tick()
{
var Imu = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU;
var Imu = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU;
AnguloX = Imu.InclinacaoFrontal;
AnguloY = Imu.InclinacaoLateral;
AnguloZ = Imu.Rotacao;

View File

@ -1,4 +1,5 @@
using AgroBase.Services;
using AgroBase.Models.Operacoes;
using AgroBase.Services;
using System;
using System.Collections.Generic;
using System.Globalization;
@ -113,6 +114,31 @@ namespace AgroBase.Models
Y = Y
};
}
public OperacaoParametrosDadosGNSSModel ToGnssModel()
{
return new OperacaoParametrosDadosGNSSModel()
{
Altitude = Altitude,
Distancia = Distancia,
IdadeCorrecao = IdadeCorrecao,
Iniciado = Inicializado,
Latitude = Latitude,
LeverArmFrontal = LeverArmFrontal,
LeverArmLateral= LeverArmLateral,
Longitude = Longitude,
NtripAtivado = Ntrip_ativado,
NumeroSatelites = NumeroSatelites,
OrientacaoMovimento = OrientacaoMovimento,
OrientacaoReal = OrientacaoReal,
PrecisaoCm = PrecisaoCm,
PrecisaoHorizontal = PrecisaoHorizontal,
QualidadeFix = QualidadeFix,
UltimoComandoRespondido = UltimoComandoRespondido,
Velocidade = Velocidade
};
}
}
public class GPSSatelitesEmVistaModel

View File

@ -759,6 +759,7 @@ namespace AgroBase
if (Bomba != null)
{
if (Status != null) Bomba.ComandoAtuar = (bool)Status;
if (Valor != null) Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha = (double)Valor;
(id_num, posicao, data) = Bomba.ProtocoloComando();
}
break;
@ -766,14 +767,8 @@ namespace AgroBase
var Bico = DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.ID == ID);
if (Bico != null)
{
//Console.WriteLine($"Bico {Bico.Posicao} atualizado de {Bico.ComandoAtuar} para {Status}");
if (Status != null) Bico.ComandoAtuar = (bool)Status;
if (Valor != null) Bico.AnguloControle = (int)Valor;
if (Status != null)
{
Bico.ComandoAtuar = (bool)Status;
if (Bico.ComandoAtuar) Bico.Atuacoes++;
Bico.AnguloControle = (int)Valor;
}
(id_num, posicao, data) = Bico.ProtocoloComando();
}
break;
@ -781,7 +776,7 @@ namespace AgroBase
var Servo = DispAtu?.Dados?.Servos?.FirstOrDefault(x => x.ID == ID && x.Inicializado);
if (Servo != null)
{
Servo._AnguloControle = (int)Valor;
if (Valor != null) Servo._AnguloControle = (int)Valor;
(id_num, posicao, data) = Servo.ProtocoloComando();
}
break;
@ -859,7 +854,7 @@ namespace AgroBase
private static bool VerificaComandoValidoSonar(Keys Comando)
{
List<Keys> ComandosImpedidos = new List<Keys>();
var Sonar = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual;
var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual;
Sonar?.Resumo?.AtualizarStatusBloqueio(false);
var DeveParar = Sonar?.Resumo?.DeveParar ?? false;
if (DeveParar)

View File

@ -101,7 +101,7 @@ public class MPCController
_dt = (EnviadoEm - _ultimaAtualizacao).TotalSeconds;
double dtCalc = Math.Max(tempoMinimo, Math.Min(tempoMaximo, _dt));
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
var dadosEnvio = new
{

View File

@ -52,7 +52,7 @@ public class MPCControllerSimple
List<(double steering, Enums.TipoMovimentoDirecional mode)> candidates = GenerateControlCandidates();
double bestCost = double.MaxValue;
(double steeringAngle, Enums.TipoMovimentoDirecional mode) bestControl = (0, Enums.TipoMovimentoDirecional.RodasDianteiras);
bool insideStreet = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Trajetoria.CorredorAtual.Dentro;
bool insideStreet = Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria.CorredorAtual.Dentro;
double velocity = FuncoesMatematicas.CalculaVelocidadeMsPercentual(currentVelocity);
double distanciaPasso = dt * velocity;

View File

@ -666,7 +666,7 @@ namespace AgroBase.Models
private void DrawObstacle(Graphics g, float xRobot, float yRobot, Color pointColor, Color borderColor, float angle, Obstaculo obstaculo, float PxToCm)
{
GPSModel posicaoRobo = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps;
GPSModel posicaoRobo = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
GPSModel posicaoObstaculo = GPSUtils.GerarPontoDeslocado(posicaoRobo, angle, obstaculo.DistanciaMedia_mm / 1000);
float x = xRobot + (float)((posicaoObstaculo.Longitude - posicaoRobo.Longitude) * _zoom);

View File

@ -155,8 +155,8 @@ namespace AgroBase.Models.Modules
}
public void AtualizaPercentualErvas()
{
//double tempoTotalOperacao = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.TempoDecorridoSeg * 1000.0;
double tempoTotalOperacao = (Variaveis.OperacaoEmAndamento.Parametros?.DadosLeitura?.Movimentacao?.TempoMovimentoSegs ?? 0) * 1000.0;
//double tempoTotalOperacao = Variaveis.OperacaoEmAndamento.Sensoriamento.TempoDecorridoSeg * 1000.0;
double tempoTotalOperacao = (Variaveis.OperacaoEmAndamento.Sensoriamento?.Movimentacao?.TempoMovimentoSegs ?? 0) * 1000.0;
if (tempoTotalOperacao > 0)
{
@ -193,7 +193,7 @@ namespace AgroBase.Models.Modules
_contadorLeituras++;
}
VazaoFluxoMLpSMedia = _contadorLeituras > 0 ? _somaVazao / _contadorLeituras : 0;
VazaoFluxoMLpSMedia = TempoAtuado == 0 ? 0 : VolumeVazaoML / TempoAtuado;
var BicosAtuados = BicosPulverizadores.Where(x => x.Inicializado && x.ComandoAtuar).ToList();
double vazaoInstantaneaBico = vazaoInstantanea / ((double)BicosAtuados.Count());
@ -736,9 +736,7 @@ namespace AgroBase.Models.Modules
Servo_ID_Num = 90 + posicao,
Componente = S_Code.sBIC,
Posicao = posicao,
Atuacoes = 0,
Inicializado = false,
TempoAtuado = 0,
AnguloControle = 0,
AnguloAbertura = 110,
Comandar = true,
@ -801,9 +799,7 @@ namespace AgroBase.Models.Modules
Dados.BicosPulverizadores.ForEach(x =>
{
x.ComandoAtuar = false;
x.Atuacoes = 0;
x.TempoAtuado = 0;
x.InicioAtuacao = DateTime.MinValue;
x.ReiniciarDados();
x.ValoresLeituras.ForEach(l =>
{
l.atual = new CanCommandFreqModel<dynamic>();
@ -1057,45 +1053,49 @@ namespace AgroBase.Models.Modules
private void VerificaControleLeitura()
{
if (true) // !frmDiagnosticos.Diagnosticando
foreach (var bico in BicosPulverizadores.Where(x => x.Comandar && x.Inicializado))
{
foreach (var bico in BicosPulverizadores.Where(x => x.Comandar && x.Inicializado))
Estado comandoEstado = bico.ComandoAtuar ? Estado.Ligado : Estado.Desligado;
if (comandoEstado != bico._EstadoLeitura || bico.AnguloControle != bico._AnguloBicoLeitura)
{
Estado comandoEstado = bico.ComandoAtuar ? Estado.Ligado : Estado.Desligado;
if (bico._EstadoLeitura != comandoEstado || bico.AnguloControle != bico._AnguloBicoLeitura)
GeneralJoystick.EnviarComandoAtuador(bico.Componente, bico.ID, Status: bico.ComandoAtuar, Valor: bico.AnguloControle);
}
}
foreach (var bomba in BombasPressurizadoras.Where(x => x.Comandar && x.Inicializado))
{
// Desligar a bomba caso nao tenha herbicida suficiente no recipiente
if (!ContadorCarga.PulverizadorLiberado)
{
if (bomba._EstadoLeitura == Estado.Ligado)
{
GeneralJoystick.EnviarComandoAtuador(bico.Componente, bico.ID, Status: bico.ComandoAtuar, Valor: bico.AnguloControle);
GeneralJoystick.EnviarComandoAtuador(bomba.Componente, bomba.ID, Status: false);
}
}
var bomba = BombasPressurizadoras.FirstOrDefault(x => x.Comandar && x.Inicializado);
if (bomba != null)
else
{
bool leituraEstado = bomba._Potencia > 0;
// Desliga a bomba caso esteja ligada e o nivel de herbicida caiu
if (ContadorCarga.PercentualAtual < VariaveisEquipamento.PercentualReservatorioMin && leituraEstado == true)
if (Variaveis.OperacaoEmAndamento.Iniciado && Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico)
{
bomba.ComandoAtuar = false;
}
// Religa a bomba caso esteja desligada, o nivel de herbicida esta estavel e o pulverizador automatico esta ligado
else if (ContadorCarga.PercentualAtual >= VariaveisEquipamento.PercentualReservatorioMin && leituraEstado == false && Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico)
{
bomba.ComandoAtuar = true;
if (bomba._EstadoLeitura == Estado.Desligado)
{
GeneralJoystick.EnviarComandoAtuador(bomba.Componente, bomba.ID, Status: true);
}
}
if (bomba.ComandoAtuar != leituraEstado)
Estado comandoEstado = bomba.ComandoAtuar ? Estado.Ligado : Estado.Desligado;
double pressaoSp = Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha;
if (comandoEstado != bomba._EstadoLeitura || pressaoSp != bomba._PressaoSP)
{
GeneralJoystick.EnviarComandoAtuador(bomba.Componente, bomba.ID, Status: bomba.ComandoAtuar);
GeneralJoystick.EnviarComandoAtuador(bomba.Componente, bomba.ID, Status: bomba.ComandoAtuar, Valor: pressaoSp);
}
}
}
foreach (var servo in Servos.Where(x => x.Controlar && x.Inicializado))
foreach (var servo in Servos.Where(x => x.Controlar && x.Inicializado))
{
if (servo._AnguloControle != servo._AnguloLeiutra)
{
if (servo._AnguloLeiutra != servo._AnguloControle)
{
GeneralJoystick.EnviarComandoAtuador(servo.Componente, servo.ID, Valor: servo._AnguloControle);
}
GeneralJoystick.EnviarComandoAtuador(servo.Componente, servo.ID, Valor: servo._AnguloControle);
}
}
}
@ -1145,7 +1145,6 @@ namespace AgroBase.Models.Modules
break;
}
Variaveis.OperacaoEmAndamento.Controle.BombaAtuada = true;
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: true);
await FuncoesGlobais.AguardarCondicaoAsync(Bomba.AtingiuPressao, 3000, 200);
@ -1246,6 +1245,8 @@ namespace AgroBase.Models.Modules
case S_Code.sMAG:
{
var sensor = Sensores.FirstOrDefault(x => x.ID_Num == id_num);
if (sensor == null) return;
double angulo = sensor.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraAngulo)?.atual?.valor ?? double.NaN;
if (sensor.ID_Num == SensorAnguloBarraEsquerda.ID_Num)
AnguloBarraEsquerda = angulo;
@ -1255,6 +1256,17 @@ namespace AgroBase.Models.Modules
AnguloBarraAltura = angulo;
}
break;
case S_Code.sBIC:
{
var bico = BicosPulverizadores.FirstOrDefault(x => x.ID_Num == id_num);
if (bico == null) return;
if (bico._estadoLeituraAnterior != bico._EstadoLeitura)
{
bico.AtualizaTempoAtuado();
}
}
break;
}
}
@ -1270,20 +1282,7 @@ namespace AgroBase.Models.Modules
public int Servo_ID_Num { get; set; }
public double AnguloControle { get; set; }
public double AnguloAbertura { get; set; }
private bool _atuado;
public bool ComandoAtuar
{
get
{
return _atuado;
}
set
{
_atuado = value;
AtualizaTempoAtuado();
}
}
public bool ComandoAtuar { get; set; }
public bool Comandar { get; set; }
public bool Mandatorio { get; set; }
public bool Liberado
@ -1304,7 +1303,8 @@ namespace AgroBase.Models.Modules
}
}
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; }
public Estado _EstadoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado;
public Estado _estadoLeituraAnterior { get; private set; } = Estado.Desligado;
public Estado _EstadoLeitura => (Estado)(ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? 0);
public int _AnguloBicoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraAngulo)?.atual?.valor ?? 0;
@ -1339,35 +1339,43 @@ namespace AgroBase.Models.Modules
}
public int Atuacoes { get; set; } = 0;
public DateTime InicioAtuacao { get; set; } = DateTime.MinValue;
public double TempoAtuado { get; set; } = 0;
private void AtualizaTempoAtuado()
public List<List<double[]>> TrechosAtuado { get; set; } = new List<List<double[]>>();
public int Atuacoes { get; private set; } = 0;
private DateTime InicioAtuacao { get; set; } = DateTime.MinValue;
public double TempoAtuado { get; private set; } = 0;
public void ReiniciarDados()
{
if (!Variaveis.OperacaoEmAndamento.Iniciado) return;
Atuacoes = 0;
InicioAtuacao = DateTime.MinValue;
TempoAtuado = 0;
}
public void AtualizaTempoAtuado()
{
//if (!Variaveis.OperacaoEmAndamento.Iniciado) return;
Estado estado_atual = _EstadoLeitura;
DateTime agora = DateTime.Now;
if (_atuado)
if (estado_atual == Estado.Ligado)
{
if (InicioAtuacao == DateTime.MinValue)
{
InicioAtuacao = DateTime.Now;
}
else
{
TempoAtuado += (DateTime.Now - InicioAtuacao).TotalMilliseconds;
InicioAtuacao = DateTime.Now;
}
InicioAtuacao = agora;
TrechosAtuado.Add(new List<double[]>());
Atuacoes++;
}
else if (InicioAtuacao != DateTime.MinValue)
else if (estado_atual == Estado.Desligado)
{
TempoAtuado += (DateTime.Now - InicioAtuacao).TotalMilliseconds;
InicioAtuacao = DateTime.MinValue;
if (InicioAtuacao != DateTime.MinValue)
{
TempoAtuado += (agora - InicioAtuacao).TotalMilliseconds;
InicioAtuacao = DateTime.MinValue;
}
}
if (Variaveis.OperacaoEmAndamento.DispAtu != null)
{
Variaveis.OperacaoEmAndamento.DispAtu.Dados.AtualizaTempoAtuadoGeral();
}
_estadoLeituraAnterior = estado_atual;
}
@ -1426,6 +1434,8 @@ namespace AgroBase.Models.Modules
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; }
public Estado _EstadoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado;
public double _Potencia => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Potencia)?.atual?.valor ?? 0;
public bool _BombaLigada => _Potencia > 0;
public double _PressaoSP => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.PressaoSP)?.atual?.valor ?? 0;

View File

@ -512,7 +512,7 @@ namespace AgroBase.Models.Modules
}
private double VelocidadeAtual =>
FuncoesMatematicas.CalculaVelocidadePercentualMs(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.Movimentacao?.VelocidadeMedia ?? 0);
FuncoesMatematicas.CalculaVelocidadePercentualMs(Variaveis.OperacaoEmAndamento.Sensoriamento?.Movimentacao?.VelocidadeMedia ?? 0);
private bool StatusControleEmFreio =>
(Variaveis.OperacaoEmAndamento.Controle?.TiposControle?
@ -637,9 +637,22 @@ namespace AgroBase.Models.Modules
EnviarComando = transicao || alvoMudou || !atingiu;
UltimoControle = emFreio;
EnviarComandoModulo();
}
private static int Clamp(int v, int lo, int hi) => (v < lo) ? lo : (v > hi ? hi : v);
private void EnviarComandoModulo()
{
if (EnviarComando && UltimoEnvio.AddMilliseconds(DelayEnvio) < DateTime.Now)
{
GeneralJoystick.EnviarComandoSensoriamento(S_Code.sSRV, Servo.ID, AnguloControle);
UltimoEnvio = DateTime.Now;
}
}
}
public class MvdMotorMOVSensorimanetoGrafico

View File

@ -481,13 +481,7 @@ namespace AgroBase.Models.Modules
{
foreach (var Mod in Modulos)
{
var Freio = Mod.MovMotor.ConfigFreio;
Freio.AtualizarDados();
if (Freio.EnviarComando && Freio.UltimoEnvio.AddMilliseconds(Freio.DelayEnvio) < DateTime.Now)
{
GeneralJoystick.EnviarComandoSensoriamento(S_Code.sSRV, Freio.Servo.ID, Freio.AnguloControle);
Freio.UltimoEnvio = DateTime.Now;
}
Mod.MovMotor?.ConfigFreio?.AtualizarDados();
}
}

View File

@ -2320,7 +2320,7 @@ namespace AgroBase.Models.Modules
foreach (var rele in Reles.Where(x => x.Controlar && x.Inicializado))
{
if (rele._EstadoLeitura != rele.StatusControle)
if (rele.StatusControle != rele._EstadoLeitura)
{
GeneralJoystick.EnviarComandoSensoriamento(rele.Componente, rele.ID, rele.StatusControle);
}
@ -2328,7 +2328,7 @@ namespace AgroBase.Models.Modules
foreach (var servo in Servos.Where(x => x.Controlar && x.Inicializado))
{
if (servo._AnguloLeiutra != servo._AnguloControle)
if (servo._AnguloControle != servo._AnguloLeiutra)
{
GeneralJoystick.EnviarComandoSensoriamento(servo.Componente, servo.ID, servo._AnguloControle);
}

View File

@ -58,7 +58,7 @@ namespace AgroBase.Models
public TrajetoriaMapaOperacaoModel Trajetoria { get; set; }
public List<GPSModel> GPSTrajetoria { get; set; } = new List<GPSModel>();
public OperacaoParametrosModel Parametros { get; set; } = new OperacaoParametrosModel();
//public OperacaoSensoriamentoLogModel Sensoriamento { get; set; } = new OperacaoSensoriamentoLogModel();
public OperacaoSensoriamentoLogModel Sensoriamento { get; set; } = new OperacaoSensoriamentoLogModel();
public PerformanceModel DadosPerformance { get; set; } = new PerformanceModel();
public Form frmOperacao { get; set; }
@ -114,7 +114,7 @@ namespace AgroBase.Models
{
string msg = mod.motivos.Any() ? string.Join("; ", mod.motivos) : $"{mod.status} ({mod.saude:0}%)";
string msg2 = mod.condicoes_operacionais.Any() ? string.Join("; ", mod.condicoes_operacionais.Select(x => x.descricao)) : null;
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.InserirLog(mod.modulo, mod.status, mod.saude, msg, condicoes: msg2);
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(mod.modulo, mod.status, mod.saude, msg, condicoes: msg2);
}
if (mod.saude_individual.Any())
{
@ -125,7 +125,7 @@ namespace AgroBase.Models
{
string msg = ind.motivos.Any() ? string.Join("; ", ind.motivos) : $"{ind.status} ({ind.saude:0}%)";
string msg2 = ind.condicoes_operacionais.Any() ? string.Join("; ", ind.condicoes_operacionais.Select(x => x.descricao)) : null;
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.InserirLog(mod.modulo, ind.status, ind.saude, msg, condicoes: msg2, id: ind.label);
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(mod.modulo, ind.status, ind.saude, msg, condicoes: msg2, id: ind.label);
}
}
}
@ -355,7 +355,6 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.Parametros = new OperacaoParametrosModel()
{
Modo = Modo,
DadosLeitura = new OperacaoSensoriamentoLogModel(),
QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo,
QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores,
CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio,
@ -424,12 +423,10 @@ namespace AgroBase.Models
{
TipoMovimento = TipoMovimentoDirecional.RodasDianteiras,
Angulo = 25,
BicosAtuados = new List<AtuadorBicoModel>(),
Direcao = Direcao.Parado,
EmFreio = false,
PercentualVelocidadeSP = 20,
AlturaBarra = 50,
BombaAtuada = false,
TiposControle = new List<OperacaoControleTipoModel>()
{
new OperacaoControleTipoModel()
@ -466,7 +463,6 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.Parametros = new OperacaoParametrosModel()
{
Modo = Modo,
DadosLeitura = new OperacaoSensoriamentoLogModel(),
QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo,
QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores,
CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio,
@ -577,12 +573,10 @@ namespace AgroBase.Models
{
TipoMovimento = TipoMovimentoDirecional.RodasDianteiras,
Angulo = 0,
BicosAtuados = new List<AtuadorBicoModel>(),
Direcao = Direcao.Parado,
EmFreio = false,
PercentualVelocidadeSP = 0,
AlturaBarra = 50,
BombaAtuada = true,
TiposControle = new List<OperacaoControleTipoModel>()
{
new OperacaoControleTipoModel()
@ -619,7 +613,6 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.Parametros = new OperacaoParametrosModel()
{
Modo = Modo,
DadosLeitura = new OperacaoSensoriamentoLogModel(),
QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo,
QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores,
CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio,
@ -712,7 +705,6 @@ namespace AgroBase.Models
{
TipoMovimento = TipoMovimentoDirecional.RodasDianteiras,
Angulo = 0,
BicosAtuados = new List<AtuadorBicoModel>(),
Direcao = Direcao.Parado,
EmFreio = false,
PercentualVelocidadeSP = 0,
@ -752,7 +744,6 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.Parametros = new OperacaoParametrosModel()
{
Modo = Modo,
DadosLeitura = new OperacaoSensoriamentoLogModel(),
QtdCamerasSolo = VariaveisEquipamento.QuantidadeCamerasSolo,
QtdBicos = VariaveisEquipamento.QuantidadeBicosPulverizadores,
CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio,
@ -808,7 +799,6 @@ namespace AgroBase.Models
{
TipoMovimento = TipoMovimentoDirecional.RodasDianteiras,
Angulo = 0,
BicosAtuados = new List<AtuadorBicoModel>(),
Direcao = Direcao.Parado,
EmFreio = false,
PercentualVelocidadeSP = 0,
@ -846,7 +836,8 @@ namespace AgroBase.Models
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();
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = new OperacaoParametrosDadosModel();
Variaveis.OperacaoEmAndamento.Sensoriamento = new OperacaoSensoriamentoLogModel();
if (Variaveis.OperacaoEmAndamento.DispSen != null)
{
@ -865,19 +856,14 @@ namespace AgroBase.Models
//OperacaoCarregar.DispSen.Dados.Sinaleiros.ForEach(x => OperacaoCarregar.DispSen.AdicionarMensagemFila(OperacaoCarregar.DispSen.Dados.Modulo_ID, x.ProtocoloComando(), true, false));
foreach (var Sinaleiro in Variaveis.OperacaoEmAndamento.DispSen.Dados.Sinaleiros)
{
GeneralJoystick.EnviarComandoSensoriamento(S_Code.sLED, Sinaleiro.ID, Sinaleiro.Comportamento);
GeneralJoystick.EnviarComandoSensoriamento(Sinaleiro.Componente, Sinaleiro.ID, Sinaleiro.Comportamento);
}
}
}
if (Variaveis.OperacaoEmAndamento.DispAtu != null)
{
Variaveis.OperacaoEmAndamento.Controle.BicosAtuados = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores?.Select(x => x.Clone())?.ToList() ?? new List<AtuadorBicoModel>();
}
RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false));
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.AtualizarDados();
Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados();
}
private Dictionary<string, bool> PreencherComponentesEmUso(T_Code Modulo)
@ -903,6 +889,7 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.DispAtu.Dados.Sensores.ForEach(s => d.Add(s.ID, s.Aferir));
Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.ForEach(b => d.Add(b.ID, b.Comandar));
Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.ForEach(b => d.Add(b.ID, b.Comandar));
Variaveis.OperacaoEmAndamento.DispAtu.Dados.Servos.ForEach(s => d.Add(s.ID, s.Controlar));
}
break;
case T_Code.Sen:
@ -994,8 +981,8 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.Parametros = Parametros;
Variaveis.OperacaoEmAndamento.Parametros.RoverId = VariaveisEquipamento.Parametros.serial_number;
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = new OperacaoSensoriamentoLogModel();
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.AtualizarDados();
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = new OperacaoParametrosDadosModel();
Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados();
Variaveis.OperacaoEmAndamento.DefinirComponentesEmUso();
Variaveis.OperacaoEmAndamento.Descricao = Parametros.Descricao;
@ -1032,7 +1019,7 @@ namespace AgroBase.Models
SalvarOperacao();
Parametros.DadosLeitura.AtualizarDados();
Sensoriamento.AtualizarDados();
DispMvd?.Dados?.ReiniciarLeituras(DispMvd?.Dados);
DispAtu?.Dados?.ReiniciarLeituras(DispAtu?.Dados);
@ -1049,22 +1036,8 @@ namespace AgroBase.Models
WeedWorkerService.ReiniciarLeituraAnalise();
VisualWorkerService.ReiniciarLeituraAnalise();
if (Parametros.Controle.MovimentoAutomatico)
{
Controle.Angulo = 0;
Controle.PercentualVelocidadeSP = 0;
}
else
{
Controle.Angulo = Parametros.Controle.DirAnguloMaximo;
Controle.PercentualVelocidadeSP = Parametros.Controle.MovVelocidadeCErvasPercent;
}
ControleAnterior.Angulo = 0;
ControleAnterior.PercentualVelocidadeSP = 0;
Controle.TiposControle.ForEach(x => x.UltimaDirecao = Direcao.Parado);
Controle.BicosAtuados = DispAtu?.Dados?.BicosPulverizadores?.Select(x => x.Clone())?.ToList() ?? new List<AtuadorBicoModel>();
Controle.BicosAtuados.ForEach(x => x.ComandoAtuar = false);
ControleAnterior.BicosAtuados = Controle.BicosAtuados.Select(x => x.Clone()).ToList();
Controle.Reiniciar();
ControleAnterior.Reiniciar();
GPSTrajetoria = new List<GPSModel>();
@ -1083,9 +1056,6 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.Finalizando = true;
Variaveis.OperacaoEmAndamento.Controle.BombaAtuada = false;
GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault()?.ID ?? "", Status: false, Forcar: true);
Variaveis.OperacaoEmAndamento.Trajetoria?.LoopAtualizaDados();
await Task.Delay(2000);
@ -1181,7 +1151,7 @@ namespace AgroBase.Models
ID = "";
Parametros.DadosLeitura.AtualizarDados();
Sensoriamento.AtualizarDados();
DispMvd?.Dados?.ReiniciarLeituras(DispMvd.Dados);
DispAtu?.Dados?.ReiniciarLeituras(DispAtu.Dados);
@ -1191,19 +1161,13 @@ namespace AgroBase.Models
WeedWorkerService.ReiniciarLeituraAnalise();
VisualWorkerService.ReiniciarLeituraAnalise();
Controle.Angulo = 0;
Controle.PercentualVelocidadeSP = 0;
Controle.BicosAtuados = DispAtu?.Dados?.BicosPulverizadores?.Select(x => x.Clone())?.ToList() ?? new List<AtuadorBicoModel>();
Controle.BicosAtuados.ForEach(x => x.ComandoAtuar = false);
ControleAnterior.BicosAtuados = Controle.BicosAtuados.Select(x => x.Clone()).ToList();
Controle.Reiniciar();
ControleAnterior.Reiniciar();
GPSTrajetoria = new List<GPSModel>();
Trajetoria?.ProjetarTrajetoriaFixa();
RedisService.Publish(CmdKey.ManagerWorkerRx, JsonConvert.SerializeObject(new { cmd = ManagerWorkerCommandType.IniciarMPC }));
Controle.BicosAtuados = DispAtu.Dados.BicosPulverizadores.Select(x => x.Clone()).ToList();
ControleAnterior.BicosAtuados = DispAtu.Dados.BicosPulverizadores.Select(x => x.Clone()).ToList();
}
public void ReiniciarSimulacao()
@ -1442,37 +1406,32 @@ namespace AgroBase.Models
}
case T_Code.Atu:
{
if (ControleAnterior.BicosAtuados.Count != Controle.BicosAtuados.Count)
{
ControleAnterior.BicosAtuados = Controle.BicosAtuados.Select(x => x.Clone()).ToList();
}
bool enviarComando = false;
for (int i = 0; i < _Controle.BicosAtuados.Count; i++)
for (int i = 0; i < _Controle.Bicos.Count; i++)
{
if (ForcarEnvio || _Controle.BicosAtuados[i].ComandoAtuar != _ControleAnterior.BicosAtuados[i].ComandoAtuar)
Estado comandoEstado = _Controle.Bicos[i].ComandoAtuar ? Estado.Ligado : Estado.Desligado;
if (ForcarEnvio || comandoEstado != _Controle.Bicos[i]._EstadoLeitura)
{
GeneralJoystick.EnviarComandoAtuador(S_Code.sBIC, _Controle.BicosAtuados[i].ID, Status: _Controle.BicosAtuados[i].ComandoAtuar);
_ControleAnterior.BicosAtuados[i].ComandoAtuar = _Controle.BicosAtuados[i].ComandoAtuar;
GeneralJoystick.EnviarComandoAtuador(_Controle.Bicos[i].Componente, _Controle.Bicos[i].ID, Status: _Controle.Bicos[i].ComandoAtuar);
enviarComando = true;
}
}
if (enviarComando)
// Ligar a bomba caso esteja desligada e tenha herbicida suficiente no reservatorio
if ((Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga?.PulverizadorLiberado ?? false) && enviarComando)
{
foreach (var Bomba in Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras)
{
bool Ligado = Bomba._Potencia > 0;
if (!Ligado)
if (Bomba._EstadoLeitura == Estado.Desligado)
{
Variaveis.OperacaoEmAndamento.Controle.BombaAtuada = true;
GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ID, Status: true);
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: true);
}
}
}
Protocolos = new List<string>()
{
string.Join(";", _Controle.BicosAtuados.Select(x => x.ComandoAtuar ? "1" : "0")) + ";" + (ForcarEnvio ? "1": "0")
string.Join(";", _Controle.Bicos.Select(x => x.ComandoAtuar ? "1" : "0")) + ";" + (ForcarEnvio ? "1": "0")
};
break;
}
@ -1488,12 +1447,12 @@ namespace AgroBase.Models
return;
}
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.AtualizarDados();
Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados();
//Variaveis.LoraService?.EnviarDadosParaBase();
if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.Manual)
{
var Sonar = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual;
var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual;
Sonar?.Resumo?.AtualizarStatusBloqueio(true);
if (Sonar?.Resumo?.EnviarComandoParada ?? false)
{
@ -1606,6 +1565,8 @@ namespace AgroBase.Models
if (controleBase.Dispositivo == T_Code.Atu && Variaveis.OperacaoEmAndamento.DispAtu != null)
{
if (controleBase.Controle == null) return;
S_Code get_comp(string id)
{
if (id == "") return S_Code.sMOD;
@ -1618,34 +1579,25 @@ namespace AgroBase.Models
}
S_Code comp = get_comp(controleBase._comp_id);
switch (comp)
{
case S_Code.sMOD:
if (controleBase.Controle == null) return;
Variaveis.OperacaoEmAndamento.Controle.AlturaBarra = (double)controleBase.Controle.Altura;
if (controleBase.Controle.Altura != null) Variaveis.OperacaoEmAndamento.Controle.AlturaBarra = (double)controleBase.Controle.Altura;
break;
case S_Code.sBIC:
var bico = Variaveis.OperacaoEmAndamento.Controle.BicosAtuados.FirstOrDefault(x => x.ID == controleBase._comp_id);
if (bico != null)
if (controleBase._comp_value != null)
{
if (controleBase._comp_value != null) bico.AnguloAbertura = (int)controleBase._comp_value;
if (controleBase.Controle == null) return;
if (controleBase.Controle.Estado != null) bico.ComandoAtuar = (bool)controleBase.Controle.Estado;
if (controleBase.Controle.AnguloSP != null) bico.AnguloControle = (int)controleBase.Controle.AnguloSP;
GeneralJoystick.EnviarComandoAtuador(comp, controleBase._comp_id, Status: controleBase.Controle.Estado, Valor: controleBase.Controle.AnguloSP, Forcar: true);
var bico = Variaveis.OperacaoEmAndamento.Controle.Bicos.FirstOrDefault(x => x.ID == controleBase._comp_id);
if (bico != null)
{
bico.AnguloAbertura = (int)controleBase._comp_value;
}
}
break;
case S_Code.sBMB:
if (controleBase.Controle == null) return;
Variaveis.OperacaoEmAndamento.Controle.BombaAtuada = (bool)controleBase.Controle.Estado;
GeneralJoystick.EnviarComandoAtuador(comp, controleBase._comp_id, Status: controleBase.Controle.Estado, Forcar: true);
break;
case S_Code.sSRV:
if (controleBase.Controle == null) return;
GeneralJoystick.EnviarComandoAtuador(comp, controleBase._comp_id, Valor: controleBase.Controle.AnguloSP, Forcar: true);
break;
}
GeneralJoystick.EnviarComandoAtuador(comp, controleBase._comp_id, Status: controleBase.Controle.Estado, Valor: controleBase.Controle.AnguloSP, Forcar: true);
return;
}
@ -1720,6 +1672,7 @@ namespace AgroBase.Models
else
{
topico = Variaveis.MqttServiceBase.Topicos.FirstOrDefault(x => x.Topico == VariaveisEquipamento.TopicoMqttTelemetria.Replace("<id>", VariaveisEquipamento.Parametros.serial_number));
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Atualizar();
var data = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Clone();
msg = JsonConvert.SerializeObject(data);
}
@ -1761,7 +1714,7 @@ namespace AgroBase.Models
{
DateTime Agora = DateTime.Now;
OperacaoSensoriamentoLogModel logGeral = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Clone();
OperacaoSensoriamentoLogModel logGeral = Variaveis.OperacaoEmAndamento.Sensoriamento.Clone();
logGeral.Momento = Agora;
SalvarLog("operacao", logGeral, Fim);
Variaveis.OperacaoEmAndamento.Controle.TiposControle.ForEach(x => x.Comandos.Clear());
@ -1797,9 +1750,8 @@ namespace AgroBase.Models
DirSensoriamentoLogModel logDir = new DirSensoriamentoLogModel()
{
Momento = Agora,
Modulo_ID = Modulo.Modulo_ID,
Inicializado = Modulo.DirMotor.Inicializado,
Mod_ID = Modulo.Modulo_ID,
Iniciado = Modulo.DirMotor.Inicializado,
AnguloDriver = Modulo.DirMotor.AnguloDriver,
Angulo_SP = Modulo.DirMotor.Angulo_SP,
Controlar = Modulo.DirMotor.Comandar,
@ -2126,7 +2078,7 @@ namespace AgroBase.Models
}
public bool EmFreio { get; set; } = false;
public Direcao Direcao { get; set; } = Direcao.Parado;
public bool BombaAtuada { get; set; }
public List<AtuadorBicoModel> Bicos => Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.BicosPulverizadores;
public double AlturaBarra { get; set; }
private TipoMovimentoDirecional _tipoMovimento = TipoMovimentoDirecional.Diagnostico;
public TipoMovimentoDirecional TipoMovimento
@ -2175,26 +2127,43 @@ namespace AgroBase.Models
_tipoMovimento = value;
}
}
public List<AtuadorBicoModel> BicosAtuados { get; set; } = new List<AtuadorBicoModel>();
public List<OperacaoControleTipoModel> TiposControle { get; set; } = new List<OperacaoControleTipoModel>();
public List<MPCSimulacaoModel> SimulacaoMPC { get; set; } = new List<MPCSimulacaoModel>();
public double Latencia { get; set; }
public double ErroLateral { get; set; } = 0.0;
public Dictionary<string, ManagerWorkerMessageResponseDebugCustoModel> DebugCustoMpc { get; set; } = new Dictionary<string, ManagerWorkerMessageResponseDebugCustoModel>();
public void Reiniciar()
{
var _Parametros = Variaveis.OperacaoEmAndamento.Parametros.Controle;
if (_Parametros.MovimentoAutomatico)
{
Angulo = 0;
PercentualVelocidadeSP = 0;
}
else
{
Angulo = _Parametros.DirAnguloMaximo;
PercentualVelocidadeSP = _Parametros.MovVelocidadeCErvasPercent;
}
EmFreio = false;
Direcao = Direcao.Parado;
TipoMovimento = TipoMovimentoDirecional.RodasDianteiras;
TiposControle.ForEach(x => x.UltimaDirecao = Direcao.Parado);
}
public OperacaoControleModel Clone()
{
return new OperacaoControleModel()
{
Angulo = Angulo,
BicosAtuados = new List<AtuadorBicoModel>(BicosAtuados ?? new List<AtuadorBicoModel>()),
Direcao = Direcao,
PercentualVelocidadeSP = PercentualVelocidadeSP,
_tipoMovimento = _tipoMovimento,
TipoMovimento = TipoMovimento,
TiposControle = new List<OperacaoControleTipoModel>(TiposControle),
SimulacaoMPC = new List<MPCSimulacaoModel>(SimulacaoMPC),
BombaAtuada = BombaAtuada,
AlturaBarra = AlturaBarra,
heartbeat = heartbeat,
ticks_sem_resposta = ticks_sem_resposta,
@ -2432,7 +2401,8 @@ namespace AgroBase.Models
Dir_Status = _DispMvd.Dados.StatusModulosMOV(Direcao.Direita),
Dados = _DispMvd.Dados.Modulos.Select(x => new OperacaoSensoriamentoLogMovDadosModel()
{
ID = x.MovMotor.Mod_ID,
Mod_ID = x.MovMotor.Mod_ID,
ID = byte.Parse(x.MovMotor.ID),
Iniciado = x.MovMotor.Inicializado,
Tensao = x.MovMotor.Tensao,
Corrente_Barramento = x.MovMotor.Corrente_Barramento,
@ -2442,7 +2412,7 @@ namespace AgroBase.Models
TemperaturaDriver = x.MovMotor.TemperaturaDriver,
RPM_Motor = x.MovMotor.RPM_Motor,
RPM_Roda = x.MovMotor.RPM_Roda,
VelocidadeInstantanea = x.MovMotor.VelocidadeInstantanea,
VelocidadeInstantaneaMs = x.MovMotor.VelocidadeInstantanea,
UltimoComandoRespondido = x.MovMotor.Leitura?.UltimoComandoRecebido ?? DateTime.MinValue,
}).ToList(),
} : new OperacaoSensoriamentoLogMovModel();
@ -2453,8 +2423,9 @@ namespace AgroBase.Models
Status = _DispMvd.Dados.StatusModulosDIR(_Controle.TipoMovimento),
Dados = _DispMvd.Dados.Modulos.Select(x => new DirSensoriamentoLogModel()
{
Modulo_ID = x.DirMotor.Mod_ID,
Inicializado = x.DirMotor.Inicializado,
Mod_ID = x.DirMotor.Mod_ID,
ID = byte.Parse(x.DirMotor.ID),
Iniciado = x.DirMotor.Inicializado,
AnguloDriver = x.DirMotor.AnguloDriver,
AnguloReal = x.DirMotor.AnguloReal,
Angulo_SP = x.DirMotor.Angulo_SP,
@ -2596,7 +2567,7 @@ namespace AgroBase.Models
UltimoComandoRespondido = _DispSen?.Dados?.DadosLeitura?.UltimoComandoRespondido ?? DateTime.MinValue
};
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = dadosAtualizados;
Variaveis.OperacaoEmAndamento.Sensoriamento = dadosAtualizados;
}
public OperacaoSensoriamentoLogModel Clone(bool comSonar = false)
@ -2792,8 +2763,10 @@ namespace AgroBase.Models
public class OperacaoSensoriamentoLogMovDadosModel
{
public string ID { get; set; }
public string Mod_ID { get; set; }
public byte ID { get; set; }
public bool Iniciado { get; set; }
public bool Controlar { get; set; }
public double RPM_Roda { get; set; }
public double TemperaturaDriver { get; set; }
public double Tensao { get; set; }
@ -2802,7 +2775,7 @@ namespace AgroBase.Models
public double Potencia { get; set; }
public double CicloTrabalho { get; set; }
public double RPM_Motor { get; set; }
public double VelocidadeInstantanea { get; set; }
public double VelocidadeInstantaneaMs { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
@ -2951,9 +2924,9 @@ namespace AgroBase.Models
public class DirSensoriamentoLogModel
{
public DateTime Momento { get; set; }
public string Modulo_ID { get; set; }
public bool Inicializado { get; set; }
public string Mod_ID { get; set; }
public byte ID { get; set; }
public bool Iniciado { get; set; }
public bool Controlar { get; set; }
public double Angulo_SP { get; set; }
public double AnguloDriver { get; set; }

View File

@ -1,5 +1,9 @@
using System;
using AgroBase.Models.Modules;
using AgroBase.Models.Operadores;
using AgroBase.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using static AgroBase.Models.Enums;
namespace AgroBase.Models.Operacoes
@ -22,7 +26,7 @@ namespace AgroBase.Models.Operacoes
public MapaFeatureCollectionModel Mapa { get; set; }
public List<string> RuasPercorrer { get; set; }
public OperacaoSensoriamentoLogModel DadosLeitura { get; set; }
public OperacaoParametrosDadosModel DadosLeitura { get; set; }
}
public class OperacaoParametrosControleModel
@ -58,4 +62,489 @@ namespace AgroBase.Models.Operacoes
public double AtuPercentualErvasBicoOn { get; set; }
public double AtuPercentualErvasBicoOff { get; set; }
}
public class OperacaoParametrosDadosModel
{
public DateTime Momento { get; set; }
public StatusModulo StatusRover { get; set; }
public bool CanSerial { get; set; }
public OperacaoParametrosDadosOperacaoModel Operacao { get; set; }
public OperacaoSensoriamentoLogTrajetoriaModel Trajetoria { get; set; }
public OperacaoControleModel Controle { get; set; }
public List<ManagerWorkerMessageResponseModulosPendentesModel> ModulosSaude { get; set; }
public List<DispositivoDetalhesModel> DispositivosMapeados { get; set; }
public OperacaoSensoriamentoLogImuModel Imu { get; set; }
public OperacaoParametrosDadosAtuadorModel Atuador { get; set; }
public OperacaoParametrosDadosSensoriamentoModel Sensoriamento { get; set; }
public OperacaoParametrosDadosMovimentacaoModel Movimentacao { get; set; }
public OperacaoParametrosDadosDirecionalModel Direcional { get; set; }
public OperacaoSensoriamentoLogBateriaModel Bateria { get; set; }
public CoolerControlDataModel Refrigeracao { get; set; }
public OperacaoParametrosDadosGNSSModel Gnss { get; set; }
public PerformanceModel PerformanceNcp { get; set; }
public LivoxModel LivoxLidar { get; set; }
public List<OperacaoSensoriamentoLogErrosModel> Logs { get; set; }
public void Atualizar()
{
var op = Variaveis.OperacaoEmAndamento;
var sen = op.Sensoriamento;
var dAtu = op.DispAtu?.Dados;
var dSen = op.DispSen?.Dados;
var dMvd = op.DispMvd?.Dados;
Momento = DateTime.Now;
StatusRover = op.Status;
CanSerial = CanManager.UseCanSerial;
Operacao = new OperacaoParametrosDadosOperacaoModel()
{
Iniciada = op.Iniciado,
Liberada = op.OperacaoLiberada,
Status = op.StatusAtual,
Modo = op.Modo,
ImpedimentoErro = op.ErroOperacaoLiberada,
TempoAguardandoSegs = op.TempoAguardandoSegs,
TempoDecorridoSegs = op.TempoDecorridoSegs,
Emergencia = op.Emergencia,
Pausa = op.Pausa,
IniciadoEm = op.DataInicio,
FinalizadoEm = op.DataFim,
ModulosMandatorios = new List<OperacaoModulosMandatoriosModel>(op.Parametros.ModulosMandatorios ?? new List<OperacaoModulosMandatoriosModel>()),
ParametrosMandatorios = new List<OperacaoParametrosMandatoriosModel>(op.Parametros.ParametrosMandatorios ?? new List<OperacaoParametrosMandatoriosModel>())
};
Trajetoria = sen?.Trajetoria?.Clone();
Controle = op.Controle?.Clone();
ModulosSaude = new List<ManagerWorkerMessageResponseModulosPendentesModel>(sen?.ModulosSaude ?? new List<ManagerWorkerMessageResponseModulosPendentesModel>());
DispositivosMapeados = new List<DispositivoDetalhesModel>(sen?.DispositivosMapeados ?? new List<DispositivoDetalhesModel>());
Imu = sen?.IMU?.Clone();
Atuador = new OperacaoParametrosDadosAtuadorModel()
{
Iniciado = dAtu?.Conectado ?? false,
AnguloBarraAltura = sen?.Atuador?.AnguloBarraAltura ?? 0,
AnguloBarraDireita = sen?.Atuador?.AnguloBarraDireita ?? 0,
AnguloBarraEsquerda = sen?.Atuador?.AnguloBarraEsquerda ?? 0,
CapacidadeReservatorio = sen?.Atuador?.CapacidadeReservatorio ?? 0,
ErvasNoRadar = sen?.Atuador?.ErvasNoRadar ?? false,
DistanciaEstimadaRestanteMetros = sen?.Atuador?.DistanciaEstimadaRestanteMetros ?? 0,
HerbicidaConsumidoMl = sen?.Atuador?.HerbicidaConsumido ?? 0,
HerbicidaPorAtuacaoMl = sen?.Atuador?.HerbicidaPorErva ?? 0,
LPorMetro = sen?.Atuador?.LPorMetro ?? 0,
LPorMinuto = sen?.Atuador?.LPorMinuto ?? 0,
MassaReservatorioKg = sen?.Atuador?.MassaReservatorio ?? 0,
VolumeReservatorioL = sen?.Atuador?.VolumeReservatorio ?? 0,
VolumeVazaoMl = sen?.Atuador?.VolumeVazaoMl ?? 0,
VazaoMediaMLs = sen?.Atuador?.VazaoMedia ?? 0,
VazaoInstantaneaMLs = sen?.Atuador?.VazaoInstantanea ?? 0,
TempoEstimadoRestanteMinutos = sen?.Atuador?.TempoEstimadoRestanteMinutos ?? 0,
QtdCamerasSolo = sen?.Atuador?.QtdCamerasSolo ?? 0,
PercentualErvasNoRadar = sen?.Atuador?.PercentualErvasNoRadar ?? 0,
PercentualErvasTerreno = sen?.Atuador?.PercentualErvasTerreno ?? 0,
PercentualReservatorio = sen?.Atuador?.PercentualReservatorio ?? 0,
PressaoLinhaPsi = sen?.Atuador?.PressaoLinha ?? 0,
Bicos = dAtu?.BicosPulverizadores?.Select(x => new OperacaoParametrosDadosBicoModel()
{
ID = x.ID,
ID_Num = x.ID_Num,
Servo_ID_Num = x.Servo_ID_Num,
Inicializado = x.Inicializado,
Posicao = x.Posicao,
AnguloAbertura = x.AnguloAbertura,
ComandoAngulo = (int)x.AnguloControle,
LeituraAngulo = x._AnguloBicoLeitura,
ComandoEstado = x.ComandoAtuar,
LeituraEstado = x._EstadoLeitura == Estado.Ligado,
MediaVazaoMLs = x.MediaNivelFluxo,
QtdAtuacoes = x.Atuacoes,
TempoAtuado = x.TempoAtuado,
TrechosPulverizando = new List<List<double[]>>(x.TrechosAtuado ?? new List<List<double[]>>()),
UltimoComandoRespondido = x.UltimaLeitura
}).ToList(),
Bombas = dAtu?.BombasPressurizadoras?.Select(x => new OperacaoParametrosDadosBombaModel()
{
ID = x.ID,
ID_Num = x.ID_Num,
Sensor_ID_Num = x.Sensor_ID_Num,
Inicializado = x.Inicializado,
ComandoEstado = x.ComandoAtuar,
LeituraEstado = x._EstadoLeitura == Estado.Ligado,
Potencia = x._Potencia,
TempoAtuado = dAtu?.TempoAtuado ?? 0,
UltimoComandoRespondido = x.UltimaLeitura,
}).ToList(),
Servos = dAtu?.Servos?.Select(x => new OperacaoParametrosDadosServoModel()
{
ID = x.ID,
ID_Num = x.ID_Num,
Inicializado = x.Inicializado,
Incremental = x.Incremental,
ComandoAngulo = x._AnguloControle,
LeituraAngulo = x._AnguloLeiutra,
UltimoComandoRespondido = x.UltimaLeitura,
}).ToList(),
Sensores = dAtu?.Sensores?.Select(x => new OperacaoParametrosDadosSensorModel()
{
Componente = x.Componente,
ID = x.ID,
ID_Num = x.ID_Num,
Inicializado = x.Inicializado,
Valores = x.ValoresLeituras?.Where(y => y.funcao != FuncoesPinout.Iniciado)?.Select(y => y.atual?.valor).ToList(),
UltimoComandoRespondido = x.UltimaLeitura,
}).ToList(),
UltimoComandoRespondido = dAtu.DadosLeitura.UltimoComandoRespondido,
};
Sensoriamento = new OperacaoParametrosDadosSensoriamentoModel()
{
Iniciado = dSen?.Conectado ?? false,
Sensores = dSen?.Sensores?.Select(x => new OperacaoParametrosDadosSensorModel()
{
Componente = x.Componente,
ID = x.ID,
ID_Num = x.ID_Num,
Inicializado = x.Inicializado,
Valores = x.ValoresLeituras?.Where(y => y.funcao != FuncoesPinout.Iniciado)?.Select(y => y.atual?.valor).ToList(),
UltimoComandoRespondido = x.UltimaLeitura,
}).ToList(),
Servos = dSen?.Servos?.Select(x => new OperacaoParametrosDadosServoModel()
{
ID = x.ID,
ID_Num = x.ID_Num,
Inicializado = x.Inicializado,
Incremental = x.Incremental,
ComandoAngulo = x._AnguloControle,
LeituraAngulo = x._AnguloLeiutra,
UltimoComandoRespondido = x.UltimaLeitura,
}).ToList(),
Reles = dSen?.Reles?.Select(x => new OperacaoParametrosDadosReleModel()
{
ID = x.ID,
ID_Num = x.ID_Num,
Inicializado = x.Inicializado,
ComandoEstado = x.StatusControle == Estado.Ligado,
LeituraEstado = x._EstadoLeitura == Estado.Ligado,
UltimoComandoRespondido = x.UltimaLeitura,
}).ToList(),
Sinaleiros = dSen?.Sinaleiros?.Select(x => new OperacaoParametrosDadosSinaleiroModel()
{
ID = x.ID,
ID_Num = x.ID_Num,
Inicializado = x.Inicializado,
Comportamento = x.Comportamento,
UltimoComandoRespondido = x.UltimaLeitura
}).ToList(),
UltimoComandoRespondido = dSen.DadosLeitura.UltimoComandoRespondido
};
Movimentacao = new OperacaoParametrosDadosMovimentacaoModel()
{
VelocidadeMediaMs = sen?.Movimentacao?.VelocidadeMedia ?? 0,
RPMMedio = sen?.Movimentacao?.RPMMedio ?? 0,
TemperaturaMedia = sen?.Movimentacao?.TemperaturaMedia ?? 0,
TempoMovimentoSegs = sen?.Movimentacao?.TempoMovimentoSegs ?? 0,
DistanciaPercorridaParcial = sen?.Movimentacao?.DistanciaPercorridaParcial ?? 0,
DistanciaPercorridaTotal = sen?.Movimentacao?.DistanciaPercorridaTotal ?? 0,
Modulos = dMvd?.Modulos?.Select(x => new OperacaoSensoriamentoLogMovDadosModel()
{
Mod_ID = x.MovMotor.Mod_ID,
ID = byte.Parse(x.MovMotor.ID),
Iniciado = x.MovMotor.Inicializado,
Controlar = x.MovMotor.Comandar,
CicloTrabalho = x.MovMotor.CicloTrabalho,
Corrente_Barramento = x.MovMotor.Corrente_Barramento,
Corrente_Motor = x.MovMotor.Corrente_Motor,
Potencia = x.MovMotor.Potencia,
RPM_Motor = x.MovMotor.RPM_Motor,
RPM_Roda = x.MovMotor.RPM_Roda,
TemperaturaDriver = x.MovMotor.TemperaturaDriver,
Tensao = x.MovMotor.Tensao,
VelocidadeInstantaneaMs = x.MovMotor.VelocidadeInstantanea,
UltimoComandoRespondido = x.MovMotor.Leitura?.UltimoComandoRecebido ?? DateTime.MinValue,
}).ToList(),
UltimoComandoRespondido = dMvd.Modulos.Max(x => x.MovMotor.Leitura?.UltimoComandoRecebido ?? DateTime.MinValue)
};
Direcional = new OperacaoParametrosDadosDirecionalModel()
{
AnguloMedio = sen?.Direcional?.AnguloMedio ?? 0,
Modulos = dMvd.Modulos.Select(x => new DirSensoriamentoLogModel()
{
Mod_ID = x.DirMotor.Mod_ID,
ID = byte.Parse(x.DirMotor.ID),
Iniciado = x.DirMotor.Inicializado,
Controlar = x.DirMotor.Comandar,
AnguloDriver = x.DirMotor.AnguloDriver,
AnguloFolgaCompensar = x.DirMotor.AnguloFolgaCompensar,
AnguloLeitura = x.DirMotor.AnguloLeitura,
AnguloReal = x.DirMotor.AnguloReal,
Angulo_SP = x.DirMotor.Angulo_SP,
FolgaMecanica = x.DirMotor.FolgaMecanica,
Sentido = x.DirMotor.Sentido,
SentidoReal = x.DirMotor.SentidoReal,
Sentido_SP = x.DirMotor.Sentido_SP,
Velocidade = x.DirMotor.Velocidade,
UltimoComandoRespondido = x.DirMotor.Leitura?.UltimoComandoRecebido ?? DateTime.MinValue,
}).ToList(),
UltimoComandoRespondido = dMvd.Modulos.Max(x => x.DirMotor.Leitura?.UltimoComandoRecebido ?? DateTime.MinValue)
};
Bateria = sen?.Bateria?.Clone();
Refrigeracao = sen?.CoolerControl?.Clone();
Gnss = new OperacaoParametrosDadosGNSSModel()
{
Iniciado = sen?.Gps?.Inicializado ?? false,
Altitude = sen?.Gps?.Altitude ?? 0,
Distancia = sen?.Gps?.Distancia ?? 0,
IdadeCorrecao = sen?.Gps?.IdadeCorrecao ?? 0,
Latitude = sen?.Gps?.Latitude ?? 0,
Longitude = sen?.Gps?.Longitude ?? 0,
LeverArmFrontal = sen?.Gps?.LeverArmFrontal ?? 0,
LeverArmLateral = sen?.Gps?.LeverArmLateral ?? 0,
NtripAtivado = sen?.Gps?.Ntrip_ativado ?? false,
NumeroSatelites = sen?.Gps?.NumeroSatelites ?? 0,
OrientacaoMovimento = sen?.Gps?.OrientacaoMovimento ?? 0,
OrientacaoReal = sen?.Gps?.OrientacaoReal ?? 0,
PrecisaoCm = sen?.Gps?.PrecisaoCm ?? 0,
PrecisaoHorizontal = sen?.Gps?.PrecisaoHorizontal ?? 0,
QualidadeFix = sen?.Gps?.QualidadeFix ?? TiposCorrecaoGPS.SemCorrecao,
Velocidade = sen?.Gps?.Velocidade ?? 0,
UltimoComandoRespondido = sen?.Gps?.UltimoComandoRespondido ?? DateTime.MinValue,
};
PerformanceNcp = sen?.DadosPerformance?.Clone();
LivoxLidar = sen?.LivoxLidar?.Clone();
Logs = new List<OperacaoSensoriamentoLogErrosModel>(sen?.Logs ?? new List<OperacaoSensoriamentoLogErrosModel>());
}
public OperacaoParametrosDadosModel Clone()
{
return new OperacaoParametrosDadosModel()
{
Momento = Momento,
StatusRover = StatusRover,
CanSerial = CanSerial,
Operacao = Operacao,
Trajetoria = Trajetoria?.Clone(),
Controle = Controle?.Clone(),
ModulosSaude = new List<ManagerWorkerMessageResponseModulosPendentesModel>(ModulosSaude ?? new List<ManagerWorkerMessageResponseModulosPendentesModel>()),
DispositivosMapeados = new List<DispositivoDetalhesModel>(DispositivosMapeados ?? new List<DispositivoDetalhesModel>()),
Imu = Imu?.Clone(),
Atuador = Atuador,
Sensoriamento = Sensoriamento,
Movimentacao = Movimentacao,
Direcional = Direcional,
Bateria = Bateria?.Clone(),
Refrigeracao = Refrigeracao?.Clone(),
Gnss = Gnss,
PerformanceNcp = PerformanceNcp?.Clone(),
LivoxLidar = LivoxLidar?.Clone(),
Logs = new List<OperacaoSensoriamentoLogErrosModel>(Logs ?? new List<OperacaoSensoriamentoLogErrosModel>())
};
}
}
public class OperacaoParametrosDadosOperacaoModel
{
public ModoOperacao Modo { get; set; }
public StatusOperacao Status { get; set; }
public string ImpedimentoErro { get; set; }
public bool Liberada { get; set; }
public bool Iniciada { get; set; }
public bool Emergencia { get; set; }
public bool Pausa { get; set; }
public DateTime IniciadoEm { get; set; }
public DateTime FinalizadoEm { get; set; }
public double TempoAguardandoSegs { get; set; }
public double TempoDecorridoSegs { get; set; }
public List<OperacaoModulosMandatoriosModel> ModulosMandatorios { get; set; }
public List<OperacaoParametrosMandatoriosModel> ParametrosMandatorios { get; set; }
}
public class OperacaoParametrosDadosAtuadorModel
{
public bool Iniciado { get; set; }
public double CapacidadeReservatorio { get; set; }
public int QtdCamerasSolo { get; set; }
public bool ErvasNoRadar { get; set; }
public double PercentualErvasNoRadar { get; set; }
public double PercentualErvasTerreno { get; set; }
public double HerbicidaConsumidoMl { get; set; }
public double HerbicidaPorAtuacaoMl { get; set; }
public double MassaReservatorioKg { get; set; }
public double VolumeReservatorioL { get; set; }
public double PercentualReservatorio { get; set; }
public double PressaoLinhaPsi { get; set; }
public double VazaoInstantaneaMLs { get; set; }
public double VazaoMediaMLs { get; set; }
public double VolumeVazaoMl { get; set; }
public double LPorMetro { get; set; }
public double LPorMinuto { get; set; }
public double TempoEstimadoRestanteMinutos { get; set; }
public double DistanciaEstimadaRestanteMetros { get; set; }
public double AnguloBarraEsquerda { get; set; }
public double AnguloBarraDireita { get; set; }
public double AnguloBarraAltura { get; set; }
public List<OperacaoParametrosDadosBicoModel> Bicos { get; set; }
public List<OperacaoParametrosDadosBombaModel> Bombas { get; set; }
public List<OperacaoParametrosDadosServoModel> Servos{ get; set; }
public List<OperacaoParametrosDadosSensorModel> Sensores { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosBombaModel
{
public string ID { get; set; }
public int ID_Num { get; set; }
public int Sensor_ID_Num { get; set; }
public bool Inicializado { get; set; }
public bool ComandoEstado { get; set; }
public bool LeituraEstado { get; set; }
public double TempoAtuado { get; set; }
public double Potencia { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosBicoModel
{
public string ID { get; set; }
public int ID_Num { get; set; }
public int Servo_ID_Num { get; set; }
public bool Inicializado { get; set; }
public int Posicao { get; set; }
public bool ComandoEstado { get; set; }
public bool LeituraEstado { get; set; }
public int ComandoAngulo { get; set; }
public int LeituraAngulo { get; set; }
public int QtdAtuacoes { get; set; }
public double TempoAtuado { get; set; }
public double MediaVazaoMLs { get; set; }
public double AnguloAbertura { get; set; }
public List<List<double[]>> TrechosPulverizando { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosServoModel
{
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Inicializado { get; set; }
public bool Incremental { get; set; }
public int ComandoAngulo { get; set; }
public int LeituraAngulo { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosReleModel
{
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Inicializado { get; set; }
public bool ComandoEstado { get; set; }
public bool LeituraEstado { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosSensorModel
{
public S_Code Componente { get; set; }
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Inicializado { get; set; }
public List<dynamic> Valores { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosSinaleiroModel
{
public string ID { get; set; }
public int ID_Num { get; set; }
public bool Inicializado { get; set; }
public SensorSinaleiroComportamentoModel Comportamento { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosMovimentacaoModel
{
public double VelocidadeMediaMs { get; set; }
public double RPMMedio { get; set; }
public double TempoMovimentoSegs { get; set; }
public double DistanciaPercorridaTotal { get; set; }
public double DistanciaPercorridaParcial { get; set; }
public double TemperaturaMedia { get; set; }
public List<OperacaoSensoriamentoLogMovDadosModel> Modulos { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosDirecionalModel
{
public double AnguloMedio { get; set; }
public List<DirSensoriamentoLogModel> Modulos { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosSensoriamentoModel
{
public bool Iniciado { get; set; }
public List<OperacaoParametrosDadosSinaleiroModel> Sinaleiros { get; set; }
public List<OperacaoParametrosDadosSensorModel> Sensores { get; set; }
public List<OperacaoParametrosDadosServoModel> Servos { get; set; }
public List<OperacaoParametrosDadosReleModel> Reles { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
}
public class OperacaoParametrosDadosGNSSModel
{
public bool Iniciado { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public double Altitude { get; set; }
public double Velocidade { get; set; }
public double Distancia { get; set; }
public double OrientacaoMovimento { get; set; }
public double OrientacaoReal { get; set; }
public int NumeroSatelites { get; set; }
public double PrecisaoHorizontal { get; set; }
public double PrecisaoCm { get; set; }
public TiposCorrecaoGPS QualidadeFix { get; set; }
public bool NtripAtivado { get; set; }
public double IdadeCorrecao { get; set; }
public double LeverArmLateral { get; set; }
public double LeverArmFrontal { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
public GPSModel ToGpsModel()
{
return new GPSModel()
{
Inicializado = Iniciado,
Latitude = Latitude,
Longitude = Longitude,
Altitude = Altitude,
Velocidade = Velocidade,
Distancia = Distancia,
OrientacaoMovimento = OrientacaoMovimento,
OrientacaoReal = OrientacaoReal,
NumeroSatelites = NumeroSatelites,
PrecisaoHorizontal = PrecisaoHorizontal,
QualidadeFix = QualidadeFix,
Ntrip_ativado = NtripAtivado,
IdadeCorrecao = IdadeCorrecao,
LeverArmFrontal = LeverArmFrontal,
LeverArmLateral = LeverArmLateral,
UltimoComandoRespondido = UltimoComandoRespondido
};
}
}
}

View File

@ -61,7 +61,7 @@ namespace AgroBase.Models.Operadores
public void AtualizarStatusBloqueio(bool consideraEmMovimento)
{
var Sonar = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.OperadorVisual;
var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual;
ObstaculoDetectado = (Sonar.Analises?.matriz_confianca?.block?.decision?.parar ?? false);
if (!Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado)

View File

@ -601,7 +601,7 @@ namespace AgroBase.Models
{
get
{
return DistanciaMedia / FuncoesMatematicas.ConverteKmhParaMs(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Movimentacao.VelocidadeMedia);
return DistanciaMedia / FuncoesMatematicas.ConverteKmhParaMs(Variaveis.OperacaoEmAndamento.Sensoriamento.Movimentacao.VelocidadeMedia);
}
}
public double DeslocamentoNecessarioDesvio
@ -769,18 +769,18 @@ namespace AgroBase.Models
{
get
{
double anguloAbsolutoObstaculo = (Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.AnguloCarroDefinido + AnguloInicial + AnguloFinal) / 2.0;
double anguloAbsolutoObstaculo = (Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido + AnguloInicial + AnguloFinal) / 2.0;
double anguloRad = anguloAbsolutoObstaculo * (Math.PI / 180.0);
// Supondo que a distância seja em metros e utilizando uma aproximação simples da Terra como esfera
// para converter distância e ângulo em mudança de latitude/longitude.
double deltaLatitude = (DistanciaMedia * Math.Cos(anguloRad)) / 111111; // Dividindo por 111111 para converter metros em graus
double deltaLongitude = (DistanciaMedia * Math.Sin(anguloRad)) / (111111 * Math.Cos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Latitude * (Math.PI / 180.0)));
double deltaLongitude = (DistanciaMedia * Math.Sin(anguloRad)) / (111111 * Math.Cos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Latitude * (Math.PI / 180.0)));
return new GPSModel
{
Latitude = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Latitude + deltaLatitude,
Longitude = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Longitude + deltaLongitude
Latitude = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Latitude + deltaLatitude,
Longitude = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Longitude + deltaLongitude
};
}
}

View File

@ -40,7 +40,7 @@ namespace AgroBase.Models
public double TempoEntreLeituras { get; private set; }
private void AtualizarTempoEntreLeituras()
{
DateTime leitura_gps = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps?.Momento ?? DateTime.MinValue;
DateTime leitura_gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps?.Momento ?? DateTime.MinValue;
double t_min = (1.0 / GPSService.TaxaAmostragemHz);
double dt = (leitura_gps - UltimaAtualizacaoDados).TotalSeconds;
TempoEntreLeituras = Math.Min(t_min, dt);
@ -87,8 +87,8 @@ namespace AgroBase.Models
{
get
{
double distPP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, PrimeiroPontoRuaMapa);
double distUP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, UltimoPontoRuaMapa);
double distPP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, PrimeiroPontoRuaMapa);
double distUP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, UltimoPontoRuaMapa);
// 0 para mais próximo do primeiro ponto da rua (ENTRANDO)
// 1 para mais próximo do último ponto da rua (SAINDO)
@ -128,7 +128,7 @@ namespace AgroBase.Models
{
new PontoTrajetoriaModel(TipoPontoRua.PosicaoRobo)
{
Posicao = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps,
Posicao = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps,
LarguraCorredor = 1.0,
idxCorredor = CorredorAtual?.Idx ?? 0,
Visitado = true
@ -225,7 +225,7 @@ namespace AgroBase.Models
private void AtualizarAnguloCaminho()
{
PontoTrajetoriaModel pontoComparar = PontoAtual.Aproximando ? PontoAtual : ProximoPonto != null ? ProximoPonto : PontoAtual;
AnguloCaminho = GPSUtils.CalcularOrientacao(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, pontoComparar.Posicao);
AnguloCaminho = GPSUtils.CalcularOrientacao(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, pontoComparar.Posicao);
}
[JsonProperty]
public double DistanciaEsquerda { get; private set; }
@ -233,8 +233,8 @@ namespace AgroBase.Models
public double DistanciaDireita { get; private set; }
private void AtualizarDistanciasLaterais()
{
DistanciaEsquerda = CalcularDistanciaLateral(true, Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, CorredorAtual?.idxRuaEsquerda ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida);
DistanciaDireita = CalcularDistanciaLateral(false, Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, CorredorAtual?.idxRuaDireita ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida);
DistanciaEsquerda = CalcularDistanciaLateral(true, Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual?.idxRuaEsquerda ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida);
DistanciaDireita = CalcularDistanciaLateral(false, Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual?.idxRuaDireita ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida);
}
public double CalcularDistanciaLateral(bool ladoEsquerdo, GPSModel posicaoAtual, int idxRua, DirecaoCarroRua direcaoAtual)
@ -554,12 +554,12 @@ namespace AgroBase.Models
if (CorredorAtual.Idx > 0) return;
if (!CorredorAtual.Dentro) return;
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps.Clone();
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Clone();
if (PrimeiroPontoDentroMapa == null) PrimeiroPontoDentroMapa = posicaoAtual;
var OpVisual = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.OperadorVisual ?? new VisualWorkerModel();
StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado;
var OpVisual = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel();
StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado;
if (OpVisualStatus != StatusModulo.Operante) return;
@ -591,7 +591,7 @@ namespace AgroBase.Models
private void AtualizarErroCombinado()
{
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
//double anguloCamera = _Sensoriamento.OperadorVisual.Leitura.obj?.segmentacao?.angulo_rua ?? 0;
double anguloCorredor = AnguloMedioCorredor;
@ -775,9 +775,9 @@ namespace AgroBase.Models
double limiarDistanciaMargem = DistanciaErroMapaPlantacao > -1 ? DistanciaErroMapaPlantacao : 5.0;
double distanciaCorredor = CorredorAtual.DistanciaTotal;
double distanciaRestanteCorredor = CorredorAtual.DistanciaRestante;
double distanciaUltimoPontoCorredor = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, CorredorAtual.Pontos.LastOrDefault().Posicao);
var OpVisual = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.OperadorVisual ?? new VisualWorkerModel();
StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado;
double distanciaUltimoPontoCorredor = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual.Pontos.LastOrDefault().Posicao);
var OpVisual = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel();
StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado;
var DadosSegmentacao = OpVisual.Analises?.segmentacao ?? new VisualWorkerMessageSegmentacaoSemanticaModel();
if (OpVisualStatus == StatusModulo.Operante || Variaveis.OperacaoEmAndamento.Simulando) //OpVisual.Iniciado &&
@ -855,7 +855,12 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = TipoMovimentoDirecional.MovimentoArco;
Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Dir).DelayEnvioComandoExtra = 1500;
Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Mov).DelayEnvioComandoExtra = 2000;
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(true, new List<T_Code>() { T_Code.Mov, T_Code.Dir });
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
if (pControle.MovimentoAutomatico)
{
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(false, new List<T_Code>() { T_Code.Mov, T_Code.Dir });
}
}
}
}
@ -949,7 +954,12 @@ namespace AgroBase.Models
_Controle.Latencia = novoComando.latencia;
_Controle.ErroLateral = novoComando.erro_lateral;
_Controle.DebugCustoMpc = novoComando.debug_custo;
Variaveis.OperacaoEmAndamento.AtualizaInformacoesControleOperacao();
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
if (pControle.MovimentoAutomatico)
{
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(false, new List<T_Code>() { T_Code.Mov, T_Code.Dir });
}
}
if (novoComando != null && novoComando.heartbeat == _Controle.heartbeat)
@ -1226,7 +1236,7 @@ namespace AgroBase.Models
idxCorredor = 0,
idxPonto = 0,
idxPontoCorredor = 0,
Posicao = posicaoRobo ?? Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps,
Posicao = posicaoRobo ?? Variaveis.OperacaoEmAndamento.Sensoriamento.Gps,
Orientacao = 0,
Direcao = direcaoAtual,
Visitado = true,
@ -1527,7 +1537,7 @@ namespace AgroBase.Models
public void AjustarTrajetoriaParaDesvio(Obstaculo obstaculo)
{
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps;
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
double distanciaObstaculo = ((double)obstaculo.DistanciaMedia_mm / 1000);
double larguraObstaculo = ((double)obstaculo.Largura_mm / 1000);
@ -1643,7 +1653,7 @@ namespace AgroBase.Models
}
if (!valido || pontosRetorno == null || pontosRetorno.Count < 1)
Variaveis.OperacaoEmAndamento.Parametros?.DadosLeitura?.InserirLog(T_Code.Trj, StatusModulo.Falha, 0, "Trajetória de retorno inválida.");
Variaveis.OperacaoEmAndamento.Sensoriamento?.InserirLog(T_Code.Trj, StatusModulo.Falha, 0, "Trajetória de retorno inválida.");
else
AplicarTrajetoriaFixaRetorno(pontosRetorno, "RetornoBase");
}
@ -1658,7 +1668,7 @@ namespace AgroBase.Models
idxCorredor = 0,
idxPonto = 0,
idxPontoCorredor = 0,
Posicao = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps,
Posicao = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps,
Visitado = true,
LarguraCorredor = 1.0
});
@ -1691,7 +1701,7 @@ namespace AgroBase.Models
_TrajetoriaFixa = traj;
Variaveis.OperacaoEmAndamento.Parametros?.DadosLeitura?.InserirLog(T_Code.Trj, StatusModulo.Operante, 100, $"[RETORNO] Trajetória aplicada ({motivo}) - Pontos: {traj.Count}");
Variaveis.OperacaoEmAndamento.Sensoriamento?.InserirLog(T_Code.Trj, StatusModulo.Operante, 100, $"[RETORNO] Trajetória aplicada ({motivo}) - Pontos: {traj.Count}");
AutonomiaCorredor.Parar();
@ -1706,7 +1716,7 @@ namespace AgroBase.Models
{
var pontos = new List<GPSModel>();
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps;
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
// =========================
// REGRA 0 Está dentro de corredor?
@ -2379,7 +2389,7 @@ namespace AgroBase.Models
private void AtualizarOrientacaoAtual()
{
OrientacaoAtual = GPSUtils.CalcularOrientacao(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, Posicao);
OrientacaoAtual = GPSUtils.CalcularOrientacao(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, Posicao);
}
private void AtualizarOrientacaoAnterior()
@ -2434,7 +2444,7 @@ namespace AgroBase.Models
private void AtualizarDistanciaAtual()
{
DistanciaAtual = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Gps, Posicao);
DistanciaAtual = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, Posicao);
}
private void AtualizarDistanciaAnterior()
@ -2615,7 +2625,7 @@ namespace AgroBase.Models
if (addLog)
{
Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.InserirLog(T_Code.Trj, _liberado ? StatusModulo.Operante : StatusModulo.Alerta, _liberado ? 100 : 0, res.Motivo);
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Trj, _liberado ? StatusModulo.Operante : StatusModulo.Alerta, _liberado ? 100 : 0, res.Motivo);
}
Liberado = CorredoresLiberados[idxCorredor].Liberado;

View File

@ -226,6 +226,7 @@ namespace AgroBase.Models
public static double CorrenteMaximaBateria { get; set; } = 20.0;
public static double PercentualTensaoBateriaMin { get; set; } = 25.0;
public static double PercentualReservatorioMin { get; set; } = 8.0;
public static double PercentualReservatorioMinCritio { get; set; } = 5.0;
public static double PercentualToleranciaPressaoLinha { get; set; } = 0.15;
public static int QuantidadeCamerasSolo { get; set; } = 1;
public static int QuantidadeBicosPulverizadores { get; set; } = 3;
@ -609,7 +610,7 @@ namespace AgroBase.Models
{
if (!Variaveis.IsAgroMonitor && Variaveis.OperacaoEmAndamento.DispAtu != null)
{
return (Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Atuador?.PercentualErvasTerreno ?? 0) / 100.0;
return (Variaveis.OperacaoEmAndamento.Sensoriamento.Atuador?.PercentualErvasTerreno ?? 0) / 100.0;
}
return 0.3;
}
@ -620,7 +621,7 @@ namespace AgroBase.Models
{
if (!Variaveis.IsAgroMonitor && Variaveis.OperacaoEmAndamento.DispAtu != null)
{
return (100.0 - (Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.Atuador?.PercentualErvasTerreno ?? 0)) / 100.0;
return (100.0 - (Variaveis.OperacaoEmAndamento.Sensoriamento.Atuador?.PercentualErvasTerreno ?? 0)) / 100.0;
}
return 0.7;
}

View File

@ -101,7 +101,7 @@ namespace AgroBase.Services
AlertaTemperaturaCritica = temp >= TempCritical;
if (!_alertaAnterior && AlertaTemperaturaCritica)
{
Variaveis.OperacaoEmAndamento.Parametros?.DadosLeitura?.InserirLog(T_Code.Npc, StatusModulo.Alerta, 50, "Temperatura limite excedida no NPC");
Variaveis.OperacaoEmAndamento.Sensoriamento?.InserirLog(T_Code.Npc, StatusModulo.Alerta, 50, "Temperatura limite excedida no NPC");
}
if (ModoAtual == CoolerMode.Manual)

View File

@ -991,6 +991,14 @@ namespace AgroBase.Services
}
}
foreach (var bico in Variaveis.OperacaoEmAndamento.Controle?.Bicos?.Where(x => x.Inicializado && x.Comandar))
{
if (bico._EstadoLeitura == Estado.Ligado)
{
bico.TrechosAtuado[bico.TrechosAtuado.Count - 1].Add(new double[] { UltimaLeitura.Latitude, UltimaLeitura.Longitude });
}
}
Variaveis.OperacaoEmAndamento.Trajetoria?.LoopAtualizaDados();
AtualizarTrajetoriaDinamica();
@ -1139,7 +1147,7 @@ namespace AgroBase.Services
{
double anguloFinal = 0.0;
bool imuIniciado = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.IMU?.Iniciado ?? false;
bool imuIniciado = Variaveis.OperacaoEmAndamento.Sensoriamento?.IMU?.Iniciado ?? false;
bool gpsIniciado = Iniciado;
if (imuIniciado)
@ -1159,7 +1167,7 @@ namespace AgroBase.Services
double heading = UltimaLeitura.OrientacaoReal;
double angMov = UltimaLeitura.OrientacaoMovimento;
double distJan = UltimaLeitura.Distancia;
double velPercent = Variaveis.OperacaoEmAndamento.Simulando ? Variaveis.OperacaoEmAndamento.Controle.RPM_SP : Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura?.Movimentacao?.RPMMedio ?? 0;
double velPercent = Variaveis.OperacaoEmAndamento.Simulando ? Variaveis.OperacaoEmAndamento.Controle.RPM_SP : Variaveis.OperacaoEmAndamento.Sensoriamento?.Movimentacao?.RPMMedio ?? 0;
bool rtkFix = UltimaLeitura.QualidadeFix == TiposCorrecaoGPS.RTKFixo;
double angAnterior = UltimaLeitura.AnguloCarroDefinido;
@ -1170,7 +1178,7 @@ namespace AgroBase.Services
else if (imuIniciado)
{
// Apenas o WT901C está disponível
anguloFinal = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura.IMU.RotacaoCorrigida;
anguloFinal = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU.RotacaoCorrigida;
}
else
{

View File

@ -146,6 +146,9 @@ namespace AgroBase.Services
private bool _inicializado;
private SensorModel SensorMassaReservatorio = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.Sensores?.FirstOrDefault(x => x.Componente == S_Code.sMAS && x.ID == "MASRS");
public bool PulverizadorLiberado { get; set; }
/// <summary>
/// Atualiza o estado do sistema de herbicida.
///
@ -157,22 +160,20 @@ namespace AgroBase.Services
/// </summary>
public void AtualizarConsumo(double distanciaTotalMetrosAtual, double tempoTotalSegundosAtual)
{
var Sensor = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.Sensores?.FirstOrDefault(x => x.Componente == S_Code.sMAS && x.ID == "MASRS");
Iniciado = Sensor?.Inicializado ?? false;
Iniciado = SensorMassaReservatorio?.Inicializado ?? false;
if (!Iniciado)
return;
bool pulverizando = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.BicosPulverizadores?.Any(x => x.Inicializado && x._EstadoLeitura == Estado.Ligado) ?? false;
double massaLida_Kg = Sensor?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Massa)?.atual?.valor ?? 0;
double massaLida_Kg_bruto = Sensor?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraBruta)?.atual?.valor ?? 0;
double massaLida_Kg = SensorMassaReservatorio?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Massa)?.atual?.valor ?? 0;
double massaLida_Kg_bruto = SensorMassaReservatorio?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraBruta)?.atual?.valor ?? 0;
double.TryParse(Sensor.Parametros.FirstOrDefault(x => x.Descricao == "Offset")?.Valor ?? "0", out double offset);
double.TryParse(SensorMassaReservatorio.Parametros.FirstOrDefault(x => x.Descricao == "Offset")?.Valor ?? "0", out double offset);
double massa_calc = (massaLida_Kg_bruto * -1) + offset;
double volumeMedido_L = massa_calc / DensidadeProduto;
int qtd_atuacoes = Variaveis.OperacaoEmAndamento.Controle?.BicosAtuados?.Sum(x => x.Atuacoes) ?? 0;
int qtd_atuacoes = Variaveis.OperacaoEmAndamento.Controle?.Bicos?.Sum(x => x.Atuacoes) ?? 0;
// Sanitiza volume
if (volumeMedido_L < 0) volumeMedido_L = 0;
@ -196,6 +197,8 @@ namespace AgroBase.Services
MassaAtual_Kg_Calc = massa_calc;
VolumeAtual_L = volumeMedido_L;
PulverizadorLiberado = PercentualAtual >= VariaveisEquipamento.PercentualReservatorioMinCritio;
// --- Cálculo de deltas básicos ---
double deltaVolume_L = 0.0;

View File

@ -137,7 +137,7 @@ namespace AgroBase.Services
if (ageRxMs > beaconPeriodoMs + 2000) return;
// --- ENVIO (ideal: agregue em 1-2 frames) ---
var s = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var s = Variaveis.OperacaoEmAndamento.Sensoriamento;
foreach (var dado in LoRaSerializer.SerializeGPS(s.Gps))
Variaveis.LoraService?.EnviarDadosLoRaViaCAN(dado);

View File

@ -108,7 +108,7 @@ namespace AgroBase.Services.Operadores
AtualizarDadosModulos();
AtualizarDadosControleOperacao();
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
if (_Sensoriamento == null)
{
@ -296,7 +296,7 @@ namespace AgroBase.Services.Operadores
{
if (Variaveis.OperacaoEmAndamento.DispMvd == null) return;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura;
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
var agora = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
//Console.WriteLine(RedisService.Get(RedisService.ModKey(Enums.T_Code.Gps)));

View File

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static AgroBase.Models.Enums;
using static AgroBase.Models.Operadores.OperadoresModels;
namespace AgroBase.Services.Operadores
@ -83,7 +84,12 @@ namespace AgroBase.Services.Operadores
_Controle.PercentualVelocidadeSP = novoComando.percentual_velocidade;
_Controle.EmFreio = novoComando.em_freio;
_Controle.SimulacaoMPC = novoComando.simulacao?.Select(x => new MPCSimulacaoModel() { latitude = x[0], longitude = x[1], orientacao = x[2] }).ToList() ?? new List<MPCSimulacaoModel>();
Variaveis.OperacaoEmAndamento.AtualizaInformacoesControleOperacao();
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
if (pControle.MovimentoAutomatico)
{
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(false, new List<T_Code>() { T_Code.Mov, T_Code.Dir });
}
}
}

View File

@ -92,12 +92,12 @@ namespace AgroBase.Services.Operadores
_Controle.Angulo = 0;
_Controle.PercentualVelocidadeSP = 0;
_Controle.BicosAtuados.ForEach(x => x.ComandoAtuar = false);
_Controle.Bicos.ForEach(x => x.ComandoAtuar = false);
RedisService.AtualizarCampos(
CtxKey.DadosControle,
("angulo_sp", _Controle.Angulo),
("velocidade_sp", _Controle.PercentualVelocidadeSP),
("controle_bicos", _Controle.BicosAtuados.ToDictionary(x => x.Posicao - 1, x => x.ComandoAtuar))
("controle_bicos", _Controle.Bicos.ToDictionary(x => x.Posicao - 1, x => x.ComandoAtuar))
);
Variaveis.OperacaoEmAndamento.AtualizaInformacoesControleOperacao();

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Threading.Tasks;
using static AgroBase.Models.Operadores.OperadoresModels;
using Newtonsoft.Json.Linq;
using static AgroBase.Models.Enums;
namespace AgroBase.Services.Operadores
{
@ -61,15 +62,20 @@ namespace AgroBase.Services.Operadores
bool comandoMudou = false;
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
foreach (var bico in _Controle.BicosAtuados)
foreach (var bico in _Controle.Bicos)
{
novoComando.TryGetValue(bico.Posicao, out bool atuado);
if (!(Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga?.PulverizadorLiberado ?? false)) atuado = false;
if (!comandoMudou) comandoMudou = atuado != bico.ComandoAtuar;
bico.ComandoAtuar = atuado;
}
if (comandoMudou)
{
Variaveis.OperacaoEmAndamento.AtualizaInformacoesControleOperacao();
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
if (pControle.PulverizadorAutomatico)
{
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(false, new List<T_Code>() { T_Code.Atu });
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -300,7 +300,7 @@ namespace OperationControl.Controls
private void ManualControlPad_PauseClicked(object? sender, EventArgs e)
{
if (VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.OperacaoIniciada ?? false)
if (VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Iniciada ?? false)
{
//PauseActivated = !PauseActivated;
//VariaveisControleOperacao.EnviarComandoParada(pausa: PauseActivated);

View File

@ -487,7 +487,7 @@ namespace OperationControl.Controls
}
else if (info?.Layer == MapaPlantacao_Layer && feat is MIFeature roadFeature)
{
if (!(VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.OperacaoIniciada ?? false))
if (!(VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Operacao?.Iniciada ?? false))
HighlightRoad(roadFeature);
}
else

View File

@ -102,7 +102,7 @@ namespace OperationControl.Models
RoverId = device_id,
Configurado = false,
Alive = true,
DadosLeitura = new OperacaoSensoriamentoLogModel()
DadosLeitura = new OperacaoParametrosDadosModel()
{
Momento = DateTime.Now
}
@ -123,7 +123,7 @@ namespace OperationControl.Models
{
string json = message.Mensagem;
if (string.IsNullOrEmpty(json)) return;
var obj = JsonConvert.DeserializeObject<OperacaoSensoriamentoLogModel>(json);
var obj = JsonConvert.DeserializeObject<OperacaoParametrosDadosModel>(json);
if (obj == null) return;
lock (_RoversLock)
{
@ -205,9 +205,9 @@ namespace OperationControl.Models
if (!rover.Alive)
{
//((App)Application.Current).Shell.Main?.MAP?.markers?.UpdateMarkerInfo(rover.RoverId, status: AgroBase.Models.Enums.StatusOperacao.Erro);
rover.DadosLeitura = new OperacaoSensoriamentoLogModel();
rover.DadosLeitura = new OperacaoParametrosDadosModel();
rover.DadosLeitura.Momento = DateTime.Now;
rover.DadosLeitura.StatusOperacao = AgroBase.Models.Enums.StatusOperacao.Erro;
rover.DadosLeitura.Operacao.Status = AgroBase.Models.Enums.StatusOperacao.Erro;
((App)Application.Current).Shell.Main?.AtualizarDadosTela_Telemetria(rover.RoverId);
((App)Application.Current).Shell.Main?.AdicionarAlerta(rover.RoverId, AgroBase.Models.Enums.T_Code.Ipb, SeveridadeAlerta.Critical, "Perda de comunicação com o equipamento!");
}
@ -316,7 +316,7 @@ namespace OperationControl.Models
public static void EnviarParametrosOperacao(OperacaoParametrosModel parametros)
{
bool operacao_iniciada = (RoverEmFoco?.DadosLeitura?.OperacaoIniciada ?? false);
bool operacao_iniciada = (RoverEmFoco?.DadosLeitura?.Operacao?.Iniciada ?? false);
bool parametros_parciais = parametros.Modo == null;
EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel()

View File

@ -1098,7 +1098,7 @@ namespace OperationControl.Services
{
try
{
((App)Application.Current).Shell.Main.AtualizarDadosTela_GNSS(UltimaLeitura, marker_id: VariaveisControleOperacao.BaseMarkerID, progresso: BaseFix.Progresso);
((App)Application.Current).Shell.Main.AtualizarDadosTela_GNSS(UltimaLeitura.ToGnssModel(), marker_id: VariaveisControleOperacao.BaseMarkerID, progresso: BaseFix.Progresso);
((App)Application.Current).Shell.Main.AtualizarDadosTela_Heading(UltimaLeitura.AnguloCarroDefinido);
}
catch (Exception exUi)

View File

@ -127,22 +127,22 @@
<Label x:Name="lblDiagnosticos_SEN_AB36V" Tag="sCOR" Content="🔒B36V" Style="{StaticResource RoundedLabel}" Height="21" Width="42" Canvas.Left="366" Canvas.Top="76" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_DIR_DF" Content="🔒DIR" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="300" Canvas.Top="102" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_MOV_DF" Content="🔒MOV" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="300" Canvas.Top="128" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_FRODF" Tag="sFRO" Content="🔒FRO" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="346" Canvas.Top="128" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_FRODF" Tag="sSRV" Content="🔒FRO" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="346" Canvas.Top="128" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_MAGDF" Tag="sMAG" Content="🔒MAG" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="346" Canvas.Top="154" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_TMVDF" Tag="sNTC" Content="🔒TMP" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="300" Canvas.Top="154" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_DIR_EF" Content="🔒DIR" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="99" Canvas.Top="102" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_MOV_EF" Content="🔒MOV" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="99" Canvas.Top="128" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_FROEF" Tag="sFRO" Content="🔒FRO" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="53" Canvas.Top="128" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_FROEF" Tag="sSRV" Content="🔒FRO" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="53" Canvas.Top="128" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_MAGEF" Tag="sMAG" Content="🔒MAG" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="53" Canvas.Top="154" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_TMVEF" Tag="sNTC" Content="🔒TMP" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="99" Canvas.Top="154" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_DIR_ET" Content="🔒DIR" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="99" Canvas.Top="280" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_MOV_ET" Content="🔒MOV" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="99" Canvas.Top="306" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_FROET" Tag="sFRO" Content="🔒FRO" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="53" Canvas.Top="306" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_FROET" Tag="sSRV" Content="🔒FRO" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="53" Canvas.Top="306" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_MAGET" Tag="sMAG" Content="🔒MAG" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="53" Canvas.Top="332" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_TMVET" Tag="sNTC" Content="🔒TMP" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="99" Canvas.Top="332" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_DIR_DT" Content="🔒DIR" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="300" Canvas.Top="280" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_MOV_DT" Content="🔒MOV" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="300" Canvas.Top="306" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_FRODT" Tag="sFRO" Content="🔒FRO" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="346" Canvas.Top="306" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_FRODT" Tag="sSRV" Content="🔒FRO" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="346" Canvas.Top="306" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_MAGDT" Tag="sMAG" Content="🔒MAG" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="346" Canvas.Top="332" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_TMVDT" Tag="sNTC" Content="🔒TMP" Style="{StaticResource RoundedLabel}" Height="21" Width="41" Canvas.Left="300" Canvas.Top="332" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SNR" Content="🔒SNR" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="202" Canvas.Top="102" HorizontalAlignment="Center" VerticalAlignment="Top"/>
@ -156,16 +156,20 @@
<Label x:Name="lblDiagnosticos_CAN" Content="🔒CAN" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="398" Canvas.Top="192" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<Label x:Name="lblDiagnosticos_IPB" Content="🔒LAN" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="398" Canvas.Top="218" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<Label x:Name="lblDiagnosticos_TRJ" Content="🔒TRAJ" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="398" Canvas.Top="244" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_BOMBA" Tag="sBMB" Content="🔒BMB" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="202" Canvas.Top="309" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU" Tag="sMOD" Content="🔒ATU" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="202" Canvas.Top="349" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_PRSLN" Tag="sPRS" Content="🔒PRS" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="202" Canvas.Top="386" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_FLXLN" Tag="sFLX" Content="🔒FLX" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="155" Canvas.Top="386" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_MASRS" Tag="sMAS" Content="🔒MAS" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="249" Canvas.Top="386" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_B01" Tag="sBIC" Content="🔒B01" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="75" Canvas.Top="411" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_B02" Tag="sBIC" Content="🔒B02" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="143" Canvas.Top="412" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_B03" Tag="sBIC" Content="🔒B03" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="254" Canvas.Top="412" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_B04" Tag="sBIC" Content="🔒B04" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="322" Canvas.Top="411" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_CAM" Content="🔒CAM" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="204" Canvas.Top="411" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_BOMBA" Tag="sBMB" Content="🔒BMB" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="157" Canvas.Top="360" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU" Tag="sMOD" Content="🔒ATU" Style="{StaticResource RoundedLabel}" Height="22" Width="40" Canvas.Left="202" Canvas.Top="333" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_PRSLN" Tag="sPRS" Content="🔒PRS" Style="{StaticResource RoundedLabel}" Height="22" Width="40" Canvas.Left="157" Canvas.Top="333" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_FLXLN" Tag="sFLX" Content="🔒FLX" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="247" Canvas.Top="334" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_MASRS" Tag="sMAS" Content="🔒MAS" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="247" Canvas.Top="360" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_B01" Tag="sBIC" Content="🔒B01" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="79" Canvas.Top="411" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<Label x:Name="lblDiagnosticos_ATU_SRVB1" Tag="sSRV" Content="🔒SVB1" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="79" Canvas.Top="386" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_B02" Tag="sBIC" Content="🔒B02" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="202" Canvas.Top="411" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<Label x:Name="lblDiagnosticos_ATU_B03" Tag="sBIC" Content="🔒B03" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="324" Canvas.Top="412" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<Label x:Name="lblDiagnosticos_ATU_SRVB3" Tag="sSRV" Content="🔒SVB3" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="324" Canvas.Top="386" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_MAGESQ" Tag="sMAG" Content="🔒MAG" Style="{StaticResource RoundedLabel}" Height="22" Width="40" Canvas.Left="140" Canvas.Top="400" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<Label x:Name="lblDiagnosticos_ATU_MAGDIR" Tag="sMAG" Content="🔒MAG" Style="{StaticResource RoundedLabel}" Height="22" Width="40" Canvas.Left="262" Canvas.Top="400" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_ATU_MAGALT" Tag="sMAG" Content="🔒MAG" Style="{StaticResource RoundedLabel}" Height="22" Width="40" Canvas.Left="202" Canvas.Top="388" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_CAM" Content="🔒CAM" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="202" Canvas.Top="360" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_LEDOP" Tag="sLED" Content="🔒OP" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="10" Canvas.Top="192" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_LEDMN" Tag="sLED" Content="🔒MN" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="10" Canvas.Top="218" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_LEDAT" Tag="sLED" Content="🔒AT" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="10" Canvas.Top="244" HorizontalAlignment="Center" VerticalAlignment="Top"/>

View File

@ -145,9 +145,9 @@ namespace OperationControl.Windows
MAP.markers.AddMarker(
d,
false,
lat: rover.DadosLeitura?.Gps?.Latitude ?? 0,
lon: rover.DadosLeitura?.Gps?.Longitude ?? 0,
heading: rover.DadosLeitura?.Gps?.AnguloCarroDefinido ?? 0
lat: rover.DadosLeitura?.Gnss?.Latitude ?? 0,
lon: rover.DadosLeitura?.Gnss?.Longitude ?? 0,
heading: rover.DadosLeitura?.Gnss?.OrientacaoReal ?? 0
);
}
}
@ -227,8 +227,8 @@ namespace OperationControl.Windows
else if (dados_leitura != null)
{
var simulacao = dados_leitura.Controle?.SimulacaoMPC?.Select(x => new double[] { x.longitude, x.latitude })?.ToList();
MAP.markers.UpdateMarkerPosition(rover_id, lat: dados_leitura.Gps?.Latitude, lon: dados_leitura.Gps?.Longitude, heading: dados_leitura.Gps?.OrientacaoReal, predict: simulacao);
MAP.markers.UpdateMarkerInfo(rover_id, status: dados_leitura.StatusOperacao);
MAP.markers.UpdateMarkerPosition(rover_id, lat: dados_leitura.Gnss?.Latitude, lon: dados_leitura.Gnss?.Longitude, heading: dados_leitura.Gnss?.OrientacaoReal, predict: simulacao);
MAP.markers.UpdateMarkerInfo(rover_id, status: dados_leitura.Operacao.Status);
}
if (rover != null && dados_leitura?.ModulosSaude != null)
@ -294,7 +294,7 @@ namespace OperationControl.Windows
lblDispositivos_Status.Content = VariaveisControleOperacao.StatusBase.ToString();
AplicarStatusModuloNaLabel(lblDispositivos_Status, VariaveisControleOperacao.StatusBase, true, false);
AtualizarDadosTela_GNSS(Variaveis.GpsService?.UltimaLeitura ?? new AgroBase.Models.GPSModel(), marker_id: VariaveisControleOperacao.BaseMarkerID);
AtualizarDadosTela_GNSS(Variaveis.GpsService?.UltimaLeitura?.ToGnssModel() ?? new AgroBase.Models.Operacoes.OperacaoParametrosDadosGNSSModel(), marker_id: VariaveisControleOperacao.BaseMarkerID);
AtualizarDadosTela_Heading(Variaveis.GpsService?.UltimaLeitura?.AnguloCarroDefinido ?? 0);
}
else
@ -302,24 +302,24 @@ namespace OperationControl.Windows
if (dados_leitura == null) return;
Variaveis.MostrarLog($"Atualizando dados da tela para o dispositivo {rover_id}");
lblDispositivos_Status.Content = (rover?.DadosLeitura?.Status ?? AgroBase.Models.Enums.StatusModulo.Desconectado).ToString();
AplicarStatusModuloNaLabel(lblDispositivos_Status, rover?.DadosLeitura?.Status ?? AgroBase.Models.Enums.StatusModulo.Desconectado, true, false);
lblDispositivos_Status.Content = (rover?.DadosLeitura?.StatusRover ?? AgroBase.Models.Enums.StatusModulo.Desconectado).ToString();
AplicarStatusModuloNaLabel(lblDispositivos_Status, rover?.DadosLeitura?.StatusRover ?? AgroBase.Models.Enums.StatusModulo.Desconectado, true, false);
AtualizarDadosTela_Diagnosticos(rover);
AtualizarDadosTela_Resumo_Conexao(dados_leitura);
if (dados_leitura.Trajetoria != null)
AtualizarDadosTela_Resumo(dados_leitura);
if (dados_leitura.Gps != null)
AtualizarDadosTela_GNSS(dados_leitura.Gps, marker_id: rover_id);
if (dados_leitura.Gnss != null)
AtualizarDadosTela_GNSS(dados_leitura.Gnss, marker_id: rover_id);
if (dados_leitura.Controle != null)
AtualizarDadosTela_Controle(dados_leitura.Controle, dados_leitura.Direcional.AnguloMedio, dados_leitura.Movimentacao.VelocidadeMedia, dados_leitura.Emergencia, !dados_leitura.OperacaoIniciada, dados_leitura.StatusOperacao == AgroBase.Models.Enums.StatusOperacao.Calibrando);
AtualizarDadosTela_Controle(dados_leitura.Controle, dados_leitura.Direcional.AnguloMedio, dados_leitura.Movimentacao.VelocidadeMediaMs, dados_leitura.Operacao.Emergencia, !dados_leitura.Operacao.Iniciada, dados_leitura.Operacao.Status == AgroBase.Models.Enums.StatusOperacao.Calibrando);
//if (rover.Value.Controle != null)
// AtualizarDadosTela_ParametrosOperacao(rover.Value.Controle);
if (dados_leitura.Trajetoria != null)
AtualizarDadosTela_Mapa(dados_leitura.Trajetoria);
if (dados_leitura.Gps != null)
AtualizarDadosTela_Heading(dados_leitura.Gps.AnguloCarroDefinido, dados_leitura.Modo == AgroBase.Models.Enums.ModoOperacao.Manual ? double.NaN : dados_leitura.Trajetoria.AnguloCaminho);
if (dados_leitura.IMU != null)
AtualizarDadosTela_IMU(dados_leitura.IMU.InclinacaoLateral, dados_leitura.IMU.InclinacaoFrontal);
if (dados_leitura.Gnss != null)
AtualizarDadosTela_Heading(dados_leitura.Gnss.OrientacaoReal, dados_leitura.Operacao.Modo == AgroBase.Models.Enums.ModoOperacao.Manual ? double.NaN : dados_leitura.Trajetoria.AnguloCaminho);
if (dados_leitura.Imu != null)
AtualizarDadosTela_IMU(dados_leitura.Imu.InclinacaoLateral, dados_leitura.Imu.InclinacaoFrontal);
if (rover.Controle != null)
AtualizarDadosTela_Pulverizador(dados_leitura);
if (dados_leitura.LivoxLidar != null)
@ -339,7 +339,7 @@ namespace OperationControl.Windows
#region RESUMO OPERACIONAL
public void AtualizarDadosTela_Resumo(AgroBase.Models.OperacaoSensoriamentoLogModel dados)
public void AtualizarDadosTela_Resumo(AgroBase.Models.Operacoes.OperacaoParametrosDadosModel dados)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
@ -352,16 +352,16 @@ namespace OperationControl.Windows
pgbResumo_Bateria.Value = dados.Bateria.PercentualBateria;
lblResumo_Bateria.Content = $"{dados.Bateria.TensaoInstantanea:0.00} V ({TimeSpan.FromMinutes(dados.Bateria.TempoEstimadoRestanteMinutos).ToString(@"dd\.hh\:mm\:ss")} {dados.Bateria.DistanciaEstimadaRestanteMetros:0.00} m)";
pgbResumo_Herbicida.Value = dados.Atuador.PercentualReservatorio;
lblResumo_Herbicida.Content = $"{dados.Atuador.VolumeReservatorio:0.00} L ({TimeSpan.FromMinutes(dados.Atuador.TempoEstimadoRestanteMinutos).ToString(@"hh\:mm\:ss")} {dados.Atuador.DistanciaEstimadaRestanteMetros:0.00} m)";
lblResumo_Herbicida.Content = $"{dados.Atuador.VolumeReservatorioL:0.00} L ({TimeSpan.FromMinutes(dados.Atuador.TempoEstimadoRestanteMinutos).ToString(@"hh\:mm\:ss")} {dados.Atuador.DistanciaEstimadaRestanteMetros:0.00} m)";
pgbResumo_Infestacao.Value = dados.Atuador.PercentualErvasTerreno;
lblResumo_Infestacao.Content = $"{dados.Atuador.HerbicidaPorErva:0.00} mL/erva";
lblResumo_Infestacao.Content = $"{dados.Atuador.HerbicidaPorAtuacaoMl:0.00} mL/atuação";
lblResumo_OperacaoLiberada.Content = $"Operação " + (dados.OperacaoLiberada ? "🔓 Liberada" : "🔒 Bloqueada");
lblResumo_OperacaoModo.Content = $"Modo {dados.Modo}";
lblResumo_OperacaoStatus.Content = $"Status {dados.StatusOperacao}" + (dados.StatusOperacao == AgroBase.Models.Enums.StatusOperacao.Aguardando ? $" ({dados.TempoAguardandoSeg:0})" : "");
lblResumo_OperacaoLiberada.Content = $"Operação " + (dados.Operacao.Liberada ? "🔓 Liberada" : "🔒 Bloqueada");
lblResumo_OperacaoModo.Content = $"Modo {dados.Operacao.Modo}";
lblResumo_OperacaoStatus.Content = $"Status {dados.Operacao.Status}" + (dados.Operacao.Status == AgroBase.Models.Enums.StatusOperacao.Aguardando ? $" ({dados.Operacao.TempoAguardandoSegs:0})" : "");
lblResumo_StatusCarro.Content = $"Carro {dados.Trajetoria.StatusCarro}";
lblResumo_TemperaturaGeral.Content = $"Temperatura {(dados.DadosPerformance.CPU_temp ?? 0):0.00} °C";
lblResumo_OperacaoDuracao.Content = $"Duração {dados.TempoDecorrido.ToString("HH:mm:ss")} / " + (string.IsNullOrEmpty(dados.Trajetoria.TempoEstimadoOperacao) ? "00:00:00" : dados.Trajetoria.TempoEstimadoOperacao);
lblResumo_TemperaturaGeral.Content = $"Temperatura {(dados.PerformanceNcp.CPU_temp ?? 0):0.00} °C";
lblResumo_OperacaoDuracao.Content = $"Duração {TimeSpan.FromSeconds(dados.Operacao.TempoDecorridoSegs).ToString(@"hh\:mm\:ss")} / " + (string.IsNullOrEmpty(dados.Trajetoria.TempoEstimadoOperacao) ? "00:00:00" : dados.Trajetoria.TempoEstimadoOperacao);
}
catch (Exception exUi)
{
@ -370,7 +370,7 @@ namespace OperationControl.Windows
}));
}
public void AtualizarDadosTela_Resumo_Conexao(AgroBase.Models.OperacaoSensoriamentoLogModel dados)
public void AtualizarDadosTela_Resumo_Conexao(AgroBase.Models.Operacoes.OperacaoParametrosDadosModel dados)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
@ -400,7 +400,7 @@ namespace OperationControl.Windows
private void AtualizarDadosTela_Diagnosticos(AgroBase.Models.Operacoes.OperacaoParametrosModel dados)
{
lblDiagnosticos_Impedimento.Text = "Impedimento: " + (string.IsNullOrEmpty(dados.DadosLeitura.ErroOperacaoLiberada) ? "Nenhum" : dados.DadosLeitura.ErroOperacaoLiberada.Replace("\n\n", "; "));
lblDiagnosticos_Impedimento.Text = "Impedimento: " + (string.IsNullOrEmpty(dados.DadosLeitura.Operacao.ImpedimentoErro) ? "Nenhum" : dados.DadosLeitura.Operacao.ImpedimentoErro.Replace("\n\n", "; "));
// Canvas que está dentro do Border
var canvas = brdDiagnostico.Child as Canvas;
@ -421,7 +421,7 @@ namespace OperationControl.Windows
var individual = _saude?.saude_individual?.FirstOrDefault(x => x.label == mod_label);
bool em_uso = mod_label != "" ? dados.DadosLeitura.ModulosMandatorios?.FirstOrDefault(x => x.Dispositivo == modulo)?.ComponentesEmUso?.Any(x => x.Key == mod_label && x.Value) ?? false : dados.ModulosMandatorios?.Any(x => x.Dispositivo == modulo && x.Utilizar) ?? false;
bool em_uso = mod_label != "" ? dados.DadosLeitura.Operacao.ModulosMandatorios?.FirstOrDefault(x => x.Dispositivo == modulo)?.ComponentesEmUso?.Any(x => x.Key == mod_label && x.Value) ?? false : dados.ModulosMandatorios?.Any(x => x.Dispositivo == modulo && x.Utilizar) ?? false;
// Aplica cor de acordo com o status
AplicarStatusModuloNaLabel(lbl, individual?.status ?? _saude?.status ?? AgroBase.Models.Enums.StatusModulo.Desconectado, em_uso);
@ -524,25 +524,53 @@ namespace OperationControl.Windows
switch (modulo)
{
case AgroBase.Models.Enums.T_Code.Mov:
iniciado = rover.DadosLeitura?.Movimentacao?.Dados?.FirstOrDefault(x => x.ID == mod_label)?.Iniciado ?? false;
iniciado = rover.DadosLeitura?.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == mod_label)?.Iniciado ?? false;
break;
case AgroBase.Models.Enums.T_Code.Dir:
iniciado = rover.DadosLeitura?.Direcional?.Dados?.FirstOrDefault(x => x.Modulo_ID == mod_label)?.Inicializado ?? false;
iniciado = rover.DadosLeitura?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == mod_label)?.Iniciado ?? false;
break;
case AgroBase.Models.Enums.T_Code.Atu:
if (string.IsNullOrEmpty(mod_label))
iniciado = rover.DadosLeitura?.DispositivosMapeados?.FirstOrDefault(x => x.Dispositivo == modulo)?.Saude > 0;
iniciado = rover.DadosLeitura?.Atuador?.Iniciado ?? false;
else
rover.DadosLeitura?.Atuador?.Iniciados?.TryGetValue(mod_label, out iniciado);
switch (s_code)
{
case AgroBase.Models.Enums.S_Code.sBIC:
iniciado = rover.DadosLeitura?.Atuador?.Bicos?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
break;
case AgroBase.Models.Enums.S_Code.sBMB:
iniciado = rover.DadosLeitura?.Atuador?.Bombas?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
break;
case AgroBase.Models.Enums.S_Code.sSRV:
iniciado = rover.DadosLeitura?.Atuador?.Servos?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
break;
default:
iniciado = rover.DadosLeitura?.Atuador?.Sensores?.FirstOrDefault(x => x.ID == mod_label && x.Componente == s_code)?.Inicializado ?? false;
break;
}
break;
case AgroBase.Models.Enums.T_Code.Sen:
if (string.IsNullOrEmpty(mod_label))
iniciado = rover.DadosLeitura?.DispositivosMapeados?.FirstOrDefault(x => x.Dispositivo == modulo)?.Saude > 0;
iniciado = rover.DadosLeitura?.Sensoriamento?.Iniciado ?? false;
else
rover.DadosLeitura.Iniciados?.TryGetValue(mod_label, out iniciado);
switch (s_code)
{
case AgroBase.Models.Enums.S_Code.sLED:
iniciado = rover.DadosLeitura?.Sensoriamento?.Sinaleiros?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
break;
case AgroBase.Models.Enums.S_Code.sRLE:
iniciado = rover.DadosLeitura?.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
break;
case AgroBase.Models.Enums.S_Code.sSRV:
iniciado = rover.DadosLeitura?.Atuador?.Servos?.FirstOrDefault(x => x.ID == mod_label)?.Inicializado ?? false;
break;
default:
iniciado = rover.DadosLeitura?.Atuador?.Sensores?.FirstOrDefault(x => x.ID == mod_label && x.Componente == s_code)?.Inicializado ?? false;
break;
}
break;
case AgroBase.Models.Enums.T_Code.Imu:
iniciado = rover.DadosLeitura?.IMU?.Iniciado ?? false;
iniciado = rover.DadosLeitura?.Imu?.Iniciado ?? false;
break;
case AgroBase.Models.Enums.T_Code.Npc:
case AgroBase.Models.Enums.T_Code.Ipb:
@ -552,7 +580,7 @@ namespace OperationControl.Windows
iniciado = rover.DadosLeitura.DispositivosMapeados?.Any(x => x.Dispositivo == AgroBase.Models.Enums.T_Code.Can) ?? false;
break;
case AgroBase.Models.Enums.T_Code.Lra:
iniciado = rover.DadosLeitura?.DadosLoRa?.Conectado ?? false;
//iniciado = rover.DadosLeitura?.DadosLoRa?.Conectado ?? false;
break;
case AgroBase.Models.Enums.T_Code.Cam:
case AgroBase.Models.Enums.T_Code.Snr:
@ -627,13 +655,13 @@ namespace OperationControl.Windows
DateTime ucr = DateTime.MinValue;
if (modulo == AgroBase.Models.Enums.T_Code.Sen)
ucr = rover?.DadosLeitura?.UltimoComandoRespondido ?? DateTime.MinValue;
ucr = rover?.DadosLeitura?.Sensoriamento?.UltimoComandoRespondido ?? DateTime.MinValue;
else if (modulo == AgroBase.Models.Enums.T_Code.Atu)
ucr = rover?.DadosLeitura?.Atuador?.UltimoComandoRespondido ?? DateTime.MinValue;
else if (modulo == AgroBase.Models.Enums.T_Code.Mov)
ucr = rover?.DadosLeitura?.Movimentacao?.Dados?.FirstOrDefault(x => x.ID == label)?.UltimoComandoRespondido ?? DateTime.MinValue;
ucr = rover?.DadosLeitura?.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == label)?.UltimoComandoRespondido ?? DateTime.MinValue;
else if (modulo == AgroBase.Models.Enums.T_Code.Dir)
ucr = rover?.DadosLeitura?.Direcional?.Dados?.FirstOrDefault(x => x.Modulo_ID == label)?.UltimoComandoRespondido ?? DateTime.MinValue;
ucr = rover?.DadosLeitura?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == label)?.UltimoComandoRespondido ?? DateTime.MinValue;
else
ucr = rover.DadosLeitura?.Momento ?? DateTime.MinValue;
@ -734,7 +762,7 @@ namespace OperationControl.Windows
});
break;
case AgroBase.Models.Enums.S_Code.sNTC:
var ntc = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Temperaturas?.FirstOrDefault(x => x.Key == label).Value;
var ntc = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Sensoriamento?.Sensores?.FirstOrDefault(x => x.ID == label && x.Componente == s_code)?.Valores[1];
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
@ -747,38 +775,38 @@ namespace OperationControl.Windows
break;
case AgroBase.Models.Enums.S_Code.sRLE:
//var (cmd, leitura) = ((JObject)controleBase._comp_value).ToObject<(double?, double?)>();
var rle = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Reles?.FirstOrDefault(x => x.Key == label).Value;
var rle = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == label);
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
{
Label = "Comando",
Unidade = "",
Valor = rle.Value.Item1 == true ? 1 : 0,
Valor = rle?.ComandoEstado == true ? 1 : 0,
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Leitura",
Unidade = "",
Valor = rle.Value.Item2 == true ? 1 : 0,
Valor = rle?.LeituraEstado == true ? 1 : 0,
},
});
break;
case AgroBase.Models.Enums.S_Code.sFRO:
var fro = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Servos?.FirstOrDefault(x => x.Key == label).Value;
var fro = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == label);
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
{
Label = "Comando",
Unidade = "°",
Valor = fro.Value.Item1,
Valor = fro?.ComandoAngulo
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Leitura",
Unidade = "°",
Valor = fro.Value.Item2,
Valor = fro?.LeituraAngulo
},
});
break;
@ -789,43 +817,44 @@ namespace OperationControl.Windows
switch (s_code)
{
case AgroBase.Models.Enums.S_Code.sBIC:
var b = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Controle?.BicosAtuados?.FirstOrDefault(x => x.ID == label);
var b = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Atuador?.Bicos?.FirstOrDefault(x => x.ID == label);
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
{
Label = "Cmd",
Unidade = "",
Valor = (b?.ComandoAtuar ?? false) ? 100 : 0
Valor = (b?.ComandoEstado ?? false) ? 100 : 0
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Vazão",
Unidade = "mL/s",
Valor = b?.MediaNivelFluxo
Valor = b?.MediaVazaoMLs
},
});
break;
case AgroBase.Models.Enums.S_Code.sBMB:
var bb = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Atuador?.Bombas?.FirstOrDefault(x => x.ID == label);
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
{
Label = "Cmd",
Unidade = "",
Valor = (atu?.ComandoBomba ?? false) ? 100 : 0
Valor = (bb?.ComandoEstado ?? false) ? 100 : 0
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Potência",
Unidade = "%",
Valor = atu?.LeituraPotenciaBomba
Valor = bb?.Potencia
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Pressão",
Unidade = "psi",
Valor = atu?.PressaoLinha
Valor = atu?.PressaoLinhaPsi
},
});
break;
@ -836,7 +865,7 @@ namespace OperationControl.Windows
{
Label = "Pressão",
Unidade = "psi",
Valor = atu ?.PressaoLinha
Valor = atu?.PressaoLinhaPsi
},
});
break;
@ -847,7 +876,13 @@ namespace OperationControl.Windows
{
Label = "Fluxo",
Unidade = "mL/s",
Valor = atu ?.VazaoInstantanea
Valor = atu?.VazaoInstantaneaMLs
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Media",
Unidade = "mL/s",
Valor = atu?.VazaoMediaMLs
},
});
break;
@ -858,20 +893,26 @@ namespace OperationControl.Windows
{
Label = "Volume",
Unidade = "L",
Valor = atu ?.VolumeReservatorio
Valor = atu?.VolumeReservatorioL
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Massa",
Unidade = "Kg",
Valor = atu?.MassaReservatorioKg
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Percentual",
Unidade = "%",
Valor = atu ?.PercentualReservatorio
Valor = atu?.PercentualReservatorio
},
});
break;
}
break;
case AgroBase.Models.Enums.T_Code.Mov:
var mov = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Movimentacao?.Dados?.FirstOrDefault(x => x.ID == label);
var mov = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Movimentacao?.Modulos?.FirstOrDefault(x => x.Mod_ID == label);
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
@ -913,7 +954,7 @@ namespace OperationControl.Windows
});
break;
case AgroBase.Models.Enums.T_Code.Npc:
var npc = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.DadosPerformance;
var npc = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.PerformanceNcp;
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
@ -998,32 +1039,32 @@ namespace OperationControl.Windows
});
break;
case AgroBase.Models.Enums.T_Code.Gps:
var gps = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Gps;
var gps = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Gnss;
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
{
Label = "Precisão",
Unidade = "cm",
Valor = gps?.PrecisaoCm ?? 0
Valor = gps?.PrecisaoCm
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Altitude",
Unidade = "m",
Valor = gps?.Altitude ?? 0
Valor = gps?.Altitude
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Idade",
Unidade = "s",
Valor = gps?.IdadeCorrecao ?? -1
Valor = gps?.IdadeCorrecao
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Satelites",
Unidade = "%",
Valor = gps?.NumeroSatelites ?? 0
Valor = gps?.NumeroSatelites
},
});
break;
@ -1073,23 +1114,23 @@ namespace OperationControl.Windows
{
panelOpcoes_Bico.Visibility = Visibility.Visible;
var bico = rover?.Controle?.BicosAtuados?.FirstOrDefault(x => x.ID == label);
bool comando = bico?.ComandoAtuar ?? false;
var leitura = bico?._EstadoLeitura;
var bico = rover?.Atuador?.Bicos?.FirstOrDefault(x => x.ID == label);
bool comando = bico?.ComandoEstado ?? false;
bool leitura = bico?.LeituraEstado ?? false;
txtBico_Titulo.Text = $"Bico {label} - Testes";
txtBico_Comando.Text = comando ? "Ligado" : "Desligado";
txtBico_StatusReal.Text = leitura != null && (AgroBase.Models.Enums.Estado)Enum.Parse(typeof(AgroBase.Models.Enums.Estado), leitura.ToString(), true) == AgroBase.Models.Enums.Estado.Ligado ? "Ligado" : "Desligado";
txtBico_StatusReal.Text = leitura ? "Ligado" : "Desligado";
txtBico_TempoLigado.Text = (bico?.TempoAtuado ?? 0).ToString("0.00") + " ms";
txtBico_Vazao.Text = (bico?.MediaNivelFluxo ?? 0).ToString("0.00") + " L/min";
txtBico_Pressao.Text = (rover?.Atuador?.PressaoLinha ?? 0).ToString("0.00") + " psi";
txtBico_Atuacoes.Text = (bico?.Atuacoes ?? 0).ToString();
txtBico_Vazao.Text = (bico?.MediaVazaoMLs ?? 0).ToString("0.00") + " Ml/s";
txtBico_Pressao.Text = (rover?.Atuador?.PressaoLinhaPsi ?? 0).ToString("0.00") + " psi";
txtBico_Atuacoes.Text = (bico?.QtdAtuacoes ?? 0).ToString();
if (inicial)
{
txtBico_AnguloAbertura.Text = (bico?.AnguloAbertura ?? 0).ToString();
sldBico_Angular.Value = (bico?.AnguloControle ?? 0);
sldBico_Angular.Value = (bico?.ComandoAngulo ?? 0);
}
lblBico_Angulo.Foreground = new SolidColorBrush(Math.Round(sldBico_Angular.Value) == Math.Round(bico?.AnguloControle ?? 0, 0) ? System.Windows.Media.Colors.Black : System.Windows.Media.Colors.Red);
lblBico_Angulo.Foreground = new SolidColorBrush(Math.Round(sldBico_Angular.Value) == (bico?.ComandoAngulo ?? 0) ? System.Windows.Media.Colors.Black : System.Windows.Media.Colors.Red);
txtBico_AnguloAbertura.Foreground = new SolidColorBrush(Convert.ToInt32(txtBico_AnguloAbertura.Text) == Convert.ToInt32(bico?.AnguloAbertura ?? 0) ? System.Windows.Media.Colors.Black : System.Windows.Media.Colors.Red);
break;
}
@ -1097,15 +1138,29 @@ namespace OperationControl.Windows
{
panelOpcoes_Bomba.Visibility = Visibility.Visible;
bool comando = rover?.Atuador?.ComandoBomba ?? false;
bool leitura = rover?.Atuador?.LeituraComandoBomba ?? false;
var potencia = rover?.Atuador?.LeituraPotenciaBomba ?? 0;
var bomba = rover?.Atuador?.Bombas?.FirstOrDefault(x => x.ID == label);
bool comando = bomba?.ComandoEstado ?? false;
bool leitura = bomba?.LeituraEstado ?? false;
var potencia = bomba?.Potencia ?? 0;
txtBomba_Comando.Text = comando ? "Ligado" : "Desligado";
txtBomba_StatusReal.Text = leitura ? "Ligado" : "Desligado";
txtBomba_PressaoLinha.Text = (rover?.Atuador?.PressaoLinha ?? 0).ToString("0.00") + " psi";
txtBomba_PressaoLinha.Text = (rover?.Atuador?.PressaoLinhaPsi ?? 0).ToString("0.00") + " psi";
txtBomba_Potencia.Text = potencia.ToString("0") + " %";
break;
}
case AgroBase.Models.Enums.S_Code.sSRV:
{
panelOpcoes_Servo.Visibility = Visibility.Visible;
var servo = rover?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == label);
int comando = servo?.ComandoAngulo ?? 0;
int leitura = servo?.LeituraAngulo ?? 0;
bool inc = servo?.Incremental ?? false;
txtServo_Comando.Text = $"{comando}°";
txtServo_Leitura.Text = $"{leitura}°";
txtServo_Incremental.Text = inc ? "Incremental" : "Decremental";
break;
}
default:
txtOpcoes_SemDados.Visibility = Visibility.Visible;
break;
@ -1121,22 +1176,22 @@ namespace OperationControl.Windows
{
panelOpcoes_Rele.Visibility = Visibility.Visible;
var rele = rover?.Reles?.FirstOrDefault(x => x.Key == label).Value;
bool comando = rele?.Item1 ?? false;
bool leitura = rele?.Item2 ?? false;
var rele = rover?.Sensoriamento?.Reles?.FirstOrDefault(x => x.ID == label);
bool comando = rele?.ComandoEstado ?? false;
bool leitura = rele?.LeituraEstado ?? false;
txtRele_Titulo.Text = $"Relé {label} - Testes";
txtRele_Comando.Text = comando ? "Ligado" : "Desligado";
txtRele_StatusReal.Text = leitura ? "Ligado" : "Desligado";
break;
}
case AgroBase.Models.Enums.S_Code.sFRO:
case AgroBase.Models.Enums.S_Code.sSRV:
{
panelOpcoes_Servo.Visibility = Visibility.Visible;
var servo = rover?.Servos?.FirstOrDefault(x => x.Key == label).Value;
int comando = servo?.Item1 ?? 0;
int leitura = servo?.Item2 ?? 0;
bool inc = servo?.Item3 ?? false;
var servo = rover?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == label);
int comando = servo?.ComandoAngulo ?? 0;
int leitura = servo?.LeituraAngulo ?? 0;
bool inc = servo?.Incremental ?? false;
txtServo_Comando.Text = $"{comando}°";
txtServo_Leitura.Text = $"{leitura}°";
txtServo_Incremental.Text = inc ? "Incremental" : "Decremental";
@ -1153,7 +1208,7 @@ namespace OperationControl.Windows
{
panelOpcoes_Direcional.Visibility = Visibility.Visible;
var mod = rover?.Direcional?.Dados?.FirstOrDefault(x => x.Modulo_ID == label);
var mod = rover?.Direcional?.Modulos?.FirstOrDefault(x => x.Mod_ID == label);
AgroBase.Models.Enums.Sentido sentido_sp = mod?.Sentido_SP ?? AgroBase.Models.Enums.Sentido.Parado;
AgroBase.Models.Enums.Sentido sentido = mod?.SentidoReal ?? AgroBase.Models.Enums.Sentido.Parado;
double angulo_sp = mod?.Angulo_SP ?? 0;
@ -1169,7 +1224,7 @@ namespace OperationControl.Windows
{
panelOpcoes_GPS.Visibility = Visibility.Visible;
var dados = rover?.Gps;
var dados = rover?.Gnss;
if (inicial)
{
sldGps_LeverArmLateral.Value = (dados?.LeverArmLateral ?? 0) / 10.0;
@ -1183,7 +1238,7 @@ namespace OperationControl.Windows
txtGps_Idade.Text = (dados?.IdadeCorrecao ?? -1).ToString();
txtGps_Precisao.Text = (dados?.PrecisaoCm ?? -1).ToString();
txtGps_NSatelites.Text = (dados?.NumeroSatelites ?? 0).ToString();
txtGps_DistBase.Text = (Variaveis.GpsService.IsConnected ? AgroBase.Models.GPSUtils.DistanciaEntrePontos(dados ?? new AgroBase.Models.GPSModel(), Variaveis.GpsService.UltimaLeitura) : 0).ToString();
txtGps_DistBase.Text = (Variaveis.GpsService.IsConnected ? AgroBase.Models.GPSUtils.DistanciaEntrePontos(dados?.ToGpsModel() ?? new AgroBase.Models.GPSModel(), Variaveis.GpsService.UltimaLeitura) : 0).ToString();
txtGps_Orientacao.Text = (dados?.OrientacaoReal ?? 0).ToString();
break;
@ -1207,7 +1262,7 @@ namespace OperationControl.Windows
{
panelOpcoes_NPC.Visibility = Visibility.Visible;
var dados = rover?.CoolerControl;
var dados = rover?.Refrigeracao;
var modo = dados?.Modo ?? AgroBase.Services.CoolerControlService.CoolerMode.Off;
double tmp = dados?.Temperatura ?? 0;
@ -1438,14 +1493,25 @@ namespace OperationControl.Windows
private void btnServo_Enviar_Click(object sender, RoutedEventArgs e)
{
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
if (modulo != AgroBase.Models.Enums.T_Code.Sen && s_code != AgroBase.Models.Enums.S_Code.sFRO)
if (s_code != AgroBase.Models.Enums.S_Code.sFRO)
return;
var servo = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Servos?.FirstOrDefault(x => x.Key == label).Value;
double angulo = Convert.ToInt32(sldServo_Angulo.Value);
if (!(servo?.Item3 ?? false)) angulo = 180 - angulo;
if (modulo == AgroBase.Models.Enums.T_Code.Sen)
{
var servo = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Sensoriamento?.Servos?.FirstOrDefault(x => x.ID == label);
double angulo = Convert.ToInt32(sldServo_Angulo.Value);
if (!(servo?.Incremental ?? false)) angulo = 180 - angulo;
VariaveisControleOperacao.EnviarComandoSensoriamento(label, status: angulo);
VariaveisControleOperacao.EnviarComandoSensoriamento(label, status: angulo);
}
else if (modulo == AgroBase.Models.Enums.T_Code.Atu)
{
var servo = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Atuador?.Servos?.FirstOrDefault(x => x.ID == label);
double angulo = Convert.ToInt32(sldServo_Angulo.Value);
if (!(servo?.Incremental ?? false)) angulo = 180 - angulo;
VariaveisControleOperacao.EnviarComandoAtuador(label, angulo_controle: (int)angulo);
}
}
private void sldServo_Angulo_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
@ -1541,7 +1607,7 @@ namespace OperationControl.Windows
#region POSICAO
public void AtualizarDadosTela_GNSS(AgroBase.Models.GPSModel dados, string? marker_id = null, double progresso = double.NaN)
public void AtualizarDadosTela_GNSS(AgroBase.Models.Operacoes.OperacaoParametrosDadosGNSSModel dados, string? marker_id = null, double progresso = double.NaN)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
@ -1549,11 +1615,11 @@ namespace OperationControl.Windows
{
bool dados_base = marker_id == VariaveisControleOperacao.BaseMarkerID;
lblGNSS_Posicao.Foreground = new SolidColorBrush(dados.Inicializado ? System.Windows.Media.Colors.Green : System.Windows.Media.Colors.Red);
lblGNSS_Posicao.Foreground = new SolidColorBrush(dados.Iniciado ? System.Windows.Media.Colors.Green : System.Windows.Media.Colors.Red);
lblGNSS_Correcao.Content = $"Correção {dados.QualidadeFix} " +
(dados.QualidadeFix == AgroBase.Models.Enums.TiposCorrecaoGPS.BaseFix ?
(dados.OrientacaoReal.ToString("0.00") + "°") :
((dados.Ntrip_ativado ? "N" : "B") + $" {dados.IdadeCorrecao.ToString("0.0")} s"));
((dados.NtripAtivado ? "N" : "B") + $" {dados.IdadeCorrecao.ToString("0.0")} s"));
lblGNSS_Satelites.Content = $"Satélites {dados.NumeroSatelites} ({dados.PrecisaoCm.ToString("0.00")} cm)";
lblGNSS_Altitude.Content = $"Altitude {dados.Altitude.ToString("0.00")} m";
@ -1902,15 +1968,17 @@ namespace OperationControl.Windows
#region PULVERIZADOR
private void AtualizarDadosTela_Pulverizador(AgroBase.Models.OperacaoSensoriamentoLogModel dados)
private void AtualizarDadosTela_Pulverizador(AgroBase.Models.Operacoes.OperacaoParametrosDadosModel dados)
{
var bomba = dados.Atuador?.Bombas?.FirstOrDefault();
ATU.ComprimentoBarraCm = AgroBase.Models.VariaveisEquipamento.ComprimentoBarraPulverizadoraCm;
ATU.DistanciaEntreBicosCm = AgroBase.Models.VariaveisEquipamento.DistanciaEntreBicosCm;
ATU.AlturaBarra = dados?.Controle?.AlturaBarra ?? AgroBase.Models.VariaveisEquipamento.AlturaBarraPulverizadoraCm;
ATU.IsBombaOn = dados?.Atuador?.LeituraComandoBomba ?? false;
ATU.PressaoLinha = dados?.Atuador?.PressaoLinha ?? 0;
ATU.VazaoInstantanea = dados?.Atuador?.VazaoInstantanea ?? 0;
ATU.TempoAtuado = (dados?.Atuador?.TempoBombaAtuada ?? 0) / 1000.0;
ATU.IsBombaOn = bomba?.LeituraEstado ?? false;
ATU.PressaoLinha = dados?.Atuador?.PressaoLinhaPsi ?? 0;
ATU.VazaoInstantanea = dados?.Atuador?.VazaoInstantaneaMLs ?? 0;
ATU.TempoAtuado = (bomba?.TempoAtuado ?? 0) / 1000.0;
double erroLateral = ((dados?.Trajetoria?.DistanciaEsquerda ?? 0) - (dados?.Trajetoria?.DistanciaDireita ?? 0)) / 2.0 * 100.0;
ATU.LarguraRuaCm = 100.0;
@ -1927,11 +1995,11 @@ namespace OperationControl.Windows
if (_bc == null) continue;
bico.OpeningAngle = _bc.AnguloAbertura;
bico.AnguloControle = _bc.AnguloControle;
bico.IsCommandOn = _bc.Atuado;
bico.IsSpraying = _bc.StatusBico;
bico.Vazao = _bc.MediaNivelFluxo;
bico.Atuacoes = _bc.Atuacoes;
bico.AnguloControle = _bc.ComandoAngulo;
bico.IsCommandOn = _bc.ComandoEstado;
bico.IsSpraying = _bc.LeituraEstado;
bico.Vazao = _bc.MediaVazaoMLs;
bico.Atuacoes = _bc.QtdAtuacoes;
bico.TempoAtuado = _bc.TempoAtuado / 1000.0;
}
}