ajustado novo contrato de dados para logs e parametros runtime, ainda em teste
This commit is contained in:
parent
f3cca4c54f
commit
ab0d5966b2
|
|
@ -15,7 +15,7 @@ namespace AgroBase.Forms
|
||||||
{
|
{
|
||||||
public partial class frmAtuCamera : Form
|
public partial class frmAtuCamera : Form
|
||||||
{
|
{
|
||||||
private CameraSoloModel cameraSolo = new CameraSoloModel();
|
//private CameraSoloModel cameraSolo = new CameraSoloModel();
|
||||||
private AsyncTaskTimerModel tmrLeitura;
|
private AsyncTaskTimerModel tmrLeitura;
|
||||||
|
|
||||||
public frmAtuCamera()
|
public frmAtuCamera()
|
||||||
|
|
@ -25,21 +25,21 @@ namespace AgroBase.Forms
|
||||||
|
|
||||||
private void frmCamera_Load(object sender, EventArgs e)
|
private void frmCamera_Load(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
cameraSolo = new CameraSoloModel()
|
//cameraSolo = new CameraSoloModel()
|
||||||
{
|
//{
|
||||||
Nome = "T",
|
// Nome = "T",
|
||||||
Posicao = CameraWorkerService.CamerasSolo.Count(),
|
// Posicao = CameraWorkerService.CamerasSolo.Count(),
|
||||||
ArquivoLeitura = "ervas_T.json",
|
// ArquivoLeitura = "ervas_T.json",
|
||||||
browser = null,
|
// browser = null,
|
||||||
camera = new CameraService(),
|
// camera = new CameraService(),
|
||||||
DeviceID = "",
|
// DeviceID = "",
|
||||||
combo = cmbCameras,
|
// combo = cmbCameras,
|
||||||
MaxLeituras = 10,
|
// MaxLeituras = 10,
|
||||||
VideoPorta = "", //(VariaveisPortas.CameraSolo + Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.Count()).ToString(),
|
// VideoPorta = "", //(VariaveisPortas.CameraSolo + Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.Count()).ToString(),
|
||||||
VideoUrl = "green_objects_T",
|
// VideoUrl = "green_objects_T",
|
||||||
MqttTopico = "green_objects_T",
|
// MqttTopico = "green_objects_T",
|
||||||
panel = pnlCamera,
|
// panel = pnlCamera,
|
||||||
};
|
//};
|
||||||
AtualizaListaCameras();
|
AtualizaListaCameras();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -47,8 +47,8 @@ namespace AgroBase.Forms
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
cameraSolo.camera.pythonProcess?.Kill();
|
//cameraSolo.camera.pythonProcess?.Kill();
|
||||||
Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraSolo.camera._mqttTopico).ConfigureAwait(false);
|
//Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraSolo.camera._mqttTopico).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
@ -77,7 +77,7 @@ namespace AgroBase.Forms
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
btnSalvar.Text = "Editar";
|
btnSalvar.Text = "Editar";
|
||||||
cameraSolo.camera.cameraIndex = cmbCameras.SelectedIndex;
|
//cameraSolo.camera.cameraIndex = cmbCameras.SelectedIndex;
|
||||||
}
|
}
|
||||||
btnIniciar.Enabled = btnSalvar.Text == "Editar" && cmbCameras.SelectedIndex > 0;
|
btnIniciar.Enabled = btnSalvar.Text == "Editar" && cmbCameras.SelectedIndex > 0;
|
||||||
cmbCameras.Enabled = btnSalvar.Text == "Salvar";
|
cmbCameras.Enabled = btnSalvar.Text == "Salvar";
|
||||||
|
|
@ -88,94 +88,94 @@ namespace AgroBase.Forms
|
||||||
VersaoArquivoModel ArquivoVersao = VersionamentoService.ArquivoModeloWeedDetector;
|
VersaoArquivoModel ArquivoVersao = VersionamentoService.ArquivoModeloWeedDetector;
|
||||||
|
|
||||||
string CamNome = "Cam_Solo_0";
|
string CamNome = "Cam_Solo_0";
|
||||||
CameraSoloModel CameraSolo = new CameraSoloModel()
|
//CameraSoloModel CameraSolo = new CameraSoloModel()
|
||||||
{
|
//{
|
||||||
ID = "S0",
|
// ID = "S0",
|
||||||
Nome = CamNome,
|
// Nome = CamNome,
|
||||||
Posicao = 0,
|
// Posicao = 0,
|
||||||
ArquivoLeitura = "ervas_" + CamNome + ".json",
|
// ArquivoLeitura = "ervas_" + CamNome + ".json",
|
||||||
browser = null,
|
// browser = null,
|
||||||
camera = new CameraService(),
|
// camera = new CameraService(),
|
||||||
DeviceID = "123",
|
// DeviceID = "123",
|
||||||
combo = new ComboBox(),
|
// combo = new ComboBox(),
|
||||||
MaxLeituras = 1,
|
// MaxLeituras = 1,
|
||||||
VideoPorta = "", // (VariaveisPortas.CameraSolo + 0).ToString(),
|
// VideoPorta = "", // (VariaveisPortas.CameraSolo + 0).ToString(),
|
||||||
VideoUrl = "green_objects_" + CamNome,
|
// VideoUrl = "green_objects_" + CamNome,
|
||||||
MqttTopico = "green_objects_" + CamNome,
|
// MqttTopico = "green_objects_" + CamNome,
|
||||||
};
|
//};
|
||||||
CameraSolo.panel = pnlCamera;
|
//CameraSolo.panel = pnlCamera;
|
||||||
CameraSolo.camera.cameraIndex = 1;
|
//CameraSolo.camera.cameraIndex = 1;
|
||||||
IniciarCameraSolo(CameraSolo);
|
//IniciarCameraSolo(CameraSolo);
|
||||||
|
|
||||||
tmrLeitura = new AsyncTaskTimerModel("tmrLeitura", tmrLeitura_Tick, 200);
|
tmrLeitura = new AsyncTaskTimerModel("tmrLeitura", tmrLeitura_Tick, 200);
|
||||||
tmrLeitura.Start();
|
tmrLeitura.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void IniciarCameraSolo(CameraSoloModel CameraSolo)
|
//public void IniciarCameraSolo(CameraSoloModel CameraSolo)
|
||||||
{
|
//{
|
||||||
CameraSolo.DesligarCamera();
|
// CameraSolo.DesligarCamera();
|
||||||
|
//
|
||||||
if (CameraSolo.camera.cameraIndex > 0)
|
// if (CameraSolo.camera.cameraIndex > 0)
|
||||||
{
|
// {
|
||||||
VersaoArquivoModel ArquivoVersao = VersionamentoService.ArquivoModeloWeedDetector;
|
// VersaoArquivoModel ArquivoVersao = VersionamentoService.ArquivoModeloWeedDetector;
|
||||||
|
//
|
||||||
//CameraSolo.IniciarRotinaProcesso();
|
// //CameraSolo.IniciarRotinaProcesso();
|
||||||
|
//
|
||||||
CameraSolo.camera.IniciarCamera(
|
// CameraSolo.camera.IniciarCamera(
|
||||||
"", //Variaveis.OperacaoEmAndamento.DispAtu.Dados.ScriptDeteccaoErvas,
|
// "", //Variaveis.OperacaoEmAndamento.DispAtu.Dados.ScriptDeteccaoErvas,
|
||||||
new string[] {
|
// new string[] {
|
||||||
CameraSolo.MaxLeituras.ToString(),
|
// CameraSolo.MaxLeituras.ToString(),
|
||||||
CameraSolo.VideoPorta,
|
// CameraSolo.VideoPorta,
|
||||||
CameraSolo.VideoUrl,
|
// CameraSolo.VideoUrl,
|
||||||
CameraSolo.ArquivoLeitura,
|
// CameraSolo.ArquivoLeitura,
|
||||||
"0",
|
// "0",
|
||||||
CameraSolo.MqttTopico,
|
// CameraSolo.MqttTopico,
|
||||||
ArquivoVersao.Diretorio,
|
// ArquivoVersao.Diretorio,
|
||||||
ArquivoVersao.Versao,
|
// ArquivoVersao.Versao,
|
||||||
},
|
// },
|
||||||
CameraSolo.VideoPorta,
|
// CameraSolo.VideoPorta,
|
||||||
new List<string>() { CameraSolo.VideoUrl },
|
// new List<string>() { CameraSolo.VideoUrl },
|
||||||
CameraSolo.MqttTopico,
|
// CameraSolo.MqttTopico,
|
||||||
async (Mensagem) =>
|
// async (Mensagem) =>
|
||||||
{
|
// {
|
||||||
if (Mensagem.Momento > CameraSolo.camera.IniciadoEm && Mensagem.Mensagem == "OK")
|
// if (Mensagem.Momento > CameraSolo.camera.IniciadoEm && Mensagem.Mensagem == "OK")
|
||||||
{
|
// {
|
||||||
CameraSolo.camera.ProntoEm = Mensagem.Momento;
|
// CameraSolo.camera.ProntoEm = Mensagem.Momento;
|
||||||
|
//
|
||||||
if (CameraSolo.browser == null)
|
// if (CameraSolo.browser == null)
|
||||||
{
|
// {
|
||||||
CameraSolo.Iniciada = true;
|
// CameraSolo.Iniciada = true;
|
||||||
CameraSolo.browser = new WebView2();
|
// CameraSolo.browser = new WebView2();
|
||||||
CameraSolo.browser.Source = new Uri(CameraSolo.camera.URLcamera[0]);
|
// CameraSolo.browser.Source = new Uri(CameraSolo.camera.URLcamera[0]);
|
||||||
CameraSolo.browser.Dock = DockStyle.Fill;
|
// CameraSolo.browser.Dock = DockStyle.Fill;
|
||||||
|
//
|
||||||
CameraSolo.panel.Invoke(new Action(() =>
|
// CameraSolo.panel.Invoke(new Action(() =>
|
||||||
{
|
// {
|
||||||
CameraSolo.panel.Controls.Add(CameraSolo.browser);
|
// CameraSolo.panel.Controls.Add(CameraSolo.browser);
|
||||||
CameraSolo.panel.Refresh();
|
// CameraSolo.panel.Refresh();
|
||||||
}));
|
// }));
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
Console.Write("Camera " + CameraSolo.Nome + " não foi configurada!");
|
// Console.Write("Camera " + CameraSolo.Nome + " não foi configurada!");
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
private void AtualizaListaCameras()
|
private void AtualizaListaCameras()
|
||||||
{
|
{
|
||||||
cameraSolo.camera.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
//cameraSolo.camera.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
||||||
cmbCameras.Items.Clear();
|
cmbCameras.Items.Clear();
|
||||||
cmbCameras.Items.AddRange(CameraService.ObterListaCameras().Keys.ToArray());
|
cmbCameras.Items.AddRange(CameraWorkerService.ListaCameras.Select(x => x.mx_id).ToArray());
|
||||||
if (cmbCameras.Items.Count == 1)
|
if (cmbCameras.Items.Count == 1)
|
||||||
{
|
{
|
||||||
cameraSolo.camera.cameraIndex = 0;
|
//cameraSolo.camera.cameraIndex = 0;
|
||||||
}
|
}
|
||||||
cmbCameras.SelectedIndex = cameraSolo.camera.cameraIndex;
|
//cmbCameras.SelectedIndex = cameraSolo.camera.cameraIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ListarObjetosDetectados()
|
private void ListarObjetosDetectados()
|
||||||
|
|
@ -184,27 +184,27 @@ namespace AgroBase.Forms
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
//var coordenadas = cameraService.AferirDadosCamera<CameraCoordenadasModel>();
|
//var coordenadas = cameraService.AferirDadosCamera<CameraCoordenadasModel>();
|
||||||
var MqttTopico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == cameraSolo.MqttTopico);
|
//var MqttTopico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == cameraSolo.MqttTopico);
|
||||||
|
//
|
||||||
if (MqttTopico == null)
|
//if (MqttTopico == null)
|
||||||
{
|
//{
|
||||||
return;
|
// return;
|
||||||
}
|
//}
|
||||||
|
|
||||||
CameraCoordenadasFrameModel leitura = null;
|
CameraCoordenadasFrameModel leitura = null;
|
||||||
List<MqttTopicosMensagensModel> msgs = new List<MqttTopicosMensagensModel>(MqttTopico.Mensagens);
|
//List<MqttTopicosMensagensModel> msgs = new List<MqttTopicosMensagensModel>(MqttTopico.Mensagens);
|
||||||
var Mensagem = msgs.LastOrDefault(x => x.Momento > cameraSolo.camera.IniciadoEm);
|
//var Mensagem = msgs.LastOrDefault(x => x.Momento > cameraSolo.camera.IniciadoEm);
|
||||||
if (msgs.Count() > 1 && Mensagem != null)
|
//if (msgs.Count() > 1 && Mensagem != null)
|
||||||
{
|
//{
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
|
// leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
|
||||||
}
|
// }
|
||||||
catch
|
// catch
|
||||||
{
|
// {
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
if (leitura != null)
|
if (leitura != null)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -246,10 +246,10 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private async void cmbComunicacao_SelectedIndexChanged(object sender, EventArgs e)
|
private async void cmbComunicacao_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (Variaveis.LoraService.Iniciado)
|
//if (Variaveis.LoraService.Iniciado)
|
||||||
{
|
//{
|
||||||
await AtualizarParametrosLoRa();
|
// await AtualizarParametrosLoRa();
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
||||||
|
|
@ -236,7 +236,7 @@ namespace AgroBase.Forms.IHM
|
||||||
PreencherDadosDiagnosticoSinaleiros(Diagnosticos.FirstOrDefault(x => x.Modulo == T_Code.Sen));
|
PreencherDadosDiagnosticoSinaleiros(Diagnosticos.FirstOrDefault(x => x.Modulo == T_Code.Sen));
|
||||||
PreencherDadosDiagnosticoReles(Diagnosticos.FirstOrDefault(x => x.Modulo == T_Code.Mks));
|
PreencherDadosDiagnosticoReles(Diagnosticos.FirstOrDefault(x => x.Modulo == T_Code.Mks));
|
||||||
PreencherDadosTabelaResultado(dgResultados);
|
PreencherDadosTabelaResultado(dgResultados);
|
||||||
OperacaoModel.PopularTreeView(tvwFalhas, HealthWorkerService.ModulosSaude);
|
OperacaoModel.PopularTreeView(tvwFalhas, Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<bool> IniciarDiagnostico(int idx)
|
private async Task<bool> IniciarDiagnostico(int idx)
|
||||||
|
|
@ -245,7 +245,7 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
if (idx == 9)
|
if (idx == 9)
|
||||||
{
|
{
|
||||||
OperacaoModel.PopularTreeView(tvwFalhas, HealthWorkerService.ModulosSaude);
|
OperacaoModel.PopularTreeView(tvwFalhas, Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -1388,24 +1388,24 @@ namespace AgroBase.Forms.IHM
|
||||||
bool Conectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Lra);
|
bool Conectado = SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Lra);
|
||||||
idx = PreencheDadosLinha(grid, Testes, idx, Conectado ? 1 : 0);
|
idx = PreencheDadosLinha(grid, Testes, idx, Conectado ? 1 : 0);
|
||||||
|
|
||||||
bool Inicializado = Variaveis.LoraService.Iniciado;
|
bool Inicializado = false; // Variaveis.LoraService.Iniciado;
|
||||||
idx = PreencheDadosLinha(grid, Testes, idx, Inicializado ? 1 : 0);
|
idx = PreencheDadosLinha(grid, Testes, idx, Inicializado ? 1 : 0);
|
||||||
|
|
||||||
bool sucesso = false;
|
bool sucesso = false;
|
||||||
if (Inicializado)
|
if (Inicializado)
|
||||||
{
|
{
|
||||||
(bool _sucesso, LoRaParametrosModel parametros) = await Variaveis.LoraService.RequisitarParametrosModulo();
|
//(bool _sucesso, LoRaParametrosModel parametros) = await Variaveis.LoraService.RequisitarParametrosModulo();
|
||||||
sucesso = _sucesso;
|
//sucesso = _sucesso;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Parametrizado = Inicializado && sucesso && Variaveis.LoraService.ParametrosGet != null;
|
bool Parametrizado = false; // Inicializado && sucesso && Variaveis.LoraService.ParametrosGet != null;
|
||||||
idx = PreencheDadosLinha(grid, Testes, idx, Parametrizado ? 1 : 0);
|
idx = PreencheDadosLinha(grid, Testes, idx, Parametrizado ? 1 : 0);
|
||||||
|
|
||||||
bool MensagemEnviada = false;
|
bool MensagemEnviada = false;
|
||||||
if (Inicializado)
|
if (Inicializado)
|
||||||
{
|
{
|
||||||
//int msgEnviadasAnterior = LoRaBaseService.MensagensEnviadas;
|
//int msgEnviadasAnterior = LoRaBaseService.MensagensEnviadas;
|
||||||
Variaveis.LoraService.EnviarDadosParaBase();
|
//Variaveis.LoraService.EnviarDadosParaBase();
|
||||||
await Task.Delay(2000);
|
await Task.Delay(2000);
|
||||||
MensagemEnviada = true; //LoRaBaseService.MensagensEnviadas > msgEnviadasAnterior;
|
MensagemEnviada = true; //LoRaBaseService.MensagensEnviadas > msgEnviadasAnterior;
|
||||||
}
|
}
|
||||||
|
|
@ -1506,7 +1506,7 @@ namespace AgroBase.Forms.IHM
|
||||||
var grid = Diagnostico.grid;
|
var grid = Diagnostico.grid;
|
||||||
var Testes = Diagnostico.Testes;
|
var Testes = Diagnostico.Testes;
|
||||||
|
|
||||||
List<string> CamerasIDs = CameraService.ObterListaCameras().Values.ToList();
|
List<string> CamerasIDs = CameraWorkerService.ListaCameras.Select(x => x.mx_id).ToList();
|
||||||
|
|
||||||
string IDcamRua = CameraWorkerService.CameraCaminho.Id;//.Replace("\\", "#").ToLower();
|
string IDcamRua = CameraWorkerService.CameraCaminho.Id;//.Replace("\\", "#").ToLower();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,8 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
FuncoesGlobais.DefinirEventosPicBtn(picFechar, "", async () =>
|
FuncoesGlobais.DefinirEventosPicBtn(picFechar, "", async () =>
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado && !Variaveis.OperacaoEmAndamento.Finalizando)
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
if (op.Sensoriamento.Operacao.OperacaoIniciada && !op.Sensoriamento.Operacao.Finalizando)
|
||||||
{
|
{
|
||||||
var res = CustomDialog.ShowDialog(
|
var res = CustomDialog.ShowDialog(
|
||||||
"Interromper Operação",
|
"Interromper Operação",
|
||||||
|
|
@ -75,8 +76,8 @@ namespace AgroBase.Forms.IHM
|
||||||
);
|
);
|
||||||
if (res == DialogResult.Yes)
|
if (res == DialogResult.Yes)
|
||||||
{
|
{
|
||||||
Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao());
|
Task.Run(async () => await op.FinalizarOperacao());
|
||||||
if (Variaveis.OperacaoEmAndamento.Parametros?.Modo == Enums.ModoOperacao.Manual)
|
if (op.Parametros?.Modo == ModoOperacao.Manual)
|
||||||
{
|
{
|
||||||
this.Close();
|
this.Close();
|
||||||
}
|
}
|
||||||
|
|
@ -84,7 +85,7 @@ namespace AgroBase.Forms.IHM
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.StatusAtual == Enums.StatusOperacao.Parametrizando)
|
if (op.Sensoriamento.Operacao.StatusOperacaoAtual == StatusOperacao.Parametrizando)
|
||||||
{
|
{
|
||||||
this.Hide();
|
this.Hide();
|
||||||
}
|
}
|
||||||
|
|
@ -98,18 +99,19 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void frmDialogoMapa_Load(object sender, EventArgs e)
|
private void frmDialogoMapa_Load(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
tmrLeitura?.Dispose();
|
tmrLeitura?.Dispose();
|
||||||
tmrLeitura = new AsyncTaskTimerModel("tmrLeitura", tmrLeitura_Tick, 500, this);
|
tmrLeitura = new AsyncTaskTimerModel("tmrLeitura", tmrLeitura_Tick, 500, this);
|
||||||
tmrLeitura.Start();
|
tmrLeitura.Start();
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Mapa.pnlMapa == null)
|
if (op.Mapa.pnlMapa == null)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Mapa = new MapasModel()
|
op.Mapa = new MapasModel()
|
||||||
{
|
{
|
||||||
pnlMapa = pnlMapa,
|
pnlMapa = pnlMapa,
|
||||||
lblMapa = lblMapaCarregado
|
lblMapa = lblMapaCarregado
|
||||||
};
|
};
|
||||||
Variaveis.OperacaoEmAndamento.Mapa.CarregarMapaGPS();
|
op.Mapa.CarregarMapaGPS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -136,8 +138,9 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
public void AtualizarMapaDinamico()
|
public void AtualizarMapaDinamico()
|
||||||
{
|
{
|
||||||
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria;
|
var _Sensoriamento = op.Sensoriamento;
|
||||||
|
var _Trajetoria = op.Trajetoria;
|
||||||
|
|
||||||
if (_Trajetoria != null && _Trajetoria.CorredorAtual != null)
|
if (_Trajetoria != null && _Trajetoria.CorredorAtual != null)
|
||||||
{
|
{
|
||||||
|
|
@ -148,9 +151,9 @@ namespace AgroBase.Forms.IHM
|
||||||
_Sensoriamento.Gps,
|
_Sensoriamento.Gps,
|
||||||
_Trajetoria._TrajetoriaDinamica,
|
_Trajetoria._TrajetoriaDinamica,
|
||||||
_Trajetoria.CorredorAtual.Pontos,
|
_Trajetoria.CorredorAtual.Pontos,
|
||||||
Variaveis.OperacaoEmAndamento.GPSTrajetoria,
|
op.GPSTrajetoria,
|
||||||
_Trajetoria.RuasPlantacao,
|
_Trajetoria.RuasPlantacao,
|
||||||
_Sensoriamento.Controle.SimulacaoMPC
|
op.Controle.SimulacaoMPC
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -160,25 +163,26 @@ namespace AgroBase.Forms.IHM
|
||||||
pnlOrientacao.Invalidate();
|
pnlOrientacao.Invalidate();
|
||||||
pnlInclinacao.Invalidate();
|
pnlInclinacao.Invalidate();
|
||||||
|
|
||||||
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
var _Sensoriamento = op.Sensoriamento;
|
||||||
|
|
||||||
lblUltimaLeituraSolo.Text = "Última Leitura Solo: " + _Sensoriamento.OperadorErvas.UltimaMensagem.ToString("HH:mm:ss.fff");
|
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");
|
lblUltimaLeituraCaminho.Text = "Última Leitura Caminho: " + _Sensoriamento.OperadorVisual.UltimaMensagem.ToString("HH:mm:ss.fff");
|
||||||
lblPerformance.Text = _Sensoriamento.DadosPerformance.PerformanceStr;
|
lblPerformance.Text = _Sensoriamento.DadosPerformance.PerformanceStr;
|
||||||
|
|
||||||
lblMapaCarregado.Text = "Operação: " + Variaveis.OperacaoEmAndamento.Descricao;
|
lblMapaCarregado.Text = "Operação: " + op.Descricao;
|
||||||
|
|
||||||
txtModoOperacao.Text = (Variaveis.OperacaoEmAndamento.Parametros?.Modo ?? ModoOperacao.NaoDefinido).ToString();
|
txtModoOperacao.Text = (op.Parametros?.Modo ?? ModoOperacao.NaoDefinido).ToString();
|
||||||
bool opLiberada = _Sensoriamento.OperacaoLiberada;
|
bool opLiberada = _Sensoriamento.Operacao.OperacaoLiberada;
|
||||||
txtOperacaoLiberada.Text = opLiberada ? "Sim" : "Não";
|
txtOperacaoLiberada.Text = opLiberada ? "Sim" : "Não";
|
||||||
txtOperacaoLiberada.ForeColor = opLiberada ? Color.Black : Color.Red;
|
txtOperacaoLiberada.ForeColor = opLiberada ? Color.Black : Color.Red;
|
||||||
btnCodFalha.Text = CodigoFalha.ToString("0.000");
|
btnCodFalha.Text = CodigoFalha.ToString("0.000");
|
||||||
txtStatusAtual.Text = _Sensoriamento.StatusOperacao.ToString();
|
txtStatusAtual.Text = _Sensoriamento.Operacao.StatusOperacaoAtual.ToString();
|
||||||
txtIniciadoEm.Text = _Sensoriamento.DataInicio == DateTime.MinValue ? "Aguardando" : _Sensoriamento.DataInicio.ToString("dd/MM HH:mm:ss");
|
txtIniciadoEm.Text = _Sensoriamento.Operacao.DataInicio == DateTime.MinValue ? "Aguardando" : _Sensoriamento.Operacao.DataInicio.ToString("dd/MM HH:mm:ss");
|
||||||
txtConcluidoEm.Text = _Sensoriamento.DataFim == DateTime.MinValue ? "-" : _Sensoriamento.DataFim.ToString("dd/MM HH:mm:ss");
|
txtConcluidoEm.Text = _Sensoriamento.Operacao.DataFim == DateTime.MinValue ? "-" : _Sensoriamento.Operacao.DataFim.ToString("dd/MM HH:mm:ss");
|
||||||
txtDistanciaPercorrida.Text = _Sensoriamento.Trajetoria.DistanciaPercorrida.ToString("0.00") + " m";
|
txtDistanciaPercorrida.Text = _Sensoriamento.Trajetoria.DistanciaPercorrida.ToString("0.00") + " m";
|
||||||
txtTempoOperacao.Text = _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss");
|
txtTempoOperacao.Text = _Sensoriamento.Operacao.TempoDecorrido.ToString("HH:mm:ss");
|
||||||
txtLatenciaControle.Text = _Sensoriamento.Controle.Latencia.ToString();
|
txtLatenciaControle.Text = op.Controle.Latencia.ToString();
|
||||||
txtHerbicidaAplicado.Text = _Sensoriamento.Atuador.HerbicidaConsumido.ToString("0.000") + " L";
|
txtHerbicidaAplicado.Text = _Sensoriamento.Atuador.HerbicidaConsumido.ToString("0.000") + " L";
|
||||||
txtBateriaConsumida.Text = _Sensoriamento.Bateria.PercentualBateriaConsumida.ToString("0.00") + " %";
|
txtBateriaConsumida.Text = _Sensoriamento.Bateria.PercentualBateriaConsumida.ToString("0.00") + " %";
|
||||||
|
|
||||||
|
|
@ -197,38 +201,38 @@ namespace AgroBase.Forms.IHM
|
||||||
lblCorrecaoGPS.Text = (_Sensoriamento.Gps.Ntrip_ativado ? "N " : "B ") + _Sensoriamento.Gps.IdadeCorrecao + ": " + _Sensoriamento.Gps.QualidadeFix.ToString();
|
lblCorrecaoGPS.Text = (_Sensoriamento.Gps.Ntrip_ativado ? "N " : "B ") + _Sensoriamento.Gps.IdadeCorrecao + ": " + _Sensoriamento.Gps.QualidadeFix.ToString();
|
||||||
lblPrecisaoGPS.Text = $"Precisão: {_Sensoriamento.Gps.PrecisaoCm.ToString("0.00")} cm";
|
lblPrecisaoGPS.Text = $"Precisão: {_Sensoriamento.Gps.PrecisaoCm.ToString("0.00")} cm";
|
||||||
|
|
||||||
bool automatico = Variaveis.OperacaoEmAndamento.Parametros?.ControleAutomatico ?? false;
|
bool automatico = op.Parametros?.ControleAutomatico ?? false;
|
||||||
cmbModoControle.Enabled = !automatico;
|
cmbModoControle.Enabled = !automatico;
|
||||||
tkbVelocidade.Enabled = !automatico;
|
tkbVelocidade.Enabled = !automatico;
|
||||||
tkbAnguloDirecional.Enabled = !automatico;
|
tkbAnguloDirecional.Enabled = !automatico;
|
||||||
pnlFreio.Enabled = !automatico;
|
pnlFreio.Enabled = !automatico;
|
||||||
if (automatico)
|
if (automatico)
|
||||||
{
|
{
|
||||||
cmbModoControle.SelectedIndex = (int)_Sensoriamento.Controle.TipoMovimento;
|
cmbModoControle.SelectedIndex = (int)op.Controle.TipoMovimento;
|
||||||
|
|
||||||
tkbVelocidade.Value = Convert.ToInt32(_Sensoriamento.Controle.PercentualVelocidadeSP);
|
tkbVelocidade.Value = Convert.ToInt32(op.Controle.PercentualVelocidadeSP);
|
||||||
|
|
||||||
tkbAnguloDirecional.Minimum = 0;
|
tkbAnguloDirecional.Minimum = 0;
|
||||||
tkbAnguloDirecional.Maximum = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo);
|
tkbAnguloDirecional.Maximum = Convert.ToInt32(op.Parametros.Controle.DirAnguloMaximo);
|
||||||
tkbAnguloDirecional.Value = Math.Abs(Convert.ToInt32(_Sensoriamento.Controle.Angulo));
|
tkbAnguloDirecional.Value = Math.Abs(Convert.ToInt32(op.Controle.Angulo));
|
||||||
}
|
}
|
||||||
|
|
||||||
txtDistanciasEsqDir.Text = _Sensoriamento.Trajetoria.DistanciaEsquerda.ToString("0.00") + " / " + _Sensoriamento.Trajetoria.DistanciaDireita.ToString("0.00") + " (" + _Sensoriamento.Controle.ErroLateral.ToString("0.00" + ")");
|
txtDistanciasEsqDir.Text = _Sensoriamento.Trajetoria.DistanciaEsquerda.ToString("0.00") + " / " + _Sensoriamento.Trajetoria.DistanciaDireita.ToString("0.00") + " (" + op.Controle.ErroLateral.ToString("0.00" + ")");
|
||||||
txtDentroCorredor.Text = _Sensoriamento.Trajetoria.CorredorAtual.Dentro ? "Sim" : "Não";
|
txtDentroCorredor.Text = _Sensoriamento.Trajetoria.CorredorAtual.Dentro ? "Sim" : "Não";
|
||||||
txtMargemCorredor.Text = _Sensoriamento.Trajetoria.NaMargemDoCorredor ? "Sim" : "Não";
|
txtMargemCorredor.Text = _Sensoriamento.Trajetoria.NaMargemDoCorredor ? "Sim" : "Não";
|
||||||
txtStatusCarro.Text = _Sensoriamento.Trajetoria.StatusCarro.ToString();
|
txtStatusCarro.Text = _Sensoriamento.Trajetoria.StatusCarro.ToString();
|
||||||
txtInclinacao.Text = _Sensoriamento.IMU.RollSeguro.ToString("0.00") + "/" + _Sensoriamento.IMU.PitchSeguro.ToString("0.00");
|
txtInclinacao.Text = _Sensoriamento.IMU.RollSeguro.ToString("0.00") + "/" + _Sensoriamento.IMU.PitchSeguro.ToString("0.00");
|
||||||
|
|
||||||
var ModET = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "ET");
|
var ModET = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "ET");
|
||||||
txtET.Text = (ModET?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00");
|
txtET.Text = (ModET?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00");
|
||||||
lblET.ForeColor = (ModET?.Conectado ?? false) ? Color.Green : Color.Red;
|
lblET.ForeColor = (ModET?.Conectado ?? false) ? Color.Green : Color.Red;
|
||||||
var ModDT = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "DT");
|
var ModDT = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "DT");
|
||||||
txtDT.Text = (ModDT?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00");
|
txtDT.Text = (ModDT?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00");
|
||||||
lblDT.ForeColor = (ModDT?.Conectado ?? false) ? Color.Green : Color.Red;
|
lblDT.ForeColor = (ModDT?.Conectado ?? false) ? Color.Green : Color.Red;
|
||||||
var ModEF = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "EF");
|
var ModEF = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "EF");
|
||||||
txtEF.Text = (ModEF?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00");
|
txtEF.Text = (ModEF?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00");
|
||||||
lblEF.ForeColor = (ModEF?.Conectado ?? false) ? Color.Green : Color.Red;
|
lblEF.ForeColor = (ModEF?.Conectado ?? false) ? Color.Green : Color.Red;
|
||||||
var ModDF = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "DF");
|
var ModDF = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == "DF");
|
||||||
txtDF.Text = (ModDF?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00");
|
txtDF.Text = (ModDF?.MovMotor?.Corrente_Motor ?? 0).ToString("0.00");
|
||||||
lblDF.ForeColor = (ModDF?.Conectado ?? false) ? Color.Green : Color.Red;
|
lblDF.ForeColor = (ModDF?.Conectado ?? false) ? Color.Green : Color.Red;
|
||||||
|
|
||||||
|
|
@ -291,19 +295,21 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void pnlOrientacao_Paint(object sender, PaintEventArgs e)
|
private void pnlOrientacao_Paint(object sender, PaintEventArgs e)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
double angulo = Variaveis.OperacaoEmAndamento.Sensoriamento?.Gps?.AnguloCarroDefinido ?? 0;
|
double angulo = op.Sensoriamento?.Gps?.AnguloCarroDefinido ?? 0;
|
||||||
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)(Variaveis.OperacaoEmAndamento.Sensoriamento?.Trajetoria?.AnguloCaminho ?? 0));
|
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)(op.Sensoriamento?.Trajetoria?.AnguloCaminho ?? 0));
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pnlInclinacao_Paint(object sender, PaintEventArgs e)
|
private void pnlInclinacao_Paint(object sender, PaintEventArgs e)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)(Variaveis.OperacaoEmAndamento.Controle.Angulo), 90);
|
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)(op.Controle.Angulo), 90);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
@ -326,14 +332,16 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void AtualizarElementosModoManual()
|
private void AtualizarElementosModoManual()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
cmbModoControle.Enabled = false;
|
cmbModoControle.Enabled = false;
|
||||||
tkbAnguloDirecional.Enabled = false;
|
tkbAnguloDirecional.Enabled = false;
|
||||||
tkbVelocidade.Enabled = false;
|
tkbVelocidade.Enabled = false;
|
||||||
pnlJoystick.Visible = false;
|
pnlJoystick.Visible = false;
|
||||||
tabControl1.TabPages.Remove(tabControle);
|
tabControl1.TabPages.Remove(tabControle);
|
||||||
|
|
||||||
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
|
var pControle = op.Parametros.Controle;
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var _Controle = op.Controle;
|
||||||
cmbModoControle.SelectedIndex = (int)_Controle.TipoMovimento;
|
cmbModoControle.SelectedIndex = (int)_Controle.TipoMovimento;
|
||||||
chbFrenagemAutomatica.Checked = pControle.FrenagemAutomaticaAoParar;
|
chbFrenagemAutomatica.Checked = pControle.FrenagemAutomaticaAoParar;
|
||||||
nudVelSemErvas.Value = (int)pControle.MovVelocidadeSErvasPercent;
|
nudVelSemErvas.Value = (int)pControle.MovVelocidadeSErvasPercent;
|
||||||
|
|
@ -473,6 +481,8 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void SendMovementCommand(int deltaX, int deltaY)
|
private void SendMovementCommand(int deltaX, int deltaY)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
Keys MovKey = Keys.Escape;
|
Keys MovKey = Keys.Escape;
|
||||||
if (deltaY < -10) MovKey = Keys.Up;
|
if (deltaY < -10) MovKey = Keys.Up;
|
||||||
else if (deltaY > 10) MovKey = Keys.Down;
|
else if (deltaY > 10) MovKey = Keys.Down;
|
||||||
|
|
@ -488,7 +498,7 @@ namespace AgroBase.Forms.IHM
|
||||||
Console.WriteLine($"Movimento: MovKey={MovKey}");
|
Console.WriteLine($"Movimento: MovKey={MovKey}");
|
||||||
//GeneralJoystick.EnviaComandoMotor(MovKey, Enums.T_Code.Mov);
|
//GeneralJoystick.EnviaComandoMotor(MovKey, Enums.T_Code.Mov);
|
||||||
var comando = GeneralJoystick.DeParaComandos.FirstOrDefault(x => x.key == MovKey);
|
var comando = GeneralJoystick.DeParaComandos.FirstOrDefault(x => x.key == MovKey);
|
||||||
GeneralJoystick.ProcessarDadosControle(comando.botaoJoy, false, valorDesejado: Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent);
|
GeneralJoystick.ProcessarDadosControle(comando.botaoJoy, false, valorDesejado: op.Parametros.Controle.MovVelocidadeCErvasPercent);
|
||||||
prevMovKey = MovKey; // Atualiza o estado anterior
|
prevMovKey = MovKey; // Atualiza o estado anterior
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -499,7 +509,7 @@ namespace AgroBase.Forms.IHM
|
||||||
Console.WriteLine($"Direção: DirKey={DirKey}");
|
Console.WriteLine($"Direção: DirKey={DirKey}");
|
||||||
//GeneralJoystick.EnviaComandoMotor(DirKey, Enums.T_Code.Dir);
|
//GeneralJoystick.EnviaComandoMotor(DirKey, Enums.T_Code.Dir);
|
||||||
var comando = GeneralJoystick.DeParaComandos.FirstOrDefault(x => x.key == DirKey);
|
var comando = GeneralJoystick.DeParaComandos.FirstOrDefault(x => x.key == DirKey);
|
||||||
GeneralJoystick.ProcessarDadosControle(comando.botaoJoy, false, valorDesejado: Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo);
|
GeneralJoystick.ProcessarDadosControle(comando.botaoJoy, false, valorDesejado: op.Parametros.Controle.DirAnguloMaximo);
|
||||||
prevDirKey = DirKey; // Atualiza o estado anterior
|
prevDirKey = DirKey; // Atualiza o estado anterior
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -526,7 +536,8 @@ namespace AgroBase.Forms.IHM
|
||||||
// Iniciar o arraste
|
// Iniciar o arraste
|
||||||
private void BrakePanel_MouseDown(object sender, MouseEventArgs e)
|
private void BrakePanel_MouseDown(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.Parametros?.Modo != Enums.ModoOperacao.Manual)
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
if (op.Parametros?.Modo != Enums.ModoOperacao.Manual)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -540,7 +551,8 @@ namespace AgroBase.Forms.IHM
|
||||||
// Movimentar o botão de freio
|
// Movimentar o botão de freio
|
||||||
private void BrakePanel_MouseMove(object sender, MouseEventArgs e)
|
private void BrakePanel_MouseMove(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.Parametros?.Modo != Enums.ModoOperacao.Manual)
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
if (op.Parametros?.Modo != Enums.ModoOperacao.Manual)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -582,7 +594,8 @@ namespace AgroBase.Forms.IHM
|
||||||
// Soltar o botão de freio
|
// Soltar o botão de freio
|
||||||
private void BrakePanel_MouseUp(object sender, MouseEventArgs e)
|
private void BrakePanel_MouseUp(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.Parametros?.Modo != Enums.ModoOperacao.Manual)
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
if (op.Parametros?.Modo != Enums.ModoOperacao.Manual)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -634,7 +647,7 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void btnCodFalha_Click(object sender, EventArgs e)
|
private void btnCodFalha_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
string DescricaoFalha = Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada;
|
string DescricaoFalha = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada;
|
||||||
CustomDialog.ShowDialog(
|
CustomDialog.ShowDialog(
|
||||||
"Código de Falha",
|
"Código de Falha",
|
||||||
$"{DescricaoFalha}",
|
$"{DescricaoFalha}",
|
||||||
|
|
@ -670,14 +683,16 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void AtualizarListaModulos(bool forceRebuild = false)
|
private void AtualizarListaModulos(bool forceRebuild = false)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (_inRefresh) return;
|
if (_inRefresh) return;
|
||||||
_inRefresh = true;
|
_inRefresh = true;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// 1) Pega o estado atual do seu sistema
|
// 1) Pega o estado atual do seu sistema
|
||||||
var src = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios;
|
var src = op.Parametros.ModulosMandatorios;
|
||||||
var saude = HealthWorkerService.ModulosSaude;
|
var saude = op.Sensoriamento.OperadorSaude.ModulosSaude;
|
||||||
|
|
||||||
// 2) Constrói snapshot
|
// 2) Constrói snapshot
|
||||||
var novos = new List<ModuloUIItem>(src.Count);
|
var novos = new List<ModuloUIItem>(src.Count);
|
||||||
|
|
@ -795,6 +810,7 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void clbModulos_ItemCheck(object sender, ItemCheckEventArgs e)
|
private void clbModulos_ItemCheck(object sender, ItemCheckEventArgs e)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
if (_inRefresh) return; // evita loop quando sincronizamos via código
|
if (_inRefresh) return; // evita loop quando sincronizamos via código
|
||||||
|
|
||||||
var idx = e.Index;
|
var idx = e.Index;
|
||||||
|
|
@ -808,7 +824,7 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
// escreve de volta na fonte oficial
|
// escreve de volta na fonte oficial
|
||||||
var disp = _modulosUI[idx].Disp;
|
var disp = _modulosUI[idx].Disp;
|
||||||
var alvo = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.FirstOrDefault(m => m.Dispositivo.Equals(disp));
|
var alvo = op.Parametros.ModulosMandatorios.FirstOrDefault(m => m.Dispositivo.Equals(disp));
|
||||||
if (alvo != null)
|
if (alvo != null)
|
||||||
{
|
{
|
||||||
if (alvo.Utilizar && alvo.Mandatorio && !novoUtilizar)
|
if (alvo.Utilizar && alvo.Mandatorio && !novoUtilizar)
|
||||||
|
|
@ -843,14 +859,15 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void btnPausarOperacao_Click(object sender, EventArgs e)
|
private void btnPausarOperacao_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (!Variaveis.OperacaoEmAndamento.Pausa)
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
if (!op.Sensoriamento.Operacao.Pausa)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Pausa = true;
|
op.Sensoriamento.Operacao.Pausa = true;
|
||||||
btnPausarOperacao.Text = "Retomar";
|
btnPausarOperacao.Text = "Retomar";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Pausa = false;
|
op.Sensoriamento.Operacao.Pausa = false;
|
||||||
btnPausarOperacao.Text = "Pausar";
|
btnPausarOperacao.Text = "Pausar";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -862,6 +879,7 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void btnSalvarParametros_Click(object sender, EventArgs e)
|
private void btnSalvarParametros_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
var res = CustomDialog.ShowDialog(
|
var res = CustomDialog.ShowDialog(
|
||||||
"Salvar parâmetros da operação",
|
"Salvar parâmetros da operação",
|
||||||
"Deseja aplicar os novos parâmetros para operação atual?",
|
"Deseja aplicar os novos parâmetros para operação atual?",
|
||||||
|
|
@ -872,7 +890,7 @@ namespace AgroBase.Forms.IHM
|
||||||
{ ("Não", DialogResult.No), () => { } },
|
{ ("Não", DialogResult.No), () => { } },
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
|
var pControle = op.Parametros.Controle;
|
||||||
if (res == DialogResult.Yes)
|
if (res == DialogResult.Yes)
|
||||||
{
|
{
|
||||||
pControle.FrenagemAutomaticaAoParar = chbFrenagemAutomatica.Checked;
|
pControle.FrenagemAutomaticaAoParar = chbFrenagemAutomatica.Checked;
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ namespace AgroBase.Forms.IHM
|
||||||
FuncoesGlobais.DefinirEventosPicBtn(picManual, "Erro ao carregar modo de controle manual!", async () =>
|
FuncoesGlobais.DefinirEventosPicBtn(picManual, "Erro ao carregar modo de controle manual!", async () =>
|
||||||
{
|
{
|
||||||
OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual, true);
|
OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual, true);
|
||||||
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
|
if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada)
|
||||||
{
|
{
|
||||||
frmDialogoMapa frm = new frmDialogoMapa();
|
frmDialogoMapa frm = new frmDialogoMapa();
|
||||||
frm.Show();
|
frm.Show();
|
||||||
|
|
@ -55,7 +55,7 @@ namespace AgroBase.Forms.IHM
|
||||||
{
|
{
|
||||||
CustomDialog.ShowDialog(
|
CustomDialog.ShowDialog(
|
||||||
"Iniciar Operação Manual",
|
"Iniciar Operação Manual",
|
||||||
$"{Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada ?? ""}",
|
$"{Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada ?? ""}",
|
||||||
MessageBoxIcon.Error,
|
MessageBoxIcon.Error,
|
||||||
new Dictionary<(string, dynamic), Action>()
|
new Dictionary<(string, dynamic), Action>()
|
||||||
{
|
{
|
||||||
|
|
@ -194,7 +194,7 @@ namespace AgroBase.Forms.IHM
|
||||||
{
|
{
|
||||||
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == T_Code.Snr);
|
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == T_Code.Snr);
|
||||||
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
|
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
|
||||||
var saudeImu = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
|
var saudeImu = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
|
||||||
var CameraCaminho = CameraWorkerService.CameraCaminho;
|
var CameraCaminho = CameraWorkerService.CameraCaminho;
|
||||||
lbl.ForeColor =
|
lbl.ForeColor =
|
||||||
modDesconectado || saudeImu == null ? Color.Black
|
modDesconectado || saudeImu == null ? Color.Black
|
||||||
|
|
@ -208,8 +208,8 @@ namespace AgroBase.Forms.IHM
|
||||||
{
|
{
|
||||||
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == T_Code.Snr);
|
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == T_Code.Snr);
|
||||||
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
|
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
|
||||||
var saudeLra = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
|
var saudeLra = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
|
||||||
var lora = Variaveis.LoraService;
|
dynamic lora = null; // Variaveis.LoraService;
|
||||||
lbl.ForeColor =
|
lbl.ForeColor =
|
||||||
lora == null || !(Variaveis.OperacaoEmAndamento.DispSen?.Dados?.Conectado ?? false)
|
lora == null || !(Variaveis.OperacaoEmAndamento.DispSen?.Dados?.Conectado ?? false)
|
||||||
? Color.Black
|
? Color.Black
|
||||||
|
|
@ -309,7 +309,7 @@ namespace AgroBase.Forms.IHM
|
||||||
lblIA.Text = "IA: " + (VariaveisOperacao.Operadores.Conectado ? "Conectado" : "Desconectado");
|
lblIA.Text = "IA: " + (VariaveisOperacao.Operadores.Conectado ? "Conectado" : "Desconectado");
|
||||||
lblIA.ForeColor = VariaveisOperacao.Operadores.Conectado ? Color.Green : Color.Red;
|
lblIA.ForeColor = VariaveisOperacao.Operadores.Conectado ? Color.Green : Color.Red;
|
||||||
|
|
||||||
bool opLiberada = Variaveis.OperacaoEmAndamento.OperacaoLiberada;
|
bool opLiberada = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada;
|
||||||
lblOperacaoLiberada.Text = "Operação Liberada: " + (opLiberada ? "Sim" : "Não");
|
lblOperacaoLiberada.Text = "Operação Liberada: " + (opLiberada ? "Sim" : "Não");
|
||||||
lblOperacaoLiberada.ForeColor = opLiberada ? Color.Green : Color.Red;
|
lblOperacaoLiberada.ForeColor = opLiberada ? Color.Green : Color.Red;
|
||||||
|
|
||||||
|
|
@ -320,7 +320,7 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void LblCodigoFalha_Click(object sender, EventArgs e)
|
private void LblCodigoFalha_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
string DescricaoFalha = Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada;
|
string DescricaoFalha = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada;
|
||||||
CustomDialog.ShowDialog(
|
CustomDialog.ShowDialog(
|
||||||
"Código de Falha",
|
"Código de Falha",
|
||||||
$"{DescricaoFalha}",
|
$"{DescricaoFalha}",
|
||||||
|
|
@ -340,7 +340,7 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo && (x.Mod_ID == Mod_ID || x.Mod_ID == null));
|
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo && (x.Mod_ID == Mod_ID || x.Mod_ID == null));
|
||||||
|
|
||||||
var saudeGeral = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
|
var saudeGeral = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
|
||||||
ManagerWorkerMessageResponseModulosPendentesSaudeModel saudeIndividual = null;
|
ManagerWorkerMessageResponseModulosPendentesSaudeModel saudeIndividual = null;
|
||||||
switch (Dispositivo)
|
switch (Dispositivo)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
});
|
});
|
||||||
FuncoesGlobais.DefinirEventosPicBtn(picIniciar, "Erro ao iniciar operação!", async () =>
|
FuncoesGlobais.DefinirEventosPicBtn(picIniciar, "Erro ao iniciar operação!", async () =>
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
|
if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada)
|
||||||
{
|
{
|
||||||
var res = CustomDialog.ShowDialog(
|
var res = CustomDialog.ShowDialog(
|
||||||
"Iniciar Operação",
|
"Iniciar Operação",
|
||||||
|
|
@ -71,7 +71,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
{
|
{
|
||||||
CustomDialog.ShowDialog(
|
CustomDialog.ShowDialog(
|
||||||
"Conexão de módulos pendentes",
|
"Conexão de módulos pendentes",
|
||||||
$"{Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada}",
|
$"{Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada}",
|
||||||
MessageBoxIcon.Warning,
|
MessageBoxIcon.Warning,
|
||||||
new Dictionary<(string, dynamic), Action>()
|
new Dictionary<(string, dynamic), Action>()
|
||||||
{
|
{
|
||||||
|
|
@ -350,7 +350,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
AtualizarOpLiberada();
|
AtualizarOpLiberada();
|
||||||
CustomDialog.ShowDialog(
|
CustomDialog.ShowDialog(
|
||||||
"Status",
|
"Status",
|
||||||
Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada,
|
Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada,
|
||||||
MessageBoxIcon.Information,
|
MessageBoxIcon.Information,
|
||||||
new Dictionary<(string, dynamic), Action>()
|
new Dictionary<(string, dynamic), Action>()
|
||||||
{
|
{
|
||||||
|
|
@ -361,8 +361,8 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
private void AtualizarOpLiberada()
|
private void AtualizarOpLiberada()
|
||||||
{
|
{
|
||||||
lblStatusOperacao.Text = "LIBERADO: " + (Variaveis.OperacaoEmAndamento.OperacaoLiberada ? "SIM" : "NÃO");
|
lblStatusOperacao.Text = "LIBERADO: " + (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada ? "SIM" : "NÃO");
|
||||||
lblStatusOperacao.ForeColor = Variaveis.OperacaoEmAndamento.OperacaoLiberada ? Color.DarkGreen : Color.DarkRed;
|
lblStatusOperacao.ForeColor = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada ? Color.DarkGreen : Color.DarkRed;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
using AgroBase.Models;
|
using AgroBase.Models;
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
|
using AgroBase.Services.Operadores;
|
||||||
using Microsoft.Web.WebView2.WinForms;
|
using Microsoft.Web.WebView2.WinForms;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
|
|
@ -27,7 +28,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
private CameraService cameraService = new CameraService();
|
//private CameraService cameraService = new CameraService();
|
||||||
private WebView2 browser = null;
|
private WebView2 browser = null;
|
||||||
private Timer tmrLeitura;
|
private Timer tmrLeitura;
|
||||||
|
|
||||||
|
|
@ -65,8 +66,8 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
tmrLeitura.Stop();
|
tmrLeitura.Stop();
|
||||||
Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
|
//Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
|
||||||
cameraService.pythonProcess.Kill();
|
//cameraService.pythonProcess.Kill();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
@ -238,7 +239,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
if (browser == null)
|
if (browser == null)
|
||||||
{
|
{
|
||||||
browser = new WebView2();
|
browser = new WebView2();
|
||||||
browser.Source = new Uri(cameraService.URLcamera[0]);
|
//browser.Source = new Uri(cameraService.URLcamera[0]);
|
||||||
this.pnlCamera.Controls.Add(browser);
|
this.pnlCamera.Controls.Add(browser);
|
||||||
browser.Dock = DockStyle.Fill;
|
browser.Dock = DockStyle.Fill;
|
||||||
}
|
}
|
||||||
|
|
@ -273,7 +274,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
btnSalvar.Text = "Editar";
|
btnSalvar.Text = "Editar";
|
||||||
cameraService.cameraIndex = cmbCameras.SelectedIndex;
|
//cameraService.cameraIndex = cmbCameras.SelectedIndex;
|
||||||
}
|
}
|
||||||
btnIniciar.Enabled = btnSalvar.Text == "Editar" && cmbCameras.SelectedIndex > 0;
|
btnIniciar.Enabled = btnSalvar.Text == "Editar" && cmbCameras.SelectedIndex > 0;
|
||||||
cmbCameras.Enabled = btnSalvar.Text == "Salvar";
|
cmbCameras.Enabled = btnSalvar.Text == "Salvar";
|
||||||
|
|
@ -306,14 +307,14 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
|
|
||||||
private void AtualizaListaCameras()
|
private void AtualizaListaCameras()
|
||||||
{
|
{
|
||||||
cameraService.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
//cameraService.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
||||||
cmbCameras.Items.Clear();
|
cmbCameras.Items.Clear();
|
||||||
cmbCameras.Items.AddRange(CameraService.ObterListaCameras().Keys.ToArray());
|
cmbCameras.Items.AddRange(CameraWorkerService.ListaCameras.Select(x => x.mx_id).ToArray());
|
||||||
if (cmbCameras.Items.Count == 1)
|
if (cmbCameras.Items.Count == 1)
|
||||||
{
|
{
|
||||||
cameraService.cameraIndex = 0;
|
//cameraService.cameraIndex = 0;
|
||||||
}
|
}
|
||||||
cmbCameras.SelectedIndex = cameraService.cameraIndex;
|
//cmbCameras.SelectedIndex = cameraService.cameraIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
});
|
});
|
||||||
|
|
||||||
// Verifica se a operação está liberada
|
// Verifica se a operação está liberada
|
||||||
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
|
if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada)
|
||||||
{
|
{
|
||||||
// Inicia a operação de forma assíncrona
|
// Inicia a operação de forma assíncrona
|
||||||
Task.Run(async () => await Variaveis.OperacaoEmAndamento.IniciarOperacao());
|
Task.Run(async () => await Variaveis.OperacaoEmAndamento.IniciarOperacao());
|
||||||
|
|
@ -149,7 +149,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
// Mostra a mensagem de erro na thread principal
|
// Mostra a mensagem de erro na thread principal
|
||||||
btnIniciarOperacao.Invoke((MethodInvoker)delegate
|
btnIniciarOperacao.Invoke((MethodInvoker)delegate
|
||||||
{
|
{
|
||||||
MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show(Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
btnIniciarOperacao.Text = "Iniciar Operação";
|
btnIniciarOperacao.Text = "Iniciar Operação";
|
||||||
btnIniciarOperacao.Enabled = true;
|
btnIniciarOperacao.Enabled = true;
|
||||||
});
|
});
|
||||||
|
|
@ -186,8 +186,8 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
lblTensao.Text = _Sensoriamento.Bateria.TensaoInstantanea.ToString("0.00") + " v";
|
lblTensao.Text = _Sensoriamento.Bateria.TensaoInstantanea.ToString("0.00") + " v";
|
||||||
lblCorrente.Text = _Sensoriamento.Bateria.CorrenteInstantanea.ToString("0.00") + " A";
|
lblCorrente.Text = _Sensoriamento.Bateria.CorrenteInstantanea.ToString("0.00") + " A";
|
||||||
lblRPM.Text = _Sensoriamento.Movimentacao.RPMMedio.ToString("0") + " rpm";
|
lblRPM.Text = _Sensoriamento.Movimentacao.RPMRodaMedio.ToString("0") + " rpm";
|
||||||
lblVelocidade.Text = (_Sensoriamento.Movimentacao.VelocidadeMedia * 3.6).ToString("0.00");
|
lblVelocidade.Text = (_Sensoriamento.Movimentacao.VelocidadeMediaMs * 3.6).ToString("0.00");
|
||||||
lblPressao.Text = $"{(_Sensoriamento.Atuador.PressaoLinha):F0} psi";
|
lblPressao.Text = $"{(_Sensoriamento.Atuador.PressaoLinha):F0} psi";
|
||||||
lblPressaoBomba.Text = $"{(_Sensoriamento.Atuador.PressaoAtualBomba):F0} psi";
|
lblPressaoBomba.Text = $"{(_Sensoriamento.Atuador.PressaoAtualBomba):F0} psi";
|
||||||
lblVazaoInstantanea.Text = $"{(_Sensoriamento.Atuador.VazaoFluxoMLpSInstantaneaCorrigida):F0} ml/s";
|
lblVazaoInstantanea.Text = $"{(_Sensoriamento.Atuador.VazaoFluxoMLpSInstantaneaCorrigida):F0} ml/s";
|
||||||
|
|
@ -557,9 +557,9 @@ namespace AgroBase.Forms.Operacoes
|
||||||
var _Atuador = _Sensoriamento?.Atuador;
|
var _Atuador = _Sensoriamento?.Atuador;
|
||||||
var _IMU = _Sensoriamento?.IMU;
|
var _IMU = _Sensoriamento?.IMU;
|
||||||
|
|
||||||
gridDados.Rows[0].Cells[1].Value = _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss");
|
gridDados.Rows[0].Cells[1].Value = _Sensoriamento.Operacao.TempoDecorrido.ToString("HH:mm:ss");
|
||||||
gridDados.Rows[1].Cells[1].Value = (_Movimentacao?.TempoMovimento ?? DateTime.Now).ToString("HH:mm:ss");
|
gridDados.Rows[1].Cells[1].Value = (FuncoesGlobais.TimestampToDate(_Movimentacao?.TempoMovimentoSegs ?? 0));
|
||||||
gridDados.Rows[2].Cells[1].Value = (_Movimentacao?.VelocidadeMedia ?? 0 * 3.6).ToString("0.00");
|
gridDados.Rows[2].Cells[1].Value = (_Movimentacao?.VelocidadeMediaMs ?? 0 * 3.6).ToString("0.00");
|
||||||
gridDados.Rows[3].Cells[1].Value = (_Sensoriamento.Trajetoria?.DistanciaPercorrida ?? 0).ToString("0.00");
|
gridDados.Rows[3].Cells[1].Value = (_Sensoriamento.Trajetoria?.DistanciaPercorrida ?? 0).ToString("0.00");
|
||||||
gridDados.Rows[4].Cells[1].Value = ((_Bateria?.PercentualBateria ?? 0).ToString("0.00"));
|
gridDados.Rows[4].Cells[1].Value = ((_Bateria?.PercentualBateria ?? 0).ToString("0.00"));
|
||||||
gridDados.Rows[5].Cells[1].Value = ((_Bateria?.TensaoInstantanea ?? 0).ToString("0.00"));
|
gridDados.Rows[5].Cells[1].Value = ((_Bateria?.TensaoInstantanea ?? 0).ToString("0.00"));
|
||||||
|
|
@ -735,7 +735,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
AtuadorFuncoesGerais.DesenharAtuadores(
|
AtuadorFuncoesGerais.DesenharAtuadores(
|
||||||
pnlAtuadores,
|
pnlAtuadores,
|
||||||
e,
|
e,
|
||||||
Atuador.BicosPulverizadores.Select(x => new AtuBicoSensoriamentoLogModel()
|
Atuador.BicosPulverizadores.Select(x => new AtuadorBicoLogModel()
|
||||||
{
|
{
|
||||||
ID = x.ID,
|
ID = x.ID,
|
||||||
Atuacoes = x.Atuacoes,
|
Atuacoes = x.Atuacoes,
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
lblUltimaLeituraRua.Text = "Ultima Leitura Rua: " + FuncoesGlobais.TimestampToDate(Variaveis.OperacaoEmAndamento.CameraCaminho.Leitura.timestamp);*/
|
lblUltimaLeituraRua.Text = "Ultima Leitura Rua: " + FuncoesGlobais.TimestampToDate(Variaveis.OperacaoEmAndamento.CameraCaminho.Leitura.timestamp);*/
|
||||||
|
|
||||||
btnCarregarMapa.Enabled = !Variaveis.OperacaoEmAndamento.Iniciado;
|
btnCarregarMapa.Enabled = !Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada;
|
||||||
|
|
||||||
this.Text = Variaveis.OperacaoEmAndamento.TextoFormOperacao("Mapa GPS");
|
this.Text = Variaveis.OperacaoEmAndamento.TextoFormOperacao("Mapa GPS");
|
||||||
|
|
||||||
|
|
@ -86,8 +86,8 @@ namespace AgroBase.Forms.Operacoes
|
||||||
//lblDistanciaDireita.Text = "Distancia da Direita: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaDireita.ToString("0.00") + " cm";
|
//lblDistanciaDireita.Text = "Distancia da Direita: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaDireita.ToString("0.00") + " cm";
|
||||||
|
|
||||||
lblDistanciaPercorrida.Text = "Distancia Percorrida: " + _Sensoriamento.Trajetoria.DistanciaPercorrida.ToString("0.00") + " m";
|
lblDistanciaPercorrida.Text = "Distancia Percorrida: " + _Sensoriamento.Trajetoria.DistanciaPercorrida.ToString("0.00") + " m";
|
||||||
lblTempoOperacao.Text = "Tempo de Operação: " + _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss");
|
lblTempoOperacao.Text = "Tempo de Operação: " + _Sensoriamento.Operacao.TempoDecorrido.ToString("HH:mm:ss");
|
||||||
lblVelocidadeMedia.Text = "Velocidade Média: " + _Sensoriamento.Movimentacao.VelocidadeMedia.ToString("0.00") + " km/h";
|
lblVelocidadeMedia.Text = "Velocidade Média: " + _Sensoriamento.Movimentacao.VelocidadeMediaMs.ToString("0.00") + " km/h";
|
||||||
//lblErvasIdentificadas.Text = "Ervas Identificadas: " + _Sensoriamento.Atuador.QtdErvasIdentificadas.ToString("000");
|
//lblErvasIdentificadas.Text = "Ervas Identificadas: " + _Sensoriamento.Atuador.QtdErvasIdentificadas.ToString("000");
|
||||||
lblHerbicidaAplicado.Text = "Herbicida Aplicado: " + _Sensoriamento.Atuador.HerbicidaConsumido.ToString("0.000") + " L";
|
lblHerbicidaAplicado.Text = "Herbicida Aplicado: " + _Sensoriamento.Atuador.HerbicidaConsumido.ToString("0.000") + " L";
|
||||||
lblHerbicidaPorErva.Text = "Herbicida por Erva: " + _Sensoriamento.Atuador.HerbicidaPorErva.ToString("0.000") + " mL";
|
lblHerbicidaPorErva.Text = "Herbicida por Erva: " + _Sensoriamento.Atuador.HerbicidaPorErva.ToString("0.000") + " mL";
|
||||||
|
|
@ -107,7 +107,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
lblPerformance.Text = _Sensoriamento.DadosPerformance.PerformanceStr;
|
lblPerformance.Text = _Sensoriamento.DadosPerformance.PerformanceStr;
|
||||||
|
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado && btnIniciarOperacao.Text == "Finalizar Operação")
|
if (!Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada && btnIniciarOperacao.Text == "Finalizar Operação")
|
||||||
{
|
{
|
||||||
AtualizaComponentesOperacao();
|
AtualizaComponentesOperacao();
|
||||||
}
|
}
|
||||||
|
|
@ -143,7 +143,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada && Variaveis.OperacaoEmAndamento.Trajetoria.DistanciaTotal > 0 && Variaveis.OperacaoEmAndamento.Mapa.RuasPercorrer.Any())
|
if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoLiberada && Variaveis.OperacaoEmAndamento.Trajetoria.DistanciaTotal > 0 && Variaveis.OperacaoEmAndamento.Mapa.RuasPercorrer.Any())
|
||||||
{
|
{
|
||||||
//Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora.PressaoSP = Convert.ToDouble(nudPressaoSP.Value);
|
//Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora.PressaoSP = Convert.ToDouble(nudPressaoSP.Value);
|
||||||
await Variaveis.OperacaoEmAndamento.IniciarOperacao();
|
await Variaveis.OperacaoEmAndamento.IniciarOperacao();
|
||||||
|
|
@ -159,7 +159,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
private void AtualizaComponentesOperacao()
|
private void AtualizaComponentesOperacao()
|
||||||
{
|
{
|
||||||
btnIniciarOperacao.Text = !Variaveis.OperacaoEmAndamento.Iniciado ? "Iniciar Operação" : "Finalizar Operação";
|
btnIniciarOperacao.Text = !Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada ? "Iniciar Operação" : "Finalizar Operação";
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -169,7 +169,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
private void pnlAtuadores_Paint(object sender, PaintEventArgs e)
|
private void pnlAtuadores_Paint(object sender, PaintEventArgs e)
|
||||||
{
|
{
|
||||||
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu.Dados;
|
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu.Dados;
|
||||||
AtuadorFuncoesGerais.DesenharAtuadores(pnlAtuadores, e, Atuador.BicosPulverizadores.Select(x => new AtuBicoSensoriamentoLogModel()
|
AtuadorFuncoesGerais.DesenharAtuadores(pnlAtuadores, e, Atuador.BicosPulverizadores.Select(x => new AtuadorBicoLogModel()
|
||||||
{
|
{
|
||||||
ID = x.ID,
|
ID = x.ID,
|
||||||
Atuacoes = x.Atuacoes,
|
Atuacoes = x.Atuacoes,
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,5 +1,6 @@
|
||||||
using AgroBase.Models;
|
using AgroBase.Models;
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
|
using AgroBase.Services.Operadores;
|
||||||
using Microsoft.Web.WebView2.WinForms;
|
using Microsoft.Web.WebView2.WinForms;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
|
|
@ -10,7 +11,7 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
{
|
{
|
||||||
public partial class frmSenCamera : Form
|
public partial class frmSenCamera : Form
|
||||||
{
|
{
|
||||||
private CameraService cameraService = new CameraService();
|
//private CameraService cameraService = new CameraService();
|
||||||
private WebView2 browser = null;
|
private WebView2 browser = null;
|
||||||
private Timer tmrLeitura;
|
private Timer tmrLeitura;
|
||||||
|
|
||||||
|
|
@ -34,8 +35,8 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
|
//`Variaveis.MqttServiceLocal.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
|
||||||
cameraService.pythonProcess?.Kill();
|
//`cameraService.pythonProcess?.Kill();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
@ -63,7 +64,7 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
btnSalvar.Text = "Editar";
|
btnSalvar.Text = "Editar";
|
||||||
cameraService.cameraIndex = cmbCameras.SelectedIndex;
|
//cameraService.cameraIndex = cmbCameras.SelectedIndex;
|
||||||
}
|
}
|
||||||
btnIniciar.Enabled = btnSalvar.Text == "Editar" && cmbCameras.SelectedIndex > 0;
|
btnIniciar.Enabled = btnSalvar.Text == "Editar" && cmbCameras.SelectedIndex > 0;
|
||||||
cmbCameras.Enabled = btnSalvar.Text == "Salvar";
|
cmbCameras.Enabled = btnSalvar.Text == "Salvar";
|
||||||
|
|
@ -96,14 +97,14 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
|
|
||||||
private void AtualizaListaCameras()
|
private void AtualizaListaCameras()
|
||||||
{
|
{
|
||||||
cameraService.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
//cameraService.cameraIndex = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
||||||
cmbCameras.Items.Clear();
|
cmbCameras.Items.Clear();
|
||||||
cmbCameras.Items.AddRange(CameraService.ObterListaCameras().Keys.ToArray());
|
cmbCameras.Items.AddRange(CameraWorkerService.ListaCameras.Select(x => x.mx_id).ToArray());
|
||||||
if (cmbCameras.Items.Count == 1)
|
if (cmbCameras.Items.Count == 1)
|
||||||
{
|
{
|
||||||
cameraService.cameraIndex = 0;
|
//cameraService.cameraIndex = 0;
|
||||||
}
|
}
|
||||||
cmbCameras.SelectedIndex = cameraService.cameraIndex;
|
//cmbCameras.SelectedIndex = cameraService.cameraIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ListarObjetosDetectados()
|
private void ListarObjetosDetectados()
|
||||||
|
|
@ -111,7 +112,7 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
if (browser == null)
|
if (browser == null)
|
||||||
{
|
{
|
||||||
browser = new WebView2();
|
browser = new WebView2();
|
||||||
browser.Source = new Uri(cameraService.URLcamera[0]);
|
//browser.Source = new Uri(cameraService.URLcamera[0]);
|
||||||
this.pnlCamera.Controls.Add(browser);
|
this.pnlCamera.Controls.Add(browser);
|
||||||
browser.Dock = DockStyle.Fill;
|
browser.Dock = DockStyle.Fill;
|
||||||
}
|
}
|
||||||
|
|
@ -121,18 +122,18 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
|
|
||||||
var MqttTopico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == VideoUrl);
|
var MqttTopico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == VideoUrl);
|
||||||
CameraCoordenadasFrameModel leitura = null;
|
CameraCoordenadasFrameModel leitura = null;
|
||||||
var Mensagem = MqttTopico.Mensagens.LastOrDefault(x => x.Momento > cameraService.IniciadoEm);
|
//var Mensagem = MqttTopico.Mensagens.LastOrDefault(x => x.Momento > cameraService.IniciadoEm);
|
||||||
if (Mensagem != null)
|
//if (Mensagem != null)
|
||||||
{
|
//{
|
||||||
try
|
// try
|
||||||
{
|
// {
|
||||||
leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
|
// leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
|
||||||
}
|
// }
|
||||||
catch
|
// catch
|
||||||
{
|
// {
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
/*foreach (var leitura in leituras)
|
/*foreach (var leitura in leituras)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
|
|
||||||
private void AtualizarCameras()
|
private void AtualizarCameras()
|
||||||
{
|
{
|
||||||
Cameras = CameraService.ObterListaCameras();
|
//Cameras = CameraWorkerService.ListaCameras.Select(x => x.mx_id);
|
||||||
cmbCaminho.Items.Clear();
|
cmbCaminho.Items.Clear();
|
||||||
cmbCaminho.Items.AddRange(Cameras.Values.ToArray());
|
cmbCaminho.Items.AddRange(Cameras.Values.ToArray());
|
||||||
string IDrua = CameraWorkerService.CameraCaminho.Id;
|
string IDrua = CameraWorkerService.CameraCaminho.Id;
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ namespace AgroBase.Forms
|
||||||
private void frmSimulacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e)
|
private void frmSimulacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e)
|
||||||
{
|
{
|
||||||
tmrLeitura?.Dispose();
|
tmrLeitura?.Dispose();
|
||||||
Variaveis.OperacaoEmAndamento.Iniciado = false;
|
Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTime t0 = DateTime.Now;
|
DateTime t0 = DateTime.Now;
|
||||||
|
|
@ -115,6 +115,7 @@ namespace AgroBase.Forms
|
||||||
return;
|
return;
|
||||||
AtualizandoTela = true;
|
AtualizandoTela = true;
|
||||||
|
|
||||||
|
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
||||||
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
||||||
var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria;
|
var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria;
|
||||||
|
|
||||||
|
|
@ -124,9 +125,9 @@ namespace AgroBase.Forms
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
lblStatusOperacao.Text = $"Operação: {_Sensoriamento.StatusOperacao}";
|
lblStatusOperacao.Text = $"Operação: {_Sensoriamento.Operacao.StatusOperacaoAtual}";
|
||||||
if (_Sensoriamento.StatusOperacao == StatusOperacao.Aguardando) lblStatusOperacao.Text += $" ({_Sensoriamento.TempoAguardandoSeg:0})";
|
if (_Sensoriamento.Operacao.StatusOperacaoAtual == StatusOperacao.Aguardando) lblStatusOperacao.Text += $" ({_Sensoriamento.Operacao.TempoAguardandoSeg:0})";
|
||||||
lblTipoMovimento.Text = (_Sensoriamento.Controle?.TipoMovimento ?? TipoMovimentoDirecional.Diagnostico).ToString();
|
lblTipoMovimento.Text = (_Controle?.TipoMovimento ?? TipoMovimentoDirecional.Diagnostico).ToString();
|
||||||
|
|
||||||
if (_Trajetoria == null)
|
if (_Trajetoria == null)
|
||||||
{
|
{
|
||||||
|
|
@ -148,7 +149,7 @@ namespace AgroBase.Forms
|
||||||
lblDistanciaOperacao.Text = $"Distância Operação: {_Sensoriamento.Trajetoria.DistanciaPercorrida:F2} m de {_Sensoriamento.Trajetoria.DistanciaTotal:F2} m";
|
lblDistanciaOperacao.Text = $"Distância Operação: {_Sensoriamento.Trajetoria.DistanciaPercorrida:F2} m de {_Sensoriamento.Trajetoria.DistanciaTotal:F2} m";
|
||||||
lblDistanciaFinal.Text = $"Distância Restante: {_Sensoriamento.Trajetoria.DistanciaRestante:F2} m";
|
lblDistanciaFinal.Text = $"Distância Restante: {_Sensoriamento.Trajetoria.DistanciaRestante:F2} m";
|
||||||
//lblDistanciaLateral.Text = $"Esq: {_Sensoriamento.Trajetoria.DistanciaEsquerda:F2} m - Dir: {_Sensoriamento.Trajetoria.DistanciaDireita:F2} m {Variaveis.OperacaoEmAndamento.Controle.ErroLateral:F2} m";
|
//lblDistanciaLateral.Text = $"Esq: {_Sensoriamento.Trajetoria.DistanciaEsquerda:F2} m - Dir: {_Sensoriamento.Trajetoria.DistanciaDireita:F2} m {Variaveis.OperacaoEmAndamento.Controle.ErroLateral:F2} m";
|
||||||
lblDistanciaLateral.Text = $"h: {h:F2} m, p: {_Sensoriamento.Controle.SimulacaoMPC.Count}, s: {_Sensoriamento.Controle.DebugCustoMpc.Count}";
|
lblDistanciaLateral.Text = $"h: {h:F2} m, p: {_Controle.SimulacaoMPC.Count}, s: {_Controle.DebugCustoMpc.Count}";
|
||||||
lblRua.Text = $"Corredor: " + (_Sensoriamento.Trajetoria.CorredorAtual.Dentro ? "Dentro" : "Fora");
|
lblRua.Text = $"Corredor: " + (_Sensoriamento.Trajetoria.CorredorAtual.Dentro ? "Dentro" : "Fora");
|
||||||
lblMargem.Text = $"Margem: " + (_Sensoriamento.Trajetoria.NaMargemDoCorredor ? "Sim" : "Não");
|
lblMargem.Text = $"Margem: " + (_Sensoriamento.Trajetoria.NaMargemDoCorredor ? "Sim" : "Não");
|
||||||
lblProximoPonto.Text = $"Próximo Ponto: {_Sensoriamento.Trajetoria.ProximoPonto.idxPonto}";
|
lblProximoPonto.Text = $"Próximo Ponto: {_Sensoriamento.Trajetoria.ProximoPonto.idxPonto}";
|
||||||
|
|
@ -156,7 +157,7 @@ namespace AgroBase.Forms
|
||||||
lblDistProx.Text = $"Distância Próximo Ponto: {_Sensoriamento.Trajetoria.ProximoPonto.DistanciaTrajeto:F2} m";
|
lblDistProx.Text = $"Distância Próximo Ponto: {_Sensoriamento.Trajetoria.ProximoPonto.DistanciaTrajeto:F2} m";
|
||||||
lblDistAnt.Text = $"Distância Ponto Anterior: {_Sensoriamento.Trajetoria.PontoMaisProximo.DistanciaTrajeto:F2} m";
|
lblDistAnt.Text = $"Distância Ponto Anterior: {_Sensoriamento.Trajetoria.PontoMaisProximo.DistanciaTrajeto:F2} m";
|
||||||
lblTempoRestante.Text = $"Tempo Restante: {_Sensoriamento.Trajetoria.TempoEstimadoRestante}";
|
lblTempoRestante.Text = $"Tempo Restante: {_Sensoriamento.Trajetoria.TempoEstimadoRestante}";
|
||||||
lblTempoOperacao.Text = $"Tempo: " + _Sensoriamento.TempoDecorrido.ToString("HH:mm:ss") + $" de {_Sensoriamento.Trajetoria.TempoEstimadoOperacao}";
|
lblTempoOperacao.Text = $"Tempo: " + _Sensoriamento.Operacao.TempoDecorrido.ToString("HH:mm:ss") + $" de {_Sensoriamento.Trajetoria.TempoEstimadoOperacao}";
|
||||||
lblPercentualRua.Text = $"Rua: {_Sensoriamento.Trajetoria.CorredorAtual.Progresso:F2}%";
|
lblPercentualRua.Text = $"Rua: {_Sensoriamento.Trajetoria.CorredorAtual.Progresso:F2}%";
|
||||||
lblPercentualOperacao.Text = $"Operação: {_Sensoriamento.Trajetoria.ProgressoTrajeto:F2}%";
|
lblPercentualOperacao.Text = $"Operação: {_Sensoriamento.Trajetoria.ProgressoTrajeto:F2}%";
|
||||||
|
|
||||||
|
|
@ -165,9 +166,9 @@ namespace AgroBase.Forms
|
||||||
pnlAnguloControle.Invalidate();
|
pnlAnguloControle.Invalidate();
|
||||||
pnlOrientacaoCarro.Invalidate();
|
pnlOrientacaoCarro.Invalidate();
|
||||||
|
|
||||||
if (_Sensoriamento.Controle.SimulacaoMPC != null)
|
if (_Controle.SimulacaoMPC != null)
|
||||||
{
|
{
|
||||||
simulacao = _Sensoriamento.Controle.SimulacaoMPC;
|
simulacao = _Controle.SimulacaoMPC;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -190,7 +191,7 @@ namespace AgroBase.Forms
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado)
|
if (!Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada)
|
||||||
{
|
{
|
||||||
if (btnIniciarSimulacao.Text.Contains("Parar"))
|
if (btnIniciarSimulacao.Text.Contains("Parar"))
|
||||||
{
|
{
|
||||||
|
|
@ -280,7 +281,7 @@ namespace AgroBase.Forms
|
||||||
|
|
||||||
double anguloControle = 0.0;
|
double anguloControle = 0.0;
|
||||||
TipoMovimentoDirecional tipoMovimento = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento;
|
TipoMovimentoDirecional tipoMovimento = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento;
|
||||||
double veloccidade = (Variaveis.OperacaoEmAndamento.StatusAtual == StatusOperacao.Concluido || Variaveis.OperacaoEmAndamento.StatusAtual == StatusOperacao.Aguardando) ? 0 : velocidadeCarroMs;
|
double veloccidade = (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.StatusOperacaoAtual == StatusOperacao.Concluido || Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.StatusOperacaoAtual == StatusOperacao.Aguardando) ? 0 : velocidadeCarroMs;
|
||||||
|
|
||||||
var tipoControle = Variaveis.OperacaoEmAndamento.Parametros.Controle.DirTipoMovimento;
|
var tipoControle = Variaveis.OperacaoEmAndamento.Parametros.Controle.DirTipoMovimento;
|
||||||
|
|
||||||
|
|
@ -374,13 +375,13 @@ namespace AgroBase.Forms
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado && !parar)
|
if (!Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada && !parar)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.IniciarSimulacao();
|
Variaveis.OperacaoEmAndamento.IniciarSimulacao();
|
||||||
}
|
}
|
||||||
|
|
||||||
btnIniciarSimulacao.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Parar Simulação" : "Iniciar Simulação";
|
btnIniciarSimulacao.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada ? "Parar Simulação" : "Iniciar Simulação";
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada)
|
||||||
{
|
{
|
||||||
GPSService.PenultimaLeitura.Latitude = GPSService.UltimaLeitura.Latitude;
|
GPSService.PenultimaLeitura.Latitude = GPSService.UltimaLeitura.Latitude;
|
||||||
GPSService.PenultimaLeitura.Longitude = GPSService.UltimaLeitura.Longitude;
|
GPSService.PenultimaLeitura.Longitude = GPSService.UltimaLeitura.Longitude;
|
||||||
|
|
@ -569,7 +570,7 @@ namespace AgroBase.Forms
|
||||||
Heartbeat = GPSService.UltimaLeitura.Heartbeat,
|
Heartbeat = GPSService.UltimaLeitura.Heartbeat,
|
||||||
OrientacaoReal = double.Parse(txtAnguloGPS.Text.Replace(".", ",")),
|
OrientacaoReal = double.Parse(txtAnguloGPS.Text.Replace(".", ",")),
|
||||||
};
|
};
|
||||||
GPSService.EnviarCoordenadasParaMapa(VariaveisOperacao.PosicaoBase.Latitude, VariaveisOperacao.PosicaoBase.Longitude, VariaveisOperacao.PosicaoBase.AnguloCarroDefinido, false, Variaveis.LoraBaseParametros.address);
|
GPSService.EnviarCoordenadasParaMapa(VariaveisOperacao.PosicaoBase.Latitude, VariaveisOperacao.PosicaoBase.Longitude, VariaveisOperacao.PosicaoBase.AnguloCarroDefinido, false, 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnLiberarCorredor_Click(object sender, EventArgs e)
|
private void btnLiberarCorredor_Click(object sender, EventArgs e)
|
||||||
|
|
|
||||||
|
|
@ -107,13 +107,15 @@ namespace AgroBase.Forms
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado && !parar)
|
bool iniciado = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada;
|
||||||
|
|
||||||
|
if (!iniciado && !parar)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.IniciarTreinamento();
|
Variaveis.OperacaoEmAndamento.IniciarTreinamento();
|
||||||
}
|
}
|
||||||
|
|
||||||
btnIniciarSimulacao.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Parar Treinamento" : "Iniciar Treinamento";
|
btnIniciarSimulacao.Text = iniciado ? "Parar Treinamento" : "Iniciar Treinamento";
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
if (iniciado)
|
||||||
{
|
{
|
||||||
GPSService.PenultimaLeitura.Latitude = GPSService.UltimaLeitura.Latitude;
|
GPSService.PenultimaLeitura.Latitude = GPSService.UltimaLeitura.Latitude;
|
||||||
GPSService.PenultimaLeitura.Longitude = GPSService.UltimaLeitura.Longitude;
|
GPSService.PenultimaLeitura.Longitude = GPSService.UltimaLeitura.Longitude;
|
||||||
|
|
@ -129,7 +131,7 @@ namespace AgroBase.Forms
|
||||||
|
|
||||||
StatusCarro = _robotState.Current_State.Status;
|
StatusCarro = _robotState.Current_State.Status;
|
||||||
|
|
||||||
lblStatusOperacao.Text = "Operação: " + Enum.GetName(typeof(StatusOperacao), Variaveis.OperacaoEmAndamento.StatusAtual);
|
lblStatusOperacao.Text = "Operação: " + Enum.GetName(typeof(StatusOperacao), Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.StatusOperacaoAtual);
|
||||||
lblStatus.Text = "Carro: " + Enum.GetName(typeof(StatusCarroMapa), StatusCarro);
|
lblStatus.Text = "Carro: " + Enum.GetName(typeof(StatusCarroMapa), StatusCarro);
|
||||||
lblDirecao.Text = "Direção: " + Enum.GetName(typeof(DirecaoCarroRua), Variaveis.OperacaoEmAndamento.Trajetoria?.DirecaoCaminho ?? DirecaoCarroRua.Parado);
|
lblDirecao.Text = "Direção: " + Enum.GetName(typeof(DirecaoCarroRua), Variaveis.OperacaoEmAndamento.Trajetoria?.DirecaoCaminho ?? DirecaoCarroRua.Parado);
|
||||||
lblDistanciaOperacao.Text = "Distância Operação: " + (Variaveis.OperacaoEmAndamento.Trajetoria?.DistanciaTotal ?? 0).ToString("00.00") + " m";
|
lblDistanciaOperacao.Text = "Distância Operação: " + (Variaveis.OperacaoEmAndamento.Trajetoria?.DistanciaTotal ?? 0).ToString("00.00") + " m";
|
||||||
|
|
@ -145,7 +147,7 @@ namespace AgroBase.Forms
|
||||||
|
|
||||||
lblTempoEstimado.Text = "Tempo Estimado: " + Variaveis.OperacaoEmAndamento.Trajetoria?.TempoEstimadoRestante ?? "";
|
lblTempoEstimado.Text = "Tempo Estimado: " + Variaveis.OperacaoEmAndamento.Trajetoria?.TempoEstimadoRestante ?? "";
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
if (Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada)
|
||||||
{
|
{
|
||||||
pnlOrientacaoTrajeto.Invalidate();
|
pnlOrientacaoTrajeto.Invalidate();
|
||||||
pnlAnguloControle.Invalidate();
|
pnlAnguloControle.Invalidate();
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ namespace AgroBase.Forms
|
||||||
lblGPSDetalhes.Text = $"{Gps.QualidadeFix} - {Gps.PrecisaoCm:F2} cm";
|
lblGPSDetalhes.Text = $"{Gps.QualidadeFix} - {Gps.PrecisaoCm:F2} cm";
|
||||||
}
|
}
|
||||||
|
|
||||||
lblPerformance.Text = Variaveis.OperacaoEmAndamento.DadosPerformance.PerformanceStr;
|
lblPerformance.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.DadosPerformance.PerformanceStr;
|
||||||
|
|
||||||
lblSen_Latencia.Text = $"Latencia de Loop: {Variaveis.OperacaoEmAndamento.DispSen.Dados?.DadosLeitura?.LatenciaLoop ?? 0} ms";
|
lblSen_Latencia.Text = $"Latencia de Loop: {Variaveis.OperacaoEmAndamento.DispSen.Dados?.DadosLeitura?.LatenciaLoop ?? 0} ms";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using AgroBase.Models;
|
using AgroBase.Models;
|
||||||
using AgroBase.Services.Operadores;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
|
@ -19,7 +18,7 @@ namespace AgroBase.Forms
|
||||||
|
|
||||||
private void btnAtualizar_Click(object sender, EventArgs e)
|
private void btnAtualizar_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
OperacaoModel.PopularTreeView(tvwFalhas, HealthWorkerService.ModulosSaude);
|
OperacaoModel.PopularTreeView(tvwFalhas, Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -70,14 +70,14 @@ namespace AgroBase.Forms
|
||||||
|
|
||||||
if (GPSService.Iniciado)
|
if (GPSService.Iniciado)
|
||||||
{
|
{
|
||||||
int ID = Convert.ToInt32(Variaveis.IsAgroMonitor ? LoRaBaseService.parametrosModel.address : Variaveis.LoraService.ParametrosSet.address);
|
int ID = 0x02; // Convert.ToInt32(Variaveis.IsAgroMonitor ? LoRaBaseService.parametrosModel.address : Variaveis.LoraService.ParametrosSet.address);
|
||||||
GPSService.EnviarCoordenadasParaMapa(Gps.Latitude, Gps.Longitude, Gps.AnguloCarroDefinido, true, ID);
|
GPSService.EnviarCoordenadasParaMapa(Gps.Latitude, Gps.Longitude, Gps.AnguloCarroDefinido, true, ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Variaveis.LoraService.Iniciado && Variaveis.LoraService._ultimoRxDados > DateTime.UtcNow.AddSeconds(-60))
|
if (VariaveisOperacao.PosicaoBase.Inicializado && VariaveisOperacao.PosicaoBase.UltimoComandoRespondido > DateTime.UtcNow.AddSeconds(-60))
|
||||||
{
|
{
|
||||||
var GpsBase = VariaveisOperacao.PosicaoBase;
|
var GpsBase = VariaveisOperacao.PosicaoBase;
|
||||||
GPSService.EnviarCoordenadasParaMapa(GpsBase.Latitude, GpsBase.Longitude, GpsBase.AnguloCarroDefinido, false, Variaveis.LoraBaseParametros.address);
|
GPSService.EnviarCoordenadasParaMapa(GpsBase.Latitude, GpsBase.Longitude, GpsBase.AnguloCarroDefinido, false, 0x01);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ namespace AgroBase.Forms
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(sucesso, par) = await Variaveis.LoraService?.RequisitarParametrosModulo();
|
//(sucesso, par) = await Variaveis.LoraService?.RequisitarParametrosModulo();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sucesso)
|
if (!sucesso)
|
||||||
|
|
@ -96,19 +96,19 @@ namespace AgroBase.Forms
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var MensagemDisponivel = Variaveis.LoraService.MensagensRecebidasAvulsas.FirstOrDefault(x => !x.Lido);
|
//var MensagemDisponivel = Variaveis.LoraService.MensagensRecebidasAvulsas.FirstOrDefault(x => !x.Lido);
|
||||||
if (MensagemDisponivel != null)
|
//if (MensagemDisponivel != null)
|
||||||
{
|
//{
|
||||||
MensagemDisponivel.Lido = true;
|
// MensagemDisponivel.Lido = true;
|
||||||
AtualizarConsole(MensagemDisponivel.Remetente, MensagemDisponivel.Destinatario, MensagemDisponivel.Mensagem);
|
// AtualizarConsole(MensagemDisponivel.Remetente, MensagemDisponivel.Destinatario, MensagemDisponivel.Mensagem);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarDadosTela()
|
private void AtualizarDadosTela()
|
||||||
{
|
{
|
||||||
bool loraConectado = Variaveis.IsAgroMonitor ? LoRaBaseService.Iniciado : Variaveis.LoraService.Iniciado;
|
bool loraConectado = false; // Variaveis.IsAgroMonitor ? LoRaBaseService.Iniciado : Variaveis.LoraService.Iniciado;
|
||||||
|
|
||||||
cmbPorta.Items.Clear();
|
cmbPorta.Items.Clear();
|
||||||
cmbPorta.Items.AddRange(SerialPort.GetPortNames().ToArray());
|
cmbPorta.Items.AddRange(SerialPort.GetPortNames().ToArray());
|
||||||
|
|
@ -158,7 +158,7 @@ namespace AgroBase.Forms
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(Sucesso, par) = await Variaveis.LoraService?.RedefinirParametros(Parametros);
|
//(Sucesso, par) = await Variaveis.LoraService?.RedefinirParametros(Parametros);
|
||||||
}
|
}
|
||||||
if (Sucesso)
|
if (Sucesso)
|
||||||
{
|
{
|
||||||
|
|
@ -208,7 +208,7 @@ namespace AgroBase.Forms
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Variaveis.LoraService.EnviarDadosLoRaViaCAN(payload.ToArray());
|
//Variaveis.LoraService.EnviarDadosLoRaViaCAN(payload.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageBox.Show("Dados enviados com sucesso: " + FuncoesGlobais.ConverterComandoBytesParaTexto(payload.ToArray()));
|
MessageBox.Show("Dados enviados com sucesso: " + FuncoesGlobais.ConverterComandoBytesParaTexto(payload.ToArray()));
|
||||||
|
|
|
||||||
|
|
@ -91,11 +91,11 @@ namespace AgroBase.Forms
|
||||||
ID = x.ID,
|
ID = x.ID,
|
||||||
Funcoes = x.Funcoes
|
Funcoes = x.Funcoes
|
||||||
}));
|
}));
|
||||||
Dispositivos.Add(new DispositivoDataModel()
|
//Dispositivos.Add(new DispositivoDataModel()
|
||||||
{
|
//{
|
||||||
ID = Variaveis.LoraService.ID,
|
// ID = Variaveis.LoraService.ID,
|
||||||
Funcoes = Variaveis.LoraService.Funcoes
|
// Funcoes = Variaveis.LoraService.Funcoes
|
||||||
});
|
//});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case T_Code.Atu:
|
case T_Code.Atu:
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,8 @@ namespace AgroBase
|
||||||
|
|
||||||
private async Task tmrLoopDispositivos_Tick()
|
private async Task tmrLoopDispositivos_Tick()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
AtualizaDadosGerais();
|
AtualizaDadosGerais();
|
||||||
|
|
||||||
lblStripMqtt.Text = "MQTT: " + (Variaveis.MqttServiceLocal.StatusConexao() ? "Conectado" : "Desconectado");
|
lblStripMqtt.Text = "MQTT: " + (Variaveis.MqttServiceLocal.StatusConexao() ? "Conectado" : "Desconectado");
|
||||||
|
|
@ -103,8 +105,8 @@ namespace AgroBase
|
||||||
lblStripPython.Text = "IA: " + (VariaveisOperacao.Operadores.Conectado ? "Conectado" : "Desconectado");
|
lblStripPython.Text = "IA: " + (VariaveisOperacao.Operadores.Conectado ? "Conectado" : "Desconectado");
|
||||||
lblStripPython.ForeColor = VariaveisOperacao.Operadores.Conectado ? Color.Green : Color.Red;
|
lblStripPython.ForeColor = VariaveisOperacao.Operadores.Conectado ? Color.Green : Color.Red;
|
||||||
|
|
||||||
lblStripOperacaoLiberada.Text = "Operação Liberada: " + (Variaveis.OperacaoEmAndamento.OperacaoLiberada ? "Sim" : "Não");
|
lblStripOperacaoLiberada.Text = "Operação Liberada: " + (op.Sensoriamento.Operacao.OperacaoLiberada ? "Sim" : "Não");
|
||||||
lblStripOperacaoLiberada.ForeColor = Variaveis.OperacaoEmAndamento.OperacaoLiberada ? Color.Green : Color.Red;
|
lblStripOperacaoLiberada.ForeColor = op.Sensoriamento.Operacao.OperacaoLiberada ? Color.Green : Color.Red;
|
||||||
|
|
||||||
Variaveis.DebugMode = chbDebugMode.Checked;
|
Variaveis.DebugMode = chbDebugMode.Checked;
|
||||||
}
|
}
|
||||||
|
|
@ -211,19 +213,21 @@ namespace AgroBase
|
||||||
|
|
||||||
private void btnIniciarOperacao_Click(object sender, EventArgs e)
|
private void btnIniciarOperacao_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
if (op.Sensoriamento.Operacao.OperacaoIniciada)
|
||||||
{
|
{
|
||||||
Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao());
|
Task.Run(async () => await op.FinalizarOperacao());
|
||||||
|
|
||||||
btnIniciarOperacao.Text = "Abrir Operação";
|
btnIniciarOperacao.Text = "Abrir Operação";
|
||||||
cmbModoOperacao.Enabled = true;
|
cmbModoOperacao.Enabled = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.AbrirForm();
|
op.AbrirForm();
|
||||||
}
|
}
|
||||||
|
|
||||||
lblStripOperacaoStatus.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Iniciado" : "Não iniciado";
|
lblStripOperacaoStatus.Text = op.Sensoriamento.Operacao.OperacaoIniciada ? "Iniciado" : "Não iniciado";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnConfigurarOperacao_Click(object sender, EventArgs e)
|
private void btnConfigurarOperacao_Click(object sender, EventArgs e)
|
||||||
|
|
@ -397,7 +401,7 @@ namespace AgroBase
|
||||||
|
|
||||||
private void btnLoRaConfig_Click(object sender, EventArgs e)
|
private void btnLoRaConfig_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (Variaveis.LoraService.Iniciado)
|
if (false)//(Variaveis.LoraService.Iniciado)
|
||||||
{
|
{
|
||||||
frmLoraConfig frm = new frmLoraConfig();
|
frmLoraConfig frm = new frmLoraConfig();
|
||||||
frm.Show();
|
frm.Show();
|
||||||
|
|
@ -473,7 +477,7 @@ namespace AgroBase
|
||||||
|
|
||||||
private void lblStripOperacaoLiberada_Click(object sender, EventArgs e)
|
private void lblStripOperacaoLiberada_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
MessageBox.Show($"{Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada}", "Status da Operacao", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
MessageBox.Show($"{Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada}", "Status da Operacao", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,4 @@
|
||||||
using System;
|
using static AgroBase.Models.Enums;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using static AgroBase.Models.Enums;
|
|
||||||
|
|
||||||
namespace AgroBase.Models
|
namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,294 +0,0 @@
|
||||||
using AgroBase.Services;
|
|
||||||
using Microsoft.Web.WebView2.WinForms;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace AgroBase.Models
|
|
||||||
{
|
|
||||||
public class CameraCaminhoModel
|
|
||||||
{
|
|
||||||
public Bitmap bitmapSegmentado;
|
|
||||||
|
|
||||||
public string ID { get; set; }
|
|
||||||
public string Nome { get; set; }
|
|
||||||
public int Posicao { get; set; }
|
|
||||||
public bool Iniciada { get; set; } = false;
|
|
||||||
public CameraService camera { get; set; }
|
|
||||||
public WebView2 browserRgb { get; set; }
|
|
||||||
public Panel panelRgb { get; set; }
|
|
||||||
public WebView2 browserHeatmap { get; set; }
|
|
||||||
public Panel panelHeatmap { get; set; }
|
|
||||||
public ComboBox combo { get; set; }
|
|
||||||
public string ArquivoLeitura { get; set; }
|
|
||||||
public int MaxLeituras { get; set; }
|
|
||||||
public string VideoPorta { get; set; }
|
|
||||||
public string VideoRgbUrl { get; set; }
|
|
||||||
public string VideoHeatmapUrl { get; set; }
|
|
||||||
public string DeviceID { get; set; }
|
|
||||||
public string MqttTopico { get; set; } = "street_detector";
|
|
||||||
|
|
||||||
public Dictionary<string, Color> ClassMap = new Dictionary<string, Color>()
|
|
||||||
{
|
|
||||||
{ "background", Color.Black },
|
|
||||||
{ "rua", Color.DarkRed },
|
|
||||||
{ "cana", Color.DarkGreen },
|
|
||||||
{ "ceu", Color.Gold },
|
|
||||||
};
|
|
||||||
|
|
||||||
public CameraDeepLabV3PlusModel Leitura { get; set; } = new CameraDeepLabV3PlusModel();
|
|
||||||
public List<Point> PontosExtremos { get; set; } = new List<Point>();
|
|
||||||
public double Angulo { get; set; }
|
|
||||||
public double AnguloEsquerdo { get; set; }
|
|
||||||
public double AnguloDireito { get; set; }
|
|
||||||
|
|
||||||
public DateTime UltimaMensagemRecebida { get; set; } = DateTime.MinValue;
|
|
||||||
public DateTime UltimaMensagemProcessada { get; set; } = DateTime.MinValue;
|
|
||||||
|
|
||||||
public SonarCamModel Sonar { get; set; } = new SonarCamModel();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void DesligarCamera()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Iniciada = false;
|
|
||||||
Variaveis.MqttServiceLocal.Topicos.Remove(camera._mqttTopico);
|
|
||||||
if (panelRgb != null)
|
|
||||||
{
|
|
||||||
panelRgb.Controls.Remove(browserRgb);
|
|
||||||
}
|
|
||||||
browserRgb = null;
|
|
||||||
Task.Run(async () => await Variaveis.MqttServiceLocal.UnsubscribeAsync(camera._mqttTopico));
|
|
||||||
|
|
||||||
lock (camera.processLock)
|
|
||||||
{
|
|
||||||
if (camera.pythonProcess != null)
|
|
||||||
{
|
|
||||||
camera.pythonProcess.Kill();
|
|
||||||
camera.pythonProcess = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<Point> DefinirPontosExtremos(List<Point> PontosCamera)
|
|
||||||
{
|
|
||||||
if (!PontosCamera.Any())
|
|
||||||
{
|
|
||||||
return new List<Point>();
|
|
||||||
}
|
|
||||||
List<Point> Pontos = new List<Point>()
|
|
||||||
{
|
|
||||||
new Point(9999, -1), // Ponto 0 - Mais a esquerda e abaixo
|
|
||||||
new Point(9999, -1), // Ponto 1 - Mais a esquerda e abaixo, e esquerda > Ponto0.X
|
|
||||||
new Point(9999, 9999), // Ponto 2 - Mais a esquerda e acima
|
|
||||||
new Point(-1, 9999), // Ponto 3 - Mais a direita e acima
|
|
||||||
new Point(-1, -1), // Ponto 4 - Mais a direita e abaixo, e direita < Ponto5.X
|
|
||||||
new Point(-1, -1), // Ponto 5 - Mais a direita e abaixo
|
|
||||||
};
|
|
||||||
|
|
||||||
foreach (var Ponto in PontosCamera)
|
|
||||||
{
|
|
||||||
// Ponto 0 - Mais a esquerda e abaixo
|
|
||||||
if (Ponto.X < Pontos[0].X)
|
|
||||||
{
|
|
||||||
Pontos[0] = new Point() { X = Ponto.X, Y = Ponto.Y };
|
|
||||||
}
|
|
||||||
// Ponto 5 - Mais a direita e abaixo
|
|
||||||
if (Ponto.X > Pontos[5].X)
|
|
||||||
{
|
|
||||||
Pontos[5] = new Point() { X = Ponto.X, Y = Ponto.Y };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var Ponto0 = PontosCamera.Where(Ponto => Ponto.X == Pontos[0].X).OrderByDescending(Ponto => Ponto.Y).First();
|
|
||||||
Pontos[0] = Ponto0;
|
|
||||||
var Ponto5 = PontosCamera.Where(Ponto => Ponto.X == Pontos[5].X).OrderByDescending(Ponto => Ponto.Y).First();
|
|
||||||
Pontos[5] = Ponto5;
|
|
||||||
|
|
||||||
foreach (var Ponto in PontosCamera)
|
|
||||||
{
|
|
||||||
// Ponto 1 - Mais a esquerda e abaixo, e esquerda > Ponto0.X
|
|
||||||
if (Ponto.X < Pontos[1].X && Ponto.X > Ponto0.X)
|
|
||||||
{
|
|
||||||
Pontos[1] = new Point() { X = Ponto.X, Y = Ponto.Y };
|
|
||||||
}
|
|
||||||
// Ponto 4 Mais a direita e abaixo, e direita < Ponto5.X
|
|
||||||
if (Ponto.X > Pontos[4].X && Ponto.X < Ponto5.X)
|
|
||||||
{
|
|
||||||
Pontos[4] = new Point() { X = Ponto.X, Y = Ponto.Y };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var Ponto1 = PontosCamera.Where(Ponto => Ponto.X == Pontos[1].X).OrderByDescending(Ponto => Ponto.Y).First();
|
|
||||||
Pontos[1] = Ponto1;
|
|
||||||
var Ponto4 = PontosCamera.Where(Ponto => Ponto.X == Pontos[4].X).OrderByDescending(Ponto => Ponto.Y).First();
|
|
||||||
Pontos[4] = Ponto4;
|
|
||||||
|
|
||||||
int Y_min = PontosCamera.OrderBy(Ponto => Ponto.Y).First().Y;
|
|
||||||
foreach (var Ponto in PontosCamera.Where(x => x.Y == Y_min))
|
|
||||||
{
|
|
||||||
// Ponto 2 - Mais a esquerda e acima
|
|
||||||
if (Ponto.X < Pontos[2].X)
|
|
||||||
{
|
|
||||||
Pontos[2] = new Point() { X = Ponto.X, Y = Ponto.Y };
|
|
||||||
}
|
|
||||||
// Ponto 3 - Mais a direita e acima
|
|
||||||
if (Ponto.X > Pontos[3].X)
|
|
||||||
{
|
|
||||||
Pontos[3] = new Point() { X = Ponto.X, Y = Ponto.Y };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Pontos;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 🔹 Gera um mapa de calor corretamente escalado
|
|
||||||
public Bitmap GenerateHeatmapBitmap()
|
|
||||||
{
|
|
||||||
double MaxDepth = 10000;
|
|
||||||
var depth_data = Leitura.depth_data;
|
|
||||||
|
|
||||||
if (depth_data == null || depth_data.Count == 0)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
//throw new InvalidOperationException("Dados de profundidade inválidos.");
|
|
||||||
}
|
|
||||||
|
|
||||||
int height = depth_data.Count;
|
|
||||||
int width = depth_data[0].Count;
|
|
||||||
|
|
||||||
Bitmap heatmap = new Bitmap(width, height);
|
|
||||||
|
|
||||||
for (int y = 0; y < height; y++)
|
|
||||||
{
|
|
||||||
for (int x = 0; x < width; x++)
|
|
||||||
{
|
|
||||||
int depth = depth_data[y][x];
|
|
||||||
|
|
||||||
// 🔹 Normaliza a profundidade entre 0 (vermelho, perto) e 10.000 mm (azul, longe)
|
|
||||||
int normalized = (int)FuncoesMatematicas.Clamp(255 - ((depth * 255) / MaxDepth), 0, 255);
|
|
||||||
|
|
||||||
Color color = ApplyJetColormap(normalized);
|
|
||||||
heatmap.SetPixel(x, y, color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return heatmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 🔹 Função para converter um valor normalizado (0-255) para um colormap "Jet" correto
|
|
||||||
private Color ApplyJetColormap(int value)
|
|
||||||
{
|
|
||||||
double normalized = value / 255.0;
|
|
||||||
|
|
||||||
int r = (int)(FuncoesMatematicas.Clamp(255 * Math.Max(0, Math.Min(1, 1.5 - Math.Abs(normalized * 2 - 1.5))), 0, 255));
|
|
||||||
int g = (int)(FuncoesMatematicas.Clamp(255 * Math.Max(0, Math.Min(1, 1.5 - Math.Abs(normalized * 2 - 1.0))), 0, 255));
|
|
||||||
int b = (int)(FuncoesMatematicas.Clamp(255 * Math.Max(0, Math.Min(1, 1.5 - Math.Abs(normalized * 2 - 0.5))), 0, 255));
|
|
||||||
|
|
||||||
return Color.FromArgb(r, g, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class GridMap
|
|
||||||
{
|
|
||||||
public int x_max { get; set; }
|
|
||||||
public int y_max { get; set; }
|
|
||||||
public Subdivisoes subdivisoes_cima { get; set; }
|
|
||||||
public Subdivisoes subdivisoes_chao { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Subdivisoes
|
|
||||||
{
|
|
||||||
public int num_linhas { get; set; }
|
|
||||||
public int num_colunas { get; set; }
|
|
||||||
public List<Celula> celulas { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Celula
|
|
||||||
{
|
|
||||||
public int linha { get; set; }
|
|
||||||
public int coluna { get; set; }
|
|
||||||
public int x { get; set; }
|
|
||||||
public int y { get; set; }
|
|
||||||
public int largura { get; set; }
|
|
||||||
public int altura { get; set; }
|
|
||||||
public double profundidade_calibragem { get; set; }
|
|
||||||
public double profundidade_media { get; set; }
|
|
||||||
public double dif_profundidade
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return profundidade_media - profundidade_calibragem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public Color cor
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
double margem = 200;
|
|
||||||
|
|
||||||
if (dif_profundidade < margem)
|
|
||||||
{
|
|
||||||
return Color.Red;
|
|
||||||
}
|
|
||||||
else if (dif_profundidade > margem)
|
|
||||||
{
|
|
||||||
return Color.Gold;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Color.Transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class GridDrawer
|
|
||||||
{
|
|
||||||
public static GridMap LoadJson(string json)
|
|
||||||
{
|
|
||||||
return JsonConvert.DeserializeObject<GridMap>(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Bitmap DrawGridOnBitmap(GridMap gridMap, Bitmap image)
|
|
||||||
{
|
|
||||||
Bitmap output = new Bitmap(image);
|
|
||||||
using (Graphics g = Graphics.FromImage(output))
|
|
||||||
{
|
|
||||||
foreach (var celula in gridMap.subdivisoes_chao.celulas)
|
|
||||||
{
|
|
||||||
using (Brush brush = new SolidBrush(Color.FromArgb(100, celula.cor))) // 100 = opacidade
|
|
||||||
{
|
|
||||||
g.FillRectangle(brush, celula.x, celula.y, celula.largura, celula.altura);
|
|
||||||
}
|
|
||||||
g.DrawRectangle(Pens.White, celula.x, celula.y, celula.largura, celula.altura);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var celula in gridMap.subdivisoes_cima.celulas)
|
|
||||||
{
|
|
||||||
using (Brush brush = new SolidBrush(Color.FromArgb(100, celula.cor)))
|
|
||||||
{
|
|
||||||
g.FillRectangle(brush, celula.x, celula.y, celula.largura, celula.altura);
|
|
||||||
}
|
|
||||||
g.DrawRectangle(Pens.White, celula.x, celula.y, celula.largura, celula.altura);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace AgroBase.Models
|
namespace AgroBase.Models
|
||||||
|
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
using AgroBase.Services;
|
|
||||||
using Microsoft.Web.WebView2.WinForms;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace AgroBase.Models
|
|
||||||
{
|
|
||||||
public class CameraSoloModel
|
|
||||||
{
|
|
||||||
public CameraSoloModel()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DesligarCamera()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Iniciada = false;
|
|
||||||
Variaveis.MqttServiceLocal.Topicos.Remove(camera._mqttTopico);
|
|
||||||
if (panel != null)
|
|
||||||
{
|
|
||||||
panel.Controls.Remove(browser);
|
|
||||||
}
|
|
||||||
browser = null;
|
|
||||||
Task.Run(async () => await Variaveis.MqttServiceLocal.UnsubscribeAsync(camera._mqttTopico));
|
|
||||||
lock (camera.processLock)
|
|
||||||
{
|
|
||||||
if (camera.pythonProcess != null)
|
|
||||||
{
|
|
||||||
camera.pythonProcess.Kill();
|
|
||||||
camera.pythonProcess = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public string ID { get; set; }
|
|
||||||
public string Nome { get; set; }
|
|
||||||
public int Posicao { get; set; }
|
|
||||||
public bool Iniciada { get; set; } = false;
|
|
||||||
public CameraService camera { get; set; } = new CameraService();
|
|
||||||
public WebView2 browser { get; set; }
|
|
||||||
public Panel panel { get;set; }
|
|
||||||
public ComboBox combo { get;set; }
|
|
||||||
public string ArquivoLeitura { get; set; }
|
|
||||||
public int MaxLeituras { get; set; }
|
|
||||||
public string VideoPorta { get; set; }
|
|
||||||
public string VideoUrl { get; set; }
|
|
||||||
public string MqttTopico { get; set; } = "weed_detector";
|
|
||||||
public string DeviceID { get; set; }
|
|
||||||
public CameraCoordenadasFrameModel Leitura { get; set; } = new CameraCoordenadasFrameModel();
|
|
||||||
|
|
||||||
public int ErvasNoRadar { get; set; }
|
|
||||||
|
|
||||||
public DateTime UltimaMensagemRecebida { get; set; } = DateTime.MinValue;
|
|
||||||
public DateTime UltimaMensagemProcessada { get; set; } = DateTime.MinValue;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using AgroBase.Services;
|
using System;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using AgroBase.Services.Operadores;
|
using System;
|
||||||
using System;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using static AgroBase.Models.Enums;
|
using static AgroBase.Models.Enums;
|
||||||
|
|
||||||
|
|
@ -38,11 +37,12 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
public void AtualizarDados()
|
public void AtualizarDados()
|
||||||
{
|
{
|
||||||
Status = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo)?.status ?? StatusModulo.Desconectado;
|
var saude = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorSaude?.ModulosSaude;
|
||||||
Saude = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo)?.saude ?? 0;
|
Status = saude.FirstOrDefault(x => x.modulo == Dispositivo)?.status ?? StatusModulo.Desconectado;
|
||||||
|
Saude = saude.FirstOrDefault(x => x.modulo == Dispositivo)?.saude ?? 0;
|
||||||
|
|
||||||
var motivos = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo)?.motivos ?? new System.Collections.Generic.List<string>();
|
var motivos = saude.FirstOrDefault(x => x.modulo == Dispositivo)?.motivos ?? new System.Collections.Generic.List<string>();
|
||||||
var cond_op = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo)?.condicoes_operacionais?.Select(x => x.descricao) ?? new System.Collections.Generic.List<string>();
|
var cond_op = saude.FirstOrDefault(x => x.modulo == Dispositivo)?.condicoes_operacionais?.Select(x => x.descricao) ?? new System.Collections.Generic.List<string>();
|
||||||
string motivos_str = string.Join(", ", motivos);
|
string motivos_str = string.Join(", ", motivos);
|
||||||
string cond_op_str = string.Join(", ", cond_op);
|
string cond_op_str = string.Join(", ", cond_op);
|
||||||
Erros = motivos_str + (motivos.Any() && cond_op.Any() ? ", " : "") + cond_op_str;
|
Erros = motivos_str + (motivos.Any() && cond_op.Any() ? ", " : "") + cond_op_str;
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,6 @@ namespace AgroBase.Models
|
||||||
public double Distancia { get; set; }
|
public double Distancia { get; set; }
|
||||||
public double OrientacaoMovimento { get; set; }
|
public double OrientacaoMovimento { get; set; }
|
||||||
public int NumeroSatelites { get; set; }
|
public int NumeroSatelites { get; set; }
|
||||||
//public CanCommandFreqModel<int> NumeroSatelites { get; set; } = new CanCommandFreqModel<int>();
|
|
||||||
public double PrecisaoHorizontal { get; set; }
|
public double PrecisaoHorizontal { get; set; }
|
||||||
public double CursoVerdadeiro { get; set; }
|
public double CursoVerdadeiro { get; set; }
|
||||||
public double OrientacaoReal { get; set; }
|
public double OrientacaoReal { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using AgroBase.Models;
|
||||||
using AgroBase.Models.Modules;
|
using AgroBase.Models.Modules;
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
using SharpDX.DirectInput;
|
using SharpDX.DirectInput;
|
||||||
using StackExchange.Redis;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
|
|
@ -20,7 +19,6 @@ namespace AgroBase
|
||||||
public static int MargemAnalogico = 100;
|
public static int MargemAnalogico = 100;
|
||||||
public static int MaximoAnalogico = 65534;
|
public static int MaximoAnalogico = 65534;
|
||||||
|
|
||||||
public static List<ComandosDispositivo> Comandos = new List<ComandosDispositivo>() { };
|
|
||||||
public static List<DeParaComandos> DeParaComandos = new List<DeParaComandos>()
|
public static List<DeParaComandos> DeParaComandos = new List<DeParaComandos>()
|
||||||
{
|
{
|
||||||
new DeParaComandos() { key = Keys.Left, botaoJoy = BotoesJoystick.SEsquerda, direcao = Direcao.Esquerda, Dispositivo = T_Code.Dir, PararAoSoltar = true },
|
new DeParaComandos() { key = Keys.Left, botaoJoy = BotoesJoystick.SEsquerda, direcao = Direcao.Esquerda, Dispositivo = T_Code.Dir, PararAoSoltar = true },
|
||||||
|
|
@ -55,10 +53,6 @@ namespace AgroBase
|
||||||
public static bool Pressionado = false;
|
public static bool Pressionado = false;
|
||||||
public static List<IDispositivosService> DispCon;
|
public static List<IDispositivosService> DispCon;
|
||||||
|
|
||||||
//public static int RPM { get; set; } = 60;
|
|
||||||
//public static double Angulo { get; set; } = 20;
|
|
||||||
//public static int Velocidade { get; set; } = 50;
|
|
||||||
|
|
||||||
public static AsyncTaskTimerModel tmrJoystick;
|
public static AsyncTaskTimerModel tmrJoystick;
|
||||||
|
|
||||||
public static void IniciarRotinas()
|
public static void IniciarRotinas()
|
||||||
|
|
@ -553,14 +547,16 @@ namespace AgroBase
|
||||||
|
|
||||||
private static void EnviarComandoMotorAtualizado(DeParaComandos Comando, string ID = "", bool ForcarComando = false)
|
private static void EnviarComandoMotorAtualizado(DeParaComandos Comando, string ID = "", bool ForcarComando = false)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
bool bloqueioAutomatico =
|
bool bloqueioAutomatico =
|
||||||
(Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico && Comando.Dispositivo == T_Code.Mov) ||
|
(op.Parametros.Controle.MovimentoAutomatico && Comando.Dispositivo == T_Code.Mov) ||
|
||||||
(Variaveis.OperacaoEmAndamento.Parametros.Controle.DirecionalAutomatico && Comando.Dispositivo == T_Code.Dir);
|
(op.Parametros.Controle.DirecionalAutomatico && Comando.Dispositivo == T_Code.Dir);
|
||||||
|
|
||||||
bool bloqueioOperacional =
|
bool bloqueioOperacional =
|
||||||
Variaveis.OperacaoEmAndamento.Calibrando ||
|
op.Sensoriamento.Operacao.Calibrando ||
|
||||||
!Variaveis.OperacaoEmAndamento.OperacaoLiberada ||
|
!op.Sensoriamento.Operacao.OperacaoLiberada ||
|
||||||
!Variaveis.OperacaoEmAndamento.Iniciado;
|
!op.Sensoriamento.Operacao.OperacaoIniciada;
|
||||||
|
|
||||||
bool deveInterromper =
|
bool deveInterromper =
|
||||||
bloqueioAutomatico ||
|
bloqueioAutomatico ||
|
||||||
|
|
@ -569,8 +565,8 @@ namespace AgroBase
|
||||||
|
|
||||||
if (deveInterromper) return;
|
if (deveInterromper) return;
|
||||||
|
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var _Controle = op.Controle;
|
||||||
if (Comando.direcao.HasValue)
|
if (Comando.direcao.HasValue && _Controle.TiposControle.Any(x => x.Tipo == Comando.Dispositivo))
|
||||||
_Controle.TiposControle.FirstOrDefault(x => x.Tipo == Comando.Dispositivo).DirecaoAtual = Comando.direcao.Value;
|
_Controle.TiposControle.FirstOrDefault(x => x.Tipo == Comando.Dispositivo).DirecaoAtual = Comando.direcao.Value;
|
||||||
|
|
||||||
for (int i = 0; i < 1; i++)
|
for (int i = 0; i < 1; i++)
|
||||||
|
|
@ -580,38 +576,41 @@ namespace AgroBase
|
||||||
case T_Code.Mov:
|
case T_Code.Mov:
|
||||||
_Controle.PercentualVelocidadeSP = Comando.ValorAplicar;
|
_Controle.PercentualVelocidadeSP = Comando.ValorAplicar;
|
||||||
_Controle.EmFreio = Comando.EstadoAplicar;
|
_Controle.EmFreio = Comando.EstadoAplicar;
|
||||||
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(ForcarComando, new List<T_Code>() { Comando.Dispositivo });
|
op.AtualizarDadosControle(ForcarComando, new List<T_Code>() { Comando.Dispositivo });
|
||||||
break;
|
break;
|
||||||
case T_Code.Dir:
|
case T_Code.Dir:
|
||||||
if (MovimentosCombinados.Contains(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento))
|
if (MovimentosCombinados.Contains(_Controle.TipoMovimento))
|
||||||
{
|
{
|
||||||
Task.Run(async () => await Variaveis.OperacaoEmAndamento.DispMvd.Dados.ExecutarMovimentoDirecionalCombinado(Comando.direcao.Value));
|
Task.Run(async () => await op.DispMvd.Dados.ExecutarMovimentoDirecionalCombinado(Comando.direcao.Value));
|
||||||
}
|
}
|
||||||
else if (Comando.direcao == Direcao.Referenciar)
|
else if (Comando.direcao == Direcao.Referenciar)
|
||||||
{
|
{
|
||||||
List<string> modsControlar = (!string.IsNullOrEmpty(ID)) ? new List<string>() { ID } : null;
|
List<string> modsControlar = (!string.IsNullOrEmpty(ID)) ? new List<string>() { ID } : null;
|
||||||
Task.Run(async () => await Variaveis.OperacaoEmAndamento.DispMvd.Dados.RealizarReferenciamentoDirecional(ModsReferenciar: modsControlar));
|
Task.Run(async () => await op.DispMvd.Dados.RealizarReferenciamentoDirecional(ModsReferenciar: modsControlar));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_Controle.Angulo = Comando.ValorAplicar;
|
_Controle.Angulo = Comando.ValorAplicar;
|
||||||
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(ForcarComando, new List<T_Code>() { Comando.Dispositivo });
|
op.AtualizarDadosControle(ForcarComando, new List<T_Code>() { Comando.Dispositivo });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AtualizaConsole(_Controle.TiposControle.FirstOrDefault(x => x.Tipo == Comando.Dispositivo).DirecaoAtual.ToString());
|
if (_Controle.TiposControle.Any(x => x.Tipo == Comando.Dispositivo))
|
||||||
|
AtualizaConsole(_Controle.TiposControle.FirstOrDefault(x => x.Tipo == Comando.Dispositivo).DirecaoAtual.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EnviarComandoAtuadorAtualizado(DeParaComandos Comando, bool ForcarComando = false)
|
public static void EnviarComandoAtuadorAtualizado(DeParaComandos Comando, bool ForcarComando = false)
|
||||||
{
|
{
|
||||||
bool bloqueioAutomatico = Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
bool bloqueioAutomatico = op.Parametros.Controle.PulverizadorAutomatico;
|
||||||
|
|
||||||
bool bloqueioOperacional =
|
bool bloqueioOperacional =
|
||||||
Variaveis.OperacaoEmAndamento.Calibrando ||
|
op.Sensoriamento.Operacao.Calibrando ||
|
||||||
!Variaveis.OperacaoEmAndamento.OperacaoLiberada ||
|
!op.Sensoriamento.Operacao.OperacaoLiberada ||
|
||||||
!Variaveis.OperacaoEmAndamento.Iniciado;
|
!op.Sensoriamento.Operacao.OperacaoIniciada;
|
||||||
|
|
||||||
bool deveInterromper =
|
bool deveInterromper =
|
||||||
bloqueioAutomatico ||
|
bloqueioAutomatico ||
|
||||||
|
|
@ -619,11 +618,11 @@ namespace AgroBase
|
||||||
|
|
||||||
if (deveInterromper) return;
|
if (deveInterromper) return;
|
||||||
|
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var _Controle = op.Controle;
|
||||||
var tipoControle = _Controle?.TiposControle?.FirstOrDefault(x => x?.Tipo == Comando.Dispositivo);
|
var tipoControle = _Controle?.TiposControle?.FirstOrDefault(x => x?.Tipo == Comando.Dispositivo);
|
||||||
|
|
||||||
var bico = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.BicosPulverizadores?.FirstOrDefault(x => x.ID == Comando.IDcontrolar);
|
var bico = op.DispAtu?.Dados?.BicosPulverizadores?.FirstOrDefault(x => x.ID == Comando.IDcontrolar);
|
||||||
var bomba = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.BombasPressurizadoras?.FirstOrDefault(x => x.ID == Comando.IDcontrolar);
|
var bomba = op.DispAtu?.Dados?.BombasPressurizadoras?.FirstOrDefault(x => x.ID == Comando.IDcontrolar);
|
||||||
S_Code comp = bico?.Componente ?? bomba?.Componente ?? S_Code.sVZO;
|
S_Code comp = bico?.Componente ?? bomba?.Componente ?? S_Code.sVZO;
|
||||||
|
|
||||||
for (int i = 0; i < 1; i++)
|
for (int i = 0; i < 1; i++)
|
||||||
|
|
@ -632,214 +631,18 @@ namespace AgroBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void EnviaComandoMotor(Keys Tecla, T_Code Disp = T_Code.Vzo, string ID = null, BotoesJoystick botao = BotoesJoystick.Vazio, bool ForcarComando = false)
|
|
||||||
{
|
|
||||||
// Verifica se deve interromper o fluxo
|
|
||||||
// interrompe se nao estiver diagnosticando, nao forca o envio, e se o modo for manual vai verificar o status da operacao e do sonar, pois automatico faz esse controle em outro lugar
|
|
||||||
bool deveInterromper =
|
|
||||||
!Forms.IHM.frmDiagnosticos.Diagnosticando && !ForcarComando &&
|
|
||||||
(
|
|
||||||
Variaveis.OperacaoEmAndamento.Parametros?.Modo == ModoOperacao.Manual && (
|
|
||||||
Variaveis.OperacaoEmAndamento.Calibrando ||
|
|
||||||
!Variaveis.OperacaoEmAndamento.OperacaoLiberada ||
|
|
||||||
!Variaveis.OperacaoEmAndamento.Iniciado ||
|
|
||||||
!VerificaComandoValidoSonar(Tecla)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (deveInterromper)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ComandosDispositivo Comando = new ComandosDispositivo()
|
|
||||||
{
|
|
||||||
Momento = DateTime.Now,
|
|
||||||
Comando = Tecla,
|
|
||||||
IDcontrolar = DeParaComandos.FirstOrDefault(x => x.key == Tecla)?.IDcontrolar ?? "",
|
|
||||||
};
|
|
||||||
|
|
||||||
Direcao DirecaoAtual = Direcao.Parado;
|
|
||||||
|
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
|
||||||
var tipoControle = _Controle?.TiposControle?.FirstOrDefault(x => x?.Tipo == Comando.Dispositivo);
|
|
||||||
|
|
||||||
// Cancelar Comando Anterior
|
|
||||||
if (Comando.Comando == Keys.Escape)
|
|
||||||
{
|
|
||||||
var ComandosDisp = Disp == T_Code.Vzo ? Comandos : Comandos.Where(x => x.Dispositivo == Disp).ToList();
|
|
||||||
|
|
||||||
if (ComandosDisp.Any())
|
|
||||||
{
|
|
||||||
if (Disp == T_Code.Vzo)
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = ComandosDisp[ComandosDisp.Count - 1].Dispositivo;
|
|
||||||
Comando.IDcontrolar = ComandosDisp[ComandosDisp.Count - 1].IDcontrolar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = Disp;
|
|
||||||
Comando.IDcontrolar = !string.IsNullOrEmpty(ID) ? ID : ComandosDisp[ComandosDisp.Count - 1].IDcontrolar;
|
|
||||||
}
|
|
||||||
DirecaoAtual = Direcao.Parado;
|
|
||||||
|
|
||||||
switch (botao)
|
|
||||||
{
|
|
||||||
case BotoesJoystick.Bolinha:
|
|
||||||
_Controle.EmFreio = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Controle de Velocidade (MOV RPM SP)
|
|
||||||
else if (Comando.Comando == Keys.Add)
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = T_Code.Mov;
|
|
||||||
DirecaoAtual = tipoControle?.UltimaDirecao ?? Direcao.Parado;
|
|
||||||
int s = Math.Sign(_Controle.PercentualVelocidadeSP);
|
|
||||||
var p = (Math.Abs(_Controle.PercentualVelocidadeSP) + 1) * s;
|
|
||||||
_Controle.PercentualVelocidadeSP = p;
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
else if (Comando.Comando == Keys.Subtract)
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = T_Code.Mov;
|
|
||||||
DirecaoAtual = tipoControle?.UltimaDirecao ?? Direcao.Parado;
|
|
||||||
int s = Math.Sign(_Controle.PercentualVelocidadeSP);
|
|
||||||
var p = (Math.Abs(_Controle.PercentualVelocidadeSP) - 1) * s;
|
|
||||||
_Controle.PercentualVelocidadeSP = p;
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
// Controle Direcao dos Motores BLDC (MOV)
|
|
||||||
else if (Comando.Comando == Keys.Up) // && UltimaDirecao != Direcao.Frente
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = T_Code.Mov;
|
|
||||||
DirecaoAtual = Direcao.Frente;
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
else if (Comando.Comando == Keys.Down) // && UltimaDirecao != Direcao.Tras
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = T_Code.Mov;
|
|
||||||
DirecaoAtual = Direcao.Tras;
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
else if (Comando.Comando == Keys.Space && UltimaDirecao != Direcao.EmFreio)
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = T_Code.Mov;
|
|
||||||
DirecaoAtual = Direcao.EmFreio;
|
|
||||||
_Controle.EmFreio = true;
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
// Controle de Rotação dos Motores de Passo (DIR)
|
|
||||||
else if (Comando.Comando == Keys.Left) // && UltimaDirecao != Direcao.Esquerda
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = T_Code.Dir;
|
|
||||||
DirecaoAtual = Direcao.Esquerda;
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
else if (Comando.Comando == Keys.Right) // && UltimaDirecao != Direcao.Direita
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = T_Code.Dir;
|
|
||||||
DirecaoAtual = Direcao.Direita;
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
else if (Comando.Comando == Keys.R)
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = T_Code.Dir;
|
|
||||||
DirecaoAtual = Direcao.Referenciar;
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
// Controle dos Bicos Pulverizadores (ATU)
|
|
||||||
else if ((Comando.Comando == Keys.D1 || Comando.Comando == Keys.D2 || Comando.Comando == Keys.D3 || Comando.Comando == Keys.D4) && (Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.BicosPulverizadores?.Any(x => x?.ID == Comando.IDcontrolar && !(x?.ComandoAtuar ?? false)) ?? false))
|
|
||||||
{
|
|
||||||
Comando.Dispositivo = T_Code.Atu;
|
|
||||||
Pressionado = true;
|
|
||||||
}
|
|
||||||
// Soltar o Botão
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Pressionado = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Pressionado)
|
|
||||||
{
|
|
||||||
Comandos.Add(Comando);
|
|
||||||
|
|
||||||
for (int i = 0; i < 1; i++)
|
|
||||||
{
|
|
||||||
switch (Comando.Dispositivo)
|
|
||||||
{
|
|
||||||
case T_Code.Mov:
|
|
||||||
{
|
|
||||||
//Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.ForEach(x => x.MovMotor.EnviarComandoControle(DirecaoAtual));
|
|
||||||
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(ForcarComando, new List<T_Code>() { Comando.Dispositivo });
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case T_Code.Dir:
|
|
||||||
{
|
|
||||||
List<string> modsControlar = null;
|
|
||||||
if (!string.IsNullOrEmpty(ID))
|
|
||||||
modsControlar = new List<string>() { ID };
|
|
||||||
if (MovimentosCombinados.Contains(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento))
|
|
||||||
{
|
|
||||||
Task.Run(async () => await Variaveis.OperacaoEmAndamento.DispMvd.Dados.ExecutarMovimentoDirecionalCombinado(DirecaoAtual));
|
|
||||||
}
|
|
||||||
else if (DirecaoAtual == Direcao.Referenciar)
|
|
||||||
{
|
|
||||||
Task.Run(async () => await Variaveis.OperacaoEmAndamento.DispMvd.Dados.RealizarReferenciamentoDirecional(ModsReferenciar: modsControlar));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(ForcarComando, new List<T_Code>() { Comando.Dispositivo });
|
|
||||||
//foreach (var mod in Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos)
|
|
||||||
//{
|
|
||||||
// if (modsControlar == null || modsControlar.Contains(mod.DirMotor.Mod_ID))
|
|
||||||
// {
|
|
||||||
// mod.DirMotor.EnviarComandoControle(DirecaoAtual);
|
|
||||||
//
|
|
||||||
// if (mod.MovMotor.CompensacaoNecessaria)
|
|
||||||
// {
|
|
||||||
// Direcao ultimaDirecaoMov = Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Mov)?.UltimaDirecao ?? Direcao.Parado;
|
|
||||||
// mod.MovMotor.EnviarComandoControle(ultimaDirecaoMov);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//};
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case T_Code.Atu:
|
|
||||||
{
|
|
||||||
EnviarComandoAtuador(S_Code.sBIC, Comando.IDcontrolar, Status: Comando.Comando == Keys.Escape ? false : true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Controle = Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == Comando.Dispositivo);
|
|
||||||
//if (Controle != null)
|
|
||||||
//{
|
|
||||||
// Controle.UltimaDirecao = DirecaoAtual;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
UltimaDirecao = DirecaoAtual;
|
|
||||||
|
|
||||||
AtualizaConsole(Enum.GetName(typeof(Direcao), UltimaDirecao));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void EnviarComandoAtuador(S_Code Componente, string ID, bool? Status = null, List<double?> Valores = null, CanMessagePosicaoDados Comando = CanMessagePosicaoDados.Command1, bool Forcar = false)
|
public static void EnviarComandoAtuador(S_Code Componente, string ID, bool? Status = null, List<double?> Valores = null, CanMessagePosicaoDados Comando = CanMessagePosicaoDados.Command1, bool Forcar = false)
|
||||||
{
|
{
|
||||||
var DispAtu = Variaveis.OperacaoEmAndamento.DispAtu;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
var DispAtu = op.DispAtu;
|
||||||
if (!DispAtu.Dados.Conectado)
|
if (!DispAtu.Dados.Conectado)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!Forcar)
|
if (!Forcar)
|
||||||
{
|
{
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado) return;
|
if (!op.Sensoriamento.Operacao.OperacaoIniciada) return;
|
||||||
bool componente_em_uso = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == T_Code.Atu && (x.ComponentesEmUso?.ContainsKey(ID) ?? false) && x.ComponentesEmUso[ID].Item2);
|
bool componente_em_uso = op.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == T_Code.Atu && (x.ComponentesEmUso?.ContainsKey(ID) ?? false) && x.ComponentesEmUso[ID].Item2);
|
||||||
if (!componente_em_uso && (Status ?? false)) return; // Impede execucao de comandos que liguem componentes quando estiver marcado para nao utilizar
|
if (!componente_em_uso && (Status ?? false)) return; // Impede execucao de comandos que liguem componentes quando estiver marcado para nao utilizar
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -895,13 +698,15 @@ namespace AgroBase
|
||||||
|
|
||||||
public static void EnviarComandoSensoriamento(S_Code Componente, string ID, dynamic Status) //, bool Forcar = false
|
public static void EnviarComandoSensoriamento(S_Code Componente, string ID, dynamic Status) //, bool Forcar = false
|
||||||
{
|
{
|
||||||
var DispSen = Variaveis.OperacaoEmAndamento.DispSen;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
var DispSen = op.DispSen;
|
||||||
if (!DispSen.Dados.Conectado)
|
if (!DispSen.Dados.Conectado)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (false) // !Forcar
|
if (false) // !Forcar
|
||||||
{
|
{
|
||||||
bool componente_em_uso = Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == T_Code.Sen && (x.ComponentesEmUso?.ContainsKey(ID) ?? false) && x.ComponentesEmUso[ID].Item2);
|
bool componente_em_uso = op.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == T_Code.Sen && (x.ComponentesEmUso?.ContainsKey(ID) ?? false) && x.ComponentesEmUso[ID].Item2);
|
||||||
if (!componente_em_uso)
|
if (!componente_em_uso)
|
||||||
{
|
{
|
||||||
// Impede execucao de comandos que liguem componentes quando estiver marcado para nao utilizar
|
// Impede execucao de comandos que liguem componentes quando estiver marcado para nao utilizar
|
||||||
|
|
@ -987,14 +792,6 @@ namespace AgroBase
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ComandosDispositivo
|
|
||||||
{
|
|
||||||
public DateTime Momento { get; set; }
|
|
||||||
public Keys Comando { get; set; }
|
|
||||||
public T_Code Dispositivo { get; set; }
|
|
||||||
public string IDcontrolar { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DeParaComandos
|
public class DeParaComandos
|
||||||
{
|
{
|
||||||
public BotoesJoystick botaoJoy { get; set; }
|
public BotoesJoystick botaoJoy { get; set; }
|
||||||
|
|
@ -1009,11 +806,13 @@ namespace AgroBase
|
||||||
|
|
||||||
public void CalcularValor(bool solto, double? valorJoy = null, double? valorDesejado = null)
|
public void CalcularValor(bool solto, double? valorJoy = null, double? valorDesejado = null)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
double centro = 32767.0;
|
double centro = 32767.0;
|
||||||
double deadzone = 3000.0;
|
double deadzone = 3000.0;
|
||||||
|
|
||||||
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
|
var pControle = op.Parametros.Controle;
|
||||||
var controle = Variaveis.OperacaoEmAndamento.Controle;
|
var controle = op.Controle;
|
||||||
|
|
||||||
if (pControle == null || controle == null) return;
|
if (pControle == null || controle == null) return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -146,7 +146,7 @@ namespace AgroBase.Models
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Erro ao atualizar dados do grafico: {ex.Message}");
|
Variaveis.MostrarLog($"[GraficoInterativoModel.AtualizarDados] Erro ao atualizar dados do grafico: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,8 @@ public class MPCController
|
||||||
|
|
||||||
public async Task<MPCComandoModel> Compute(double _lat, double _long, double _theta, double _velocidadeMs)
|
public async Task<MPCComandoModel> Compute(double _lat, double _long, double _theta, double _velocidadeMs)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
DateTime EnviadoEm = DateTime.Now;
|
DateTime EnviadoEm = DateTime.Now;
|
||||||
|
|
||||||
double taxaHz = GPSService.TaxaAmostragemHz; // ex: 10 Hz
|
double taxaHz = GPSService.TaxaAmostragemHz; // ex: 10 Hz
|
||||||
|
|
@ -101,7 +103,7 @@ public class MPCController
|
||||||
_dt = (EnviadoEm - _ultimaAtualizacao).TotalSeconds;
|
_dt = (EnviadoEm - _ultimaAtualizacao).TotalSeconds;
|
||||||
double dtCalc = Math.Max(tempoMinimo, Math.Min(tempoMaximo, _dt));
|
double dtCalc = Math.Max(tempoMinimo, Math.Min(tempoMaximo, _dt));
|
||||||
|
|
||||||
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
var _Sensoriamento = op.Sensoriamento;
|
||||||
|
|
||||||
var dadosEnvio = new
|
var dadosEnvio = new
|
||||||
{
|
{
|
||||||
|
|
@ -112,8 +114,8 @@ public class MPCController
|
||||||
dt = dtCalc,
|
dt = dtCalc,
|
||||||
comando_anterior = new
|
comando_anterior = new
|
||||||
{
|
{
|
||||||
angulo = _Sensoriamento.Controle.Angulo,
|
angulo = op.Controle.Angulo,
|
||||||
tipo = _Sensoriamento.Controle.TipoMovimento,
|
tipo = op.Controle.TipoMovimento,
|
||||||
},
|
},
|
||||||
contexto = new
|
contexto = new
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -24,10 +24,12 @@ public class MPCControllerAprimorado
|
||||||
|
|
||||||
public MPCControllerAprimorado()
|
public MPCControllerAprimorado()
|
||||||
{
|
{
|
||||||
this.maxAnguloDirecao = Variaveis.OperacaoEmAndamento.Parametros?.Controle?.DirAnguloMaximo ?? 30.0;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
this.maxAnguloDirecao = op.Parametros?.Controle?.DirAnguloMaximo ?? 30.0;
|
||||||
this.maxAngulo4Rodas = this.maxAnguloDirecao * 0.8;
|
this.maxAngulo4Rodas = this.maxAnguloDirecao * 0.8;
|
||||||
this.velocidadeMin = Variaveis.OperacaoEmAndamento.Parametros?.Controle?.MovVelocidadeCErvasPercent ?? 20.0;
|
this.velocidadeMin = op.Parametros?.Controle?.MovVelocidadeCErvasPercent ?? 20.0;
|
||||||
this.velocidadeMax = Variaveis.OperacaoEmAndamento.Parametros?.Controle?.MovVelocidadeSErvasPercent ?? 100.0;
|
this.velocidadeMax = op.Parametros?.Controle?.MovVelocidadeSErvasPercent ?? 100.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public (double anguloControle, Enums.TipoMovimentoDirecional modo) CalcularControle(GPSModel posicalAtual, double velocidadeAtual, List<GPSModel> proximaTrajetoria, Enums.TipoMovimentoDirecional[] modosPermitidos)
|
public (double anguloControle, Enums.TipoMovimentoDirecional modo) CalcularControle(GPSModel posicalAtual, double velocidadeAtual, List<GPSModel> proximaTrajetoria, Enums.TipoMovimentoDirecional[] modosPermitidos)
|
||||||
|
|
@ -93,6 +95,8 @@ public class MPCControllerAprimorado
|
||||||
|
|
||||||
private double SimularTrajetoriaComReavaliacao(GPSModel posicaoInicial, List<GPSModel> trajeto, double anguloInicial, double anguloControleInicial, Enums.TipoMovimentoDirecional modoInicial, double velocidadeMs, double dt)
|
private double SimularTrajetoriaComReavaliacao(GPSModel posicaoInicial, List<GPSModel> trajeto, double anguloInicial, double anguloControleInicial, Enums.TipoMovimentoDirecional modoInicial, double velocidadeMs, double dt)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
double custoTotal = 0;
|
double custoTotal = 0;
|
||||||
GPSModel posAtual = posicaoInicial;
|
GPSModel posAtual = posicaoInicial;
|
||||||
double anguloAtual = anguloInicial;
|
double anguloAtual = anguloInicial;
|
||||||
|
|
@ -126,14 +130,14 @@ public class MPCControllerAprimorado
|
||||||
double erroOri = Math.Abs(GPSUtils.CalcularDiferencaAngulo(novaPos.OrientacaoReal, orientacaoAlvo));
|
double erroOri = Math.Abs(GPSUtils.CalcularDiferencaAngulo(novaPos.OrientacaoReal, orientacaoAlvo));
|
||||||
|
|
||||||
(GPSModel ponto, int idx) = GPSUtils.PontoMaisProximoTrechoComIndice(posAtual, trajeto);
|
(GPSModel ponto, int idx) = GPSUtils.PontoMaisProximoTrechoComIndice(posAtual, trajeto);
|
||||||
int idxNovoPonto = Variaveis.OperacaoEmAndamento.Trajetoria.PontoAtual.idxPonto + idx;
|
int idxNovoPonto = op.Trajetoria.PontoAtual.idxPonto + idx;
|
||||||
PontoTrajetoriaModel pontoAtual = Variaveis.OperacaoEmAndamento.Trajetoria._TrajetoriaFixa[idxNovoPonto].Clone();
|
PontoTrajetoriaModel pontoAtual = op.Trajetoria._TrajetoriaFixa[idxNovoPonto].Clone();
|
||||||
|
|
||||||
int idxRuaEsquerda = Variaveis.OperacaoEmAndamento.Trajetoria._Corredores[pontoAtual.idxCorredor].idxRuaEsquerda;
|
int idxRuaEsquerda = op.Trajetoria._Corredores[pontoAtual.idxCorredor].idxRuaEsquerda;
|
||||||
double distEsq = Variaveis.OperacaoEmAndamento.Trajetoria.CalcularDistanciaLateral(true, posAtual, idxRuaEsquerda, pontoAtual.Direcao);
|
double distEsq = op.Trajetoria.CalcularDistanciaLateral(true, posAtual, idxRuaEsquerda, pontoAtual.Direcao);
|
||||||
|
|
||||||
int idxRuaDireita = Variaveis.OperacaoEmAndamento.Trajetoria._Corredores[pontoAtual.idxCorredor].idxRuaDireita;
|
int idxRuaDireita = op.Trajetoria._Corredores[pontoAtual.idxCorredor].idxRuaDireita;
|
||||||
double distDir = Variaveis.OperacaoEmAndamento.Trajetoria.CalcularDistanciaLateral(false, posAtual, idxRuaDireita, pontoAtual.Direcao);
|
double distDir = op.Trajetoria.CalcularDistanciaLateral(false, posAtual, idxRuaDireita, pontoAtual.Direcao);
|
||||||
|
|
||||||
double erroLat = Math.Abs(distEsq - distDir);
|
double erroLat = Math.Abs(distEsq - distDir);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -248,7 +248,7 @@ namespace AgroBase.Models
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Erro ao atualizar mapa dinamico: " + ex.Message);
|
Variaveis.MostrarLog("[MapaDinamicoModel.PnlZoomMapa_Paint] Erro ao atualizar mapa dinamico: " + ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -329,7 +329,7 @@ namespace AgroBase.Models
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Erro ao atualizar mapa dinamico: " + ex.Message);
|
Variaveis.MostrarLog("[MapaDinamicoModel.PnlZoomMapa_Paint] Erro ao atualizar mapa dinamico: " + ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ namespace AgroBase.Models
|
||||||
}
|
}
|
||||||
catch (InvalidOperationException ex)
|
catch (InvalidOperationException ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Erro ao verificar o estado do processo: {ex.Message}");
|
Variaveis.MostrarLog($"[MapasModel.tmrCarregamento_Tick] Erro ao verificar o estado do processo: {ex.Message}");
|
||||||
picLoading.Visible = false;
|
picLoading.Visible = false;
|
||||||
tmrCarregamento.Dispose();
|
tmrCarregamento.Dispose();
|
||||||
}
|
}
|
||||||
|
|
@ -215,8 +215,9 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
if (TrajetoriaMapa.Any())
|
if (TrajetoriaMapa.Any())
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Trajetoria = new TrajetoriaMapaOperacaoModel(TrajetoriaMapa);
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
Variaveis.OperacaoEmAndamento.Trajetoria.ProjetarTrajetoriaFixa();
|
op.Trajetoria = new TrajetoriaMapaOperacaoModel(TrajetoriaMapa);
|
||||||
|
op.Trajetoria.ProjetarTrajetoriaFixa();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
using AgroBase.Services.Operadores;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
@ -41,7 +40,7 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return HealthWorkerService.ModulosSaude.Any(x => x.modulo == Dispositivo && x.status == StatusModulo.Operante);
|
return Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorSaude?.ModulosSaude?.Any(x => x.modulo == Dispositivo && x.status == StatusModulo.Operante) ?? false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public bool AtuPronto { get; set; } = false;
|
public bool AtuPronto { get; set; } = false;
|
||||||
|
|
@ -335,80 +334,53 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public void AtualizarMetricasOperacao()
|
public void AtualizarMetricasOperacao()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
lock (_metricasLock)
|
lock (_metricasLock)
|
||||||
{
|
{
|
||||||
long agoraTicks =
|
long agoraTicks = Stopwatch.GetTimestamp();
|
||||||
Stopwatch.GetTimestamp();
|
DateTime agora = DateTime.Now;
|
||||||
|
|
||||||
DateTime agora =
|
bool operacaoConcluida = op.Sensoriamento?.Operacao?.StatusOperacaoAtual == StatusOperacao.Concluido;
|
||||||
DateTime.Now;
|
bool operacaoAtiva = op.Sensoriamento?.Operacao?.OperacaoIniciada == true && !operacaoConcluida;
|
||||||
|
|
||||||
bool operacaoConcluida =
|
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.Sensoriamento != null &&
|
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.Sensoriamento
|
|
||||||
.StatusOperacao ==
|
|
||||||
StatusOperacao.Concluido;
|
|
||||||
|
|
||||||
bool operacaoAtiva =
|
|
||||||
Variaveis.OperacaoEmAndamento.Iniciado &&
|
|
||||||
!operacaoConcluida;
|
|
||||||
|
|
||||||
bool atuadorComTelemetriaRecente =
|
bool atuadorComTelemetriaRecente =
|
||||||
DadosLeitura != null &&
|
DadosLeitura != null &&
|
||||||
DadosLeitura.UltimoComandoRespondido != DateTime.MinValue &&
|
DadosLeitura.UltimoComandoRespondido != DateTime.MinValue &&
|
||||||
DadosLeitura
|
DadosLeitura.UltimoComandoRespondido.AddMilliseconds(TempoLimiteConexao) > agora;
|
||||||
.UltimoComandoRespondido
|
|
||||||
.AddMilliseconds(TempoLimiteConexao) > agora;
|
|
||||||
|
|
||||||
bool atuadorTemEstrutura =
|
bool atuadorTemEstrutura = (BicosPulverizadores?.Count ?? 0) > 0;
|
||||||
(BicosPulverizadores?.Count ?? 0) > 0;
|
|
||||||
|
|
||||||
bool atuadorDisponivel =
|
bool atuadorDisponivel =
|
||||||
operacaoAtiva &&
|
operacaoAtiva &&
|
||||||
atuadorTemEstrutura &&
|
atuadorTemEstrutura &&
|
||||||
atuadorComTelemetriaRecente;
|
atuadorComTelemetriaRecente;
|
||||||
|
|
||||||
bool pulverizadorAutomatico =
|
bool pulverizadorAutomatico = op.Parametros?.Controle?.PulverizadorAutomatico ?? false;
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.Parametros?
|
|
||||||
.Controle?
|
|
||||||
.PulverizadorAutomatico
|
|
||||||
?? false;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bicos são contabilizados pelo comando de alta resolução.
|
* Bicos são contabilizados pelo comando de alta resolução.
|
||||||
* O retorno CAN permanece sendo telemetria e diagnóstico.
|
* O retorno CAN permanece sendo telemetria e diagnóstico.
|
||||||
*/
|
*/
|
||||||
var bicosAtivosAgora =
|
var bicosAtivosAgora = atuadorDisponivel
|
||||||
atuadorDisponivel
|
? BicosPulverizadores
|
||||||
? BicosPulverizadores
|
.Where(b =>
|
||||||
.Where(b =>
|
b != null &&
|
||||||
b != null &&
|
b.Inicializado &&
|
||||||
b.Inicializado &&
|
b.Comandar &&
|
||||||
b.Comandar &&
|
b.ComandoAtuar)
|
||||||
b.ComandoAtuar)
|
.Select(b => b.ID_Num)
|
||||||
.Select(b => b.ID_Num)
|
.ToHashSet()
|
||||||
.ToHashSet()
|
: new HashSet<int>();
|
||||||
: new HashSet<int>();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* O mesmo estado usado nas métricas governa
|
* O mesmo estado usado nas métricas governa
|
||||||
* abertura e fechamento dos trechos.
|
* abertura e fechamento dos trechos.
|
||||||
*/
|
*/
|
||||||
foreach (var bico in
|
foreach (var bico in BicosPulverizadores ?? new List<AtuadorBicoModel>())
|
||||||
BicosPulverizadores ??
|
|
||||||
new List<AtuadorBicoModel>())
|
|
||||||
{
|
{
|
||||||
bool atuandoComandado =
|
bool atuandoComandado = bicosAtivosAgora.Contains(bico.ID_Num);
|
||||||
bicosAtivosAgora.Contains(
|
bico.AtualizarEstadoTrecho(atuandoComandado);
|
||||||
bico.ID_Num
|
|
||||||
);
|
|
||||||
|
|
||||||
bico.AtualizarEstadoTrecho(
|
|
||||||
atuandoComandado
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -432,54 +404,28 @@ namespace AgroBase.Models.Modules
|
||||||
.ToHashSet()
|
.ToHashSet()
|
||||||
: new HashSet<int>();
|
: new HashSet<int>();
|
||||||
|
|
||||||
double vazaoAtualMLs =
|
double vazaoAtualMLs = operacaoAtiva ? ObterVazaoAtualConfiavelMLs(agora) : 0.0;
|
||||||
operacaoAtiva
|
double tempoMovimentoAtualSeg = op.Sensoriamento?.Movimentacao?.TempoMovimentoSegs ?? 0.0;
|
||||||
? ObterVazaoAtualConfiavelMLs(
|
|
||||||
agora
|
|
||||||
)
|
|
||||||
: 0.0;
|
|
||||||
|
|
||||||
double tempoMovimentoAtualSeg =
|
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.Sensoriamento?
|
|
||||||
.Movimentacao?
|
|
||||||
.TempoMovimentoSegs
|
|
||||||
?? 0.0;
|
|
||||||
|
|
||||||
if (_ultimoTickMetricas != 0)
|
if (_ultimoTickMetricas != 0)
|
||||||
{
|
{
|
||||||
double dt =
|
double dt = (agoraTicks - _ultimoTickMetricas) / (double)Stopwatch.Frequency;
|
||||||
(agoraTicks -
|
|
||||||
_ultimoTickMetricas) /
|
|
||||||
(double)Stopwatch.Frequency;
|
|
||||||
|
|
||||||
if (dt > 0 && dt <= IntervaloMaximoIntegracaoSeg)
|
if (dt > 0 && dt <= IntervaloMaximoIntegracaoSeg)
|
||||||
{
|
{
|
||||||
double deltaMovimentoSeg = 0;
|
double deltaMovimentoSeg = 0;
|
||||||
|
|
||||||
if (tempoMovimentoAtualSeg >=
|
if (tempoMovimentoAtualSeg >= _tempoMovimentoAnteriorSeg)
|
||||||
_tempoMovimentoAnteriorSeg)
|
|
||||||
{
|
{
|
||||||
deltaMovimentoSeg =
|
deltaMovimentoSeg = tempoMovimentoAtualSeg - _tempoMovimentoAnteriorSeg;
|
||||||
tempoMovimentoAtualSeg -
|
|
||||||
_tempoMovimentoAnteriorSeg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* O tempo em movimento não pode exceder
|
* O tempo em movimento não pode exceder
|
||||||
* o tempo físico do intervalo integrado.
|
* o tempo físico do intervalo integrado.
|
||||||
*/
|
*/
|
||||||
deltaMovimentoSeg =
|
deltaMovimentoSeg = FuncoesMatematicas.Clamp(deltaMovimentoSeg, 0.0, dt);
|
||||||
FuncoesMatematicas.Clamp(
|
IntegrarIntervaloAnterior(dt, deltaMovimentoSeg);
|
||||||
deltaMovimentoSeg,
|
|
||||||
0.0,
|
|
||||||
dt
|
|
||||||
);
|
|
||||||
|
|
||||||
IntegrarIntervaloAnterior(
|
|
||||||
dt,
|
|
||||||
deltaMovimentoSeg
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -492,7 +438,7 @@ namespace AgroBase.Models.Modules
|
||||||
if (dt > IntervaloMaximoIntegracaoSeg)
|
if (dt > IntervaloMaximoIntegracaoSeg)
|
||||||
{
|
{
|
||||||
Variaveis.MostrarLog("[ATU/METRICAS] Integração ignorada por dt alto: " + dt.ToString("0.000") + "s");
|
Variaveis.MostrarLog("[ATU/METRICAS] Integração ignorada por dt alto: " + dt.ToString("0.000") + "s");
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, "[ATU/METRICAS] Integração ignorada por dt alto: " + dt.ToString("0.000") + "s");
|
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, "[ATU/METRICAS] Integração ignorada por dt alto: " + dt.ToString("0.000") + "s");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -501,20 +447,12 @@ namespace AgroBase.Models.Modules
|
||||||
* Contagem de atuações das bombas por borda
|
* Contagem de atuações das bombas por borda
|
||||||
* do comando efetivo OFF -> ON.
|
* do comando efetivo OFF -> ON.
|
||||||
*/
|
*/
|
||||||
foreach (var bomba in
|
foreach (var bomba in BombasPressurizadoras ?? new List<AtuadorBombaModel>())
|
||||||
BombasPressurizadoras ??
|
|
||||||
new List<AtuadorBombaModel>())
|
|
||||||
{
|
{
|
||||||
bool estavaLigada =
|
bool estavaLigada = _bombasAtivasIntervaloAnterior.Contains(bomba.ID_Num);
|
||||||
_bombasAtivasIntervaloAnterior
|
bool estaLigada = bombasAtivasAgora.Contains(bomba.ID_Num);
|
||||||
.Contains(bomba.ID_Num);
|
|
||||||
|
|
||||||
bool estaLigada =
|
if (!estavaLigada && estaLigada)
|
||||||
bombasAtivasAgora
|
|
||||||
.Contains(bomba.ID_Num);
|
|
||||||
|
|
||||||
if (!estavaLigada &&
|
|
||||||
estaLigada)
|
|
||||||
{
|
{
|
||||||
bomba.Atuacoes++;
|
bomba.Atuacoes++;
|
||||||
}
|
}
|
||||||
|
|
@ -524,43 +462,27 @@ namespace AgroBase.Models.Modules
|
||||||
* Atualiza o snapshot que representará
|
* Atualiza o snapshot que representará
|
||||||
* o próximo intervalo.
|
* o próximo intervalo.
|
||||||
*/
|
*/
|
||||||
_ultimoTickMetricas =
|
_ultimoTickMetricas = agoraTicks;
|
||||||
agoraTicks;
|
_tempoMovimentoAnteriorSeg = tempoMovimentoAtualSeg;
|
||||||
|
_bicosAtivosIntervaloAnterior = bicosAtivosAgora;
|
||||||
|
_bombasAtivasIntervaloAnterior = bombasAtivasAgora;
|
||||||
|
|
||||||
_tempoMovimentoAnteriorSeg =
|
_potenciaBombasIntervaloAnterior = (BombasPressurizadoras ??
|
||||||
tempoMovimentoAtualSeg;
|
new List<AtuadorBombaModel>())
|
||||||
|
.ToDictionary(
|
||||||
|
b => b.ID_Num,
|
||||||
|
b =>
|
||||||
|
ObterPotenciaAtualConfiavelPct(
|
||||||
|
b,
|
||||||
|
agora
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
_bicosAtivosIntervaloAnterior =
|
_vazaoIntervaloAnteriorMLs = vazaoAtualMLs;
|
||||||
bicosAtivosAgora;
|
|
||||||
|
|
||||||
_bombasAtivasIntervaloAnterior =
|
AtualizarVazoesInstantaneas(bicosAtivosAgora, vazaoAtualMLs);
|
||||||
bombasAtivasAgora;
|
|
||||||
|
|
||||||
_potenciaBombasIntervaloAnterior =
|
VazaoMediaMLs = TempoAtuado > 0 ? VolumeVazadoML / TempoAtuado : 0;
|
||||||
(BombasPressurizadoras ??
|
|
||||||
new List<AtuadorBombaModel>())
|
|
||||||
.ToDictionary(
|
|
||||||
b => b.ID_Num,
|
|
||||||
b =>
|
|
||||||
ObterPotenciaAtualConfiavelPct(
|
|
||||||
b,
|
|
||||||
agora
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
_vazaoIntervaloAnteriorMLs =
|
|
||||||
vazaoAtualMLs;
|
|
||||||
|
|
||||||
AtualizarVazoesInstantaneas(
|
|
||||||
bicosAtivosAgora,
|
|
||||||
vazaoAtualMLs
|
|
||||||
);
|
|
||||||
|
|
||||||
VazaoMediaMLs =
|
|
||||||
TempoAtuado > 0
|
|
||||||
? VolumeVazadoML /
|
|
||||||
TempoAtuado
|
|
||||||
: 0;
|
|
||||||
|
|
||||||
AtualizaPercentualErvas();
|
AtualizaPercentualErvas();
|
||||||
}
|
}
|
||||||
|
|
@ -568,13 +490,12 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
private void IntegrarIntervaloAnterior(double dt, double tempoMovimentoIntervaloSeg)
|
private void IntegrarIntervaloAnterior(double dt, double tempoMovimentoIntervaloSeg)
|
||||||
{
|
{
|
||||||
var bicosDoIntervalo =
|
var bicosDoIntervalo = (BicosPulverizadores ??
|
||||||
(BicosPulverizadores ??
|
new List<AtuadorBicoModel>())
|
||||||
new List<AtuadorBicoModel>())
|
.Where(b =>
|
||||||
.Where(b =>
|
_bicosAtivosIntervaloAnterior
|
||||||
_bicosAtivosIntervaloAnterior
|
.Contains(b.ID_Num))
|
||||||
.Contains(b.ID_Num))
|
.ToList();
|
||||||
.ToList();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tempo geral de pulverização:
|
* Tempo geral de pulverização:
|
||||||
|
|
@ -585,32 +506,22 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
TempoAtuado += dt;
|
TempoAtuado += dt;
|
||||||
|
|
||||||
foreach (var bico in
|
foreach (var bico in bicosDoIntervalo)
|
||||||
bicosDoIntervalo)
|
|
||||||
{
|
{
|
||||||
bico.TempoAtuado += dt;
|
bico.TempoAtuado += dt;
|
||||||
|
|
||||||
bico.TempoAtuadoEmMovimento +=
|
bico.TempoAtuadoEmMovimento += tempoMovimentoIntervaloSeg;
|
||||||
tempoMovimentoIntervaloSeg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double vazaoTotalMLs =
|
double vazaoTotalMLs = Math.Max(0, _vazaoIntervaloAnteriorMLs);
|
||||||
Math.Max(
|
|
||||||
0,
|
|
||||||
_vazaoIntervaloAnteriorMLs
|
|
||||||
);
|
|
||||||
|
|
||||||
if (vazaoTotalMLs > 0)
|
if (vazaoTotalMLs > 0)
|
||||||
{
|
{
|
||||||
double volumeIntervaloML =
|
double volumeIntervaloML = vazaoTotalMLs * dt;
|
||||||
vazaoTotalMLs * dt;
|
|
||||||
|
|
||||||
VolumeVazadoML +=
|
VolumeVazadoML += volumeIntervaloML;
|
||||||
volumeIntervaloML;
|
|
||||||
|
|
||||||
double volumePorBicoML =
|
double volumePorBicoML = volumeIntervaloML / bicosDoIntervalo.Count;
|
||||||
volumeIntervaloML /
|
|
||||||
bicosDoIntervalo.Count;
|
|
||||||
|
|
||||||
foreach (var bico in bicosDoIntervalo)
|
foreach (var bico in bicosDoIntervalo)
|
||||||
{
|
{
|
||||||
|
|
@ -624,14 +535,9 @@ namespace AgroBase.Models.Modules
|
||||||
* não existe fluxo. O tempo continua crescendo,
|
* não existe fluxo. O tempo continua crescendo,
|
||||||
* logo a média operacional deve diminuir.
|
* logo a média operacional deve diminuir.
|
||||||
*/
|
*/
|
||||||
foreach (var bico in
|
foreach (var bico in bicosDoIntervalo)
|
||||||
bicosDoIntervalo)
|
|
||||||
{
|
{
|
||||||
bico.VazaoMediaMLs =
|
bico.VazaoMediaMLs = bico.TempoAtuado > 0 ? bico.VolumeVazadoML / bico.TempoAtuado : 0;
|
||||||
bico.TempoAtuado > 0
|
|
||||||
? bico.VolumeVazadoML /
|
|
||||||
bico.TempoAtuado
|
|
||||||
: 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -640,32 +546,27 @@ namespace AgroBase.Models.Modules
|
||||||
* TempoAtuado é baseado no comando efetivo.
|
* TempoAtuado é baseado no comando efetivo.
|
||||||
* TempoComPotencia usa telemetria CAN recente.
|
* TempoComPotencia usa telemetria CAN recente.
|
||||||
*/
|
*/
|
||||||
foreach (var bomba in
|
foreach (var bomba in BombasPressurizadoras ?? new List<AtuadorBombaModel>())
|
||||||
BombasPressurizadoras ??
|
|
||||||
new List<AtuadorBombaModel>())
|
|
||||||
{
|
{
|
||||||
if (!_bombasAtivasIntervaloAnterior
|
if (!_bombasAtivasIntervaloAnterior.Contains(bomba.ID_Num))
|
||||||
.Contains(bomba.ID_Num))
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bomba.TempoAtuado += dt;
|
bomba.TempoAtuado += dt;
|
||||||
|
|
||||||
double potencia =
|
double potencia = _potenciaBombasIntervaloAnterior
|
||||||
_potenciaBombasIntervaloAnterior
|
.TryGetValue(
|
||||||
.TryGetValue(
|
bomba.ID_Num,
|
||||||
bomba.ID_Num,
|
out double valorPotencia)
|
||||||
out double valorPotencia)
|
? valorPotencia
|
||||||
? valorPotencia
|
: 0;
|
||||||
: 0;
|
|
||||||
|
|
||||||
if (potencia > 0)
|
if (potencia > 0)
|
||||||
{
|
{
|
||||||
bomba.TempoComPotencia += dt;
|
bomba.TempoComPotencia += dt;
|
||||||
|
|
||||||
bomba.PotenciaAcumuladaPctSeg +=
|
bomba.PotenciaAcumuladaPctSeg += potencia * dt;
|
||||||
potencia * dt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -673,11 +574,7 @@ namespace AgroBase.Models.Modules
|
||||||
* o denominador deve ser o período com
|
* o denominador deve ser o período com
|
||||||
* potência efetivamente observada.
|
* potência efetivamente observada.
|
||||||
*/
|
*/
|
||||||
bomba.PotenciaMediaAtiva =
|
bomba.PotenciaMediaAtiva = bomba.TempoComPotencia > 0 ? bomba.PotenciaAcumuladaPctSeg / bomba.TempoComPotencia : 0;
|
||||||
bomba.TempoComPotencia > 0
|
|
||||||
? bomba.PotenciaAcumuladaPctSeg /
|
|
||||||
bomba.TempoComPotencia
|
|
||||||
: 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -704,23 +601,16 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
private void AtualizaPercentualErvas()
|
private void AtualizaPercentualErvas()
|
||||||
{
|
{
|
||||||
double tempoMovimentoSeg =
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.Sensoriamento?
|
|
||||||
.Movimentacao?
|
|
||||||
.TempoMovimentoSegs
|
|
||||||
?? 0;
|
|
||||||
|
|
||||||
var bicosConsiderados =
|
double tempoMovimentoSeg = op.Sensoriamento?.Movimentacao?.TempoMovimentoSegs ?? 0;
|
||||||
BicosPulverizadores?
|
|
||||||
.Where(b =>
|
|
||||||
b != null &&
|
|
||||||
b.Comandar)
|
|
||||||
.ToList()
|
|
||||||
?? new List<AtuadorBicoModel>();
|
|
||||||
|
|
||||||
if (tempoMovimentoSeg <= 0 ||
|
var bicosConsiderados = BicosPulverizadores?
|
||||||
bicosConsiderados.Count == 0)
|
.Where(b => b != null && b.Comandar)
|
||||||
|
.ToList()
|
||||||
|
?? new List<AtuadorBicoModel>();
|
||||||
|
|
||||||
|
if (tempoMovimentoSeg <= 0 || bicosConsiderados.Count == 0)
|
||||||
{
|
{
|
||||||
PercentualErvasTerreno = 0;
|
PercentualErvasTerreno = 0;
|
||||||
return;
|
return;
|
||||||
|
|
@ -730,38 +620,19 @@ namespace AgroBase.Models.Modules
|
||||||
* Soma somente atuação ocorrida enquanto
|
* Soma somente atuação ocorrida enquanto
|
||||||
* o rover acumulava tempo de movimento.
|
* o rover acumulava tempo de movimento.
|
||||||
*/
|
*/
|
||||||
double somaBicoSegEmMovimento =
|
double somaBicoSegEmMovimento = bicosConsiderados.Sum(b => b.TempoAtuadoEmMovimento);
|
||||||
bicosConsiderados.Sum(
|
|
||||||
b => b.TempoAtuadoEmMovimento
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Capacidade total:
|
* Capacidade total:
|
||||||
* tempo de movimento x quantidade de regiões/bicos.
|
* tempo de movimento x quantidade de regiões/bicos.
|
||||||
*/
|
*/
|
||||||
double capacidadeTotalBicoSeg =
|
double capacidadeTotalBicoSeg = tempoMovimentoSeg * bicosConsiderados.Count;
|
||||||
tempoMovimentoSeg *
|
|
||||||
bicosConsiderados.Count;
|
|
||||||
|
|
||||||
double percentual =
|
double percentual = capacidadeTotalBicoSeg > 0 ? somaBicoSegEmMovimento / capacidadeTotalBicoSeg * 100.0 : 0;
|
||||||
capacidadeTotalBicoSeg > 0
|
|
||||||
? somaBicoSegEmMovimento /
|
|
||||||
capacidadeTotalBicoSeg *
|
|
||||||
100.0
|
|
||||||
: 0;
|
|
||||||
|
|
||||||
percentual =
|
percentual = FuncoesMatematicas.Clamp(percentual, 0.0, 100.0);
|
||||||
FuncoesMatematicas.Clamp(
|
|
||||||
percentual,
|
|
||||||
0.0,
|
|
||||||
100.0
|
|
||||||
);
|
|
||||||
|
|
||||||
PercentualErvasTerreno =
|
PercentualErvasTerreno = Math.Round(percentual, 2);
|
||||||
Math.Round(
|
|
||||||
percentual,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ZerarVazoesInstantaneas()
|
private void ZerarVazoesInstantaneas()
|
||||||
|
|
@ -1215,8 +1086,8 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
Modo = ModoControleBomba.PID,
|
Modo = ModoControleBomba.PID,
|
||||||
PotenciaMinPID = 40,
|
PotenciaMinPID = 40,
|
||||||
Kp = 6.0,
|
Kp = 1.10,
|
||||||
Ki = 0.2,
|
Ki = 0.12,
|
||||||
Kd = 0.0,
|
Kd = 0.0,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -1434,12 +1305,10 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
private void PrepararAtuadorParaOperacao(AtuadorModel Dados, bool resetarComandos)
|
private void PrepararAtuadorParaOperacao(AtuadorModel Dados, bool resetarComandos)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
var dadosAtuador = Dados;
|
var dadosAtuador = Dados;
|
||||||
var controle =
|
var controle = op.Parametros?.Controle;
|
||||||
Variaveis
|
|
||||||
.OperacaoEmAndamento
|
|
||||||
.Parametros?
|
|
||||||
.Controle;
|
|
||||||
|
|
||||||
if (dadosAtuador == null || controle == null)
|
if (dadosAtuador == null || controle == null)
|
||||||
return;
|
return;
|
||||||
|
|
@ -1478,16 +1347,13 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public void SincronizarBombaPressurizadoraAutomatica(bool forcar = false)
|
public void SincronizarBombaPressurizadoraAutomatica(bool forcar = false)
|
||||||
{
|
{
|
||||||
var operacao = Variaveis.OperacaoEmAndamento;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
var controle =
|
var controle = op?.Parametros?.Controle;
|
||||||
operacao?
|
|
||||||
.Parametros?
|
|
||||||
.Controle;
|
|
||||||
|
|
||||||
var bomba = BombaPressurizadora;
|
var bomba = BombaPressurizadora;
|
||||||
|
|
||||||
if (operacao == null || controle == null || bomba == null || !bomba.Inicializado)
|
if (op == null || controle == null || bomba == null || !bomba.Inicializado)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool pulverizadorAutomatico = controle.PulverizadorAutomatico;
|
bool pulverizadorAutomatico = controle.PulverizadorAutomatico;
|
||||||
|
|
@ -1495,14 +1361,14 @@ namespace AgroBase.Models.Modules
|
||||||
if (!pulverizadorAutomatico)
|
if (!pulverizadorAutomatico)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool operacaoConcluida = operacao.Sensoriamento?.StatusOperacao == StatusOperacao.Concluido;
|
bool operacaoConcluida = op.Sensoriamento?.Operacao?.StatusOperacaoAtual == StatusOperacao.Concluido;
|
||||||
|
|
||||||
bool atuacaoPermitida =
|
bool atuacaoPermitida =
|
||||||
operacao.Iniciado &&
|
op.Sensoriamento.Operacao.OperacaoIniciada &&
|
||||||
!operacao.Finalizando &&
|
!op.Sensoriamento.Operacao.Finalizando &&
|
||||||
!operacao.Emergencia &&
|
!op.Sensoriamento.Operacao.Emergencia &&
|
||||||
!operacaoConcluida &&
|
!operacaoConcluida &&
|
||||||
!operacao.Pausa;
|
!op.Sensoriamento.Operacao.Pausa;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reaplica setpoints sempre antes de sincronizar.
|
* Reaplica setpoints sempre antes de sincronizar.
|
||||||
|
|
@ -1522,45 +1388,19 @@ namespace AgroBase.Models.Modules
|
||||||
*/
|
*/
|
||||||
bomba.ComandoAtuar = statusDesejado;
|
bomba.ComandoAtuar = statusDesejado;
|
||||||
|
|
||||||
double potenciaEfetiva =
|
double potenciaEfetiva = statusDesejado ? bomba.PotenciaSP : 0;
|
||||||
statusDesejado
|
|
||||||
? bomba.PotenciaSP
|
|
||||||
: 0;
|
|
||||||
|
|
||||||
double pressaoEfetiva =
|
double pressaoEfetiva = bomba.Sensor_ID_Num > -1 ? (statusDesejado ? bomba.PressaoSP : 0) : bomba.PressaoSP;
|
||||||
bomba.Sensor_ID_Num > -1
|
|
||||||
? (
|
|
||||||
statusDesejado
|
|
||||||
? bomba.PressaoSP
|
|
||||||
: 0
|
|
||||||
)
|
|
||||||
: bomba.PressaoSP;
|
|
||||||
|
|
||||||
Estado estadoDesejado =
|
Estado estadoDesejado = statusDesejado ? Estado.Ligado : Estado.Desligado;
|
||||||
statusDesejado
|
|
||||||
? Estado.Ligado
|
|
||||||
: Estado.Desligado;
|
|
||||||
|
|
||||||
bool estadoDivergente =
|
bool estadoDivergente = estadoDesejado != bomba._EstadoLeitura;
|
||||||
estadoDesejado != bomba._EstadoLeitura;
|
|
||||||
|
|
||||||
bool potenciaDivergente =
|
bool potenciaDivergente = Math.Abs(bomba._PotenciaSP - potenciaEfetiva) > 1.0;
|
||||||
Math.Abs(
|
|
||||||
bomba._PotenciaSP -
|
|
||||||
potenciaEfetiva
|
|
||||||
) > 1.0;
|
|
||||||
|
|
||||||
bool pressaoDivergente =
|
bool pressaoDivergente = bomba.Sensor_ID_Num > -1 && Math.Abs(bomba._PressaoSP - pressaoEfetiva) > 0.05;
|
||||||
bomba.Sensor_ID_Num > -1 &&
|
|
||||||
Math.Abs(
|
|
||||||
bomba._PressaoSP -
|
|
||||||
pressaoEfetiva
|
|
||||||
) > 0.05;
|
|
||||||
|
|
||||||
if (forcar ||
|
if (forcar || estadoDivergente || potenciaDivergente || pressaoDivergente)
|
||||||
estadoDivergente ||
|
|
||||||
potenciaDivergente ||
|
|
||||||
pressaoDivergente)
|
|
||||||
{
|
{
|
||||||
EnviarComandoFisicoBomba(
|
EnviarComandoFisicoBomba(
|
||||||
bomba,
|
bomba,
|
||||||
|
|
@ -1573,22 +1413,24 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public async Task<bool> VerificaDispositivoConectado()
|
public async Task<bool> VerificaDispositivoConectado()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (!CanManager.CanService.IsConnected) return false;
|
if (!CanManager.CanService.IsConnected) return false;
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.DispAtu == null) return false;
|
if (op.DispAtu == null) return false;
|
||||||
|
|
||||||
CanManager.CanService.RegistrarHandler(_EnderecoCAN_Rx, _AtuHandler);
|
CanManager.CanService.RegistrarHandler(_EnderecoCAN_Rx, _AtuHandler);
|
||||||
|
|
||||||
RequisitarDadosDescoberta();
|
RequisitarDadosDescoberta();
|
||||||
|
|
||||||
DateTime Inicio = DateTime.Now;
|
DateTime Inicio = DateTime.Now;
|
||||||
bool Respondido() => Variaveis.OperacaoEmAndamento.DispAtu.Dados.DadosLeitura.UltimoComandoRespondido > Inicio;
|
bool Respondido() => op.DispAtu.Dados.DadosLeitura.UltimoComandoRespondido > Inicio;
|
||||||
await FuncoesGlobais.AguardarCondicaoAsync(Respondido, 500, 50);
|
await FuncoesGlobais.AguardarCondicaoAsync(Respondido, 500, 50);
|
||||||
|
|
||||||
if (Conectado)
|
if (Conectado)
|
||||||
{
|
{
|
||||||
DefinirDispositivo();
|
DefinirDispositivo();
|
||||||
Variaveis.OperacaoEmAndamento.DispAtu?.EnviarProtocolosConfiguracao();
|
op.DispAtu?.EnviarProtocolosConfiguracao();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Conectado;
|
return Conectado;
|
||||||
|
|
@ -1596,6 +1438,8 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
private void DefinirDispositivo()
|
private void DefinirDispositivo()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Dispositivo && x.Mod_ID == Modulo_ID))
|
if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Dispositivo && x.Mod_ID == Modulo_ID))
|
||||||
{
|
{
|
||||||
SerialService.DispositivosMapeados.Add(new DispositivoDetalhesModel()
|
SerialService.DispositivosMapeados.Add(new DispositivoDetalhesModel()
|
||||||
|
|
@ -1606,8 +1450,8 @@ namespace AgroBase.Models.Modules
|
||||||
Mod_ID = Modulo_ID
|
Mod_ID = Modulo_ID
|
||||||
});
|
});
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.ModsCalibragem[Dispositivo] = new Dictionary<string, bool>();
|
op.Sensoriamento.Operacao.ModsCalibragem[Dispositivo] = new Dictionary<string, bool>();
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Conectado, 0, "Dispositivo conectado");
|
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Conectado, 0, "Dispositivo conectado");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1760,13 +1604,15 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public async Task tmrRegistrador_Tick()
|
public async Task tmrRegistrador_Tick()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (Variaveis.Fechando) return;
|
if (Variaveis.Fechando) return;
|
||||||
|
|
||||||
tmrRegistrador.SetInterval(_TaxaAmostragem);
|
tmrRegistrador.SetInterval(_TaxaAmostragem);
|
||||||
|
|
||||||
if (SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Atu) && (_VezesLeituraReconexao >= _TempoReconexaoComponentes))
|
if (SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Dispositivo) && (_VezesLeituraReconexao >= _TempoReconexaoComponentes))
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.DispAtu?.EnviarProtocolosConfiguracao();
|
op.DispAtu?.EnviarProtocolosConfiguracao();
|
||||||
|
|
||||||
_VezesLeituraReconexao = 0;
|
_VezesLeituraReconexao = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1792,23 +1638,16 @@ namespace AgroBase.Models.Modules
|
||||||
if (Variaveis.Fechando)
|
if (Variaveis.Fechando)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var operacao = Variaveis.OperacaoEmAndamento;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (operacao?.DispAtu?.Dados?.Conectado != true)
|
if (op?.DispAtu?.Dados?.Conectado != true)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool operacaoConcluida =
|
bool operacaoConcluida = op.Sensoriamento?.Operacao?.StatusOperacaoAtual == StatusOperacao.Concluido;
|
||||||
operacao.Sensoriamento?.StatusOperacao ==
|
|
||||||
StatusOperacao.Concluido;
|
|
||||||
|
|
||||||
bool pulverizadorAutomatico =
|
bool pulverizadorAutomatico = op.Parametros?.Controle?.PulverizadorAutomatico ?? false;
|
||||||
operacao.Parametros?
|
|
||||||
.Controle?
|
|
||||||
.PulverizadorAutomatico
|
|
||||||
?? false;
|
|
||||||
|
|
||||||
bool calibrando =
|
bool calibrando = op.Sensoriamento?.Operacao?.Calibrando == true;
|
||||||
operacao.Calibrando;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bloqueios absolutos.
|
* Bloqueios absolutos.
|
||||||
|
|
@ -1818,9 +1657,9 @@ namespace AgroBase.Models.Modules
|
||||||
* operação ter sido encerrada.
|
* operação ter sido encerrada.
|
||||||
*/
|
*/
|
||||||
bool bloqueioGeral =
|
bool bloqueioGeral =
|
||||||
!operacao.Iniciado ||
|
!op.Sensoriamento.Operacao.OperacaoIniciada ||
|
||||||
operacao.Finalizando ||
|
op.Sensoriamento.Operacao.Finalizando ||
|
||||||
operacao.Emergencia ||
|
op.Sensoriamento.Operacao.Emergencia ||
|
||||||
operacaoConcluida;
|
operacaoConcluida;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1828,12 +1667,7 @@ namespace AgroBase.Models.Modules
|
||||||
* Portanto, a pausa somente bloqueia atuação fora
|
* Portanto, a pausa somente bloqueia atuação fora
|
||||||
* da calibração.
|
* da calibração.
|
||||||
*/
|
*/
|
||||||
bool atuacaoPermitida =
|
bool atuacaoPermitida = !bloqueioGeral && (!op.Sensoriamento.Operacao.Pausa || calibrando);
|
||||||
!bloqueioGeral &&
|
|
||||||
(
|
|
||||||
!operacao.Pausa ||
|
|
||||||
calibrando
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BICOS
|
* BICOS
|
||||||
|
|
@ -1843,21 +1677,10 @@ namespace AgroBase.Models.Modules
|
||||||
*
|
*
|
||||||
* Este método apenas calcula o comando físico.
|
* Este método apenas calcula o comando físico.
|
||||||
*/
|
*/
|
||||||
foreach (
|
foreach (var bico in BicosPulverizadores.Where(x => x != null && x.Inicializado))
|
||||||
var bico in
|
|
||||||
BicosPulverizadores
|
|
||||||
.Where(x =>
|
|
||||||
x != null &&
|
|
||||||
x.Inicializado)
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
bool comandoSolicitado =
|
bool comandoSolicitado = bico.Comandar && bico.ComandoAtuar;
|
||||||
bico.Comandar &&
|
bool statusDesejado = comandoSolicitado && atuacaoPermitida;
|
||||||
bico.ComandoAtuar;
|
|
||||||
|
|
||||||
bool statusDesejado =
|
|
||||||
comandoSolicitado &&
|
|
||||||
atuacaoPermitida;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fora da calibração, a pulverização automática
|
* Fora da calibração, a pulverização automática
|
||||||
|
|
@ -1866,43 +1689,24 @@ namespace AgroBase.Models.Modules
|
||||||
* Durante a calibração, permite o pulso de teste
|
* Durante a calibração, permite o pulso de teste
|
||||||
* explicitamente solicitado pelo método de calibração.
|
* explicitamente solicitado pelo método de calibração.
|
||||||
*/
|
*/
|
||||||
if (
|
if (pulverizadorAutomatico && !calibrando)
|
||||||
pulverizadorAutomatico &&
|
|
||||||
!calibrando
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
statusDesejado &=
|
statusDesejado &= ContadorCarga.PulverizadorLiberado;
|
||||||
ContadorCarga.PulverizadorLiberado;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Estado estadoDesejado =
|
Estado estadoDesejado = statusDesejado ? Estado.Ligado : Estado.Desligado;
|
||||||
statusDesejado
|
|
||||||
? Estado.Ligado
|
|
||||||
: Estado.Desligado;
|
|
||||||
|
|
||||||
double anguloDesejado =
|
double anguloDesejado = statusDesejado ? bico.AnguloControle : bico.AnguloNeutro;
|
||||||
statusDesejado
|
|
||||||
? bico.AnguloControle
|
|
||||||
: bico.AnguloNeutro;
|
|
||||||
|
|
||||||
bool estadoDivergente =
|
bool estadoDivergente = estadoDesejado != bico._EstadoLeitura;
|
||||||
estadoDesejado !=
|
|
||||||
bico._EstadoLeitura;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Verifica o ângulo também quando desligado,
|
* Verifica o ângulo também quando desligado,
|
||||||
* para garantir o retorno à posição neutra.
|
* para garantir o retorno à posição neutra.
|
||||||
*/
|
*/
|
||||||
bool anguloDivergente =
|
bool anguloDivergente = Math.Abs(anguloDesejado - bico._AnguloBicoLeitura) > 1.0;
|
||||||
Math.Abs(
|
|
||||||
anguloDesejado -
|
|
||||||
bico._AnguloBicoLeitura
|
|
||||||
) > 1.0;
|
|
||||||
|
|
||||||
if (
|
if (estadoDivergente || anguloDivergente)
|
||||||
estadoDivergente ||
|
|
||||||
anguloDivergente
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
EnviarComandoFisicoBico(
|
EnviarComandoFisicoBico(
|
||||||
bico,
|
bico,
|
||||||
|
|
@ -1915,21 +1719,11 @@ namespace AgroBase.Models.Modules
|
||||||
/*
|
/*
|
||||||
* BOMBAS
|
* BOMBAS
|
||||||
*/
|
*/
|
||||||
foreach (
|
foreach (var bomba in BombasPressurizadoras.Where(x => x != null && x.Inicializado))
|
||||||
var bomba in
|
|
||||||
BombasPressurizadoras
|
|
||||||
.Where(x =>
|
|
||||||
x != null &&
|
|
||||||
x.Inicializado)
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
bool ehBombaPrincipal =
|
bool ehBombaPrincipal = bomba.ID == BombaPressurizadora?.ID;
|
||||||
bomba.ID ==
|
|
||||||
BombaPressurizadora?.ID;
|
|
||||||
|
|
||||||
bool comandoSolicitado =
|
bool comandoSolicitado = bomba.Comandar && bomba.ComandoAtuar;
|
||||||
bomba.Comandar &&
|
|
||||||
bomba.ComandoAtuar;
|
|
||||||
|
|
||||||
bool statusDesejado;
|
bool statusDesejado;
|
||||||
|
|
||||||
|
|
@ -1942,9 +1736,7 @@ namespace AgroBase.Models.Modules
|
||||||
*/
|
*/
|
||||||
if (calibrando)
|
if (calibrando)
|
||||||
{
|
{
|
||||||
statusDesejado =
|
statusDesejado = comandoSolicitado && atuacaoPermitida;
|
||||||
comandoSolicitado &&
|
|
||||||
atuacaoPermitida;
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Fora da calibração, a bomba principal automática
|
* Fora da calibração, a bomba principal automática
|
||||||
|
|
@ -1955,10 +1747,7 @@ namespace AgroBase.Models.Modules
|
||||||
*/
|
*/
|
||||||
else if (ehBombaPrincipal && pulverizadorAutomatico)
|
else if (ehBombaPrincipal && pulverizadorAutomatico)
|
||||||
{
|
{
|
||||||
statusDesejado =
|
statusDesejado = bomba.Comandar && atuacaoPermitida && ContadorCarga.PulverizadorLiberado;
|
||||||
bomba.Comandar &&
|
|
||||||
atuacaoPermitida &&
|
|
||||||
ContadorCarga.PulverizadorLiberado;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mantém o modelo coerente com o comando automático.
|
* Mantém o modelo coerente com o comando automático.
|
||||||
|
|
@ -1975,15 +1764,10 @@ namespace AgroBase.Models.Modules
|
||||||
*/
|
*/
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
statusDesejado =
|
statusDesejado = comandoSolicitado && atuacaoPermitida;
|
||||||
comandoSolicitado &&
|
|
||||||
atuacaoPermitida;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Estado estadoDesejado =
|
Estado estadoDesejado = statusDesejado ? Estado.Ligado : Estado.Desligado;
|
||||||
statusDesejado
|
|
||||||
? Estado.Ligado
|
|
||||||
: Estado.Desligado;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Valores efetivamente enviados ao hardware.
|
* Valores efetivamente enviados ao hardware.
|
||||||
|
|
@ -1991,19 +1775,13 @@ namespace AgroBase.Models.Modules
|
||||||
* Os setpoints armazenados no modelo não são
|
* Os setpoints armazenados no modelo não são
|
||||||
* alterados quando existir um bloqueio temporário.
|
* alterados quando existir um bloqueio temporário.
|
||||||
*/
|
*/
|
||||||
double potenciaEfetiva =
|
double potenciaEfetiva = statusDesejado ? bomba.PotenciaSP : 0;
|
||||||
statusDesejado
|
|
||||||
? bomba.PotenciaSP
|
|
||||||
: 0;
|
|
||||||
|
|
||||||
double pressaoEfetiva;
|
double pressaoEfetiva;
|
||||||
|
|
||||||
if (bomba.Sensor_ID_Num > -1)
|
if (bomba.Sensor_ID_Num > -1)
|
||||||
{
|
{
|
||||||
pressaoEfetiva =
|
pressaoEfetiva = statusDesejado ? bomba.PressaoSP : 0;
|
||||||
statusDesejado
|
|
||||||
? bomba.PressaoSP
|
|
||||||
: 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -2011,32 +1789,16 @@ namespace AgroBase.Models.Modules
|
||||||
* Mantém -1 como marcador de bomba sem
|
* Mantém -1 como marcador de bomba sem
|
||||||
* sensor de pressão, como o agitador.
|
* sensor de pressão, como o agitador.
|
||||||
*/
|
*/
|
||||||
pressaoEfetiva =
|
pressaoEfetiva = bomba.PressaoSP;
|
||||||
bomba.PressaoSP;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool estadoDivergente =
|
bool estadoDivergente = estadoDesejado != bomba._EstadoLeitura;
|
||||||
estadoDesejado !=
|
|
||||||
bomba._EstadoLeitura;
|
|
||||||
|
|
||||||
bool potenciaDivergente =
|
bool potenciaDivergente = Math.Abs(bomba._PotenciaSP - potenciaEfetiva) > 1.0;
|
||||||
Math.Abs(
|
|
||||||
bomba._PotenciaSP -
|
|
||||||
potenciaEfetiva
|
|
||||||
) > 1.0;
|
|
||||||
|
|
||||||
bool pressaoDivergente =
|
bool pressaoDivergente = bomba.Sensor_ID_Num > -1 && Math.Abs(bomba._PressaoSP - pressaoEfetiva) > 0.05;
|
||||||
bomba.Sensor_ID_Num > -1 &&
|
|
||||||
Math.Abs(
|
|
||||||
bomba._PressaoSP -
|
|
||||||
pressaoEfetiva
|
|
||||||
) > 0.05;
|
|
||||||
|
|
||||||
if (
|
if (estadoDivergente || potenciaDivergente || pressaoDivergente)
|
||||||
estadoDivergente ||
|
|
||||||
potenciaDivergente ||
|
|
||||||
pressaoDivergente
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
EnviarComandoFisicoBomba(
|
EnviarComandoFisicoBomba(
|
||||||
bomba,
|
bomba,
|
||||||
|
|
@ -2127,7 +1889,9 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
private async Task<bool> RealizarTestesIniciais(bool forcar)
|
private async Task<bool> RealizarTestesIniciais(bool forcar)
|
||||||
{
|
{
|
||||||
var calAtu = Variaveis.OperacaoEmAndamento.ModsCalibragem[Dispositivo];
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
var calAtu = op.Sensoriamento.Operacao.ModsCalibragem[Dispositivo];
|
||||||
|
|
||||||
// Ligar bomba
|
// Ligar bomba
|
||||||
foreach (var Bomba in BombasPressurizadoras.Where(x => x.Comandar))
|
foreach (var Bomba in BombasPressurizadoras.Where(x => x.Comandar))
|
||||||
|
|
@ -2141,29 +1905,29 @@ namespace AgroBase.Models.Modules
|
||||||
if (!Bomba.Inicializado || ContadorCarga.PercentualAtual < VariaveisEquipamento.PercentualReservatorioMin)
|
if (!Bomba.Inicializado || ContadorCarga.PercentualAtual < VariaveisEquipamento.PercentualReservatorioMin)
|
||||||
{
|
{
|
||||||
Variaveis.MostrarLog($"[AtuadorModel] [RealizarTestesIniciais] Bomba não iniciada ou nível do reservatório baixo, não irá ligar a bomba {Bomba.ID}");
|
Variaveis.MostrarLog($"[AtuadorModel] [RealizarTestesIniciais] Bomba não iniciada ou nível do reservatório baixo, não irá ligar a bomba {Bomba.ID}");
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, $"Bomba não iniciada ou nível do reservatório baixo, não irá ligar a bomba {Bomba.ID}", id: Bomba.ID);
|
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, $"Bomba não iniciada ou nível do reservatório baixo, não irá ligar a bomba {Bomba.ID}", id: Bomba.ID);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bomba.PotenciaSP = 100;
|
Bomba.PotenciaSP = 100;
|
||||||
if (Bomba.ID == BombaPressurizadora.ID)
|
if (Bomba.ID == BombaPressurizadora.ID)
|
||||||
{
|
{
|
||||||
Bomba.Controle.Modo = Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuModoControle;
|
Bomba.Controle.Modo = op.Parametros.Controle.AtuModoControle;
|
||||||
Bomba.PressaoSP = Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha;
|
Bomba.PressaoSP = op.Parametros.Controle.AtuPressaoLinha;
|
||||||
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: true, Valores: new List<double?>() { (int)Bomba.Controle.Modo, Bomba.Controle.PotenciaMinPID, Bomba.Controle.Kp, Bomba.Controle.Ki, Bomba.Controle.Kd }, Comando: CanMessagePosicaoDados.Command2, Forcar: true);
|
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: true, Valores: new List<double?>() { (int)Bomba.Controle.Modo, Bomba.Controle.PotenciaMinPID, Bomba.Controle.Kp, Bomba.Controle.Ki, Bomba.Controle.Kd }, Comando: CanMessagePosicaoDados.Command2, Forcar: true);
|
||||||
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: true, Valores: new List<double?>() { Bomba.PotenciaSP, Bomba.PressaoSP }, Comando: CanMessagePosicaoDados.Command1, Forcar: true);
|
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: true, Valores: new List<double?>() { Bomba.PotenciaSP, Bomba.PressaoSP }, Comando: CanMessagePosicaoDados.Command1, Forcar: true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Bomba.PressaoSP = -1;
|
Bomba.PressaoSP = -1;
|
||||||
bool ligar = Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuAgitadorModo != ModoAgitadorCalda.SemAgitacao;
|
bool ligar = op.Parametros.Controle.AtuAgitadorModo != ModoAgitadorCalda.SemAgitacao;
|
||||||
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: ligar, Valores: new List<double?>() { Bomba.PotenciaSP, Bomba.PressaoSP }, Comando: CanMessagePosicaoDados.Command1, Forcar: true);
|
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: ligar, Valores: new List<double?>() { Bomba.PotenciaSP, Bomba.PressaoSP }, Comando: CanMessagePosicaoDados.Command1, Forcar: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Bomba.Sensor_ID_Num == -1)
|
if (Bomba.Sensor_ID_Num == -1)
|
||||||
{
|
{
|
||||||
Variaveis.MostrarLog($"[AtuadorModel] [RealizarTestesIniciais] Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato");
|
Variaveis.MostrarLog($"[AtuadorModel] [RealizarTestesIniciais] Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato");
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, $"Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato", id: Bomba.ID);
|
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, $"Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato", id: Bomba.ID);
|
||||||
calAtu[Bomba.ID] = true;
|
calAtu[Bomba.ID] = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -2227,22 +1991,24 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public List<Task> RealizarCalibragemAsync(bool forcar)
|
public List<Task> RealizarCalibragemAsync(bool forcar)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
List<Task> tasks = new List<Task>();
|
List<Task> tasks = new List<Task>();
|
||||||
var DispAtu = Variaveis.OperacaoEmAndamento.DispAtu;
|
var DispAtu = op.DispAtu;
|
||||||
if (DispAtu != null)
|
if (DispAtu != null)
|
||||||
{
|
{
|
||||||
tasks.Add(DispAtu.Dados.RealizarTestesIniciais(forcar).ContinueWith(t => {
|
tasks.Add(DispAtu.Dados.RealizarTestesIniciais(forcar).ContinueWith(t => {
|
||||||
if (t.IsFaulted)
|
if (t.IsFaulted)
|
||||||
{
|
{
|
||||||
Variaveis.MostrarLog($"[AtuadorModel] [RealizarCalibragemAsync] Erro no referenciamento do módulo {Modulo_ID}: {t.Exception?.InnerException?.Message}");
|
Variaveis.MostrarLog($"[AtuadorModel] [RealizarCalibragemAsync] Erro no referenciamento do módulo {Modulo_ID}: {t.Exception?.InnerException?.Message}");
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Falha, 0, $"Erro no referenciamento do módulo {Modulo_ID}: {t.Exception?.InnerException?.Message}");
|
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Falha, 0, $"Erro no referenciamento do módulo {Modulo_ID}: {t.Exception?.InnerException?.Message}");
|
||||||
}
|
}
|
||||||
if (t.IsCompleted)
|
if (t.IsCompleted)
|
||||||
{
|
{
|
||||||
var calAtu = Variaveis.OperacaoEmAndamento.ModsCalibragem[Dispositivo];
|
var calAtu = op.Sensoriamento.Operacao.ModsCalibragem[Dispositivo];
|
||||||
var v = calAtu.Select(x => $"{x.Key} " + (x.Value ? "Sim" : "Não"));
|
var v = calAtu.Select(x => $"{x.Key} " + (x.Value ? "Sim" : "Não"));
|
||||||
Variaveis.MostrarLog($"[AtuadorModel] [RealizarCalibragemAsync] Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
|
Variaveis.MostrarLog($"[AtuadorModel] [RealizarCalibragemAsync] Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Operante, 100, $"Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
|
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Operante, 100, $"Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}));
|
||||||
|
|
@ -2437,7 +2203,8 @@ namespace AgroBase.Models.Modules
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReiniciarHistoricoAtuacao(bool limparTrechos = true) {
|
public void ReiniciarHistoricoAtuacao(bool limparTrechos = true)
|
||||||
|
{
|
||||||
lock (_trechosLock)
|
lock (_trechosLock)
|
||||||
{
|
{
|
||||||
_trechoAtivo = null;
|
_trechoAtivo = null;
|
||||||
|
|
@ -2712,7 +2479,7 @@ namespace AgroBase.Models.Modules
|
||||||
public class AtuadorFuncoesGerais
|
public class AtuadorFuncoesGerais
|
||||||
{
|
{
|
||||||
|
|
||||||
public static void DesenharAtuadores(object sender, PaintEventArgs e, List<AtuBicoSensoriamentoLogModel> Bicos, bool BombaLigada, double PressaoLinha, double TempoBombaAtuada)
|
public static void DesenharAtuadores(object sender, PaintEventArgs e, List<AtuadorBicoLogModel> Bicos, bool BombaLigada, double PressaoLinha, double TempoBombaAtuada)
|
||||||
{
|
{
|
||||||
Panel myPanel = (Panel)sender;
|
Panel myPanel = (Panel)sender;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -289,11 +289,13 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public void EnviarComandoControle(Direcao Direcao)
|
public void EnviarComandoControle(Direcao Direcao)
|
||||||
{
|
{
|
||||||
var _Simulando = Variaveis.OperacaoEmAndamento.Simulando;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
var _Simulando = op.Simulando;
|
||||||
|
|
||||||
if ((Inicializado && (Comandar || !AtingiuAnguloSP)) || _Simulando)
|
if ((Inicializado && (Comandar || !AtingiuAnguloSP)) || _Simulando)
|
||||||
{
|
{
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var _Controle = op.Controle;
|
||||||
int AnguloTipoMovimento = VariaveisEquipamento.AnguloMovimento[_Controle.TipoMovimento];
|
int AnguloTipoMovimento = VariaveisEquipamento.AnguloMovimento[_Controle.TipoMovimento];
|
||||||
|
|
||||||
if (!Comandar)
|
if (!Comandar)
|
||||||
|
|
@ -332,7 +334,7 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
if (Comandar)
|
if (Comandar)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle = Variaveis.OperacaoEmAndamento.Controle.Angulo;
|
op.SimulacaoAnguloControle = op.Controle.Angulo;
|
||||||
//Console.WriteLine($"[{Mod_ID}] Angulo Atualizado para {Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle}");
|
//Console.WriteLine($"[{Mod_ID}] Angulo Atualizado para {Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -353,6 +355,8 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public async Task ReferenciaMotor()
|
public async Task ReferenciaMotor()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (Referenciando || !Inicializado) return;
|
if (Referenciando || !Inicializado) return;
|
||||||
|
|
||||||
Referenciando = true;
|
Referenciando = true;
|
||||||
|
|
@ -376,12 +380,12 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
await SetZero();
|
await SetZero();
|
||||||
Variaveis.MostrarLog($"[DirecionalModel] [ReferenciaMotor] [DIR {Mod_ID}] - Referenciamento Concluído!");
|
Variaveis.MostrarLog($"[DirecionalModel] [ReferenciaMotor] [DIR {Mod_ID}] - Referenciamento Concluído!");
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Dir, StatusModulo.Operante, 100, $"Referenciamento Concluído!", id: Mod_ID);
|
op.Sensoriamento.InserirLog(T_Code.Dir, StatusModulo.Operante, 100, $"Referenciamento Concluído!", id: Mod_ID);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Variaveis.MostrarLog($"[DirecionalModel] [ReferenciaMotor] [DIR {Mod_ID}] - Referenciamento Falhou!");
|
Variaveis.MostrarLog($"[DirecionalModel] [ReferenciaMotor] [DIR {Mod_ID}] - Referenciamento Falhou!");
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Dir, StatusModulo.Falha, 0, $"Referenciamento Falhou!", id: Mod_ID);
|
op.Sensoriamento.InserirLog(T_Code.Dir, StatusModulo.Falha, 0, $"Referenciamento Falhou!", id: Mod_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
Referenciando = false;
|
Referenciando = false;
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
public class ModuloIMUModel
|
public class ModuloIMUModel
|
||||||
{
|
{
|
||||||
|
public DateTime Momento { get; set; }
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// Estado geral
|
// Estado geral
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|
|
||||||
|
|
@ -205,7 +205,9 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
if (ComandoLigado)
|
if (ComandoLigado)
|
||||||
{
|
{
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
var _Controle = op.Controle;
|
||||||
var _ControleDir = _Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Dir);
|
var _ControleDir = _Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Dir);
|
||||||
|
|
||||||
bool movimentoCompensado =
|
bool movimentoCompensado =
|
||||||
|
|
@ -213,7 +215,7 @@ namespace AgroBase.Models.Modules
|
||||||
(_Controle.TipoMovimento == TipoMovimentoDirecional.RodasDianteiras && Mod_ID.Contains("F")) ||
|
(_Controle.TipoMovimento == TipoMovimentoDirecional.RodasDianteiras && Mod_ID.Contains("F")) ||
|
||||||
(_Controle.TipoMovimento == TipoMovimentoDirecional.RodasTraseiras && Mod_ID.Contains("T"));
|
(_Controle.TipoMovimento == TipoMovimentoDirecional.RodasTraseiras && Mod_ID.Contains("T"));
|
||||||
bool emCurva = _ControleDir.UltimaDirecao != Direcao.Parado;
|
bool emCurva = _ControleDir.UltimaDirecao != Direcao.Parado;
|
||||||
double anguloDir = Math.Abs(Variaveis.OperacaoEmAndamento.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x.Modulo_ID == Mod_ID)?.DirMotor?.Angulo_SP ?? 0);
|
double anguloDir = Math.Abs(op.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x.Modulo_ID == Mod_ID)?.DirMotor?.Angulo_SP ?? 0);
|
||||||
bool direcionalAtuado = anguloDir > 0.0;
|
bool direcionalAtuado = anguloDir > 0.0;
|
||||||
|
|
||||||
if (movimentoCompensado && emCurva && direcionalAtuado)
|
if (movimentoCompensado && emCurva && direcionalAtuado)
|
||||||
|
|
@ -261,7 +263,6 @@ namespace AgroBase.Models.Modules
|
||||||
public List<FuncoesPinout> Funcoes { get; set; }
|
public List<FuncoesPinout> Funcoes { get; set; }
|
||||||
|
|
||||||
public List<MvdMotorMOVSensorimanetoGrafico> LogGrafico { get; set; } = new List<MvdMotorMOVSensorimanetoGrafico>();
|
public List<MvdMotorMOVSensorimanetoGrafico> LogGrafico { get; set; } = new List<MvdMotorMOVSensorimanetoGrafico>();
|
||||||
public List<AlarmeModel> Alarmes { get; set; } = new List<AlarmeModel>();
|
|
||||||
|
|
||||||
public MvdServoFreioModel ConfigFreio { get; set; }
|
public MvdServoFreioModel ConfigFreio { get; set; }
|
||||||
|
|
||||||
|
|
@ -380,13 +381,15 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public void EnviarComandoControle(Direcao DirecaoAtual)
|
public void EnviarComandoControle(Direcao DirecaoAtual)
|
||||||
{
|
{
|
||||||
var simulando = Variaveis.OperacaoEmAndamento.Simulando || Variaveis.OperacaoEmAndamento.Treinando;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
var simulando = op.Simulando || op.Treinando;
|
||||||
|
|
||||||
bool Freado = DirecaoAtual == Direcao.EmFreio;
|
bool Freado = DirecaoAtual == Direcao.EmFreio;
|
||||||
|
|
||||||
if ((Comandar && Inicializado) || simulando)
|
if ((Comandar && Inicializado) || simulando)
|
||||||
{
|
{
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var _Controle = op.Controle;
|
||||||
|
|
||||||
if (AlarmeSensores || AlarmeMotor)
|
if (AlarmeSensores || AlarmeMotor)
|
||||||
{
|
{
|
||||||
|
|
@ -404,7 +407,7 @@ namespace AgroBase.Models.Modules
|
||||||
RPM_SP = Math.Abs(RpmCorrigido);
|
RPM_SP = Math.Abs(RpmCorrigido);
|
||||||
FatorCompensacaoCurvasAnterior = FatorCompensacaoCurvas;
|
FatorCompensacaoCurvasAnterior = FatorCompensacaoCurvas;
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.SimulacaoRpmControle = _Controle.PercentualVelocidadeSP;
|
op.SimulacaoRpmControle = _Controle.PercentualVelocidadeSP;
|
||||||
//Console.WriteLine($"RPM Atualizado para {Variaveis.OperacaoEmAndamento.SimulacaoRpmControle}");
|
//Console.WriteLine($"RPM Atualizado para {Variaveis.OperacaoEmAndamento.SimulacaoRpmControle}");
|
||||||
|
|
||||||
switch (DirecaoAtual)
|
switch (DirecaoAtual)
|
||||||
|
|
@ -517,7 +520,7 @@ namespace AgroBase.Models.Modules
|
||||||
public int DelayEnvio { get; set; } = 500;
|
public int DelayEnvio { get; set; } = 500;
|
||||||
|
|
||||||
public SensorServoModel Servo => Variaveis.OperacaoEmAndamento.DispSen?.Dados?.Servos?.FirstOrDefault(x => x.Inicializado && x.ID.Contains(Mod_ID));
|
public SensorServoModel Servo => Variaveis.OperacaoEmAndamento.DispSen?.Dados?.Servos?.FirstOrDefault(x => x.Inicializado && x.ID.Contains(Mod_ID));
|
||||||
private double VelocidadeAtual => FuncoesMatematicas.CalculaVelocidadePercentualMs(Variaveis.OperacaoEmAndamento.Sensoriamento?.Movimentacao?.VelocidadeMedia ?? 0);
|
private double VelocidadeAtual => FuncoesMatematicas.CalculaVelocidadePercentualMs(Variaveis.OperacaoEmAndamento.Sensoriamento?.Movimentacao?.VelocidadeMediaMs ?? 0);
|
||||||
private bool StatusControleEmFreio => Variaveis.OperacaoEmAndamento.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x.Modulo_ID == Mod_ID)?.MovMotor?.Leitura?.Freado ?? false;
|
private bool StatusControleEmFreio => Variaveis.OperacaoEmAndamento.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x.Modulo_ID == Mod_ID)?.MovMotor?.Leitura?.Freado ?? false;
|
||||||
private int? AnguloLido => (int?)Servo?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual?.valor;
|
private int? AnguloLido => (int?)Servo?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual?.valor;
|
||||||
|
|
||||||
|
|
@ -671,9 +674,11 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public static void AtualizarDados()
|
public static void AtualizarDados()
|
||||||
{
|
{
|
||||||
var ctrl = Variaveis.OperacaoEmAndamento?.Controle;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
var disp = Variaveis.OperacaoEmAndamento?.DispMvd?.Dados?.Modulos;
|
|
||||||
if (Variaveis.OperacaoEmAndamento.StatusAtual != StatusOperacao.EmAndamento || ctrl == null || disp == null || !MovimentosCompensar.Contains(ctrl.TipoMovimento))
|
var ctrl = op.Controle;
|
||||||
|
var disp = op.DispMvd?.Dados?.Modulos;
|
||||||
|
if (op.Sensoriamento?.Operacao?.StatusOperacaoAtual != StatusOperacao.EmAndamento || ctrl == null || disp == null || !MovimentosCompensar.Contains(ctrl.TipoMovimento))
|
||||||
{
|
{
|
||||||
compensacoes = (disp ?? Enumerable.Empty<ModuloMvdModel>()).ToDictionary(x => x.Modulo_ID, x => 1.0);
|
compensacoes = (disp ?? Enumerable.Empty<ModuloMvdModel>()).ToDictionary(x => x.Modulo_ID, x => 1.0);
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -212,14 +212,15 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public async Task tmrRegistrador_Tick()
|
public async Task tmrRegistrador_Tick()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
tmrRegistrador.SetInterval(_TaxaAmostragem);
|
tmrRegistrador.SetInterval(_TaxaAmostragem);
|
||||||
|
|
||||||
if (!Variaveis.OperacaoEmAndamento.Simulando)
|
if (!op.Simulando)
|
||||||
{
|
{
|
||||||
VelocidadeMedia = FuncoesMatematicas.ConverteKmhParaMs(Modulos.Where(x => x.Conectado && x.MovMotor.ComandoLigado).DefaultIfEmpty().Average(x => x?.MovMotor?.VelocidadeInstantanea ?? 0));
|
VelocidadeMedia = FuncoesMatematicas.ConverteKmhParaMs(Modulos.Where(x => x.Conectado && x.MovMotor.ComandoLigado).DefaultIfEmpty().Average(x => x?.MovMotor?.VelocidadeInstantanea ?? 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
var UltimaDirecao = Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Mov)?.UltimaDirecao ?? Direcao.Parado;
|
var UltimaDirecao = op.Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Mov)?.UltimaDirecao ?? Direcao.Parado;
|
||||||
if (UltimaDirecao != Direcao.Parado)
|
if (UltimaDirecao != Direcao.Parado)
|
||||||
{
|
{
|
||||||
//double tempo = _TaxaAmostragem / 1000.0;
|
//double tempo = _TaxaAmostragem / 1000.0;
|
||||||
|
|
@ -242,16 +243,16 @@ namespace AgroBase.Models.Modules
|
||||||
private static readonly TimeSpan IntervaloLogMov = TimeSpan.FromSeconds(1);
|
private static readonly TimeSpan IntervaloLogMov = TimeSpan.FromSeconds(1);
|
||||||
private async Task tmrRegistradorMOV_Tick()
|
private async Task tmrRegistradorMOV_Tick()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (Variaveis.Fechando)
|
if (Variaveis.Fechando)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DateTime agora = DateTime.Now;
|
DateTime agora = DateTime.Now;
|
||||||
|
|
||||||
if (!OIDCanService.Iniciado &&
|
if (!OIDCanService.Iniciado && SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Mov))
|
||||||
SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Mov))
|
|
||||||
{
|
{
|
||||||
foreach (var leitura in OIDCanService.DadosLeitura
|
foreach (var leitura in OIDCanService.DadosLeitura.Where(x => x.UltimoComandoRecebido.AddSeconds(10) < agora))
|
||||||
.Where(x => x.UltimoComandoRecebido.AddSeconds(10) < agora))
|
|
||||||
{
|
{
|
||||||
OIDCanService.RequisitarDado(
|
OIDCanService.RequisitarDado(
|
||||||
leitura.EnderecoTx,
|
leitura.EnderecoTx,
|
||||||
|
|
@ -264,22 +265,14 @@ namespace AgroBase.Models.Modules
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool deveEnviarControle =
|
bool deveEnviarControle = _ultimoEnvioControleMov == DateTime.MinValue || agora - _ultimoEnvioControleMov >= IntervaloControleMov;
|
||||||
_ultimoEnvioControleMov == DateTime.MinValue ||
|
|
||||||
agora - _ultimoEnvioControleMov >= IntervaloControleMov;
|
|
||||||
|
|
||||||
bool deveRegistrarLog =
|
bool deveRegistrarLog = _ultimoRegistroLogMov == DateTime.MinValue || agora - _ultimoRegistroLogMov >= IntervaloLogMov;
|
||||||
_ultimoRegistroLogMov == DateTime.MinValue ||
|
|
||||||
agora - _ultimoRegistroLogMov >= IntervaloLogMov;
|
|
||||||
|
|
||||||
bool enviouControle = false;
|
bool enviouControle = false;
|
||||||
bool registrouLog = false;
|
bool registrouLog = false;
|
||||||
|
|
||||||
var controleMov =
|
var controleMov = deveEnviarControle ? op.Controle.TiposControle?.FirstOrDefault(x => x.Tipo == T_Code.Mov) : null;
|
||||||
deveEnviarControle
|
|
||||||
? Variaveis.OperacaoEmAndamento.Controle.TiposControle?
|
|
||||||
.FirstOrDefault(x => x.Tipo == T_Code.Mov)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
foreach (var modulo in Modulos)
|
foreach (var modulo in Modulos)
|
||||||
{
|
{
|
||||||
|
|
@ -313,15 +306,14 @@ namespace AgroBase.Models.Modules
|
||||||
/*
|
/*
|
||||||
* Essa leitura é local, pode deixar no tick.
|
* Essa leitura é local, pode deixar no tick.
|
||||||
*/
|
*/
|
||||||
modulo.MovMotor.ConfigFreio.Leitura =
|
modulo.MovMotor.ConfigFreio.Leitura = modulo.MovMotor.Leitura?.Freado ?? false;
|
||||||
modulo.MovMotor.Leitura?.Freado ?? false;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Log só a cada 1s para não virar serragem de JSON.
|
* Log só a cada 1s para não virar serragem de JSON.
|
||||||
*/
|
*/
|
||||||
if (deveRegistrarLog)
|
if (deveRegistrarLog)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.DispMvd.Dados.RegistrarLogMov(modulo);
|
op.DispMvd.Dados.RegistrarLogMov(modulo);
|
||||||
registrouLog = true;
|
registrouLog = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -343,6 +335,8 @@ namespace AgroBase.Models.Modules
|
||||||
private static readonly TimeSpan IntervaloSensoresExternosDir = TimeSpan.FromMilliseconds(500);
|
private static readonly TimeSpan IntervaloSensoresExternosDir = TimeSpan.FromMilliseconds(500);
|
||||||
private async Task tmrRegistradorDIR_Tick()
|
private async Task tmrRegistradorDIR_Tick()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (Variaveis.Fechando)
|
if (Variaveis.Fechando)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -368,22 +362,14 @@ namespace AgroBase.Models.Modules
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool deveEnviarControle =
|
bool deveEnviarControle = _ultimoEnvioControleDir == DateTime.MinValue || agora - _ultimoEnvioControleDir >= IntervaloControleDir;
|
||||||
_ultimoEnvioControleDir == DateTime.MinValue ||
|
|
||||||
agora - _ultimoEnvioControleDir >= IntervaloControleDir;
|
|
||||||
|
|
||||||
bool deveRequisitarSensoresExternos =
|
bool deveRequisitarSensoresExternos = _ultimoSensoresExternosDir == DateTime.MinValue || agora - _ultimoSensoresExternosDir >= IntervaloSensoresExternosDir;
|
||||||
_ultimoSensoresExternosDir == DateTime.MinValue ||
|
|
||||||
agora - _ultimoSensoresExternosDir >= IntervaloSensoresExternosDir;
|
|
||||||
|
|
||||||
bool enviouControle = false;
|
bool enviouControle = false;
|
||||||
bool requisitouSensoresExternos = false;
|
bool requisitouSensoresExternos = false;
|
||||||
|
|
||||||
var controleDir =
|
var controleDir = deveEnviarControle ? op.Controle.TiposControle?.FirstOrDefault(x => x.Tipo == T_Code.Dir) : null;
|
||||||
deveEnviarControle
|
|
||||||
? Variaveis.OperacaoEmAndamento.Controle.TiposControle?
|
|
||||||
.FirstOrDefault(x => x.Tipo == T_Code.Dir)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
foreach (var modulo in Modulos)
|
foreach (var modulo in Modulos)
|
||||||
{
|
{
|
||||||
|
|
@ -417,10 +403,7 @@ namespace AgroBase.Models.Modules
|
||||||
* O MKS057DCanService já tem dedupe curto, mas ainda assim
|
* O MKS057DCanService já tem dedupe curto, mas ainda assim
|
||||||
* é melhor não transformar posição em metralhadora CAN.
|
* é melhor não transformar posição em metralhadora CAN.
|
||||||
*/
|
*/
|
||||||
if (!MKS057DCanService.Referenciando &&
|
if (!MKS057DCanService.Referenciando && deveEnviarControle && controleDir != null && !modulo.DirMotor.AtingiuAnguloSP)
|
||||||
deveEnviarControle &&
|
|
||||||
controleDir != null &&
|
|
||||||
!modulo.DirMotor.AtingiuAnguloSP)
|
|
||||||
{
|
{
|
||||||
modulo.DirMotor.EnviarComandoControle(controleDir.UltimaDirecao);
|
modulo.DirMotor.EnviarComandoControle(controleDir.UltimaDirecao);
|
||||||
enviouControle = true;
|
enviouControle = true;
|
||||||
|
|
@ -463,6 +446,8 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public async Task ExecutarMovimentoDirecionalCombinado(Direcao DirecaoAtual)
|
public async Task ExecutarMovimentoDirecionalCombinado(Direcao DirecaoAtual)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (DirecaoAtual == Direcao.Parado)
|
if (DirecaoAtual == Direcao.Parado)
|
||||||
{
|
{
|
||||||
foreach (var Modulo in Modulos)
|
foreach (var Modulo in Modulos)
|
||||||
|
|
@ -473,7 +458,7 @@ namespace AgroBase.Models.Modules
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (Variaveis.OperacaoEmAndamento.Controle.TipoMovimento)
|
switch (op.Controle.TipoMovimento)
|
||||||
{
|
{
|
||||||
case TipoMovimentoDirecional.RotacionarNoEixo:
|
case TipoMovimentoDirecional.RotacionarNoEixo:
|
||||||
case TipoMovimentoDirecional.MovimentoLateral:
|
case TipoMovimentoDirecional.MovimentoLateral:
|
||||||
|
|
@ -493,7 +478,7 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
if (Sucesso && DirecaoAtual != Direcao.Parado)
|
if (Sucesso && DirecaoAtual != Direcao.Parado)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeSP = 20;
|
op.Controle.PercentualVelocidadeSP = 20;
|
||||||
foreach (var Modulo in Modulos)
|
foreach (var Modulo in Modulos)
|
||||||
{
|
{
|
||||||
Modulo.MovMotor.EnviarComandoControle(
|
Modulo.MovMotor.EnviarComandoControle(
|
||||||
|
|
@ -513,9 +498,11 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
if (!MKS057DCanService.Referenciando)
|
if (!MKS057DCanService.Referenciando)
|
||||||
{
|
{
|
||||||
TipoMovimentoDirecional tipoControle = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = TipoMovimentoDirecional.Diagnostico;
|
TipoMovimentoDirecional tipoControle = op.Controle.TipoMovimento;
|
||||||
|
|
||||||
|
op.Controle.TipoMovimento = TipoMovimentoDirecional.Diagnostico;
|
||||||
var ModsRef = Modulos.Where(x => x.DirMotor.Comandar && x.DirMotor.Inicializado && (ModsReferenciar != null ? ModsReferenciar.Contains(x.DirMotor.Mod_ID) : true)).ToList();
|
var ModsRef = Modulos.Where(x => x.DirMotor.Comandar && x.DirMotor.Inicializado && (ModsReferenciar != null ? ModsReferenciar.Contains(x.DirMotor.Mod_ID) : true)).ToList();
|
||||||
foreach (var Modulo in ModsRef)
|
foreach (var Modulo in ModsRef)
|
||||||
{
|
{
|
||||||
|
|
@ -524,7 +511,7 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
bool ReferenciamentoConcluido() => !MKS057DCanService.Referenciando;
|
bool ReferenciamentoConcluido() => !MKS057DCanService.Referenciando;
|
||||||
await FuncoesGlobais.AguardarCondicaoAsync(ReferenciamentoConcluido, 2 * 1000 * 60, 1000);
|
await FuncoesGlobais.AguardarCondicaoAsync(ReferenciamentoConcluido, 2 * 1000 * 60, 1000);
|
||||||
Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = tipoControle;
|
op.Controle.TipoMovimento = tipoControle;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Modulos.All(x => x.DirMotor.Referenciado);
|
return Modulos.All(x => x.DirMotor.Referenciado);
|
||||||
|
|
@ -532,11 +519,13 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public List<Task> RealizarCalibragemMovAsync(bool forcar)
|
public List<Task> RealizarCalibragemMovAsync(bool forcar)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
List<Task> tasks = new List<Task>();
|
List<Task> tasks = new List<Task>();
|
||||||
var DispMvd = Variaveis.OperacaoEmAndamento.DispMvd;
|
var DispMvd = op.DispMvd;
|
||||||
if (DispMvd != null)
|
if (DispMvd != null)
|
||||||
{
|
{
|
||||||
var calMov = Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Mov];
|
var calMov = op.Sensoriamento.Operacao.ModsCalibragem[T_Code.Mov];
|
||||||
foreach (var mod in DispMvd.Dados.Modulos)
|
foreach (var mod in DispMvd.Dados.Modulos)
|
||||||
{
|
{
|
||||||
calMov.TryGetValue(mod.Modulo_ID, out var cal);
|
calMov.TryGetValue(mod.Modulo_ID, out var cal);
|
||||||
|
|
@ -551,11 +540,13 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public List<Task> RealizarCalibragemDirAsync(bool forcar)
|
public List<Task> RealizarCalibragemDirAsync(bool forcar)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
List<Task> tasks = new List<Task>();
|
List<Task> tasks = new List<Task>();
|
||||||
var DispMvd = Variaveis.OperacaoEmAndamento.DispMvd;
|
var DispMvd = op.DispMvd;
|
||||||
if (DispMvd != null)
|
if (DispMvd != null)
|
||||||
{
|
{
|
||||||
var calDir = Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Dir];
|
var calDir = op.Sensoriamento.Operacao.ModsCalibragem[T_Code.Dir];
|
||||||
foreach (var mod in DispMvd.Dados.Modulos)
|
foreach (var mod in DispMvd.Dados.Modulos)
|
||||||
{
|
{
|
||||||
calDir.TryGetValue(mod.Modulo_ID, out var cal);
|
calDir.TryGetValue(mod.Modulo_ID, out var cal);
|
||||||
|
|
@ -567,7 +558,7 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
if (DispMvd.Dados.Modulos.Any(x => x.DirMotor.Inicializado))
|
if (DispMvd.Dados.Modulos.Any(x => x.DirMotor.Inicializado))
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = TipoMovimentoDirecional.Diagnostico;
|
op.Controle.TipoMovimento = TipoMovimentoDirecional.Diagnostico;
|
||||||
var ModsRef = Modulos.Where(x => x.DirMotor.Comandar).ToList(); // && x.DirMotor.Inicializado
|
var ModsRef = Modulos.Where(x => x.DirMotor.Comandar).ToList(); // && x.DirMotor.Inicializado
|
||||||
foreach (var Modulo in ModsRef)
|
foreach (var Modulo in ModsRef)
|
||||||
{
|
{
|
||||||
|
|
@ -576,12 +567,12 @@ namespace AgroBase.Models.Modules
|
||||||
if (t.IsFaulted)
|
if (t.IsFaulted)
|
||||||
{
|
{
|
||||||
Variaveis.MostrarLog($"[MovimentacaoUnificadaModel] [RealizarCalibragemDirAsync] Erro no referenciamento do módulo {Modulo.Modulo_ID}: {t.Exception?.InnerException?.Message}");
|
Variaveis.MostrarLog($"[MovimentacaoUnificadaModel] [RealizarCalibragemDirAsync] Erro no referenciamento do módulo {Modulo.Modulo_ID}: {t.Exception?.InnerException?.Message}");
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Falha, 0, $"Erro no referenciamento do módulo {Modulo.Modulo_ID}: {t.Exception?.InnerException?.Message}");
|
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Falha, 0, $"Erro no referenciamento do módulo {Modulo.Modulo_ID}: {t.Exception?.InnerException?.Message}");
|
||||||
}
|
}
|
||||||
if (t.IsCompleted)
|
if (t.IsCompleted)
|
||||||
{
|
{
|
||||||
Variaveis.MostrarLog($"[MovimentacaoUnificadaModel] [RealizarCalibragemDirAsync] Referenciamento do módulo {Modulo.Modulo_ID} concluído com sucesso!");
|
Variaveis.MostrarLog($"[MovimentacaoUnificadaModel] [RealizarCalibragemDirAsync] Referenciamento do módulo {Modulo.Modulo_ID} concluído com sucesso!");
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Operante, 100, $"Referenciamento do módulo {Modulo.Modulo_ID} concluído com sucesso!");
|
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Operante, 100, $"Referenciamento do módulo {Modulo.Modulo_ID} concluído com sucesso!");
|
||||||
calDir[Modulo.Modulo_ID] = true;
|
calDir[Modulo.Modulo_ID] = true;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,6 @@ using System.Threading.Tasks;
|
||||||
using static AgroBase.Models.Enums;
|
using static AgroBase.Models.Enums;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using static AgroBase.Services.LoRaEspService;
|
|
||||||
using AgroBase.Services.Operadores;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using AgroBase.Models.Operadores;
|
|
||||||
|
|
||||||
namespace AgroBase.Models.Modules
|
namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
|
|
@ -42,7 +38,7 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return HealthWorkerService.ModulosSaude.Any(x => x.modulo == Dispositivo && x.status == StatusModulo.Operante);
|
return Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorSaude?.ModulosSaude?.Any(x => x.modulo == Dispositivo && x.status == StatusModulo.Operante) ?? false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public SensoriamentoMensagemJsonModel DadosLeitura { get; set; } = new SensoriamentoMensagemJsonModel();
|
public SensoriamentoMensagemJsonModel DadosLeitura { get; set; } = new SensoriamentoMensagemJsonModel();
|
||||||
|
|
@ -58,18 +54,6 @@ namespace AgroBase.Models.Modules
|
||||||
public List<SensorServoModel> Servos { get; set; }
|
public List<SensorServoModel> Servos { get; set; }
|
||||||
public UltrasonicA05Configuracoes ConfiguracaoSensorUltrassom { get; set; }
|
public UltrasonicA05Configuracoes ConfiguracaoSensorUltrassom { get; set; }
|
||||||
private SenHandler _SenHandler = new SenHandler();
|
private SenHandler _SenHandler = new SenHandler();
|
||||||
public LoRaEspService loRaService { get; set; } = new LoRaEspService();
|
|
||||||
public LoRaParametrosModel LoRaParametrosBase { get; set; } = new LoRaParametrosModel()
|
|
||||||
{
|
|
||||||
address = 0x01,
|
|
||||||
channel = 0x17,
|
|
||||||
tranMode = LoRaBaseService.CodigosTipoTransmissao["Fixed"],
|
|
||||||
baudRate = LoRaBaseService.CodigosBaudRates[9600],
|
|
||||||
airRate = LoRaBaseService.CodigosAirRates[2.4],
|
|
||||||
packetSize = LoRaBaseService.CodigosPacketSizes[200],
|
|
||||||
worCycle = LoRaBaseService.CodigosWorCycles[4000],
|
|
||||||
power = LoRaBaseService.CodigosPowers[22],
|
|
||||||
};
|
|
||||||
public CoulombCounterService ContadorCarga = new CoulombCounterService(VariaveisEquipamento.CorrenteMaximaBateria);
|
public CoulombCounterService ContadorCarga = new CoulombCounterService(VariaveisEquipamento.CorrenteMaximaBateria);
|
||||||
public CoolerControlService CoolerControl = new CoolerControlService();
|
public CoolerControlService CoolerControl = new CoolerControlService();
|
||||||
public AsyncTaskTimerModel tmrRegistrador;
|
public AsyncTaskTimerModel tmrRegistrador;
|
||||||
|
|
@ -1999,40 +1983,6 @@ namespace AgroBase.Models.Modules
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
loRaService = new LoRaEspService()
|
|
||||||
{
|
|
||||||
ID = "LoRa",
|
|
||||||
ID_Num = Variaveis.ID_Num_sLRA,
|
|
||||||
Componente = S_Code.sLRA,
|
|
||||||
Funcoes = new List<FuncoesPinout>()
|
|
||||||
{
|
|
||||||
FuncoesPinout.ENA,
|
|
||||||
FuncoesPinout.M0,
|
|
||||||
FuncoesPinout.M1,
|
|
||||||
FuncoesPinout.Aux,
|
|
||||||
FuncoesPinout.RX,
|
|
||||||
FuncoesPinout.TX
|
|
||||||
},
|
|
||||||
Conectado = false,
|
|
||||||
Configurado = false,
|
|
||||||
ParametrosSet = new LoRaParametrosModel()
|
|
||||||
{
|
|
||||||
address = 2,
|
|
||||||
airRate = 0,
|
|
||||||
baudRate = 96,
|
|
||||||
parity = 0,
|
|
||||||
packetSize = 192,
|
|
||||||
power = 0,
|
|
||||||
tranMode = 64,
|
|
||||||
worCycle = 3,
|
|
||||||
channelRssi = 0,
|
|
||||||
lbt = 0,
|
|
||||||
packetRssi = 0,
|
|
||||||
channel = 65,
|
|
||||||
key = 0
|
|
||||||
},
|
|
||||||
ParametrosGet = new LoRaParametrosModel()
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
|
|
@ -2050,12 +2000,6 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
x._AnguloControle = x.Incremental ? 0 : 180;
|
x._AnguloControle = x.Incremental ? 0 : 180;
|
||||||
});
|
});
|
||||||
loRaService.Conectado = false;
|
|
||||||
loRaService.Configurado = false;
|
|
||||||
loRaService.ParametrosGet.UltimaLeitura = DateTime.MinValue;
|
|
||||||
loRaService.MensagensRecebidasAvulsas = new List<LoRaMensagemModel>();
|
|
||||||
VisualWorkerService.DadosLeitura.CameraFrames = new Dictionary<TipoFrameCamera, OAKCameraFrameModel>();
|
|
||||||
WeedWorkerService.DadosLeitura.CameraFrames = new Dictionary<TipoFrameCamera, OAKCameraFrameModel>();
|
|
||||||
|
|
||||||
ReiniciarLeituras(Dados);
|
ReiniciarLeituras(Dados);
|
||||||
}
|
}
|
||||||
|
|
@ -2094,22 +2038,24 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public async Task<bool> VerificaDispositivoConectado()
|
public async Task<bool> VerificaDispositivoConectado()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (!CanManager.CanService.IsConnected) return false;
|
if (!CanManager.CanService.IsConnected) return false;
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.DispSen == null) return false;
|
if (op.DispSen == null) return false;
|
||||||
|
|
||||||
CanManager.CanService.RegistrarHandler(_EnderecoCAN_Rx, _SenHandler);
|
CanManager.CanService.RegistrarHandler(_EnderecoCAN_Rx, _SenHandler);
|
||||||
|
|
||||||
RequisitarDadosDescoberta();
|
RequisitarDadosDescoberta();
|
||||||
|
|
||||||
DateTime Inicio = DateTime.Now;
|
DateTime Inicio = DateTime.Now;
|
||||||
bool Respondido() => Variaveis.OperacaoEmAndamento.DispSen.Dados.DadosLeitura.UltimoComandoRespondido > Inicio;
|
bool Respondido() => op.DispSen.Dados.DadosLeitura.UltimoComandoRespondido > Inicio;
|
||||||
await FuncoesGlobais.AguardarCondicaoAsync(Respondido, 500, 50);
|
await FuncoesGlobais.AguardarCondicaoAsync(Respondido, 500, 50);
|
||||||
|
|
||||||
if (Conectado)
|
if (Conectado)
|
||||||
{
|
{
|
||||||
DefinirDispositivo();
|
DefinirDispositivo();
|
||||||
Variaveis.OperacaoEmAndamento.DispSen?.EnviarProtocolosConfiguracao();
|
op.DispSen?.EnviarProtocolosConfiguracao();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Conectado;
|
return Conectado;
|
||||||
|
|
@ -2117,6 +2063,8 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
private void DefinirDispositivo()
|
private void DefinirDispositivo()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == DadosLeitura.Dispositivo && x.Mod_ID == Modulo_ID))
|
if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == DadosLeitura.Dispositivo && x.Mod_ID == Modulo_ID))
|
||||||
{
|
{
|
||||||
SerialService.DispositivosMapeados.Add(new DispositivoDetalhesModel()
|
SerialService.DispositivosMapeados.Add(new DispositivoDetalhesModel()
|
||||||
|
|
@ -2127,8 +2075,8 @@ namespace AgroBase.Models.Modules
|
||||||
Mod_ID = Modulo_ID,
|
Mod_ID = Modulo_ID,
|
||||||
});
|
});
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.ModsCalibragem[Dispositivo] = new Dictionary<string, bool>();
|
op.Sensoriamento.Operacao.ModsCalibragem[Dispositivo] = new Dictionary<string, bool>();
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Conectado, 0, "Dispositivo conectado");
|
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Conectado, 0, "Dispositivo conectado");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2184,13 +2132,6 @@ namespace AgroBase.Models.Modules
|
||||||
//var sensoresConfig = SensoresConfig(Conectar, configurarTodos);
|
//var sensoresConfig = SensoresConfig(Conectar, configurarTodos);
|
||||||
//config.AddRange(sensoresConfig);
|
//config.AddRange(sensoresConfig);
|
||||||
|
|
||||||
// Adicionar configurações do LoRa
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Parametros.ModulosMandatorios.Any(x => x.Dispositivo == T_Code.Lra && x.Mandatorio && x.Utilizar) && (!loRaService.Conectado || !loRaService.Configurado || configurarTodos))
|
|
||||||
{
|
|
||||||
var loraConfig = loRaService.ProtocoloConfiguracao(Pinout, Conectar);
|
|
||||||
config.AddRange(loraConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2201,7 +2142,7 @@ namespace AgroBase.Models.Modules
|
||||||
(byte)(Conectar ? 1 : 0),
|
(byte)(Conectar ? 1 : 0),
|
||||||
(byte)(_TaxaAmostragem / 1000),
|
(byte)(_TaxaAmostragem / 1000),
|
||||||
(byte)(RequisitarDados ? 1 : 0),
|
(byte)(RequisitarDados ? 1 : 0),
|
||||||
LoRaParametrosBase.address
|
(byte)0x00, //LoRaParametrosBase.address
|
||||||
};
|
};
|
||||||
|
|
||||||
config1.AddRange(PinoutModel.PinoProtocolo(Pinout, Funcoes, false));
|
config1.AddRange(PinoutModel.PinoProtocolo(Pinout, Funcoes, false));
|
||||||
|
|
@ -2313,13 +2254,15 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public async Task tmrRegistrador_Tick()
|
public async Task tmrRegistrador_Tick()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (Variaveis.Fechando) return;
|
if (Variaveis.Fechando) return;
|
||||||
|
|
||||||
tmrRegistrador.SetInterval(_TaxaAmostragem);
|
tmrRegistrador.SetInterval(_TaxaAmostragem);
|
||||||
|
|
||||||
if (SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Sen) && (_VezesLeituraReconexao >= _TempoReconexaoComponentes))
|
if (SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Sen) && (_VezesLeituraReconexao >= _TempoReconexaoComponentes))
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.DispSen?.EnviarProtocolosConfiguracao();
|
op.DispSen?.EnviarProtocolosConfiguracao();
|
||||||
|
|
||||||
_VezesLeituraReconexao = 0;
|
_VezesLeituraReconexao = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -2883,13 +2826,15 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
public void ProcessarMensagem(CanMessage mensagem)
|
public void ProcessarMensagem(CanMessage mensagem)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)mensagem.DataRx[0];
|
CanMessagePosicaoDados posicao = (CanMessagePosicaoDados)mensagem.DataRx[0];
|
||||||
byte ID_Num = mensagem.DataRx[1];
|
byte ID_Num = mensagem.DataRx[1];
|
||||||
var data = mensagem.DataRx;
|
var data = mensagem.DataRx;
|
||||||
|
|
||||||
S_Code componente = DetectarComponenteDoID_Num(ID_Num);
|
S_Code componente = DetectarComponenteDoID_Num(ID_Num);
|
||||||
|
|
||||||
var Dados = Variaveis.OperacaoEmAndamento.DispSen.Dados;
|
var Dados = op.DispSen.Dados;
|
||||||
|
|
||||||
//Console.WriteLine($"[SEN] Componente={componente.ToString()}, ID_Num={ID_Num}, Posicao={posicao.ToString()}, Data={FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
|
//Console.WriteLine($"[SEN] Componente={componente.ToString()}, ID_Num={ID_Num}, Posicao={posicao.ToString()}, Data={FuncoesGlobais.ConverterComandoBytesParaTexto(data)}");
|
||||||
|
|
||||||
|
|
@ -2915,139 +2860,139 @@ namespace AgroBase.Models.Modules
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case S_Code.sLRA:
|
//case S_Code.sLRA:
|
||||||
{
|
// {
|
||||||
var loraService = Dados.loRaService;
|
// var loraService = Dados.loRaService;
|
||||||
switch (posicao)
|
// switch (posicao)
|
||||||
{
|
// {
|
||||||
case CanMessagePosicaoDados.Status:
|
// case CanMessagePosicaoDados.Status:
|
||||||
{
|
// {
|
||||||
bool Conectado = data[2] == 1;
|
// bool Conectado = data[2] == 1;
|
||||||
bool Configurado = data[3] == 1;
|
// bool Configurado = data[3] == 1;
|
||||||
//Console.WriteLine($"[LRA] Resposta {ID_Num} recebida. Conectado={Conectado}, Configurado={Configurado}");
|
// //Console.WriteLine($"[LRA] Resposta {ID_Num} recebida. Conectado={Conectado}, Configurado={Configurado}");
|
||||||
loraService.Conectado = Conectado;
|
// loraService.Conectado = Conectado;
|
||||||
loraService.Configurado = Configurado;
|
// loraService.Configurado = Configurado;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
case CanMessagePosicaoDados.Dados1:
|
// case CanMessagePosicaoDados.Dados1:
|
||||||
{
|
// {
|
||||||
byte address = data[2];
|
// byte address = data[2];
|
||||||
byte baudAndAirRate = data[3];
|
// byte baudAndAirRate = data[3];
|
||||||
byte baud = (byte)(baudAndAirRate & 0b11100000);
|
// byte baud = (byte)(baudAndAirRate & 0b11100000);
|
||||||
byte airRate = (byte)((baudAndAirRate & 0b00011100) >> 2);
|
// byte airRate = (byte)((baudAndAirRate & 0b00011100) >> 2);
|
||||||
byte packetSizeAndPower = data[4];
|
// byte packetSizeAndPower = data[4];
|
||||||
byte packetSize = (byte)((packetSizeAndPower & 0b11000000));
|
// byte packetSize = (byte)((packetSizeAndPower & 0b11000000));
|
||||||
byte power = (byte)(packetSizeAndPower & 0b00000011);
|
// byte power = (byte)(packetSizeAndPower & 0b00000011);
|
||||||
byte channel = data[5];
|
// byte channel = data[5];
|
||||||
byte tranModeAndWorCycle = data[6];
|
// byte tranModeAndWorCycle = data[6];
|
||||||
byte tranMode = (byte)(tranModeAndWorCycle & 0b01000000);
|
// byte tranMode = (byte)(tranModeAndWorCycle & 0b01000000);
|
||||||
byte worCycle = (byte)(tranModeAndWorCycle & 0b00000111);
|
// byte worCycle = (byte)(tranModeAndWorCycle & 0b00000111);
|
||||||
//Console.WriteLine($"[LRA] Resposta {ID_Num} recebida. Address={address.ToString("X")}, BaudRate={baud.ToString("X")}, AirRate={airRate.ToString("X")}, PacketSize={packetSize.ToString("X")}, Power={power.ToString("X")}, Channel={channel.ToString("X")}, transMode={tranMode.ToString("X")}, WorCycle={worCycle.ToString("X")}");
|
// //Console.WriteLine($"[LRA] Resposta {ID_Num} recebida. Address={address.ToString("X")}, BaudRate={baud.ToString("X")}, AirRate={airRate.ToString("X")}, PacketSize={packetSize.ToString("X")}, Power={power.ToString("X")}, Channel={channel.ToString("X")}, transMode={tranMode.ToString("X")}, WorCycle={worCycle.ToString("X")}");
|
||||||
loraService.ParametrosGet.address = address;
|
// loraService.ParametrosGet.address = address;
|
||||||
loraService.ParametrosGet.baudRate = baud;
|
// loraService.ParametrosGet.baudRate = baud;
|
||||||
loraService.ParametrosGet.airRate = airRate;
|
// loraService.ParametrosGet.airRate = airRate;
|
||||||
loraService.ParametrosGet.packetSize = packetSize;
|
// loraService.ParametrosGet.packetSize = packetSize;
|
||||||
loraService.ParametrosGet.power = power;
|
// loraService.ParametrosGet.power = power;
|
||||||
loraService.ParametrosGet.channel = channel;
|
// loraService.ParametrosGet.channel = channel;
|
||||||
loraService.ParametrosGet.worCycle = worCycle;
|
// loraService.ParametrosGet.worCycle = worCycle;
|
||||||
loraService.ParametrosGet.tranMode = tranMode;
|
// loraService.ParametrosGet.tranMode = tranMode;
|
||||||
loraService.ParametrosGet.UltimaLeitura = DateTime.Now;
|
// loraService.ParametrosGet.UltimaLeitura = DateTime.Now;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
default:
|
// default:
|
||||||
{
|
// {
|
||||||
DadosLoRaParse tipoDado = (DadosLoRaParse)posicao;
|
// DadosLoRaParse tipoDado = (DadosLoRaParse)posicao;
|
||||||
//Console.WriteLine($"[LRA] Dados recebidos ({tipoDado.ToString()}). " + string.Join(" ", data));
|
// //Console.WriteLine($"[LRA] Dados recebidos ({tipoDado.ToString()}). " + string.Join(" ", data));
|
||||||
switch (tipoDado)
|
// switch (tipoDado)
|
||||||
{
|
// {
|
||||||
case DadosLoRaParse.ComandoControle:
|
// case DadosLoRaParse.ComandoControle:
|
||||||
{
|
// {
|
||||||
BotoesJoystick tecla = (BotoesJoystick)data[2];
|
// BotoesJoystick tecla = (BotoesJoystick)data[2];
|
||||||
int percentualVelocidadeSp = data[3];
|
// int percentualVelocidadeSp = data[3];
|
||||||
TipoMovimentoDirecional tipoMovimentoDirecional = (TipoMovimentoDirecional)data[4];
|
// TipoMovimentoDirecional tipoMovimentoDirecional = (TipoMovimentoDirecional)data[4];
|
||||||
int anguloMp = data[5];
|
// int anguloMp = data[5];
|
||||||
//int velocidadeMp = data[6];
|
// //int velocidadeMp = data[6];
|
||||||
T_Code dispositivo = (T_Code)data[6];
|
// T_Code dispositivo = (T_Code)data[6];
|
||||||
bool emergencia = data[7] == 1;
|
// bool emergencia = data[7] == 1;
|
||||||
|
//
|
||||||
OperacaoComandoBaseModel Controle = new OperacaoComandoBaseModel()
|
// OperacaoComandoBaseModel Controle = new OperacaoComandoBaseModel()
|
||||||
{
|
// {
|
||||||
Momento = DateTime.Now,
|
// Momento = DateTime.Now,
|
||||||
Tecla = tecla,
|
// Tecla = tecla,
|
||||||
Controle = new OperacaoComandoBaseControleModel()
|
// Controle = new OperacaoComandoBaseControleModel()
|
||||||
{
|
// {
|
||||||
AnguloSP = anguloMp,
|
// AnguloSP = anguloMp,
|
||||||
PercentualVelocidadeSP = percentualVelocidadeSp,
|
// PercentualVelocidadeSP = percentualVelocidadeSp,
|
||||||
TipoMovimentoDirecional = tipoMovimentoDirecional,
|
// TipoMovimentoDirecional = tipoMovimentoDirecional,
|
||||||
},
|
// },
|
||||||
Emergencia = emergencia,
|
// Emergencia = emergencia,
|
||||||
Dispositivo = dispositivo
|
// Dispositivo = dispositivo
|
||||||
};
|
// };
|
||||||
Variaveis.OperacaoEmAndamento.ExecutaComandoDaBase(Controle);
|
// op.ExecutaComandoDaBase(Controle);
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
case DadosLoRaParse.DadosLivre:
|
// case DadosLoRaParse.DadosLivre:
|
||||||
{
|
// {
|
||||||
Console.WriteLine("[LRA] Dados livres LORA recebidos da base: " + FuncoesGlobais.ConverterComandoBytesParaTexto(data));
|
// Console.WriteLine("[LRA] Dados livres LORA recebidos da base: " + FuncoesGlobais.ConverterComandoBytesParaTexto(data));
|
||||||
Variaveis.LoraService.MensagensRecebidasAvulsas.Add(new LoRaMensagemModel()
|
// Variaveis.LoraService.MensagensRecebidasAvulsas.Add(new LoRaMensagemModel()
|
||||||
{
|
// {
|
||||||
Lido = false,
|
// Lido = false,
|
||||||
Momento = DateTime.Now,
|
// Momento = DateTime.Now,
|
||||||
channel = Variaveis.LoraBaseParametros.channel,
|
// channel = Variaveis.LoraBaseParametros.channel,
|
||||||
Remetente = Variaveis.LoraBaseParametros.address,
|
// Remetente = Variaveis.LoraBaseParametros.address,
|
||||||
Destinatario = Variaveis.LoraService.ParametrosGet.address,
|
// Destinatario = Variaveis.LoraService.ParametrosGet.address,
|
||||||
Data = data,
|
// Data = data,
|
||||||
Mensagem = string.Join("", data.Select(x => x.ToString("X")))
|
// Mensagem = string.Join("", data.Select(x => x.ToString("X")))
|
||||||
});
|
// });
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
case DadosLoRaParse.GpsQualidade:
|
// case DadosLoRaParse.GpsQualidade:
|
||||||
{
|
// {
|
||||||
bool iniciado = data[2] == 1;
|
// bool iniciado = data[2] == 1;
|
||||||
TiposCorrecaoGPS qualidadeFix = (TiposCorrecaoGPS)data[3];
|
// TiposCorrecaoGPS qualidadeFix = (TiposCorrecaoGPS)data[3];
|
||||||
int numeroSatelites = data[4];
|
// int numeroSatelites = data[4];
|
||||||
double precisao = LoRaSerializer.DescompactarDecimal(data, 5);
|
// double precisao = LoRaSerializer.DescompactarDecimal(data, 5);
|
||||||
|
//
|
||||||
VariaveisOperacao.PosicaoBase.Inicializado = iniciado;
|
// VariaveisOperacao.PosicaoBase.Inicializado = iniciado;
|
||||||
VariaveisOperacao.PosicaoBase.QualidadeFix = qualidadeFix;
|
// VariaveisOperacao.PosicaoBase.QualidadeFix = qualidadeFix;
|
||||||
VariaveisOperacao.PosicaoBase.NumeroSatelites = numeroSatelites;
|
// VariaveisOperacao.PosicaoBase.NumeroSatelites = numeroSatelites;
|
||||||
VariaveisOperacao.PosicaoBase.PrecisaoHorizontal = precisao;
|
// VariaveisOperacao.PosicaoBase.PrecisaoHorizontal = precisao;
|
||||||
VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
|
// VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
case DadosLoRaParse.GpsLatitude:
|
// case DadosLoRaParse.GpsLatitude:
|
||||||
{
|
// {
|
||||||
double _lat = LoRaSerializer.DescompactarCoordenada(data.Skip(2).ToArray());
|
// double _lat = LoRaSerializer.DescompactarCoordenada(data.Skip(2).ToArray());
|
||||||
VariaveisOperacao.PosicaoBase.Latitude = _lat;
|
// VariaveisOperacao.PosicaoBase.Latitude = _lat;
|
||||||
VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
|
// VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
case DadosLoRaParse.GpsLongitude:
|
// case DadosLoRaParse.GpsLongitude:
|
||||||
{
|
// {
|
||||||
double _long = LoRaSerializer.DescompactarCoordenada(data.Skip(2).ToArray());
|
// double _long = LoRaSerializer.DescompactarCoordenada(data.Skip(2).ToArray());
|
||||||
VariaveisOperacao.PosicaoBase.Longitude = _long;
|
// VariaveisOperacao.PosicaoBase.Longitude = _long;
|
||||||
VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
|
// VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
case DadosLoRaParse.GpsGerais:
|
// case DadosLoRaParse.GpsGerais:
|
||||||
{
|
// {
|
||||||
double _altitude = LoRaSerializer.DescompactarDecimal(data, 2);
|
// double _altitude = LoRaSerializer.DescompactarDecimal(data, 2);
|
||||||
double _velocidade = LoRaSerializer.DescompactarDecimal(data, 4);
|
// double _velocidade = LoRaSerializer.DescompactarDecimal(data, 4);
|
||||||
double _orientacao = LoRaSerializer.DescompactarDecimal(data, 6);
|
// double _orientacao = LoRaSerializer.DescompactarDecimal(data, 6);
|
||||||
VariaveisOperacao.PosicaoBase.Altitude = _altitude;
|
// VariaveisOperacao.PosicaoBase.Altitude = _altitude;
|
||||||
VariaveisOperacao.PosicaoBase.Velocidade = _velocidade;
|
// VariaveisOperacao.PosicaoBase.Velocidade = _velocidade;
|
||||||
VariaveisOperacao.PosicaoBase.OrientacaoReal = _orientacao;
|
// VariaveisOperacao.PosicaoBase.OrientacaoReal = _orientacao;
|
||||||
VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
|
// VariaveisOperacao.PosicaoBase.Momento = DateTime.Now;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
Variaveis.LoraService.UltimoRxDados = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
|
// Variaveis.LoraService.UltimoRxDados = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
|
||||||
Variaveis.LoraService._ultimoRxDados = DateTime.UtcNow;
|
// Variaveis.LoraService._ultimoRxDados = DateTime.UtcNow;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
case S_Code.sTOD:
|
case S_Code.sTOD:
|
||||||
{
|
{
|
||||||
switch (posicao)
|
switch (posicao)
|
||||||
|
|
@ -3378,7 +3323,7 @@ namespace AgroBase.Models.Modules
|
||||||
Dados.DadosLeitura.UltimoComandoRespondido = DateTime.Now;
|
Dados.DadosLeitura.UltimoComandoRespondido = DateTime.Now;
|
||||||
//Console.WriteLine("Ultimo comando respondido: " + Dados.DadosLeitura.UltimoComandoRespondido.ToString("HH:mm:ss.fff") + ", Conectado: " + Dados.Conectado);
|
//Console.WriteLine("Ultimo comando respondido: " + Dados.DadosLeitura.UltimoComandoRespondido.ToString("HH:mm:ss.fff") + ", Conectado: " + Dados.Conectado);
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.DispMvd.Dados.AtualizarDadosSensoresExternos(componente, ID_Num);
|
op.DispMvd.Dados.AtualizarDadosSensoresExternos(componente, ID_Num);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -584,8 +584,8 @@ namespace AgroBase.Models.Operacoes
|
||||||
public OperacaoSensoriamentoLogImuModel Imu { get; set; }
|
public OperacaoSensoriamentoLogImuModel Imu { get; set; }
|
||||||
public OperacaoParametrosDadosAtuadorModel Atuador { get; set; }
|
public OperacaoParametrosDadosAtuadorModel Atuador { get; set; }
|
||||||
public OperacaoParametrosDadosSensoriamentoModel Sensoriamento { get; set; }
|
public OperacaoParametrosDadosSensoriamentoModel Sensoriamento { get; set; }
|
||||||
public OperacaoParametrosDadosMovimentacaoModel Movimentacao { get; set; }
|
public MovimentacaoLogModel Movimentacao { get; set; }
|
||||||
public OperacaoParametrosDadosDirecionalModel Direcional { get; set; }
|
public DirecionalLogModel Direcional { get; set; }
|
||||||
|
|
||||||
public OperacaoSensoriamentoLogBateriaModel Bateria { get; set; }
|
public OperacaoSensoriamentoLogBateriaModel Bateria { get; set; }
|
||||||
public CoolerControlDataModel Refrigeracao { get; set; }
|
public CoolerControlDataModel Refrigeracao { get; set; }
|
||||||
|
|
@ -622,41 +622,37 @@ namespace AgroBase.Models.Operacoes
|
||||||
AtualizarImu(sen);
|
AtualizarImu(sen);
|
||||||
AtualizarAtuador(sen, dAtu);
|
AtualizarAtuador(sen, dAtu);
|
||||||
AtualizarSensoriamento(dSen);
|
AtualizarSensoriamento(dSen);
|
||||||
AtualizarMovimentacao(sen, dMvd);
|
AtualizarMovimentacao(sen);
|
||||||
AtualizarDirecional(sen, dMvd);
|
AtualizarDirecional(sen);
|
||||||
AtualizarGnss(sen);
|
AtualizarGnss(sen);
|
||||||
AtualizarOutrosBlocos(sen);
|
AtualizarOutrosBlocos(sen);
|
||||||
AtualizarCameras();
|
AtualizarCameras();
|
||||||
AtualizarLogs(sen);
|
AtualizarLogs(sen);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarOperacao(dynamic op)
|
private void AtualizarOperacao(OperacaoModel op)
|
||||||
{
|
{
|
||||||
var parametros = op?.Parametros;
|
var parametros = op?.Parametros;
|
||||||
|
|
||||||
Operacao = new OperacaoParametrosDadosOperacaoModel
|
Operacao = new OperacaoParametrosDadosOperacaoModel
|
||||||
{
|
{
|
||||||
Iniciada = op?.Iniciado ?? false,
|
Iniciada = op?.Sensoriamento?.Operacao?.OperacaoIniciada ?? false,
|
||||||
Liberada = op?.OperacaoLiberada ?? false,
|
Liberada = op?.Sensoriamento?.Operacao?.OperacaoLiberada ?? false,
|
||||||
Status = op?.StatusAtual ?? StatusOperacao.Erro,
|
Status = op?.Sensoriamento?.Operacao?.StatusOperacaoAtual ?? StatusOperacao.Erro,
|
||||||
Modo = parametros?.Modo ?? ModoOperacao.NaoDefinido,
|
Modo = parametros?.Modo ?? ModoOperacao.NaoDefinido,
|
||||||
ImpedimentoErro = op?.ErroOperacaoLiberada,
|
ImpedimentoErro = op?.Sensoriamento?.Operacao?.ErroOperacaoLiberada,
|
||||||
TempoAguardandoSegs = op?.TempoAguardandoSegs ?? 0,
|
TempoAguardandoSegs = op?.Sensoriamento?.Operacao?.TempoAguardandoSeg ?? 0,
|
||||||
TempoDecorridoSegs = op?.TempoDecorridoSegs ?? 0,
|
TempoDecorridoSegs = op?.Sensoriamento?.Operacao?.TempoDecorridoSeg ?? 0,
|
||||||
Emergencia = op?.Emergencia ?? false,
|
Emergencia = op?.Sensoriamento?.Operacao?.Emergencia ?? false,
|
||||||
Pausa = op?.Pausa ?? false,
|
Pausa = op?.Sensoriamento?.Operacao?.Pausa ?? false,
|
||||||
IniciadoEm = op?.DataInicio ?? DateTime.MinValue,
|
IniciadoEm = op?.Sensoriamento?.Operacao?.DataInicio ?? DateTime.MinValue,
|
||||||
FinalizadoEm = op?.DataFim ?? DateTime.MinValue,
|
FinalizadoEm = op?.Sensoriamento?.Operacao?.DataFim ?? DateTime.MinValue,
|
||||||
ModulosMandatorios = CloneList(
|
ModulosMandatorios = CloneList(parametros?.ModulosMandatorios),
|
||||||
parametros?.ModulosMandatorios
|
ParametrosMandatorios = CloneList(parametros?.ParametrosMandatorios)
|
||||||
),
|
|
||||||
ParametrosMandatorios = CloneList(
|
|
||||||
parametros?.ParametrosMandatorios
|
|
||||||
)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarTrajetoria(dynamic sen)
|
private void AtualizarTrajetoria(OperacaoSensoriamentoConjuntoModel sen)
|
||||||
{
|
{
|
||||||
var t = sen?.Trajetoria;
|
var t = sen?.Trajetoria;
|
||||||
|
|
||||||
|
|
@ -664,8 +660,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
{
|
{
|
||||||
Trajetoria = new OperacaoParametrosDadosTrajetoriaModel
|
Trajetoria = new OperacaoParametrosDadosTrajetoriaModel
|
||||||
{
|
{
|
||||||
AutonomiaCorredor =
|
AutonomiaCorredor = new OperacaoParametrosDadosTrajetoriaAutonomiaCorredorModel()
|
||||||
new OperacaoParametrosDadosTrajetoriaAutonomiaCorredorModel()
|
|
||||||
};
|
};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -750,7 +745,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarControle(dynamic op)
|
private void AtualizarControle(OperacaoModel op)
|
||||||
{
|
{
|
||||||
var c = op?.Controle?.Clone();
|
var c = op?.Controle?.Clone();
|
||||||
|
|
||||||
|
|
@ -768,18 +763,13 @@ namespace AgroBase.Models.Operacoes
|
||||||
: new OperacaoParametrosDadosControleModel();
|
: new OperacaoParametrosDadosControleModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarSaude(dynamic sen)
|
private void AtualizarSaude(OperacaoSensoriamentoConjuntoModel sen)
|
||||||
{
|
{
|
||||||
ModulosSaude = CloneList(
|
ModulosSaude = CloneList(sen?.OperadorSaude?.ModulosSaude);
|
||||||
sen?.ModulosSaude
|
DispositivosMapeados = CloneList(sen?.Operacao?.DispositivosMapeados);
|
||||||
);
|
|
||||||
|
|
||||||
DispositivosMapeados = CloneList(
|
|
||||||
sen?.DispositivosMapeados
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarImu(dynamic sen)
|
private void AtualizarImu(OperacaoSensoriamentoConjuntoModel sen)
|
||||||
{
|
{
|
||||||
Imu = new OperacaoSensoriamentoLogImuModel
|
Imu = new OperacaoSensoriamentoLogImuModel
|
||||||
{
|
{
|
||||||
|
|
@ -790,21 +780,13 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarAtuador(dynamic sen, dynamic dAtu)
|
private void AtualizarAtuador(OperacaoSensoriamentoConjuntoModel sen, AtuadorModel dAtu)
|
||||||
{
|
{
|
||||||
var atu = sen?.Atuador;
|
var atu = sen?.Atuador;
|
||||||
|
|
||||||
var bicosPulverizadores = ToDynamicList(
|
var bicosPulverizadores = ToDynamicList(dAtu == null ? null : dAtu.BicosPulverizadores);
|
||||||
dAtu == null ? null : dAtu.BicosPulverizadores
|
var bombasPressurizadoras = ToDynamicList(dAtu == null ? null : dAtu.BombasPressurizadoras);
|
||||||
);
|
var sensoresAtuador = ToDynamicList(dAtu == null ? null : dAtu.Sensores);
|
||||||
|
|
||||||
var bombasPressurizadoras = ToDynamicList(
|
|
||||||
dAtu == null ? null : dAtu.BombasPressurizadoras
|
|
||||||
);
|
|
||||||
|
|
||||||
var sensoresAtuador = ToDynamicList(
|
|
||||||
dAtu == null ? null : dAtu.Sensores
|
|
||||||
);
|
|
||||||
|
|
||||||
Atuador = new OperacaoParametrosDadosAtuadorModel
|
Atuador = new OperacaoParametrosDadosAtuadorModel
|
||||||
{
|
{
|
||||||
|
|
@ -813,34 +795,23 @@ namespace AgroBase.Models.Operacoes
|
||||||
|
|
||||||
AnguloBarraDireita = atu?.AnguloBarraDireita ?? 0,
|
AnguloBarraDireita = atu?.AnguloBarraDireita ?? 0,
|
||||||
AnguloBarraEsquerda = atu?.AnguloBarraEsquerda ?? 0,
|
AnguloBarraEsquerda = atu?.AnguloBarraEsquerda ?? 0,
|
||||||
CapacidadeReservatorio =
|
CapacidadeReservatorio = atu?.CapacidadeReservatorio ?? 0,
|
||||||
atu?.CapacidadeReservatorio ?? 0,
|
|
||||||
ErvasNoRadar = atu?.ErvasNoRadar ?? false,
|
ErvasNoRadar = atu?.ErvasNoRadar ?? false,
|
||||||
DistanciaEstimadaRestanteMetros =
|
DistanciaEstimadaRestanteMetros = atu?.DistanciaEstimadaRestanteMetros ?? 0,
|
||||||
atu?.DistanciaEstimadaRestanteMetros ?? 0,
|
HerbicidaConsumidoMl = atu?.HerbicidaConsumido ?? 0,
|
||||||
HerbicidaConsumidoMl =
|
HerbicidaPorAtuacaoMl = atu?.HerbicidaPorErva ?? 0,
|
||||||
atu?.HerbicidaConsumido ?? 0,
|
|
||||||
HerbicidaPorAtuacaoMl =
|
|
||||||
atu?.HerbicidaPorErva ?? 0,
|
|
||||||
LPorMetro = atu?.LPorMetro ?? 0,
|
LPorMetro = atu?.LPorMetro ?? 0,
|
||||||
LPorMinuto = atu?.LPorMinuto ?? 0,
|
LPorMinuto = atu?.LPorMinuto ?? 0,
|
||||||
MassaReservatorioKg =
|
MassaReservatorioKg = atu?.MassaReservatorio ?? 0,
|
||||||
atu?.MassaReservatorio ?? 0,
|
VolumeReservatorioL = atu?.VolumeReservatorio ?? 0,
|
||||||
VolumeReservatorioL =
|
VolumeVazaoMl = atu?.VolumeVazaoML ?? 0,
|
||||||
atu?.VolumeReservatorio ?? 0,
|
VazaoMediaMLs = atu?.VazaoFluxoMLpSMedia ?? 0,
|
||||||
VolumeVazaoMl = atu?.VolumeVazaoMl ?? 0,
|
VazaoInstantaneaMLs = atu?.VazaoFluxoMLpSInstantaneaCorrigida ?? 0,
|
||||||
VazaoMediaMLs = atu?.VazaoMedia ?? 0,
|
TempoEstimadoRestanteMinutos = atu?.TempoEstimadoRestanteMinutos ?? 0,
|
||||||
VazaoInstantaneaMLs =
|
|
||||||
atu?.VazaoInstantanea ?? 0,
|
|
||||||
TempoEstimadoRestanteMinutos =
|
|
||||||
atu?.TempoEstimadoRestanteMinutos ?? 0,
|
|
||||||
QtdCamerasSolo = atu?.QtdCamerasSolo ?? 0,
|
QtdCamerasSolo = atu?.QtdCamerasSolo ?? 0,
|
||||||
PercentualErvasNoRadar =
|
PercentualErvasNoRadar = atu?.PercentualErvasNoRadar ?? 0,
|
||||||
atu?.PercentualErvasNoRadar ?? 0,
|
PercentualErvasTerreno = atu?.PercentualErvasTerreno ?? 0,
|
||||||
PercentualErvasTerreno =
|
PercentualReservatorio = atu?.PercentualReservatorio ?? 0,
|
||||||
atu?.PercentualErvasTerreno ?? 0,
|
|
||||||
PercentualReservatorio =
|
|
||||||
atu?.PercentualReservatorio ?? 0,
|
|
||||||
PressaoLinhaPsi = atu?.PressaoLinha ?? 0,
|
PressaoLinhaPsi = atu?.PressaoLinha ?? 0,
|
||||||
|
|
||||||
Bicos =
|
Bicos =
|
||||||
|
|
@ -918,7 +889,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarSensoriamento(dynamic dSen)
|
private void AtualizarSensoriamento(SensoriamentoModel dSen)
|
||||||
{
|
{
|
||||||
Sensoriamento = new OperacaoParametrosDadosSensoriamentoModel
|
Sensoriamento = new OperacaoParametrosDadosSensoriamentoModel
|
||||||
{
|
{
|
||||||
|
|
@ -995,119 +966,17 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarMovimentacao(dynamic sen, dynamic dMvd)
|
private void AtualizarMovimentacao(OperacaoSensoriamentoConjuntoModel sen)
|
||||||
{
|
{
|
||||||
var modules = ToDynamicList(
|
Movimentacao = sen.Movimentacao?.Clone();
|
||||||
dMvd == null ? null : dMvd.Modulos
|
|
||||||
);
|
|
||||||
|
|
||||||
var validMov =
|
|
||||||
((IEnumerable<dynamic>)modules)
|
|
||||||
.Where(x => x?.MovMotor != null)
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
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 =
|
|
||||||
validMov
|
|
||||||
.Select(x => new OperacaoSensoriamentoLogMovDadosModel
|
|
||||||
{
|
|
||||||
Mod_ID = x.MovMotor.Mod_ID,
|
|
||||||
ID = x.MovMotor._EnderecoCAN_Rx,
|
|
||||||
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 =
|
|
||||||
validMov.Any()
|
|
||||||
? validMov.Max(x =>
|
|
||||||
x.MovMotor.Leitura?.UltimoComandoRecebido
|
|
||||||
?? DateTime.MinValue)
|
|
||||||
: DateTime.MinValue
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarDirecional(dynamic sen, dynamic dMvd)
|
private void AtualizarDirecional(OperacaoSensoriamentoConjuntoModel sen)
|
||||||
{
|
{
|
||||||
var modules = ToDynamicList(
|
Direcional = sen.Direcional?.Clone();
|
||||||
dMvd == null ? null : dMvd.Modulos
|
|
||||||
);
|
|
||||||
|
|
||||||
var validDir =
|
|
||||||
((IEnumerable<dynamic>)modules)
|
|
||||||
.Where(x => x?.DirMotor != null)
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
Direcional = new OperacaoParametrosDadosDirecionalModel
|
|
||||||
{
|
|
||||||
AnguloMedio =
|
|
||||||
sen?.Direcional?.AnguloMedio ?? 0,
|
|
||||||
|
|
||||||
Modulos =
|
|
||||||
validDir
|
|
||||||
.Select(x => new DirSensoriamentoLogModel
|
|
||||||
{
|
|
||||||
Mod_ID = x.DirMotor.Mod_ID,
|
|
||||||
ID = x.DirMotor._EnderecoCAN_Rx,
|
|
||||||
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 =
|
|
||||||
validDir.Any()
|
|
||||||
? validDir.Max(x =>
|
|
||||||
x.DirMotor.Leitura?.UltimoComandoRecebido
|
|
||||||
?? DateTime.MinValue)
|
|
||||||
: DateTime.MinValue
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarGnss(dynamic sen)
|
private void AtualizarGnss(OperacaoSensoriamentoConjuntoModel sen)
|
||||||
{
|
{
|
||||||
var gps = sen?.Gps;
|
var gps = sen?.Gps;
|
||||||
|
|
||||||
|
|
@ -1127,24 +996,19 @@ namespace AgroBase.Models.Operacoes
|
||||||
OrientacaoReal = gps?.OrientacaoReal ?? 0,
|
OrientacaoReal = gps?.OrientacaoReal ?? 0,
|
||||||
PrecisaoCm = gps?.PrecisaoCm ?? 0,
|
PrecisaoCm = gps?.PrecisaoCm ?? 0,
|
||||||
PrecisaoHorizontal = gps?.PrecisaoHorizontal ?? 0,
|
PrecisaoHorizontal = gps?.PrecisaoHorizontal ?? 0,
|
||||||
QualidadeFix =
|
QualidadeFix = gps?.QualidadeFix ?? TiposCorrecaoGPS.SemCorrecao,
|
||||||
gps?.QualidadeFix ?? TiposCorrecaoGPS.SemCorrecao,
|
|
||||||
Velocidade = gps?.Velocidade ?? 0,
|
Velocidade = gps?.Velocidade ?? 0,
|
||||||
UltimoComandoRespondido =
|
UltimoComandoRespondido = gps?.UltimoComandoRespondido ?? DateTime.MinValue
|
||||||
gps?.UltimoComandoRespondido ?? DateTime.MinValue
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarOutrosBlocos(dynamic sen)
|
private void AtualizarOutrosBlocos(OperacaoSensoriamentoConjuntoModel sen)
|
||||||
{
|
{
|
||||||
Bateria = sen?.Bateria?.Clone();
|
Bateria = sen?.Bateria?.Clone();
|
||||||
Refrigeracao = sen?.CoolerControl?.Clone();
|
Refrigeracao = sen?.CoolerControl?.Clone();
|
||||||
PerformanceNcp = sen?.DadosPerformance?.Clone();
|
PerformanceNcp = sen?.DadosPerformance?.Clone();
|
||||||
LivoxLidar = sen?.LivoxLidar?.Clone();
|
LivoxLidar = sen?.LivoxLidar?.Clone();
|
||||||
OperadorVisual = VisualWorkerService
|
OperadorVisual = sen?.OperadorVisual?.Resumo?.Clone();
|
||||||
.DadosLeitura?
|
|
||||||
.Resumo?
|
|
||||||
.Clone();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarCameras()
|
private void AtualizarCameras()
|
||||||
|
|
@ -1154,14 +1018,14 @@ namespace AgroBase.Models.Operacoes
|
||||||
: new List<CameraWorkerItemModel>();
|
: new List<CameraWorkerItemModel>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarLogs(dynamic sen)
|
private void AtualizarLogs(OperacaoSensoriamentoConjuntoModel sen)
|
||||||
{
|
{
|
||||||
DateTime corte = UltimoEnvioLog;
|
DateTime corte = UltimoEnvioLog;
|
||||||
|
|
||||||
var logs = sen?.Logs;
|
var logs = sen?.Logs;
|
||||||
|
|
||||||
Logs = logs != null
|
Logs = logs != null
|
||||||
? ((IEnumerable<OperacaoSensoriamentoLogErrosModel>)logs)
|
? logs
|
||||||
.Where(x => x != null && x.Momento > corte)
|
.Where(x => x != null && x.Momento > corte)
|
||||||
.ToList()
|
.ToList()
|
||||||
: new List<OperacaoSensoriamentoLogErrosModel>();
|
: new List<OperacaoSensoriamentoLogErrosModel>();
|
||||||
|
|
@ -1185,8 +1049,8 @@ namespace AgroBase.Models.Operacoes
|
||||||
Imu = Imu?.Clone(),
|
Imu = Imu?.Clone(),
|
||||||
Atuador = CloneAtuador(Atuador),
|
Atuador = CloneAtuador(Atuador),
|
||||||
Sensoriamento = CloneSensoriamento(Sensoriamento),
|
Sensoriamento = CloneSensoriamento(Sensoriamento),
|
||||||
Movimentacao = CloneMovimentacao(Movimentacao),
|
Movimentacao = Movimentacao.Clone(),
|
||||||
Direcional = CloneDirecional(Direcional),
|
Direcional = Direcional.Clone(),
|
||||||
|
|
||||||
Bateria = Bateria?.Clone(),
|
Bateria = Bateria?.Clone(),
|
||||||
Refrigeracao = Refrigeracao?.Clone(),
|
Refrigeracao = Refrigeracao?.Clone(),
|
||||||
|
|
@ -1204,8 +1068,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosOperacaoModel CloneOperacao(
|
private static OperacaoParametrosDadosOperacaoModel CloneOperacao(OperacaoParametrosDadosOperacaoModel src)
|
||||||
OperacaoParametrosDadosOperacaoModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1228,8 +1091,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosAtuadorModel CloneAtuador(
|
private static OperacaoParametrosDadosAtuadorModel CloneAtuador(OperacaoParametrosDadosAtuadorModel src)
|
||||||
OperacaoParametrosDadosAtuadorModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1270,8 +1132,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosBicoModel CloneBico(
|
private static OperacaoParametrosDadosBicoModel CloneBico(OperacaoParametrosDadosBicoModel src)
|
||||||
OperacaoParametrosDadosBicoModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1297,8 +1158,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosBombaModel CloneBomba(
|
private static OperacaoParametrosDadosBombaModel CloneBomba(OperacaoParametrosDadosBombaModel src)
|
||||||
OperacaoParametrosDadosBombaModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1320,8 +1180,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosSensoriamentoModel
|
private static OperacaoParametrosDadosSensoriamentoModel CloneSensoriamento(OperacaoParametrosDadosSensoriamentoModel src)
|
||||||
CloneSensoriamento(OperacaoParametrosDadosSensoriamentoModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1342,8 +1201,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosSensorModel CloneSensor(
|
private static OperacaoParametrosDadosSensorModel CloneSensor(OperacaoParametrosDadosSensorModel src)
|
||||||
OperacaoParametrosDadosSensorModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1361,8 +1219,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosServoModel CloneServo(
|
private static OperacaoParametrosDadosServoModel CloneServo(OperacaoParametrosDadosServoModel src)
|
||||||
OperacaoParametrosDadosServoModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1379,8 +1236,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosReleModel CloneRele(
|
private static OperacaoParametrosDadosReleModel CloneRele(OperacaoParametrosDadosReleModel src)
|
||||||
OperacaoParametrosDadosReleModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1396,8 +1252,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosSinaleiroModel CloneSinaleiro(
|
private static OperacaoParametrosDadosSinaleiroModel CloneSinaleiro(OperacaoParametrosDadosSinaleiroModel src)
|
||||||
OperacaoParametrosDadosSinaleiroModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1414,41 +1269,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OperacaoParametrosDadosMovimentacaoModel
|
private static OperacaoParametrosDadosGNSSModel CloneGnss(OperacaoParametrosDadosGNSSModel src)
|
||||||
CloneMovimentacao(OperacaoParametrosDadosMovimentacaoModel src)
|
|
||||||
{
|
|
||||||
if (src == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return new OperacaoParametrosDadosMovimentacaoModel
|
|
||||||
{
|
|
||||||
VelocidadeMediaMs = src.VelocidadeMediaMs,
|
|
||||||
RPMMedio = src.RPMMedio,
|
|
||||||
TempoMovimentoSegs = src.TempoMovimentoSegs,
|
|
||||||
DistanciaPercorridaTotal = src.DistanciaPercorridaTotal,
|
|
||||||
DistanciaPercorridaParcial = src.DistanciaPercorridaParcial,
|
|
||||||
TemperaturaMedia = src.TemperaturaMedia,
|
|
||||||
Modulos = CloneList(src.Modulos),
|
|
||||||
UltimoComandoRespondido = src.UltimoComandoRespondido
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static OperacaoParametrosDadosDirecionalModel CloneDirecional(
|
|
||||||
OperacaoParametrosDadosDirecionalModel src)
|
|
||||||
{
|
|
||||||
if (src == null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
return new OperacaoParametrosDadosDirecionalModel
|
|
||||||
{
|
|
||||||
AnguloMedio = src.AnguloMedio,
|
|
||||||
Modulos = CloneList(src.Modulos),
|
|
||||||
UltimoComandoRespondido = src.UltimoComandoRespondido
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static OperacaoParametrosDadosGNSSModel CloneGnss(
|
|
||||||
OperacaoParametrosDadosGNSSModel src)
|
|
||||||
{
|
{
|
||||||
if (src == null)
|
if (src == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -1563,10 +1384,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static double TryGetDouble(
|
private static double TryGetDouble(object obj, string property, double fallback)
|
||||||
object obj,
|
|
||||||
string property,
|
|
||||||
double fallback)
|
|
||||||
{
|
{
|
||||||
if (obj == null ||
|
if (obj == null ||
|
||||||
string.IsNullOrWhiteSpace(property))
|
string.IsNullOrWhiteSpace(property))
|
||||||
|
|
@ -1850,25 +1668,6 @@ namespace AgroBase.Models.Operacoes
|
||||||
public DateTime UltimoComandoRespondido { 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 class OperacaoParametrosDadosSensoriamentoModel
|
||||||
{
|
{
|
||||||
public bool Iniciado { get; set; }
|
public bool Iniciado { get; set; }
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,29 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace AgroBase.Models.Operadores
|
namespace AgroBase.Models.Operadores
|
||||||
{
|
{
|
||||||
public class HealthWorkerModel
|
public class HealthWorkerModel
|
||||||
{
|
{
|
||||||
|
public DateTime Momento { get; set; }
|
||||||
public bool Iniciado { get; set; }
|
public bool Iniciado { get; set; }
|
||||||
public DateTime IniciadoEm { get; set; }
|
public DateTime IniciadoEm { get; set; }
|
||||||
public bool Pronto { get; set; }
|
public bool Pronto { get; set; }
|
||||||
public DateTime ProntoEm { get; set; }
|
public DateTime ProntoEm { get; set; }
|
||||||
public DateTime UltimaMensagem { get; set; }
|
public DateTime UltimaMensagem { get; set; }
|
||||||
|
|
||||||
|
public List<ManagerWorkerMessageResponseModulosPendentesModel> ModulosSaude = new List<ManagerWorkerMessageResponseModulosPendentesModel>();
|
||||||
|
|
||||||
public HealthWorkerModel Clone()
|
public HealthWorkerModel Clone()
|
||||||
{
|
{
|
||||||
return new HealthWorkerModel()
|
return new HealthWorkerModel()
|
||||||
{
|
{
|
||||||
|
Momento = Momento,
|
||||||
Iniciado = Iniciado,
|
Iniciado = Iniciado,
|
||||||
IniciadoEm = IniciadoEm,
|
IniciadoEm = IniciadoEm,
|
||||||
Pronto = Pronto,
|
Pronto = Pronto,
|
||||||
ProntoEm = ProntoEm,
|
ProntoEm = ProntoEm,
|
||||||
|
ModulosSaude = new List<ManagerWorkerMessageResponseModulosPendentesModel>(ModulosSaude ?? new List<ManagerWorkerMessageResponseModulosPendentesModel>()),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ namespace AgroBase.Models.Operadores
|
||||||
public bool Pronto { get; set; }
|
public bool Pronto { get; set; }
|
||||||
public DateTime ProntoEm { get; set; }
|
public DateTime ProntoEm { get; set; }
|
||||||
public DateTime UltimaMensagem { get; set; }
|
public DateTime UltimaMensagem { get; set; }
|
||||||
//public WorkerMessageModel<ManagerWorkerMessageResponseModel> Leitura { get; set; }
|
|
||||||
|
|
||||||
public ManagerWorkerModel Clone()
|
public ManagerWorkerModel Clone()
|
||||||
{
|
{
|
||||||
|
|
@ -32,7 +31,6 @@ namespace AgroBase.Models.Operadores
|
||||||
IniciadoEm = DateTime.MinValue;
|
IniciadoEm = DateTime.MinValue;
|
||||||
Pronto = false;
|
Pronto = false;
|
||||||
ProntoEm = DateTime.MinValue;
|
ProntoEm = DateTime.MinValue;
|
||||||
//Leitura = new WorkerMessageModel<ManagerWorkerMessageResponseModel>();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ namespace AgroBase.Models.Operadores
|
||||||
{
|
{
|
||||||
public class VisualWorkerModel
|
public class VisualWorkerModel
|
||||||
{
|
{
|
||||||
|
public DateTime Momento { get; set; }
|
||||||
public bool Iniciado { get; set; }
|
public bool Iniciado { get; set; }
|
||||||
public DateTime IniciadoEm { get; set; }
|
public DateTime IniciadoEm { get; set; }
|
||||||
public bool Pronto { get; set; }
|
public bool Pronto { get; set; }
|
||||||
|
|
@ -28,6 +29,7 @@ namespace AgroBase.Models.Operadores
|
||||||
{
|
{
|
||||||
return new VisualWorkerModel()
|
return new VisualWorkerModel()
|
||||||
{
|
{
|
||||||
|
Momento = Momento,
|
||||||
Iniciado = Iniciado,
|
Iniciado = Iniciado,
|
||||||
IniciadoEm = IniciadoEm,
|
IniciadoEm = IniciadoEm,
|
||||||
Pronto = Pronto,
|
Pronto = Pronto,
|
||||||
|
|
@ -207,7 +209,9 @@ namespace AgroBase.Models.Operadores
|
||||||
|
|
||||||
public void AtualizarStatusBloqueioManual(VisualWorkerModel Sonar, bool consideraEmMovimento)
|
public void AtualizarStatusBloqueioManual(VisualWorkerModel Sonar, bool consideraEmMovimento)
|
||||||
{
|
{
|
||||||
if (!(Variaveis.OperacaoEmAndamento.Parametros?.Controle?.OakParadaPorObstaculo ?? false))
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
if (!(op.Parametros?.Controle?.OakParadaPorObstaculo ?? false))
|
||||||
{
|
{
|
||||||
_comandoParadaEnviado = false;
|
_comandoParadaEnviado = false;
|
||||||
DeveParar = false;
|
DeveParar = false;
|
||||||
|
|
@ -217,7 +221,7 @@ namespace AgroBase.Models.Operadores
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
List<Direcao> _direcoesInterromperMovimento = new List<Direcao> { Direcao.Frente }; //, Direcao.Tras
|
List<Direcao> _direcoesInterromperMovimento = new List<Direcao> { Direcao.Frente }; //, Direcao.Tras
|
||||||
Direcao _ultimaDirecaoControle = Variaveis.OperacaoEmAndamento.Controle?.TiposControle?.FirstOrDefault(x => x?.Tipo == T_Code.Mov)?.UltimaDirecao ?? Direcao.Parado;
|
Direcao _ultimaDirecaoControle = op.Controle?.TiposControle?.FirstOrDefault(x => x?.Tipo == T_Code.Mov)?.UltimaDirecao ?? Direcao.Parado;
|
||||||
bool _carroEmMovimento = _direcoesInterromperMovimento.Contains(_ultimaDirecaoControle);
|
bool _carroEmMovimento = _direcoesInterromperMovimento.Contains(_ultimaDirecaoControle);
|
||||||
bool emMovimento = consideraEmMovimento ? _carroEmMovimento : true;
|
bool emMovimento = consideraEmMovimento ? _carroEmMovimento : true;
|
||||||
DeveParar = Sonar?.StatusValido == true && (ParadaDetectada || Modo == "stop");
|
DeveParar = Sonar?.StatusValido == true && (ParadaDetectada || Modo == "stop");
|
||||||
|
|
@ -591,25 +595,15 @@ namespace AgroBase.Models.Operadores
|
||||||
public class VisualWorkerPerformanceModel
|
public class VisualWorkerPerformanceModel
|
||||||
{
|
{
|
||||||
public double timestamp { get; set; }
|
public double timestamp { get; set; }
|
||||||
|
public Dictionary<string, VisualWorkerPerformanceLoopModel> loops { get; set; } = new Dictionary<string, VisualWorkerPerformanceLoopModel>();
|
||||||
public Dictionary<string, VisualWorkerPerformanceLoopModel> loops { get; set; }
|
|
||||||
= new Dictionary<string, VisualWorkerPerformanceLoopModel>();
|
|
||||||
|
|
||||||
public JObject sync { get; set; } = new JObject();
|
public JObject sync { get; set; } = new JObject();
|
||||||
|
|
||||||
public JObject camera_cache { get; set; } = new JObject();
|
public JObject camera_cache { get; set; } = new JObject();
|
||||||
|
public VisualWorkerPerformanceCacheModel visual_cache { get; set; } = new VisualWorkerPerformanceCacheModel();
|
||||||
public VisualWorkerPerformanceCacheModel visual_cache { get; set; }
|
public VisualWorkerPerformancePublicacaoModel pub_debug { get; set; } = new VisualWorkerPerformancePublicacaoModel();
|
||||||
= new VisualWorkerPerformanceCacheModel();
|
|
||||||
|
|
||||||
public VisualWorkerPerformancePublicacaoModel pub_debug { get; set; }
|
|
||||||
= new VisualWorkerPerformancePublicacaoModel();
|
|
||||||
|
|
||||||
public JObject contadores { get; set; } = new JObject();
|
public JObject contadores { get; set; } = new JObject();
|
||||||
|
|
||||||
[JsonExtensionData]
|
[JsonExtensionData]
|
||||||
public IDictionary<string, JToken> Extra { get; set; }
|
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
|
||||||
= new Dictionary<string, JToken>();
|
|
||||||
|
|
||||||
public VisualWorkerPerformanceModel Clone()
|
public VisualWorkerPerformanceModel Clone()
|
||||||
{
|
{
|
||||||
|
|
@ -647,16 +641,12 @@ namespace AgroBase.Models.Operadores
|
||||||
public class VisualWorkerPerformanceLoopModel
|
public class VisualWorkerPerformanceLoopModel
|
||||||
{
|
{
|
||||||
public double fps_real { get; set; }
|
public double fps_real { get; set; }
|
||||||
|
|
||||||
public JObject periodo_ms { get; set; } = new JObject();
|
public JObject periodo_ms { get; set; } = new JObject();
|
||||||
public JObject latencia_ms { get; set; } = new JObject();
|
public JObject latencia_ms { get; set; } = new JObject();
|
||||||
|
public Dictionary<string, JObject> metrics_ms { get; set; } = new Dictionary<string, JObject>();
|
||||||
public Dictionary<string, JObject> metrics_ms { get; set; }
|
|
||||||
= new Dictionary<string, JObject>();
|
|
||||||
|
|
||||||
[JsonExtensionData]
|
[JsonExtensionData]
|
||||||
public IDictionary<string, JToken> Extra { get; set; }
|
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
|
||||||
= new Dictionary<string, JToken>();
|
|
||||||
|
|
||||||
public VisualWorkerPerformanceLoopModel Clone()
|
public VisualWorkerPerformanceLoopModel Clone()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ namespace AgroBase.Models.Operadores
|
||||||
{
|
{
|
||||||
public class WeedWorkerModel
|
public class WeedWorkerModel
|
||||||
{
|
{
|
||||||
|
public DateTime Momento { get; set; }
|
||||||
public bool Iniciado { get; set; }
|
public bool Iniciado { get; set; }
|
||||||
public DateTime IniciadoEm { get; set; }
|
public DateTime IniciadoEm { get; set; }
|
||||||
public bool Pronto { get; set; }
|
public bool Pronto { get; set; }
|
||||||
|
|
@ -27,25 +28,17 @@ namespace AgroBase.Models.Operadores
|
||||||
{
|
{
|
||||||
return new WeedWorkerModel
|
return new WeedWorkerModel
|
||||||
{
|
{
|
||||||
|
Momento = Momento,
|
||||||
Iniciado = Iniciado,
|
Iniciado = Iniciado,
|
||||||
IniciadoEm = IniciadoEm,
|
IniciadoEm = IniciadoEm,
|
||||||
Pronto = Pronto,
|
Pronto = Pronto,
|
||||||
ProntoEm = ProntoEm,
|
ProntoEm = ProntoEm,
|
||||||
UltimaMensagem = UltimaMensagem,
|
UltimaMensagem = UltimaMensagem,
|
||||||
|
|
||||||
Imu = Imu?.Clone(),
|
Imu = Imu?.Clone(),
|
||||||
|
Analise = Analise?.Clone() ?? new WeedWorkerAnaliseModel(),
|
||||||
Analise = Analise?.Clone()
|
MetricasAnalise = MetricasAnalise?.Clone() ?? new WeedWorkerAnaliseMetricasModel(),
|
||||||
?? new WeedWorkerAnaliseModel(),
|
Performance = Performance?.Clone() ?? new WeedWorkerPerformanceModel(),
|
||||||
|
Timestamps = Timestamps?.Clone() ?? new WeedWorkerRedisTimestampsModel(),
|
||||||
MetricasAnalise = MetricasAnalise?.Clone()
|
|
||||||
?? new WeedWorkerAnaliseMetricasModel(),
|
|
||||||
|
|
||||||
Performance = Performance?.Clone()
|
|
||||||
?? new WeedWorkerPerformanceModel(),
|
|
||||||
|
|
||||||
Timestamps = Timestamps?.Clone()
|
|
||||||
?? new WeedWorkerRedisTimestampsModel()
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,8 +52,7 @@ namespace AgroBase.Models.Operadores
|
||||||
|
|
||||||
UltimaMensagem = DateTime.MinValue;
|
UltimaMensagem = DateTime.MinValue;
|
||||||
|
|
||||||
CameraFrames =
|
CameraFrames = new Dictionary<TipoFrameCamera, OAKCameraFrameModel>();
|
||||||
new Dictionary<TipoFrameCamera, OAKCameraFrameModel>();
|
|
||||||
|
|
||||||
Analise = new WeedWorkerAnaliseModel();
|
Analise = new WeedWorkerAnaliseModel();
|
||||||
Imu = new OAKImuModel();
|
Imu = new OAKImuModel();
|
||||||
|
|
@ -89,19 +81,14 @@ namespace AgroBase.Models.Operadores
|
||||||
public class WeedWorkerAnaliseEnvelopeModel
|
public class WeedWorkerAnaliseEnvelopeModel
|
||||||
{
|
{
|
||||||
public double ts_analise { get; set; }
|
public double ts_analise { get; set; }
|
||||||
|
|
||||||
public double fps_model { get; set; }
|
public double fps_model { get; set; }
|
||||||
public double fps_inferencia { get; set; }
|
public double fps_inferencia { get; set; }
|
||||||
|
|
||||||
public double infer_ms { get; set; }
|
public double infer_ms { get; set; }
|
||||||
public double infer_gpu_ms { get; set; }
|
public double infer_gpu_ms { get; set; }
|
||||||
|
public WeedWorkerAnaliseModel analise { get; set; } = new WeedWorkerAnaliseModel();
|
||||||
public WeedWorkerAnaliseModel analise { get; set; }
|
|
||||||
= new WeedWorkerAnaliseModel();
|
|
||||||
|
|
||||||
[JsonExtensionData]
|
[JsonExtensionData]
|
||||||
public IDictionary<string, JToken> Extra { get; set; }
|
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
|
||||||
= new Dictionary<string, JToken>();
|
|
||||||
|
|
||||||
public WeedWorkerAnaliseEnvelopeModel Clone()
|
public WeedWorkerAnaliseEnvelopeModel Clone()
|
||||||
{
|
{
|
||||||
|
|
@ -112,14 +99,8 @@ namespace AgroBase.Models.Operadores
|
||||||
fps_inferencia = fps_inferencia,
|
fps_inferencia = fps_inferencia,
|
||||||
infer_ms = infer_ms,
|
infer_ms = infer_ms,
|
||||||
infer_gpu_ms = infer_gpu_ms,
|
infer_gpu_ms = infer_gpu_ms,
|
||||||
|
analise = analise?.Clone() ?? new WeedWorkerAnaliseModel(),
|
||||||
analise = analise?.Clone()
|
Extra = Extra?.ToDictionary(x => x.Key, x => x.Value?.DeepClone()) ?? new Dictionary<string, JToken>()
|
||||||
?? new WeedWorkerAnaliseModel(),
|
|
||||||
|
|
||||||
Extra = Extra?.ToDictionary(
|
|
||||||
x => x.Key,
|
|
||||||
x => x.Value?.DeepClone()
|
|
||||||
) ?? new Dictionary<string, JToken>()
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -197,61 +178,36 @@ namespace AgroBase.Models.Operadores
|
||||||
public class WeedWorkerAnaliseEstatisticasBicosModel
|
public class WeedWorkerAnaliseEstatisticasBicosModel
|
||||||
{
|
{
|
||||||
public string motivo { get; set; }
|
public string motivo { get; set; }
|
||||||
|
public List<double> frac_erva_por_bico { get; set; } = new List<double>();
|
||||||
public List<double> frac_erva_por_bico { get; set; }
|
public List<double> ema_frac_por_bico { get; set; } = new List<double>();
|
||||||
= new List<double>();
|
public WeedWorkerAnaliseEstatisticasBicosFaixaModel faixa { get; set; } = new WeedWorkerAnaliseEstatisticasBicosFaixaModel();
|
||||||
|
public List<double> larguras { get; set; } = new List<double>();
|
||||||
public List<double> ema_frac_por_bico { get; set; }
|
|
||||||
= new List<double>();
|
|
||||||
|
|
||||||
public WeedWorkerAnaliseEstatisticasBicosFaixaModel faixa { get; set; }
|
|
||||||
= new WeedWorkerAnaliseEstatisticasBicosFaixaModel();
|
|
||||||
|
|
||||||
public List<double> larguras { get; set; }
|
|
||||||
= new List<double>();
|
|
||||||
|
|
||||||
public int shift_px { get; set; }
|
public int shift_px { get; set; }
|
||||||
|
|
||||||
public double thr_on_eff { get; set; }
|
public double thr_on_eff { get; set; }
|
||||||
public double thr_off_eff { get; set; }
|
public double thr_off_eff { get; set; }
|
||||||
|
public List<int> on_cnt { get; set; } = new List<int>();
|
||||||
public List<int> on_cnt { get; set; }
|
public List<int> off_cnt { get; set; } = new List<int>();
|
||||||
= new List<int>();
|
public List<bool> estado_bico { get; set; } = new List<bool>();
|
||||||
|
|
||||||
public List<int> off_cnt { get; set; }
|
|
||||||
= new List<int>();
|
|
||||||
|
|
||||||
public List<bool> estado_bico { get; set; }
|
|
||||||
= new List<bool>();
|
|
||||||
|
|
||||||
[JsonExtensionData]
|
[JsonExtensionData]
|
||||||
public IDictionary<string, JToken> Extra { get; set; }
|
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
|
||||||
= new Dictionary<string, JToken>();
|
|
||||||
|
|
||||||
public WeedWorkerAnaliseEstatisticasBicosModel Clone()
|
public WeedWorkerAnaliseEstatisticasBicosModel Clone()
|
||||||
{
|
{
|
||||||
return new WeedWorkerAnaliseEstatisticasBicosModel
|
return new WeedWorkerAnaliseEstatisticasBicosModel
|
||||||
{
|
{
|
||||||
motivo = motivo,
|
motivo = motivo,
|
||||||
frac_erva_por_bico =
|
frac_erva_por_bico = new List<double>(frac_erva_por_bico ?? new List<double>()),
|
||||||
new List<double>(frac_erva_por_bico ?? new List<double>()),
|
ema_frac_por_bico = new List<double>(ema_frac_por_bico ?? new List<double>()),
|
||||||
ema_frac_por_bico =
|
faixa = faixa?.Clone() ?? new WeedWorkerAnaliseEstatisticasBicosFaixaModel(),
|
||||||
new List<double>(ema_frac_por_bico ?? new List<double>()),
|
larguras = new List<double>(larguras ?? new List<double>()),
|
||||||
faixa = faixa?.Clone()
|
|
||||||
?? new WeedWorkerAnaliseEstatisticasBicosFaixaModel(),
|
|
||||||
larguras =
|
|
||||||
new List<double>(larguras ?? new List<double>()),
|
|
||||||
shift_px = shift_px,
|
shift_px = shift_px,
|
||||||
thr_on_eff = thr_on_eff,
|
thr_on_eff = thr_on_eff,
|
||||||
thr_off_eff = thr_off_eff,
|
thr_off_eff = thr_off_eff,
|
||||||
on_cnt = new List<int>(on_cnt ?? new List<int>()),
|
on_cnt = new List<int>(on_cnt ?? new List<int>()),
|
||||||
off_cnt = new List<int>(off_cnt ?? new List<int>()),
|
off_cnt = new List<int>(off_cnt ?? new List<int>()),
|
||||||
estado_bico =
|
estado_bico = new List<bool>(estado_bico ?? new List<bool>()),
|
||||||
new List<bool>(estado_bico ?? new List<bool>()),
|
Extra = Extra?.ToDictionary(x => x.Key, x => x.Value?.DeepClone()) ?? new Dictionary<string, JToken>()
|
||||||
Extra = Extra?.ToDictionary(
|
|
||||||
x => x.Key,
|
|
||||||
x => x.Value?.DeepClone()
|
|
||||||
) ?? new Dictionary<string, JToken>()
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -275,53 +231,26 @@ namespace AgroBase.Models.Operadores
|
||||||
public class WeedWorkerPerformanceModel
|
public class WeedWorkerPerformanceModel
|
||||||
{
|
{
|
||||||
public double timestamp { get; set; }
|
public double timestamp { get; set; }
|
||||||
|
public Dictionary<string, WeedWorkerPerformanceLoopModel> loops { get; set; } = new Dictionary<string, WeedWorkerPerformanceLoopModel>();
|
||||||
public Dictionary<string, WeedWorkerPerformanceLoopModel> loops { get; set; }
|
|
||||||
= new Dictionary<string, WeedWorkerPerformanceLoopModel>();
|
|
||||||
|
|
||||||
public JObject sync { get; set; } = new JObject();
|
public JObject sync { get; set; } = new JObject();
|
||||||
|
public WeedWorkerPerformanceCacheModel weed_cache { get; set; } = new WeedWorkerPerformanceCacheModel();
|
||||||
public WeedWorkerPerformanceCacheModel weed_cache { get; set; }
|
public WeedWorkerPerformancePublicacaoModel pub_debug { get; set; } = new WeedWorkerPerformancePublicacaoModel();
|
||||||
= new WeedWorkerPerformanceCacheModel();
|
|
||||||
|
|
||||||
public WeedWorkerPerformancePublicacaoModel pub_debug { get; set; }
|
|
||||||
= new WeedWorkerPerformancePublicacaoModel();
|
|
||||||
|
|
||||||
public JObject contadores { get; set; } = new JObject();
|
public JObject contadores { get; set; } = new JObject();
|
||||||
|
|
||||||
[JsonExtensionData]
|
[JsonExtensionData]
|
||||||
public IDictionary<string, JToken> Extra { get; set; }
|
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
|
||||||
= new Dictionary<string, JToken>();
|
|
||||||
|
|
||||||
public WeedWorkerPerformanceModel Clone()
|
public WeedWorkerPerformanceModel Clone()
|
||||||
{
|
{
|
||||||
return new WeedWorkerPerformanceModel
|
return new WeedWorkerPerformanceModel
|
||||||
{
|
{
|
||||||
timestamp = timestamp,
|
timestamp = timestamp,
|
||||||
|
loops = loops?.ToDictionary(x => x.Key, x => x.Value?.Clone()) ?? new Dictionary<string, WeedWorkerPerformanceLoopModel>(),
|
||||||
loops = loops?.ToDictionary(
|
sync = sync != null ? (JObject)sync.DeepClone() : new JObject(),
|
||||||
x => x.Key,
|
weed_cache = weed_cache?.Clone() ?? new WeedWorkerPerformanceCacheModel(),
|
||||||
x => x.Value?.Clone()
|
pub_debug = pub_debug?.Clone() ?? new WeedWorkerPerformancePublicacaoModel(),
|
||||||
) ?? new Dictionary<string, WeedWorkerPerformanceLoopModel>(),
|
contadores = contadores != null ? (JObject)contadores.DeepClone() : new JObject(),
|
||||||
|
Extra = Extra?.ToDictionary(x => x.Key, x => x.Value?.DeepClone()) ?? new Dictionary<string, JToken>()
|
||||||
sync = sync != null
|
|
||||||
? (JObject)sync.DeepClone()
|
|
||||||
: new JObject(),
|
|
||||||
|
|
||||||
weed_cache = weed_cache?.Clone()
|
|
||||||
?? new WeedWorkerPerformanceCacheModel(),
|
|
||||||
|
|
||||||
pub_debug = pub_debug?.Clone()
|
|
||||||
?? new WeedWorkerPerformancePublicacaoModel(),
|
|
||||||
|
|
||||||
contadores = contadores != null
|
|
||||||
? (JObject)contadores.DeepClone()
|
|
||||||
: new JObject(),
|
|
||||||
|
|
||||||
Extra = Extra?.ToDictionary(
|
|
||||||
x => x.Key,
|
|
||||||
x => x.Value?.DeepClone()
|
|
||||||
) ?? new Dictionary<string, JToken>()
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -329,42 +258,21 @@ namespace AgroBase.Models.Operadores
|
||||||
public class WeedWorkerPerformanceLoopModel
|
public class WeedWorkerPerformanceLoopModel
|
||||||
{
|
{
|
||||||
public double fps_real { get; set; }
|
public double fps_real { get; set; }
|
||||||
|
|
||||||
public JObject periodo_ms { get; set; } = new JObject();
|
public JObject periodo_ms { get; set; } = new JObject();
|
||||||
public JObject latencia_ms { get; set; } = new JObject();
|
public JObject latencia_ms { get; set; } = new JObject();
|
||||||
|
public Dictionary<string, JObject> metrics_ms { get; set; } = new Dictionary<string, JObject>();
|
||||||
public Dictionary<string, JObject> metrics_ms { get; set; }
|
|
||||||
= new Dictionary<string, JObject>();
|
|
||||||
|
|
||||||
[Newtonsoft.Json.JsonExtensionData]
|
[Newtonsoft.Json.JsonExtensionData]
|
||||||
public IDictionary<string, JToken> Extra { get; set; }
|
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
|
||||||
= new Dictionary<string, JToken>();
|
|
||||||
|
|
||||||
public WeedWorkerPerformanceLoopModel Clone()
|
public WeedWorkerPerformanceLoopModel Clone()
|
||||||
{
|
{
|
||||||
return new WeedWorkerPerformanceLoopModel
|
return new WeedWorkerPerformanceLoopModel
|
||||||
{
|
{
|
||||||
fps_real = fps_real,
|
fps_real = fps_real,
|
||||||
|
periodo_ms = periodo_ms != null ? (JObject)periodo_ms.DeepClone() : new JObject(),
|
||||||
periodo_ms = periodo_ms != null
|
latencia_ms = latencia_ms != null ? (JObject)latencia_ms.DeepClone() : new JObject(),
|
||||||
? (JObject)periodo_ms.DeepClone()
|
metrics_ms = metrics_ms?.ToDictionary(x => x.Key, x => x.Value != null ? (JObject)x.Value.DeepClone() : new JObject()) ?? new Dictionary<string, JObject>(),
|
||||||
: new JObject(),
|
Extra = Extra?.ToDictionary(x => x.Key, x => x.Value?.DeepClone()) ?? new Dictionary<string, JToken>()
|
||||||
|
|
||||||
latencia_ms = latencia_ms != null
|
|
||||||
? (JObject)latencia_ms.DeepClone()
|
|
||||||
: new JObject(),
|
|
||||||
|
|
||||||
metrics_ms = metrics_ms?.ToDictionary(
|
|
||||||
x => x.Key,
|
|
||||||
x => x.Value != null
|
|
||||||
? (JObject)x.Value.DeepClone()
|
|
||||||
: new JObject()
|
|
||||||
) ?? new Dictionary<string, JObject>(),
|
|
||||||
|
|
||||||
Extra = Extra?.ToDictionary(
|
|
||||||
x => x.Key,
|
|
||||||
x => x.Value?.DeepClone()
|
|
||||||
) ?? new Dictionary<string, JToken>()
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
using OpenHardwareMonitor.Hardware;
|
using OpenHardwareMonitor.Hardware;
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
namespace AgroBase.Models
|
namespace AgroBase.Models
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,6 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using static AgroBase.Models.Enums;
|
using static AgroBase.Models.Enums;
|
||||||
|
|
||||||
|
|
@ -601,7 +599,7 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return DistanciaMedia / FuncoesMatematicas.ConverteKmhParaMs(Variaveis.OperacaoEmAndamento.Sensoriamento.Movimentacao.VelocidadeMedia);
|
return DistanciaMedia / FuncoesMatematicas.ConverteKmhParaMs(Variaveis.OperacaoEmAndamento.Sensoriamento.Movimentacao.VelocidadeMediaMs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public double DeslocamentoNecessarioDesvio
|
public double DeslocamentoNecessarioDesvio
|
||||||
|
|
|
||||||
|
|
@ -38,11 +38,14 @@ namespace AgroBase.Models
|
||||||
public bool RetornandoBase { get; set; }
|
public bool RetornandoBase { get; set; }
|
||||||
public AutonomiaCorredorModel AutonomiaCorredor { get; set; }
|
public AutonomiaCorredorModel AutonomiaCorredor { get; set; }
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
private GPSModel GPSPosicaoAtual => Variaveis.OperacaoEmAndamento.Sensoriamento?.Gps?.Clone();
|
||||||
|
|
||||||
[JsonProperty]
|
[JsonProperty]
|
||||||
public double TempoEntreLeituras { get; private set; }
|
public double TempoEntreLeituras { get; private set; }
|
||||||
private void AtualizarTempoEntreLeituras()
|
private void AtualizarTempoEntreLeituras()
|
||||||
{
|
{
|
||||||
DateTime leitura_gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps?.Momento ?? DateTime.MinValue;
|
DateTime leitura_gps = GPSPosicaoAtual?.Momento ?? DateTime.MinValue;
|
||||||
double t_min = (1.0 / GPSService.TaxaAmostragemHz);
|
double t_min = (1.0 / GPSService.TaxaAmostragemHz);
|
||||||
double dt = (leitura_gps - UltimaAtualizacaoDados).TotalSeconds;
|
double dt = (leitura_gps - UltimaAtualizacaoDados).TotalSeconds;
|
||||||
TempoEntreLeituras = Math.Min(t_min, dt);
|
TempoEntreLeituras = Math.Min(t_min, dt);
|
||||||
|
|
@ -89,8 +92,8 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
double distPP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, PrimeiroPontoRuaMapa);
|
double distPP = GPSUtils.DistanciaEntrePontos(GPSPosicaoAtual, PrimeiroPontoRuaMapa);
|
||||||
double distUP = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, UltimoPontoRuaMapa);
|
double distUP = GPSUtils.DistanciaEntrePontos(GPSPosicaoAtual, UltimoPontoRuaMapa);
|
||||||
|
|
||||||
// 0 para mais próximo do primeiro ponto da rua (ENTRANDO)
|
// 0 para mais próximo do primeiro ponto da rua (ENTRANDO)
|
||||||
// 1 para mais próximo do último ponto da rua (SAINDO)
|
// 1 para mais próximo do último ponto da rua (SAINDO)
|
||||||
|
|
@ -130,7 +133,7 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
new PontoTrajetoriaModel(TipoPontoRua.PosicaoRobo)
|
new PontoTrajetoriaModel(TipoPontoRua.PosicaoRobo)
|
||||||
{
|
{
|
||||||
Posicao = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps,
|
Posicao = GPSPosicaoAtual,
|
||||||
LarguraCorredor = 1.0,
|
LarguraCorredor = 1.0,
|
||||||
idxCorredor = CorredorAtual?.Idx ?? 0,
|
idxCorredor = CorredorAtual?.Idx ?? 0,
|
||||||
Visitado = true
|
Visitado = true
|
||||||
|
|
@ -233,7 +236,7 @@ namespace AgroBase.Models
|
||||||
private void AtualizarAnguloCaminho()
|
private void AtualizarAnguloCaminho()
|
||||||
{
|
{
|
||||||
PontoTrajetoriaModel pontoComparar = PontoAtual.Aproximando ? PontoAtual : ProximoPonto != null ? ProximoPonto : PontoAtual;
|
PontoTrajetoriaModel pontoComparar = PontoAtual.Aproximando ? PontoAtual : ProximoPonto != null ? ProximoPonto : PontoAtual;
|
||||||
AnguloCaminho = GPSUtils.CalcularOrientacao(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, pontoComparar.Posicao);
|
AnguloCaminho = GPSUtils.CalcularOrientacao(GPSPosicaoAtual, pontoComparar.Posicao);
|
||||||
}
|
}
|
||||||
[JsonProperty]
|
[JsonProperty]
|
||||||
public double DistanciaEsquerda { get; private set; }
|
public double DistanciaEsquerda { get; private set; }
|
||||||
|
|
@ -241,8 +244,8 @@ namespace AgroBase.Models
|
||||||
public double DistanciaDireita { get; private set; }
|
public double DistanciaDireita { get; private set; }
|
||||||
private void AtualizarDistanciasLaterais()
|
private void AtualizarDistanciasLaterais()
|
||||||
{
|
{
|
||||||
DistanciaEsquerda = CalcularDistanciaLateral(true, Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual?.idxRuaEsquerda ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida);
|
DistanciaEsquerda = CalcularDistanciaLateral(true, GPSPosicaoAtual, CorredorAtual?.idxRuaEsquerda ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida);
|
||||||
DistanciaDireita = CalcularDistanciaLateral(false, Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual?.idxRuaDireita ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida);
|
DistanciaDireita = CalcularDistanciaLateral(false, GPSPosicaoAtual, CorredorAtual?.idxRuaDireita ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double CalcularDistanciaLateral(bool ladoEsquerdo, GPSModel posicaoAtual, int idxRua, DirecaoCarroRua direcaoAtual)
|
public double CalcularDistanciaLateral(bool ladoEsquerdo, GPSModel posicaoAtual, int idxRua, DirecaoCarroRua direcaoAtual)
|
||||||
|
|
@ -435,7 +438,7 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
if (CorredorAtual != null)
|
if (CorredorAtual != null)
|
||||||
{
|
{
|
||||||
if ((RetornandoBase && CorredorAtual.Dentro) || (!RetornandoBase && Variaveis.OperacaoEmAndamento.StatusAtual == StatusOperacao.EmAndamento))
|
if ((RetornandoBase && CorredorAtual.Dentro) || (!RetornandoBase && Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.StatusOperacaoAtual == StatusOperacao.EmAndamento))
|
||||||
{
|
{
|
||||||
PontoAtual.AtualizarPropriedades();
|
PontoAtual.AtualizarPropriedades();
|
||||||
if (!CorredorAtual.Dentro && ProximoPonto.DistanciaAtual > DistanciaManobraEntreRuas)
|
if (!CorredorAtual.Dentro && ProximoPonto.DistanciaAtual > DistanciaManobraEntreRuas)
|
||||||
|
|
@ -506,18 +509,20 @@ namespace AgroBase.Models
|
||||||
public string TempoEstimadoRestante { get; private set; }
|
public string TempoEstimadoRestante { get; private set; }
|
||||||
public void AtualizarTempoEstimado(double? velocidadeSemErvasMs = null, double? velocidadeComErvasMs = null)
|
public void AtualizarTempoEstimado(double? velocidadeSemErvasMs = null, double? velocidadeComErvasMs = null)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (!velocidadeSemErvasMs.HasValue)
|
if (!velocidadeSemErvasMs.HasValue)
|
||||||
{
|
{
|
||||||
velocidadeSemErvasMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeSErvasPercent) * 0.8;
|
velocidadeSemErvasMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(op.Parametros.Controle.MovVelocidadeSErvasPercent) * 0.8;
|
||||||
}
|
}
|
||||||
if (!velocidadeComErvasMs.HasValue)
|
if (!velocidadeComErvasMs.HasValue)
|
||||||
{
|
{
|
||||||
velocidadeComErvasMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent);
|
velocidadeComErvasMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(op.Parametros.Controle.MovVelocidadeCErvasPercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Supondo que metade do percurso tem ervas e a outra metade não tem
|
// Supondo que metade do percurso tem ervas e a outra metade não tem
|
||||||
double distanciaComErvas = DistanciaTotal * VariaveisOperacao.PercentualComErvas;
|
double distanciaComErvas = DistanciaTotal * op.Sensoriamento.Atuador.PercentualErvasTerreno;
|
||||||
double distanciaSemErvas = DistanciaTotal * VariaveisOperacao.PercentualSemErvas;
|
double distanciaSemErvas = DistanciaTotal * (100 - op.Sensoriamento.Atuador.PercentualErvasTerreno);
|
||||||
|
|
||||||
// Tempo em segundos para cada parte do percurso
|
// Tempo em segundos para cada parte do percurso
|
||||||
double tempoSemErvas = velocidadeSemErvasMs.Value > 0 ? distanciaSemErvas / velocidadeSemErvasMs.Value : 0;
|
double tempoSemErvas = velocidadeSemErvasMs.Value > 0 ? distanciaSemErvas / velocidadeSemErvasMs.Value : 0;
|
||||||
|
|
@ -536,8 +541,8 @@ namespace AgroBase.Models
|
||||||
double distanciaRestante = DistanciaRestante;
|
double distanciaRestante = DistanciaRestante;
|
||||||
|
|
||||||
// Calcular a distância restante sem ervas e com ervas
|
// Calcular a distância restante sem ervas e com ervas
|
||||||
double distanciaSemErvasRestante = distanciaRestante * VariaveisOperacao.PercentualSemErvas;
|
double distanciaSemErvasRestante = distanciaRestante * (100 - op.Sensoriamento.Atuador.PercentualErvasTerreno);
|
||||||
double distanciaComErvasRestante = distanciaRestante * VariaveisOperacao.PercentualComErvas;
|
double distanciaComErvasRestante = distanciaRestante * op.Sensoriamento.Atuador.PercentualErvasTerreno;
|
||||||
|
|
||||||
// Calcular o tempo restante para as áreas sem ervas e com ervas
|
// Calcular o tempo restante para as áreas sem ervas e com ervas
|
||||||
double tempoRestanteSemErvas = distanciaSemErvasRestante / velocidadeSemErvasMs.Value;
|
double tempoRestanteSemErvas = distanciaSemErvasRestante / velocidadeSemErvasMs.Value;
|
||||||
|
|
@ -563,12 +568,12 @@ namespace AgroBase.Models
|
||||||
if (CorredorAtual.Idx > 0) return;
|
if (CorredorAtual.Idx > 0) return;
|
||||||
if (!CorredorAtual.Dentro) return;
|
if (!CorredorAtual.Dentro) return;
|
||||||
|
|
||||||
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.Clone();
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (PrimeiroPontoDentroMapa == null) PrimeiroPontoDentroMapa = posicaoAtual;
|
if (PrimeiroPontoDentroMapa == null) PrimeiroPontoDentroMapa = GPSPosicaoAtual;
|
||||||
|
|
||||||
var OpVisual = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel();
|
var OpVisual = op.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel();
|
||||||
StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado;
|
StatusModulo OpVisualStatus = op.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado;
|
||||||
|
|
||||||
if (OpVisualStatus != StatusModulo.Operante) return;
|
if (OpVisualStatus != StatusModulo.Operante) return;
|
||||||
|
|
||||||
|
|
@ -576,7 +581,7 @@ namespace AgroBase.Models
|
||||||
bool CanaNoRadar = new List<StatusCarroMapa>() { StatusCarroMapa.EntrandoRua, StatusCarroMapa.CaminhandoRua, StatusCarroMapa.SaindoRua }.Contains(DadosSegmentacao.status_corredor);
|
bool CanaNoRadar = new List<StatusCarroMapa>() { StatusCarroMapa.EntrandoRua, StatusCarroMapa.CaminhandoRua, StatusCarroMapa.SaindoRua }.Contains(DadosSegmentacao.status_corredor);
|
||||||
if (!CanaNoRadar) return;
|
if (!CanaNoRadar) return;
|
||||||
|
|
||||||
PrimeiroPontoDentroCana = posicaoAtual;
|
PrimeiroPontoDentroCana = GPSPosicaoAtual;
|
||||||
|
|
||||||
DistanciaErroMapaPlantacao = GPSUtils.DistanciaEntrePontos(PrimeiroPontoDentroMapa, PrimeiroPontoDentroCana);
|
DistanciaErroMapaPlantacao = GPSUtils.DistanciaEntrePontos(PrimeiroPontoDentroMapa, PrimeiroPontoDentroCana);
|
||||||
}
|
}
|
||||||
|
|
@ -600,7 +605,9 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
private void AtualizarErroCombinado()
|
private void AtualizarErroCombinado()
|
||||||
{
|
{
|
||||||
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
var _Sensoriamento = op.Sensoriamento;
|
||||||
|
|
||||||
//double anguloCamera = _Sensoriamento.OperadorVisual.Leitura.obj?.segmentacao?.angulo_rua ?? 0;
|
//double anguloCamera = _Sensoriamento.OperadorVisual.Leitura.obj?.segmentacao?.angulo_rua ?? 0;
|
||||||
double anguloCorredor = AnguloMedioCorredor;
|
double anguloCorredor = AnguloMedioCorredor;
|
||||||
|
|
@ -617,7 +624,7 @@ namespace AgroBase.Models
|
||||||
double curvaDaRua = GPSUtils.CalcularDiferencaAngulo(anguloProximoPonto, anguloCorredor);
|
double curvaDaRua = GPSUtils.CalcularDiferencaAngulo(anguloProximoPonto, anguloCorredor);
|
||||||
|
|
||||||
// Peso do desalinhamento atual (prioriza alinhar o robô ao corredor)
|
// Peso do desalinhamento atual (prioriza alinhar o robô ao corredor)
|
||||||
double pesoAlinhamento = Math.Min(Math.Abs(desalinhamentoComRua) / Variaveis.OperacaoEmAndamento.Parametros.Controle.DirAnguloMaximo, 1.0); // Normaliza até 30°
|
double pesoAlinhamento = Math.Min(Math.Abs(desalinhamentoComRua) / op.Parametros.Controle.DirAnguloMaximo, 1.0); // Normaliza até 30°
|
||||||
|
|
||||||
// Peso do centro (prioriza ir pro ponto central do corredor)
|
// Peso do centro (prioriza ir pro ponto central do corredor)
|
||||||
double pesoCentro = 1.0 - pesoAlinhamento;
|
double pesoCentro = 1.0 - pesoAlinhamento;
|
||||||
|
|
@ -756,7 +763,7 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
private bool VerificaInicioOperacaoMeioRua(bool considerarStatus)
|
private bool VerificaInicioOperacaoMeioRua(bool considerarStatus)
|
||||||
{
|
{
|
||||||
if (_TrajetoriaFixaDefinida && !VerificacaoInicialMeioRuaConcluida && ((considerarStatus && new List<StatusOperacao>() { StatusOperacao.Aguardando, StatusOperacao.EmAndamento }.Contains(Variaveis.OperacaoEmAndamento.StatusAtual)) || !considerarStatus))
|
if (_TrajetoriaFixaDefinida && !VerificacaoInicialMeioRuaConcluida && ((considerarStatus && new List<StatusOperacao>() { StatusOperacao.Aguardando, StatusOperacao.EmAndamento }.Contains(Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.StatusOperacaoAtual)) || !considerarStatus))
|
||||||
{
|
{
|
||||||
VerificacaoInicialMeioRuaConcluida = true;
|
VerificacaoInicialMeioRuaConcluida = true;
|
||||||
(bool noCoredor, var idxPontoMaisProximo) = VerificaEquipamentoDentroCorredorMontado(_TrajetoriaFixa[0].Posicao);
|
(bool noCoredor, var idxPontoMaisProximo) = VerificaEquipamentoDentroCorredorMontado(_TrajetoriaFixa[0].Posicao);
|
||||||
|
|
@ -779,22 +786,23 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
private void VerificaFimCorredorSegmentacao()
|
private void VerificaFimCorredorSegmentacao()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
// Limiar de "margem" para considerar proximidade do fim
|
// Limiar de "margem" para considerar proximidade do fim
|
||||||
//double limiarDistanciaMargem = DistanciaErroMapaPlantacao > -1 ? DistanciaErroMapaPlantacao : 10.0;
|
//double limiarDistanciaMargem = DistanciaErroMapaPlantacao > -1 ? DistanciaErroMapaPlantacao : 10.0;
|
||||||
double limiarDistanciaMargem = Variaveis.OperacaoEmAndamento.Parametros?.Controle?.AnteciparManobraCorredorM ?? 0;
|
double limiarDistanciaMargem = op.Parametros?.Controle?.AnteciparManobraCorredorM ?? 0;
|
||||||
if (limiarDistanciaMargem <= 0) return;
|
if (limiarDistanciaMargem <= 0) return;
|
||||||
|
|
||||||
if (CorredorAtual == null) return;
|
if (CorredorAtual == null) return;
|
||||||
if (CorredorAtual.DadosVisuais.JaAntecipado) return;
|
if (CorredorAtual.DadosVisuais.JaAntecipado) return;
|
||||||
|
|
||||||
bool modoSimulador = false && Variaveis.OperacaoEmAndamento.Simulando;
|
bool modoSimulador = false && op.Simulando;
|
||||||
|
|
||||||
double distanciaCorredor = CorredorAtual.DistanciaTotal;
|
double distanciaCorredor = CorredorAtual.DistanciaTotal;
|
||||||
double distanciaRestanteCorredor = CorredorAtual.DistanciaRestante;
|
double distanciaRestanteCorredor = CorredorAtual.DistanciaRestante;
|
||||||
double distanciaUltimoPontoCorredor = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual.Pontos.LastOrDefault().Posicao);
|
double distanciaUltimoPontoCorredor = GPSUtils.DistanciaEntrePontos(GPSPosicaoAtual, CorredorAtual.Pontos.LastOrDefault().Posicao);
|
||||||
|
|
||||||
var opVisual = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel();
|
var opVisual = op.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel();
|
||||||
StatusModulo opVisualStatus = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado;
|
StatusModulo opVisualStatus = op.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado;
|
||||||
var dadosSegmentacao = opVisual.Analises?.segmentacao ?? new VisualWorkerMessageSegmentacaoSemanticaModel();
|
var dadosSegmentacao = opVisual.Analises?.segmentacao ?? new VisualWorkerMessageSegmentacaoSemanticaModel();
|
||||||
|
|
||||||
// Se não tem visual operante, não está no modoSimulador ou o corredor eh curto demais, não faz nada
|
// Se não tem visual operante, não está no modoSimulador ou o corredor eh curto demais, não faz nada
|
||||||
|
|
@ -919,12 +927,12 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
// acha o ponto mais próximo do corredor seguinte
|
// acha o ponto mais próximo do corredor seguinte
|
||||||
var pc = _Corredores[CorredorAtual.Idx + 1];
|
var pc = _Corredores[CorredorAtual.Idx + 1];
|
||||||
(GPSModel pp, double distanciaAtual) = GPSUtils.CalcularPontoMaisProximoTrajetoria(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, pc.Pontos.Select(x => x.Posicao).ToList());
|
(GPSModel pp, double distanciaAtual) = GPSUtils.CalcularPontoMaisProximoTrajetoria(GPSPosicaoAtual, pc.Pontos.Select(x => x.Posicao).ToList());
|
||||||
var _pp = pc.Pontos.FirstOrDefault(x => Math.Abs(x.Posicao.Latitude - pp.Latitude) < 1e-8 && Math.Abs(x.Posicao.Longitude - pp.Longitude) < 1e-8);
|
var _pp = pc.Pontos.FirstOrDefault(x => Math.Abs(x.Posicao.Latitude - pp.Latitude) < 1e-8 && Math.Abs(x.Posicao.Longitude - pp.Longitude) < 1e-8);
|
||||||
|
|
||||||
double anguloControle = CorredorAtual.idxRuaDireita > CorredorAtual.idxRuaEsquerda ? -AnguloAberturaCurva : AnguloAberturaCurva;
|
double anguloControle = CorredorAtual.idxRuaDireita > CorredorAtual.idxRuaEsquerda ? -AnguloAberturaCurva : AnguloAberturaCurva;
|
||||||
double anguloDesvio = PontoAtual.Orientacao + anguloControle;
|
double anguloDesvio = PontoAtual.Orientacao + anguloControle;
|
||||||
double fd = FuncoesMatematicas.Map(Variaveis.OperacaoEmAndamento.Sensoriamento.Controle.PercentualVelocidadeSP, 10, 100, 0.7, 2.5);
|
double fd = FuncoesMatematicas.Map(op.Controle.PercentualVelocidadeSP, 10, 100, 0.7, 2.5);
|
||||||
|
|
||||||
var pontoDesvio = GPSUtils.GerarPontoDeslocado(pls.Posicao, anguloDesvio, DistanciaProjecaoRua * fd);
|
var pontoDesvio = GPSUtils.GerarPontoDeslocado(pls.Posicao, anguloDesvio, DistanciaProjecaoRua * fd);
|
||||||
|
|
||||||
|
|
@ -968,7 +976,7 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
ReindexarTrajetoriaFixa();
|
ReindexarTrajetoriaFixa();
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados();
|
op.Sensoriamento.AtualizarDados();
|
||||||
HealthWorkerService.AtualizarDadosOperacao(true);
|
HealthWorkerService.AtualizarDadosOperacao(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -986,14 +994,16 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
public void LoopAtualizaDados()
|
public void LoopAtualizaDados()
|
||||||
{
|
{
|
||||||
if (!(Variaveis.OperacaoEmAndamento.Parametros?.ControleAutomatico ?? false))
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
if (!(op.Parametros?.ControleAutomatico ?? false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
AtualizarPropriedadesPontosTrajetoria();
|
AtualizarPropriedadesPontosTrajetoria();
|
||||||
|
|
||||||
AtualizarDadosTrajetoria();
|
AtualizarDadosTrajetoria();
|
||||||
|
|
||||||
//Variaveis.OperacaoEmAndamento.AtualizaInformacoesControleOperacao();
|
//op.AtualizaInformacoesControleOperacao();
|
||||||
|
|
||||||
//RedisService.Publish(CmdKey.ManagerWorkerRx, JsonConvert.SerializeObject(new { cmd = ManagerWorkerCommandType.AtualizarDadosControle }));
|
//RedisService.Publish(CmdKey.ManagerWorkerRx, JsonConvert.SerializeObject(new { cmd = ManagerWorkerCommandType.AtualizarDadosControle }));
|
||||||
|
|
||||||
|
|
@ -1002,7 +1012,9 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
private void AtualizarDadosControleRedis()
|
private void AtualizarDadosControleRedis()
|
||||||
{
|
{
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado)
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
if (!op.Sensoriamento.Operacao.OperacaoIniciada)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int min_ticks_sem_resposta = 500;
|
int min_ticks_sem_resposta = 500;
|
||||||
|
|
@ -1027,7 +1039,7 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
DateTime agora = DateTime.Now;
|
DateTime agora = DateTime.Now;
|
||||||
|
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var _Controle = op.Controle;
|
||||||
|
|
||||||
bool heartbeatMudou =
|
bool heartbeatMudou =
|
||||||
novoComando != null &&
|
novoComando != null &&
|
||||||
|
|
@ -1083,9 +1095,9 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
if (_Controle.ticks_sem_resposta.AddMilliseconds(max_ticks_sem_resposta) < agora)
|
if (_Controle.ticks_sem_resposta.AddMilliseconds(max_ticks_sem_resposta) < agora)
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento?.Sensoriamento?.Controle?.RPM_SP > 0)
|
if (op.Controle?.RPM_SP > 0)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento?.InserirLog(T_Code.Npc, StatusModulo.Falha, 0, "Muito tempo sem receber novo comando do Manager Worker! Parando Movimento!");
|
op.Sensoriamento?.InserirLog(T_Code.Npc, StatusModulo.Falha, 0, "Muito tempo sem receber novo comando do Manager Worker! Parando Movimento!");
|
||||||
Variaveis.MostrarLog("Muito tempo sem receber novo comando do Manager Worker! Parando Movimento!");
|
Variaveis.MostrarLog("Muito tempo sem receber novo comando do Manager Worker! Parando Movimento!");
|
||||||
RedisService.AtualizarCampos(
|
RedisService.AtualizarCampos(
|
||||||
CtxKey.DadosControle,
|
CtxKey.DadosControle,
|
||||||
|
|
@ -1095,13 +1107,13 @@ namespace AgroBase.Models
|
||||||
}
|
}
|
||||||
else if (_Controle.ticks_sem_resposta.AddMilliseconds(min_ticks_sem_resposta) < agora)
|
else if (_Controle.ticks_sem_resposta.AddMilliseconds(min_ticks_sem_resposta) < agora)
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento?.Sensoriamento?.Controle?.RPM_SP > Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent)
|
if (op.Controle?.RPM_SP > op.Parametros.Controle.MovVelocidadeCErvasPercent)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento?.InserirLog(T_Code.Npc, StatusModulo.Alerta, 80, "Muito tempo sem receber novo comando do Manager Worker! Reduzindo Velocidade!");
|
op.Sensoriamento?.InserirLog(T_Code.Npc, StatusModulo.Alerta, 80, "Muito tempo sem receber novo comando do Manager Worker! Reduzindo Velocidade!");
|
||||||
Variaveis.MostrarLog("Muito tempo sem receber novo comando do Manager Worker! Reduzindo Velocidade!");
|
Variaveis.MostrarLog("Muito tempo sem receber novo comando do Manager Worker! Reduzindo Velocidade!");
|
||||||
RedisService.AtualizarCampos(
|
RedisService.AtualizarCampos(
|
||||||
CtxKey.DadosControle,
|
CtxKey.DadosControle,
|
||||||
("velocidade_sp", Variaveis.OperacaoEmAndamento.Parametros.Controle.MovVelocidadeCErvasPercent)
|
("velocidade_sp", op.Parametros.Controle.MovVelocidadeCErvasPercent)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1348,7 +1360,7 @@ namespace AgroBase.Models
|
||||||
idxCorredor = 0,
|
idxCorredor = 0,
|
||||||
idxPonto = 0,
|
idxPonto = 0,
|
||||||
idxPontoCorredor = 0,
|
idxPontoCorredor = 0,
|
||||||
Posicao = posicaoRobo ?? Variaveis.OperacaoEmAndamento.Sensoriamento.Gps,
|
Posicao = posicaoRobo ?? GPSPosicaoAtual,
|
||||||
Orientacao = 0,
|
Orientacao = 0,
|
||||||
Direcao = direcaoAtual,
|
Direcao = direcaoAtual,
|
||||||
Visitado = true,
|
Visitado = true,
|
||||||
|
|
@ -1657,15 +1669,13 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
public void AjustarTrajetoriaParaDesvio(Obstaculo obstaculo)
|
public void AjustarTrajetoriaParaDesvio(Obstaculo obstaculo)
|
||||||
{
|
{
|
||||||
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
|
|
||||||
|
|
||||||
double distanciaObstaculo = ((double)obstaculo.DistanciaMedia_mm / 1000);
|
double distanciaObstaculo = ((double)obstaculo.DistanciaMedia_mm / 1000);
|
||||||
double larguraObstaculo = ((double)obstaculo.Largura_mm / 1000);
|
double larguraObstaculo = ((double)obstaculo.Largura_mm / 1000);
|
||||||
double anguloCaminho = AnguloCaminho;
|
double anguloCaminho = AnguloCaminho;
|
||||||
double anguloDesvioInicial = anguloCaminho + obstaculo.AnguloParaDesvio;
|
double anguloDesvioInicial = anguloCaminho + obstaculo.AnguloParaDesvio;
|
||||||
double anguloDesvioFinal = anguloCaminho - obstaculo.AnguloParaDesvio;
|
double anguloDesvioFinal = anguloCaminho - obstaculo.AnguloParaDesvio;
|
||||||
|
|
||||||
GPSModel ponto1 = GPSUtils.GerarPontoDeslocado(posicaoAtual, anguloDesvioInicial, distanciaObstaculo);
|
GPSModel ponto1 = GPSUtils.GerarPontoDeslocado(GPSPosicaoAtual, anguloDesvioInicial, distanciaObstaculo);
|
||||||
GPSModel ponto2 = GPSUtils.GerarPontoDeslocado(ponto1, anguloCaminho, larguraObstaculo);
|
GPSModel ponto2 = GPSUtils.GerarPontoDeslocado(ponto1, anguloCaminho, larguraObstaculo);
|
||||||
GPSModel ponto3 = GPSUtils.GerarPontoDeslocado(ponto2, anguloDesvioFinal, distanciaObstaculo);
|
GPSModel ponto3 = GPSUtils.GerarPontoDeslocado(ponto2, anguloDesvioFinal, distanciaObstaculo);
|
||||||
List<PontoTrajetoriaModel> lista = new List<PontoTrajetoriaModel>()
|
List<PontoTrajetoriaModel> lista = new List<PontoTrajetoriaModel>()
|
||||||
|
|
@ -1789,7 +1799,7 @@ namespace AgroBase.Models
|
||||||
idxCorredor = 0,
|
idxCorredor = 0,
|
||||||
idxPonto = 0,
|
idxPonto = 0,
|
||||||
idxPontoCorredor = 0,
|
idxPontoCorredor = 0,
|
||||||
Posicao = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps,
|
Posicao = GPSPosicaoAtual,
|
||||||
Visitado = true,
|
Visitado = true,
|
||||||
LarguraCorredor = 1.0
|
LarguraCorredor = 1.0
|
||||||
});
|
});
|
||||||
|
|
@ -1829,6 +1839,8 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
private void AtualizarDadosOperacaoParaRetorno()
|
private void AtualizarDadosOperacaoParaRetorno()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
AutonomiaCorredor.Parar();
|
AutonomiaCorredor.Parar();
|
||||||
|
|
||||||
AtualizarDadosTrajetoria();
|
AtualizarDadosTrajetoria();
|
||||||
|
|
@ -1836,12 +1848,12 @@ namespace AgroBase.Models
|
||||||
LoopAtualizaDados();
|
LoopAtualizaDados();
|
||||||
|
|
||||||
var _p = OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.RetornoBase, false);
|
var _p = OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.RetornoBase, false);
|
||||||
Variaveis.OperacaoEmAndamento.Parametros = _p;
|
op.Parametros = _p;
|
||||||
|
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado)
|
if (!op.Sensoriamento.Operacao.OperacaoIniciada)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Iniciado = true;
|
op.Sensoriamento.Operacao.OperacaoIniciada = true;
|
||||||
Variaveis.OperacaoEmAndamento.Simulando = !GPSService.Iniciado;
|
op.Simulando = !GPSService.Iniciado;
|
||||||
}
|
}
|
||||||
|
|
||||||
RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false));
|
RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false));
|
||||||
|
|
@ -1851,7 +1863,7 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
var pontos = new List<GPSModel>();
|
var pontos = new List<GPSModel>();
|
||||||
|
|
||||||
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;
|
GPSModel posicaoAtual = GPSPosicaoAtual;
|
||||||
|
|
||||||
double distancia = GPSUtils.DistanciaEntrePontos(posicaoAtual, baseGps);
|
double distancia = GPSUtils.DistanciaEntrePontos(posicaoAtual, baseGps);
|
||||||
if (distancia < 5)
|
if (distancia < 5)
|
||||||
|
|
@ -2642,20 +2654,22 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
private void AtualizarDistanciaTrajeto()
|
private void AtualizarDistanciaTrajeto()
|
||||||
{
|
{
|
||||||
if (!Variaveis.OperacaoEmAndamento.Trajetoria._TrajetoriaFixaDefinida)
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
|
if (!op.Trajetoria._TrajetoriaFixaDefinida)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pontoAtual = Variaveis.OperacaoEmAndamento.Trajetoria.PontoAtual;
|
var pontoAtual = op.Trajetoria.PontoAtual;
|
||||||
int idxPontoAtual = pontoAtual.idxPonto + 1;
|
int idxPontoAtual = pontoAtual.idxPonto + 1;
|
||||||
int qtdPontos = Math.Abs(idxPonto - idxPontoAtual) + 1; // Sempre positivo
|
int qtdPontos = Math.Abs(idxPonto - idxPontoAtual) + 1; // Sempre positivo
|
||||||
|
|
||||||
if (qtdPontos == 1)
|
if (qtdPontos == 1)
|
||||||
{
|
{
|
||||||
//DistanciaTrajeto = pontoAtual.Aproximando ? pontoAtual.DistanciaAtual : -pontoAtual.DistanciaAtual;
|
//DistanciaTrajeto = pontoAtual.Aproximando ? pontoAtual.DistanciaAtual : -pontoAtual.DistanciaAtual;
|
||||||
//DistanciaTrajeto = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Trajetoria._TrajetoriaDinamica.First().Posicao, Posicao);
|
//DistanciaTrajeto = GPSUtils.DistanciaEntrePontos(op.Trajetoria._TrajetoriaDinamica.First().Posicao, Posicao);
|
||||||
DistanciaTrajeto = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Trajetoria._TrajetoriaFixa.Where(x => !x.Visitado).First().Posicao, Posicao);
|
DistanciaTrajeto = GPSUtils.DistanciaEntrePontos(op.Trajetoria._TrajetoriaFixa.Where(x => !x.Visitado).First().Posicao, Posicao);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2664,7 +2678,7 @@ namespace AgroBase.Models
|
||||||
int idxFim = Math.Max(idxPontoAtual, idxPonto);
|
int idxFim = Math.Max(idxPontoAtual, idxPonto);
|
||||||
|
|
||||||
// ✅ Pega os pontos corretos, independentemente de direção
|
// ✅ Pega os pontos corretos, independentemente de direção
|
||||||
List<GPSModel> trecho = Variaveis.OperacaoEmAndamento.Trajetoria._TrajetoriaFixa
|
List<GPSModel> trecho = op.Trajetoria._TrajetoriaFixa
|
||||||
.Skip(idxInicio)
|
.Skip(idxInicio)
|
||||||
.Take(qtdPontos)
|
.Take(qtdPontos)
|
||||||
.ToList()
|
.ToList()
|
||||||
|
|
@ -2829,8 +2843,10 @@ namespace AgroBase.Models
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
// Valida índice do corredor
|
// Valida índice do corredor
|
||||||
if (Variaveis.OperacaoEmAndamento.Trajetoria?._Corredores?.Count <= idxCorredor)
|
if (op.Trajetoria?._Corredores?.Count <= idxCorredor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Se já registrou esse corredor como liberado e travado/feito, não recalcula
|
// Se já registrou esse corredor como liberado e travado/feito, não recalcula
|
||||||
|
|
@ -2844,10 +2860,10 @@ namespace AgroBase.Models
|
||||||
bool solicitouLiberacaoHumana = bateria_liberada || reservatorio_liberado;
|
bool solicitouLiberacaoHumana = bateria_liberada || reservatorio_liberado;
|
||||||
|
|
||||||
// Carrega distâncias e contadores
|
// Carrega distâncias e contadores
|
||||||
double distanciaCorredor = Variaveis.OperacaoEmAndamento.Trajetoria._Corredores[idxCorredor]?.DistanciaTotal ?? 0;
|
double distanciaCorredor = op.Trajetoria._Corredores[idxCorredor]?.DistanciaTotal ?? 0;
|
||||||
|
|
||||||
var _Bateria = Variaveis.OperacaoEmAndamento.DispSen?.Dados?.ContadorCarga;
|
var _Bateria = op.DispSen?.Dados?.ContadorCarga;
|
||||||
var _Reservatorio = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga;
|
var _Reservatorio = op.DispAtu?.Dados?.ContadorCarga;
|
||||||
|
|
||||||
DistanciaCorredor_m = distanciaCorredor;
|
DistanciaCorredor_m = distanciaCorredor;
|
||||||
DistanciaSeguraBateria_m = _Bateria?.DistanciaEstimadaRestante_m ?? 0;
|
DistanciaSeguraBateria_m = _Bateria?.DistanciaEstimadaRestante_m ?? 0;
|
||||||
|
|
@ -2857,7 +2873,7 @@ namespace AgroBase.Models
|
||||||
bool herbOk = HerbicidaSuficiente && (_Reservatorio?.Iniciado ?? false);
|
bool herbOk = HerbicidaSuficiente && (_Reservatorio?.Iniciado ?? false);
|
||||||
|
|
||||||
bool exigirPulverizacaoTotal =
|
bool exigirPulverizacaoTotal =
|
||||||
Variaveis.OperacaoEmAndamento.Parametros?.ModulosMandatorios?.Any(x => x.Dispositivo == T_Code.Atu && x.Mandatorio && x.Utilizar) ?? false;
|
op.Parametros?.ModulosMandatorios?.Any(x => x.Dispositivo == T_Code.Atu && x.Mandatorio && x.Utilizar) ?? false;
|
||||||
|
|
||||||
// ==========================
|
// ==========================
|
||||||
// 1) Calcula status "base" (sem considerar trava)
|
// 1) Calcula status "base" (sem considerar trava)
|
||||||
|
|
@ -3037,7 +3053,7 @@ namespace AgroBase.Models
|
||||||
if (CorredoresLiberados[idxCorredor].Liberado == false && liberadoFinal)
|
if (CorredoresLiberados[idxCorredor].Liberado == false && liberadoFinal)
|
||||||
{
|
{
|
||||||
CorredoresLiberados[idxCorredor] = res;
|
CorredoresLiberados[idxCorredor] = res;
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Trj, liberadoFinal ? StatusModulo.Operante : StatusModulo.Alerta, liberadoFinal ? 100 : 0, $"Corredor {idxCorredor + 1} liberado pelo operador");
|
op.Sensoriamento.InserirLog(T_Code.Trj, liberadoFinal ? StatusModulo.Operante : StatusModulo.Alerta, liberadoFinal ? 100 : 0, $"Corredor {idxCorredor + 1} liberado pelo operador");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -3048,7 +3064,7 @@ namespace AgroBase.Models
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CorredoresLiberados.Add(idxCorredor, res);
|
CorredoresLiberados.Add(idxCorredor, res);
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Trj, liberadoFinal ? StatusModulo.Operante : StatusModulo.Alerta, liberadoFinal ? 100 : 0, $"{motivoFinal}");
|
op.Sensoriamento.InserirLog(T_Code.Trj, liberadoFinal ? StatusModulo.Operante : StatusModulo.Alerta, liberadoFinal ? 100 : 0, $"{motivoFinal}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Atualiza estado exposto
|
// Atualiza estado exposto
|
||||||
|
|
|
||||||
|
|
@ -91,20 +91,20 @@ namespace AgroBase.Models
|
||||||
private static readonly SemaphoreSlim _mqttLifecycleLock = new SemaphoreSlim(1, 1);
|
private static readonly SemaphoreSlim _mqttLifecycleLock = new SemaphoreSlim(1, 1);
|
||||||
private static AsyncTaskTimerModel _tmrMqttLinkMonitor;
|
private static AsyncTaskTimerModel _tmrMqttLinkMonitor;
|
||||||
private static int _mqttCriticalConnectedState = -1;
|
private static int _mqttCriticalConnectedState = -1;
|
||||||
public static LoRaEspService LoraService
|
//public static LoRaEspService LoraService
|
||||||
{
|
//{
|
||||||
get
|
// get
|
||||||
{
|
// {
|
||||||
return OperacaoEmAndamento.DispSen?.Dados?.loRaService;
|
// return OperacaoEmAndamento.DispSen?.Dados?.loRaService;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
public static LoRaParametrosModel LoraBaseParametros
|
//public static LoRaParametrosModel LoraBaseParametros
|
||||||
{
|
//{
|
||||||
get
|
// get
|
||||||
{
|
// {
|
||||||
return OperacaoEmAndamento.DispSen?.Dados?.LoRaParametrosBase;
|
// return OperacaoEmAndamento.DispSen?.Dados?.LoRaParametrosBase;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
public static string FaixaIPwifi { get; set; } = "192.168.100";
|
public static string FaixaIPwifi { get; set; } = "192.168.100";
|
||||||
public static string FaixaIPethernet { get; set; } = "192.168.105";
|
public static string FaixaIPethernet { get; set; } = "192.168.105";
|
||||||
public static string IP_Host { get; set; } = FaixaIPwifi + ".105";
|
public static string IP_Host { get; set; } = FaixaIPwifi + ".105";
|
||||||
|
|
@ -688,7 +688,7 @@ namespace AgroBase.Models
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.ExecutaComandoDaBase(controle);
|
OperacaoEmAndamento?.ExecutaComandoDaBase(controle);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== FAILSAFE: só considera comando de controle válido (não heartbeat) =====
|
// ===== FAILSAFE: só considera comando de controle válido (não heartbeat) =====
|
||||||
|
|
@ -1263,28 +1263,6 @@ namespace AgroBase.Models
|
||||||
public static class VariaveisOperacao
|
public static class VariaveisOperacao
|
||||||
{
|
{
|
||||||
public static double TempoManobra { get; set; } = 10;
|
public static double TempoManobra { get; set; } = 10;
|
||||||
public static double PercentualComErvas
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (!Variaveis.IsAgroMonitor && Variaveis.OperacaoEmAndamento.DispAtu != null)
|
|
||||||
{
|
|
||||||
return (Variaveis.OperacaoEmAndamento.Sensoriamento.Atuador?.PercentualErvasTerreno ?? 0) / 100.0;
|
|
||||||
}
|
|
||||||
return 0.3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static double PercentualSemErvas
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (!Variaveis.IsAgroMonitor && Variaveis.OperacaoEmAndamento.DispAtu != null)
|
|
||||||
{
|
|
||||||
return (100.0 - (Variaveis.OperacaoEmAndamento.Sensoriamento.Atuador?.PercentualErvasTerreno ?? 0)) / 100.0;
|
|
||||||
}
|
|
||||||
return 0.7;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private static readonly object _posicaoBaseLock = new object();
|
private static readonly object _posicaoBaseLock = new object();
|
||||||
private static GPSModel _posicaoBase = new GPSModel();
|
private static GPSModel _posicaoBase = new GPSModel();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ namespace AgroBase.Services
|
||||||
Texto = "Calibrando módulos. Mantenha distância.";
|
Texto = "Calibrando módulos. Mantenha distância.";
|
||||||
break;
|
break;
|
||||||
case StatusOperacao.Aguardando:
|
case StatusOperacao.Aguardando:
|
||||||
Texto = $"Atenção: início em {SegundosFmt(Variaveis.OperacaoEmAndamento.TempoAguardandoSegs)}.";
|
Texto = $"Atenção: início em {SegundosFmt(Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.TempoAguardandoSeg)}.";
|
||||||
break;
|
break;
|
||||||
case StatusOperacao.EmAndamento:
|
case StatusOperacao.EmAndamento:
|
||||||
Texto = "Operação em andamento.";
|
Texto = "Operação em andamento.";
|
||||||
|
|
@ -100,7 +100,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
string TextoParado()
|
string TextoParado()
|
||||||
{
|
{
|
||||||
string motivo = Variaveis.OperacaoEmAndamento?.ErroOperacaoLiberada;
|
string motivo = Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.ErroOperacaoLiberada;
|
||||||
motivo = string.IsNullOrWhiteSpace(motivo) ? "motivo não informado" : motivo;
|
motivo = string.IsNullOrWhiteSpace(motivo) ? "motivo não informado" : motivo;
|
||||||
return $"Operação interrompida: {motivo}. Intervenção necessária.";
|
return $"Operação interrompida: {motivo}. Intervenção necessária.";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1150,7 +1150,7 @@ namespace AgroBase.Services
|
||||||
UltimoErroCriticoMotivo = motivo;
|
UltimoErroCriticoMotivo = motivo;
|
||||||
|
|
||||||
MostrarLog($"Erro crítico: {motivo}");
|
MostrarLog($"Erro crítico: {motivo}");
|
||||||
var saude = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Can);
|
var saude = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Can);
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Can, saude?.status ?? StatusModulo.Desconectado, saude?.saude ?? 0, $"Erro crítico: {motivo}");
|
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Can, saude?.status ?? StatusModulo.Desconectado, saude?.saude ?? 0, $"Erro crítico: {motivo}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -855,7 +855,7 @@ namespace AgroBase.Services
|
||||||
UltimoErroCriticoMotivo = motivo;
|
UltimoErroCriticoMotivo = motivo;
|
||||||
|
|
||||||
MostrarLog($"Erro crítico: {motivo}");
|
MostrarLog($"Erro crítico: {motivo}");
|
||||||
var saude = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Can);
|
var saude = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Can);
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Can, saude?.status ?? StatusModulo.Desconectado, saude?.saude ?? 0, $"Erro crítico: {motivo}");
|
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Can, saude?.status ?? StatusModulo.Desconectado, saude?.saude ?? 0, $"Erro crítico: {motivo}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,115 +0,0 @@
|
||||||
using AForge.Video.DirectShow;
|
|
||||||
using AgroBase.Models;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Management;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using static MqttService;
|
|
||||||
|
|
||||||
namespace AgroBase.Services
|
|
||||||
{
|
|
||||||
public class CameraService
|
|
||||||
{
|
|
||||||
public static Dictionary<string, string> CamerasConectadas = new Dictionary<string, string>();
|
|
||||||
|
|
||||||
public Process pythonProcess;
|
|
||||||
public readonly object processLock = new object();
|
|
||||||
public DateTime? IniciadoEm = null;
|
|
||||||
public DateTime? ProntoEm = null;
|
|
||||||
public DateTime? FinalizadoEm = null;
|
|
||||||
public MqttTopicosModel _mqttTopico;
|
|
||||||
|
|
||||||
private string Endereco = "localhost";
|
|
||||||
public string ArquivoLeitura = "leitura.json";
|
|
||||||
public int cameraIndex = 0;
|
|
||||||
private double conf_threshold = 0.5;
|
|
||||||
private double nms_threshold = 0.4;
|
|
||||||
public List<string> URLcamera = new List<string>();
|
|
||||||
public bool InverterDadosLeitura = false;
|
|
||||||
|
|
||||||
|
|
||||||
public void IniciarCamera(string Script, string[] Argumentos, string FlaskPorta, List<string> FlaskUrl, string MqttTopico, Func<MqttTopicosMensagensModel, Task> mqttCallback = null)
|
|
||||||
{
|
|
||||||
Task.Run(async () =>
|
|
||||||
{
|
|
||||||
_mqttTopico = await Variaveis.MqttServiceLocal.AdicionarNovoTopico(MqttTopico, true, 2, mqttCallback);
|
|
||||||
|
|
||||||
lock (processLock)
|
|
||||||
{
|
|
||||||
pythonProcess = new Process();
|
|
||||||
pythonProcess = PythonService.RunScript(Script, Argumentos);
|
|
||||||
}
|
|
||||||
IniciadoEm = DateTime.Now;
|
|
||||||
|
|
||||||
foreach (string url in FlaskUrl)
|
|
||||||
{
|
|
||||||
string _url = "http://" + Endereco + ":" + FlaskPorta + "/" + url +
|
|
||||||
"?conf_threshold=" + conf_threshold.ToString().Replace(",", ".") +
|
|
||||||
"&nms_threshold=" + nms_threshold.ToString().Replace(",", ".") +
|
|
||||||
"&camera_index=" + cameraIndex;
|
|
||||||
URLcamera.Add(_url);
|
|
||||||
|
|
||||||
Console.WriteLine(_url);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PythonProcess_Exited(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
FinalizadoEm = DateTime.Now;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Dictionary<string, string> AtualizaListaCameras()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
CamerasConectadas.Clear();
|
|
||||||
CamerasConectadas.Add("Sem vídeo", "Sem video");
|
|
||||||
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE (PNPClass = 'Camera')")) // PNPClass = 'Image' OR PNPClass = 'Camera')
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
foreach (var device in searcher.Get())
|
|
||||||
{
|
|
||||||
string cameraDesc = i.ToString() + " - " + device["Caption"].ToString();
|
|
||||||
CamerasConectadas.Add(cameraDesc, device["DeviceID"].ToString());
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (ApplicationException)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return CamerasConectadas;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Dictionary<string, string> ObterListaCameras()
|
|
||||||
{
|
|
||||||
var cameras = new Dictionary<string, string>();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
|
|
||||||
|
|
||||||
cameras.Add("Sem vídeo", "Sem video");
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
foreach (FilterInfo device in videoDevices)
|
|
||||||
{
|
|
||||||
string cameraDesc = $"{index} - {device.Name}";
|
|
||||||
cameras.Add(cameraDesc, device.MonikerString);
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Erro ao listar câmeras: {ex.Message}");
|
|
||||||
}
|
|
||||||
|
|
||||||
return cameras;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1275,7 +1275,7 @@ namespace AgroBase.Services
|
||||||
UltimoErroCriticoMotivo = motivo;
|
UltimoErroCriticoMotivo = motivo;
|
||||||
|
|
||||||
MostrarLog($"Erro crítico: {motivo}");
|
MostrarLog($"Erro crítico: {motivo}");
|
||||||
var saude = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Can);
|
var saude = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Can);
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Can, saude?.status ?? StatusModulo.Desconectado, saude?.saude ?? 0, $"Erro crítico: {motivo}");
|
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Can, saude?.status ?? StatusModulo.Desconectado, saude?.saude ?? 0, $"Erro crítico: {motivo}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -282,7 +282,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
if (_dt <= 0 || _dt > 10)
|
if (_dt <= 0 || _dt > 10)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"[COULOMB COUNTER] dt inválido: {_dt:F3}s");
|
Variaveis.MostrarLog($"[COULOMB COUNTER] dt inválido: {_dt:F3}s");
|
||||||
AtualizarCargaAtualPeloSocOuIntegrador();
|
AtualizarCargaAtualPeloSocOuIntegrador();
|
||||||
AtualizarAutonomia(distanciaTotalMetrosAtual);
|
AtualizarAutonomia(distanciaTotalMetrosAtual);
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -11,83 +11,65 @@ namespace AgroBase.Services
|
||||||
{
|
{
|
||||||
public class DalyBMSService
|
public class DalyBMSService
|
||||||
{
|
{
|
||||||
public static DalyBmsModel DadosLeitura { get; set; } =
|
public static DalyBmsModel DadosLeitura { get; set; } = new DalyBmsModel();
|
||||||
new DalyBmsModel();
|
|
||||||
|
|
||||||
private static T_Code Dispositivo { get; set; } =
|
private static T_Code Dispositivo { get; set; } = T_Code.Bat;
|
||||||
T_Code.Bat;
|
|
||||||
|
|
||||||
public static BatHandler _BatHandler { get; set; } =
|
public static BatHandler _BatHandler { get; set; } = new BatHandler();
|
||||||
new BatHandler();
|
|
||||||
|
|
||||||
private static readonly object _sync =
|
private static readonly object _sync = new object();
|
||||||
new object();
|
|
||||||
|
|
||||||
private static readonly object _handlerLock =
|
private static readonly object _handlerLock = new object();
|
||||||
new object();
|
|
||||||
|
|
||||||
private static bool _handlersRegistrados;
|
private static bool _handlersRegistrados;
|
||||||
|
|
||||||
private static readonly TimeSpan TempoRespostaRecente =
|
private static readonly TimeSpan TempoRespostaRecente = TimeSpan.FromSeconds(12);
|
||||||
TimeSpan.FromSeconds(12);
|
|
||||||
|
|
||||||
private static readonly TimeSpan TempoRemoverMapeamento =
|
private static readonly TimeSpan TempoRemoverMapeamento = TimeSpan.FromSeconds(60);
|
||||||
TimeSpan.FromSeconds(60);
|
|
||||||
|
|
||||||
private static readonly TimeSpan IntervaloMinimoEntreRequests =
|
private static readonly TimeSpan IntervaloMinimoEntreRequests = TimeSpan.FromMilliseconds(250);
|
||||||
TimeSpan.FromMilliseconds(250);
|
|
||||||
|
|
||||||
private static readonly TimeSpan IntervaloDescoberta =
|
private static readonly TimeSpan IntervaloDescoberta = TimeSpan.FromSeconds(3);
|
||||||
TimeSpan.FromSeconds(3);
|
|
||||||
|
|
||||||
private static readonly Dictionary<BatFuncCode, TimeSpan>
|
private static readonly Dictionary<BatFuncCode, TimeSpan> IntervalosPorFuncao = new Dictionary<BatFuncCode, TimeSpan>
|
||||||
IntervalosPorFuncao =
|
{
|
||||||
new Dictionary<BatFuncCode, TimeSpan>
|
/*
|
||||||
{
|
* Polling rápido, dados realmente úteis para runtime.
|
||||||
/*
|
*/
|
||||||
* Polling rápido, dados realmente úteis para runtime.
|
{ BatFuncCode.SOC, TimeSpan.FromSeconds(1) },
|
||||||
*/
|
|
||||||
{ BatFuncCode.SOC, TimeSpan.FromSeconds(1) },
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Estado geral/MOS não precisa bater a cada ciclo.
|
* Estado geral/MOS não precisa bater a cada ciclo.
|
||||||
*/
|
*/
|
||||||
{ BatFuncCode.CargaDescargaMOS, TimeSpan.FromSeconds(3) },
|
{ BatFuncCode.CargaDescargaMOS, TimeSpan.FromSeconds(3) },
|
||||||
{ BatFuncCode.StatusInformacao, TimeSpan.FromSeconds(3) },
|
{ BatFuncCode.StatusInformacao, TimeSpan.FromSeconds(3) },
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Max/min são leves.
|
* Max/min são leves.
|
||||||
*/
|
*/
|
||||||
{ BatFuncCode.TensaoMaxMin, TimeSpan.FromSeconds(5) },
|
{ BatFuncCode.TensaoMaxMin, TimeSpan.FromSeconds(5) },
|
||||||
{ BatFuncCode.TemperaturaMaxMin, TimeSpan.FromSeconds(5) },
|
{ BatFuncCode.TemperaturaMaxMin, TimeSpan.FromSeconds(5) },
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Alarmes e balanceamento.
|
* Alarmes e balanceamento.
|
||||||
*/
|
*/
|
||||||
{ BatFuncCode.StatusFalhaBateria, TimeSpan.FromSeconds(8) },
|
{ BatFuncCode.StatusFalhaBateria, TimeSpan.FromSeconds(8) },
|
||||||
{ BatFuncCode.StatusBalanceamentoCelula, TimeSpan.FromSeconds(15) },
|
{ BatFuncCode.StatusBalanceamentoCelula, TimeSpan.FromSeconds(15) },
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dados multi-frame. Pedir devagar para não saturar o Daly.
|
* Dados multi-frame. Pedir devagar para não saturar o Daly.
|
||||||
* 0x95 pode responder até 16 frames.
|
* 0x95 pode responder até 16 frames.
|
||||||
* 0x96 pode responder até 3 frames.
|
* 0x96 pode responder até 3 frames.
|
||||||
*/
|
*/
|
||||||
{ BatFuncCode.TensaoCelula, TimeSpan.FromSeconds(20) },
|
{ BatFuncCode.TensaoCelula, TimeSpan.FromSeconds(20) },
|
||||||
{ BatFuncCode.TemperaturaCelula, TimeSpan.FromSeconds(20) },
|
{ BatFuncCode.TemperaturaCelula, TimeSpan.FromSeconds(20) },
|
||||||
};
|
};
|
||||||
|
|
||||||
private static readonly Dictionary<BatFuncCode, DateTime>
|
private static readonly Dictionary<BatFuncCode, DateTime> _ultimoPedido = Enum.GetValues(typeof(BatFuncCode)).Cast<BatFuncCode>().ToDictionary(x => x, x => DateTime.MinValue);
|
||||||
_ultimoPedido =
|
|
||||||
Enum
|
|
||||||
.GetValues(typeof(BatFuncCode))
|
|
||||||
.Cast<BatFuncCode>()
|
|
||||||
.ToDictionary(x => x, x => DateTime.MinValue);
|
|
||||||
|
|
||||||
private static DateTime _ultimaTentativaDescoberta =
|
private static DateTime _ultimaTentativaDescoberta = DateTime.MinValue;
|
||||||
DateTime.MinValue;
|
|
||||||
|
|
||||||
private static DateTime _ultimoEnvioCan =
|
private static DateTime _ultimoEnvioCan = DateTime.MinValue;
|
||||||
DateTime.MinValue;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mantém prioridade determinística.
|
* Mantém prioridade determinística.
|
||||||
|
|
@ -125,10 +107,7 @@ namespace AgroBase.Services
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return
|
return SerialService.DispositivosMapeados.Any(x => x.Dispositivo == Dispositivo);
|
||||||
SerialService
|
|
||||||
.DispositivosMapeados
|
|
||||||
.Any(x => x.Dispositivo == Dispositivo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -159,15 +138,9 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
EnviarComandoDescoberta();
|
EnviarComandoDescoberta();
|
||||||
|
|
||||||
bool Respondido() =>
|
bool Respondido() => DadosLeitura.UltimoComandoRecebido > inicio;
|
||||||
DadosLeitura.UltimoComandoRecebido > inicio;
|
|
||||||
|
|
||||||
await FuncoesGlobais
|
await FuncoesGlobais.AguardarCondicaoAsync(Respondido, 1200, 50);
|
||||||
.AguardarCondicaoAsync(
|
|
||||||
Respondido,
|
|
||||||
1200,
|
|
||||||
50
|
|
||||||
);
|
|
||||||
|
|
||||||
if (Respondido())
|
if (Respondido())
|
||||||
DefinirDispositivo();
|
DefinirDispositivo();
|
||||||
|
|
@ -192,8 +165,7 @@ namespace AgroBase.Services
|
||||||
*/
|
*/
|
||||||
if (!DispositivoMapeado)
|
if (!DispositivoMapeado)
|
||||||
{
|
{
|
||||||
if (agora - _ultimaTentativaDescoberta >=
|
if (agora - _ultimaTentativaDescoberta >= IntervaloDescoberta)
|
||||||
IntervaloDescoberta)
|
|
||||||
{
|
{
|
||||||
_ultimaTentativaDescoberta = agora;
|
_ultimaTentativaDescoberta = agora;
|
||||||
EnviarComandoDescoberta();
|
EnviarComandoDescoberta();
|
||||||
|
|
@ -218,64 +190,44 @@ namespace AgroBase.Services
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (agora - _ultimoEnvioCan <
|
if (agora - _ultimoEnvioCan < IntervaloMinimoEntreRequests)
|
||||||
IntervaloMinimoEntreRequests)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BatFuncCode? proximo =
|
BatFuncCode? proximo = EscolherProximoDadoParaRequisitar(agora);
|
||||||
EscolherProximoDadoParaRequisitar(agora);
|
|
||||||
|
|
||||||
if (!proximo.HasValue)
|
if (!proximo.HasValue)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool contabilizarTimeout =
|
bool contabilizarTimeout = DeveContabilizarTimeoutHealth(proximo.Value);
|
||||||
DeveContabilizarTimeoutHealth(proximo.Value);
|
|
||||||
|
|
||||||
RequisitarDado(
|
RequisitarDado(proximo.Value, contabilizarTimeout);
|
||||||
proximo.Value,
|
|
||||||
contabilizarTimeout
|
|
||||||
);
|
|
||||||
|
|
||||||
_ultimoPedido[proximo.Value] = agora;
|
_ultimoPedido[proximo.Value] = agora;
|
||||||
_ultimoEnvioCan = agora;
|
_ultimoEnvioCan = agora;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine(
|
Variaveis.MostrarLog("[DalyBMSService.AtualizarDados] Erro em AtualizarDados: " + ex.Message);
|
||||||
"[DalyBMSService] Erro em AtualizarDados: " +
|
|
||||||
ex.Message
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BatFuncCode? EscolherProximoDadoParaRequisitar(
|
private static BatFuncCode? EscolherProximoDadoParaRequisitar(DateTime agora)
|
||||||
DateTime agora)
|
|
||||||
{
|
{
|
||||||
for (int tentativa = 0;
|
for (int tentativa = 0; tentativa < OrdemPolling.Length; tentativa++)
|
||||||
tentativa < OrdemPolling.Length;
|
|
||||||
tentativa++)
|
|
||||||
{
|
{
|
||||||
int index =
|
int index = (_cursorPolling + tentativa) % OrdemPolling.Length;
|
||||||
(_cursorPolling + tentativa) %
|
|
||||||
OrdemPolling.Length;
|
|
||||||
|
|
||||||
BatFuncCode codigo =
|
BatFuncCode codigo = OrdemPolling[index];
|
||||||
OrdemPolling[index];
|
|
||||||
|
|
||||||
TimeSpan intervalo =
|
TimeSpan intervalo = IntervalosPorFuncao[codigo];
|
||||||
IntervalosPorFuncao[codigo];
|
|
||||||
|
|
||||||
DateTime ultimo =
|
DateTime ultimo = _ultimoPedido[codigo];
|
||||||
_ultimoPedido[codigo];
|
|
||||||
|
|
||||||
if (ultimo == DateTime.MinValue ||
|
if (ultimo == DateTime.MinValue || agora - ultimo >= intervalo)
|
||||||
agora - ultimo >= intervalo)
|
|
||||||
{
|
{
|
||||||
_cursorPolling =
|
_cursorPolling = (index + 1) % OrdemPolling.Length;
|
||||||
(index + 1) %
|
|
||||||
OrdemPolling.Length;
|
|
||||||
|
|
||||||
return codigo;
|
return codigo;
|
||||||
}
|
}
|
||||||
|
|
@ -284,8 +236,7 @@ namespace AgroBase.Services
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool DeveContabilizarTimeoutHealth(
|
private static bool DeveContabilizarTimeoutHealth(BatFuncCode dado)
|
||||||
BatFuncCode dado)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Apenas requests leves e críticos entram na saúde CAN.
|
* Apenas requests leves e críticos entram na saúde CAN.
|
||||||
|
|
@ -305,18 +256,9 @@ namespace AgroBase.Services
|
||||||
if (_handlersRegistrados)
|
if (_handlersRegistrados)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
foreach (BatFuncCode f in Enum.GetValues(
|
foreach (BatFuncCode f in Enum.GetValues(typeof(BatFuncCode)))
|
||||||
typeof(BatFuncCode)))
|
|
||||||
{
|
{
|
||||||
CanManager
|
CanManager.CanService.RegistrarHandler(CanManager.ConverterIdCan(MakeResponseID(f)), _BatHandler);
|
||||||
.CanService
|
|
||||||
.RegistrarHandler(
|
|
||||||
CanManager
|
|
||||||
.ConverterIdCan(
|
|
||||||
MakeResponseID(f)
|
|
||||||
),
|
|
||||||
_BatHandler
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_handlersRegistrados = true;
|
_handlersRegistrados = true;
|
||||||
|
|
@ -331,26 +273,19 @@ namespace AgroBase.Services
|
||||||
if (DadosLeitura == null)
|
if (DadosLeitura == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SerialService
|
SerialService.DispositivosMapeados.Add(
|
||||||
.DispositivosMapeados
|
new DispositivoDetalhesModel
|
||||||
.Add(
|
{
|
||||||
new DispositivoDetalhesModel
|
Dispositivo = Dispositivo,
|
||||||
{
|
Endereco = CanManager.CanService._portName,
|
||||||
Dispositivo = Dispositivo,
|
Versao = "1"
|
||||||
Endereco = CanManager.CanService._portName,
|
}
|
||||||
Versao = "1"
|
);
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void RemoverMapeamento()
|
private static void RemoverMapeamento()
|
||||||
{
|
{
|
||||||
var d =
|
var d = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
|
||||||
SerialService
|
|
||||||
.DispositivosMapeados
|
|
||||||
.FirstOrDefault(
|
|
||||||
x => x.Dispositivo == Dispositivo
|
|
||||||
);
|
|
||||||
|
|
||||||
if (d != null)
|
if (d != null)
|
||||||
SerialService.DispositivosMapeados.Remove(d);
|
SerialService.DispositivosMapeados.Remove(d);
|
||||||
|
|
@ -360,22 +295,19 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
private static void EnviarComandoDescoberta()
|
private static void EnviarComandoDescoberta()
|
||||||
{
|
{
|
||||||
BatFuncCode dado =
|
BatFuncCode dado = BatFuncCode.SOC;
|
||||||
BatFuncCode.SOC;
|
|
||||||
|
|
||||||
CanManager
|
CanManager.CanService.AdicionarMensagemNaFila(
|
||||||
.CanService
|
Dispositivo,
|
||||||
.AdicionarMensagemNaFila(
|
MakeRequestID(dado),
|
||||||
Dispositivo,
|
MakeResponseID(dado),
|
||||||
MakeRequestID(dado),
|
(byte)dado,
|
||||||
MakeResponseID(dado),
|
(byte)dado,
|
||||||
(byte)dado,
|
payload: new byte[8],
|
||||||
(byte)dado,
|
get: true,
|
||||||
payload: new byte[8],
|
contabilizarTimeoutHealth: false,
|
||||||
get: true,
|
mensagemDescoberta: true
|
||||||
contabilizarTimeoutHealth: false,
|
);
|
||||||
mensagemDescoberta: true
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void EnviarComando(
|
private static void EnviarComando(
|
||||||
|
|
|
||||||
|
|
@ -2161,43 +2161,24 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
public static void AtualizarCoordenadasGPS()
|
public static void AtualizarCoordenadasGPS()
|
||||||
{
|
{
|
||||||
PenultimaLeitura.Ntrip_ativado =
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
UltimaLeitura.Ntrip_ativado;
|
|
||||||
|
|
||||||
PenultimaLeitura.Heartbeat =
|
PenultimaLeitura.Ntrip_ativado = UltimaLeitura.Ntrip_ativado;
|
||||||
UltimaLeitura.Heartbeat;
|
PenultimaLeitura.Heartbeat = UltimaLeitura.Heartbeat;
|
||||||
|
PenultimaLeitura.LeverArmFrontal = UltimaLeitura.LeverArmFrontal;
|
||||||
|
PenultimaLeitura.LeverArmLateral = UltimaLeitura.LeverArmLateral;
|
||||||
|
UltimaLeitura.Ntrip_ativado = CorrecaoRTK_Ntrip;
|
||||||
|
|
||||||
PenultimaLeitura.LeverArmFrontal =
|
UltimaLeitura.Heartbeat = (UltimaLeitura.Heartbeat + 1) % 10;
|
||||||
UltimaLeitura.LeverArmFrontal;
|
UltimaLeitura.LeverArmFrontal = LeverArm != null ? LeverArm.FrontalTotalCm : 0;
|
||||||
|
UltimaLeitura.LeverArmLateral = LeverArm != null ? LeverArm.LateralTotalCm : 0;
|
||||||
PenultimaLeitura.LeverArmLateral =
|
|
||||||
UltimaLeitura.LeverArmLateral;
|
|
||||||
|
|
||||||
UltimaLeitura.Ntrip_ativado =
|
|
||||||
CorrecaoRTK_Ntrip;
|
|
||||||
|
|
||||||
UltimaLeitura.Heartbeat =
|
|
||||||
(UltimaLeitura.Heartbeat + 1) % 10;
|
|
||||||
|
|
||||||
UltimaLeitura.LeverArmFrontal =
|
|
||||||
LeverArm != null
|
|
||||||
? LeverArm.FrontalTotalCm
|
|
||||||
: 0;
|
|
||||||
|
|
||||||
UltimaLeitura.LeverArmLateral =
|
|
||||||
LeverArm != null
|
|
||||||
? LeverArm.LateralTotalCm
|
|
||||||
: 0;
|
|
||||||
|
|
||||||
if (Variaveis.IsAgroMonitor)
|
if (Variaveis.IsAgroMonitor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
UltimasLeituras.Add(
|
UltimasLeituras.Add(UltimaLeitura.Clone());
|
||||||
UltimaLeitura.Clone()
|
|
||||||
);
|
|
||||||
|
|
||||||
while (UltimasLeituras.Count >
|
while (UltimasLeituras.Count > Math.Max(1, TaxaAmostragemHz))
|
||||||
Math.Max(1, TaxaAmostragemHz))
|
|
||||||
{
|
{
|
||||||
UltimasLeituras.RemoveAt(0);
|
UltimasLeituras.RemoveAt(0);
|
||||||
}
|
}
|
||||||
|
|
@ -2205,102 +2186,61 @@ namespace AgroBase.Services
|
||||||
DefinirOrientacaoMovimento();
|
DefinirOrientacaoMovimento();
|
||||||
AtualizaDadosRedis();
|
AtualizaDadosRedis();
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
if (op.Sensoriamento.Operacao.OperacaoIniciada)
|
||||||
{
|
{
|
||||||
var trajetoria =
|
var trajetoria = op.Trajetoria;
|
||||||
Variaveis.OperacaoEmAndamento.Trajetoria;
|
var gpsTrajetoria = op.GPSTrajetoria;
|
||||||
|
GPSModel novaLeitura = UltimaLeitura.Clone();
|
||||||
var gpsTrajetoria =
|
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.GPSTrajetoria;
|
|
||||||
|
|
||||||
GPSModel novaLeitura =
|
|
||||||
UltimaLeitura.Clone();
|
|
||||||
|
|
||||||
gpsTrajetoria.Add(novaLeitura);
|
gpsTrajetoria.Add(novaLeitura);
|
||||||
|
|
||||||
if (gpsTrajetoria.Count > 1)
|
if (gpsTrajetoria.Count > 1)
|
||||||
{
|
{
|
||||||
int ultimo =
|
int ultimo = gpsTrajetoria.Count - 1;
|
||||||
gpsTrajetoria.Count - 1;
|
|
||||||
|
|
||||||
int penultimo = ultimo - 1;
|
int penultimo = ultimo - 1;
|
||||||
|
double distancia = GPSUtils.DistanciaEntrePontos(gpsTrajetoria[ultimo], gpsTrajetoria[penultimo]);
|
||||||
double distancia =
|
|
||||||
GPSUtils.DistanciaEntrePontos(
|
|
||||||
gpsTrajetoria[ultimo],
|
|
||||||
gpsTrajetoria[penultimo]
|
|
||||||
);
|
|
||||||
|
|
||||||
if (trajetoria != null)
|
if (trajetoria != null)
|
||||||
trajetoria.AtualizarDistanciaPercorrida(
|
trajetoria.AtualizarDistanciaPercorrida(distancia);
|
||||||
distancia
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var bicos =
|
var bicos = op.DispAtu?.Dados?.BicosPulverizadores;
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.DispAtu?
|
|
||||||
.Dados?
|
|
||||||
.BicosPulverizadores;
|
|
||||||
|
|
||||||
if (bicos != null)
|
if (bicos != null)
|
||||||
{
|
{
|
||||||
foreach (var bico in bicos)
|
foreach (var bico in bicos)
|
||||||
{
|
{
|
||||||
if (!bico.Inicializado ||
|
if (!bico.Inicializado || !bico.Comandar || !bico.ComandoAtuar)
|
||||||
!bico.Comandar ||
|
|
||||||
!bico.ComandoAtuar)
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bico.AdicionarPontoTrechoAtivo(
|
bico.AdicionarPontoTrechoAtivo(UltimaLeitura.Latitude, UltimaLeitura.Longitude);
|
||||||
UltimaLeitura.Latitude,
|
|
||||||
UltimaLeitura.Longitude
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Trajetoria != null)
|
if (op.Trajetoria != null)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento
|
op.Trajetoria.LoopAtualizaDados();
|
||||||
.Trajetoria
|
|
||||||
.LoopAtualizaDados();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AtualizarTrajetoriaDinamica();
|
AtualizarTrajetoriaDinamica();
|
||||||
|
|
||||||
int enderecoEquipamento = Convert.ToInt32(
|
int enderecoEquipamento = 1;
|
||||||
Variaveis.LoraService?
|
|
||||||
.ParametrosGet?
|
|
||||||
.address ??
|
|
||||||
Variaveis.LoraService?
|
|
||||||
.ParametrosSet?
|
|
||||||
.address ??
|
|
||||||
0x00
|
|
||||||
);
|
|
||||||
|
|
||||||
EnviarCoordenadasParaMapa(
|
EnviarCoordenadasParaMapa(
|
||||||
UltimaLeitura.Latitude,
|
UltimaLeitura.Latitude,
|
||||||
UltimaLeitura.Longitude,
|
UltimaLeitura.Longitude,
|
||||||
UltimaLeitura.AnguloCarroDefinido,
|
UltimaLeitura.AnguloCarroDefinido,
|
||||||
Variaveis.OperacaoEmAndamento.Iniciado,
|
op.Sensoriamento.Operacao.OperacaoIniciada,
|
||||||
enderecoEquipamento
|
enderecoEquipamento
|
||||||
);
|
);
|
||||||
|
|
||||||
if ((Variaveis.LoraService?.Iniciado ?? false) &&
|
GPSModel posicaoBase = VariaveisOperacao.ObterPosicaoBaseSnapshot();
|
||||||
(Variaveis.LoraService?._ultimoRxDados ??
|
if ((posicaoBase?.UltimoComandoRespondido ?? DateTime.MinValue) > DateTime.UtcNow.AddSeconds(-60))
|
||||||
DateTime.MinValue) >
|
|
||||||
DateTime.UtcNow.AddSeconds(-60))
|
|
||||||
{
|
{
|
||||||
byte enderecoBase =
|
int enderecoBase = 0;
|
||||||
Variaveis.LoraBaseParametros.address;
|
|
||||||
|
|
||||||
GPSModel posicaoBase =
|
|
||||||
VariaveisOperacao
|
|
||||||
.ObterPosicaoBaseSnapshot();
|
|
||||||
|
|
||||||
EnviarCoordenadasParaMapa(
|
EnviarCoordenadasParaMapa(
|
||||||
posicaoBase.Latitude,
|
posicaoBase.Latitude,
|
||||||
|
|
@ -2311,17 +2251,10 @@ namespace AgroBase.Services
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
PenultimaLeitura.Inicializado =
|
PenultimaLeitura.Inicializado = UltimaLeitura.Inicializado;
|
||||||
UltimaLeitura.Inicializado;
|
|
||||||
|
|
||||||
UltimaLeitura.Inicializado = Iniciado;
|
UltimaLeitura.Inicializado = Iniciado;
|
||||||
|
|
||||||
if (CorrecaoRTK_Ntrip &&
|
if (CorrecaoRTK_Ntrip && GetAgeMs(Interlocked.Read(ref _lastRtcmWrittenMono)) > TempoMin_Ntrip * 1000.0)
|
||||||
GetAgeMs(
|
|
||||||
Interlocked.Read(
|
|
||||||
ref _lastRtcmWrittenMono
|
|
||||||
)
|
|
||||||
) > TempoMin_Ntrip * 1000.0)
|
|
||||||
{
|
{
|
||||||
_ = IniciarNtripAsync();
|
_ = IniciarNtripAsync();
|
||||||
}
|
}
|
||||||
|
|
@ -2331,61 +2264,40 @@ namespace AgroBase.Services
|
||||||
// PUBLICAÇÃO LOCAL LATEST-ONLY
|
// PUBLICAÇÃO LOCAL LATEST-ONLY
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|
||||||
public static void EnviarCoordenadasParaMapa(
|
public static void EnviarCoordenadasParaMapa(double Latitude, double Longitude, double Orientacao, bool EmFoco, int ID)
|
||||||
double Latitude,
|
|
||||||
double Longitude,
|
|
||||||
double Orientacao,
|
|
||||||
bool EmFoco,
|
|
||||||
int ID)
|
|
||||||
{
|
{
|
||||||
var coordenadas = new
|
var coordenadas = new
|
||||||
{
|
{
|
||||||
latitude = Latitude,
|
latitude = Latitude,
|
||||||
longitude = Longitude,
|
longitude = Longitude,
|
||||||
orientacao =
|
orientacao = GPSUtils.NormalizarAngulo(Orientacao - 180.0),
|
||||||
GPSUtils.NormalizarAngulo(
|
|
||||||
Orientacao - 180.0
|
|
||||||
),
|
|
||||||
id = ID,
|
id = ID,
|
||||||
foco = EmFoco
|
foco = EmFoco
|
||||||
};
|
};
|
||||||
|
|
||||||
QueueLocalPublication(
|
QueueLocalPublication(MapasVariaveisModel.TopicoCoordenadasGPS, JsonConvert.SerializeObject(coordenadas));
|
||||||
MapasVariaveisModel.TopicoCoordenadasGPS,
|
|
||||||
JsonConvert.SerializeObject(coordenadas)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AtualizarTrajetoriaDinamica()
|
public static void AtualizarTrajetoriaDinamica()
|
||||||
{
|
{
|
||||||
var dinamica =
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.Trajetoria?
|
var dinamica = op.Trajetoria?._TrajetoriaDinamica;
|
||||||
._TrajetoriaDinamica;
|
|
||||||
|
|
||||||
if (!(dinamica?.Any() ?? false))
|
if (!(dinamica?.Any() ?? false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var trajetoria = Variaveis
|
var trajetoria = op.Trajetoria.TrajetoriaDinamica.Select(x => new
|
||||||
.OperacaoEmAndamento
|
{
|
||||||
.Trajetoria
|
latitude = x.Latitude,
|
||||||
.TrajetoriaDinamica
|
longitude = x.Longitude
|
||||||
.Select(x => new
|
})
|
||||||
{
|
.ToArray();
|
||||||
latitude = x.Latitude,
|
|
||||||
longitude = x.Longitude
|
|
||||||
})
|
|
||||||
.ToArray();
|
|
||||||
|
|
||||||
QueueLocalPublication(
|
QueueLocalPublication(MapasVariaveisModel.TopicoTrajetoriaDinamica, JsonConvert.SerializeObject(trajetoria));
|
||||||
MapasVariaveisModel
|
|
||||||
.TopicoTrajetoriaDinamica,
|
|
||||||
JsonConvert.SerializeObject(trajetoria)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AtualizarRuasSelecionadas(
|
public static void AtualizarRuasSelecionadas(List<string> RuasSelecionadas)
|
||||||
List<string> RuasSelecionadas)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Preserva o formato legado produzido anteriormente.
|
* Preserva o formato legado produzido anteriormente.
|
||||||
|
|
@ -2405,9 +2317,7 @@ namespace AgroBase.Services
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void QueueLocalPublication(
|
private static void QueueLocalPublication(string topic, string payload)
|
||||||
string topic,
|
|
||||||
string payload)
|
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(topic))
|
if (string.IsNullOrWhiteSpace(topic))
|
||||||
return;
|
return;
|
||||||
|
|
@ -2424,8 +2334,7 @@ namespace AgroBase.Services
|
||||||
catch (SemaphoreFullException) { }
|
catch (SemaphoreFullException) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task LocalPublisherLoopAsync(
|
private static async Task LocalPublisherLoopAsync(CancellationToken cancellationToken)
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
while (!cancellationToken.IsCancellationRequested)
|
while (!cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
|
|
@ -2605,51 +2514,38 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
public static void DefinirAnguloCarro()
|
public static void DefinirAnguloCarro()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
double anguloFinal;
|
double anguloFinal;
|
||||||
|
|
||||||
bool imuIniciado =
|
bool imuIniciado = op.Sensoriamento?.IMU?.Iniciado ?? false;
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.Sensoriamento?
|
|
||||||
.IMU?
|
|
||||||
.Iniciado ?? false;
|
|
||||||
|
|
||||||
bool gpsIniciado = Iniciado;
|
bool gpsIniciado = Iniciado;
|
||||||
|
|
||||||
bool headingValido =
|
bool headingValido = PossuiHeadingValido(UltimaLeitura);
|
||||||
PossuiHeadingValido(UltimaLeitura);
|
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Simulando)
|
if (op.Simulando)
|
||||||
{
|
{
|
||||||
anguloFinal =
|
anguloFinal = UltimaLeitura.OrientacaoReal;
|
||||||
UltimaLeitura.OrientacaoReal;
|
|
||||||
}
|
}
|
||||||
else if (gpsIniciado && headingValido)
|
else if (gpsIniciado && headingValido)
|
||||||
{
|
{
|
||||||
anguloFinal =
|
anguloFinal = UltimaLeitura.OrientacaoReal;
|
||||||
UltimaLeitura.OrientacaoReal;
|
|
||||||
}
|
}
|
||||||
else if (gpsIniciado &&
|
else if (gpsIniciado && UltimaLeitura.Distancia > 0.25)
|
||||||
UltimaLeitura.Distancia > 0.25)
|
|
||||||
{
|
{
|
||||||
anguloFinal =
|
anguloFinal = UltimaLeitura.OrientacaoMovimento;
|
||||||
UltimaLeitura.OrientacaoMovimento;
|
|
||||||
}
|
}
|
||||||
else if (imuIniciado)
|
else if (imuIniciado)
|
||||||
{
|
{
|
||||||
anguloFinal =
|
anguloFinal = op.Sensoriamento.IMU.YawSeguro;
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.Sensoriamento
|
|
||||||
.IMU
|
|
||||||
.YawSeguro;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
anguloFinal =
|
anguloFinal = UltimaLeitura.AnguloCarroDefinido;
|
||||||
UltimaLeitura.AnguloCarroDefinido;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UltimaLeitura.AnguloCarroDefinido =
|
UltimaLeitura.AnguloCarroDefinido = anguloFinal;
|
||||||
anguloFinal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static double FundirHeadingComMovimento(
|
public static double FundirHeadingComMovimento(
|
||||||
|
|
@ -2810,10 +2706,7 @@ namespace AgroBase.Services
|
||||||
{
|
{
|
||||||
lock (_stateLock)
|
lock (_stateLock)
|
||||||
{
|
{
|
||||||
posicaoAtual =
|
posicaoAtual = historicoPosicao.Count > 0 ? historicoPosicao.Peek().Clone() : UltimaLeitura.Clone();
|
||||||
historicoPosicao.Count > 0
|
|
||||||
? historicoPosicao.Peek().Clone()
|
|
||||||
: UltimaLeitura.Clone();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -2821,37 +2714,18 @@ namespace AgroBase.Services
|
||||||
posicaoAtual = GetSnapshot();
|
posicaoAtual = GetSnapshot();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rtkValido =
|
bool rtkValido = posicaoAtual.IdadeCorrecao >= 0 && posicaoAtual.IdadeCorrecao < rtk_timeout &&
|
||||||
posicaoAtual.IdadeCorrecao >= 0 &&
|
|
||||||
posicaoAtual.IdadeCorrecao <
|
|
||||||
rtk_timeout &&
|
|
||||||
(
|
(
|
||||||
posicaoAtual.QualidadeFix ==
|
posicaoAtual.QualidadeFix == TiposCorrecaoGPS.RTKFixo ||
|
||||||
TiposCorrecaoGPS.RTKFixo ||
|
posicaoAtual.QualidadeFix == TiposCorrecaoGPS.RTKFlutuante ||
|
||||||
posicaoAtual.QualidadeFix ==
|
posicaoAtual.QualidadeFix == TiposCorrecaoGPS.DGPS
|
||||||
TiposCorrecaoGPS.RTKFlutuante ||
|
|
||||||
posicaoAtual.QualidadeFix ==
|
|
||||||
TiposCorrecaoGPS.DGPS
|
|
||||||
);
|
);
|
||||||
|
|
||||||
string statusOrientacao =
|
string statusOrientacao = (posicaoAtual.TipoOrientacao ?? string.Empty).Trim().ToUpperInvariant();
|
||||||
(posicaoAtual.TipoOrientacao ??
|
double valorOrientacao = posicaoAtual.OrientacaoReal;
|
||||||
string.Empty)
|
bool orientacaoValida = statusOrientacao == "A" && !double.IsNaN(valorOrientacao) && !double.IsInfinity(valorOrientacao) && valorOrientacao >= 0.0 && valorOrientacao < 360.0;
|
||||||
.Trim()
|
|
||||||
.ToUpperInvariant();
|
|
||||||
|
|
||||||
double valorOrientacao =
|
GpsTransportMetrics metrics = GetTransportMetrics();
|
||||||
posicaoAtual.OrientacaoReal;
|
|
||||||
|
|
||||||
bool orientacaoValida =
|
|
||||||
statusOrientacao == "A" &&
|
|
||||||
!double.IsNaN(valorOrientacao) &&
|
|
||||||
!double.IsInfinity(valorOrientacao) &&
|
|
||||||
valorOrientacao >= 0.0 &&
|
|
||||||
valorOrientacao < 360.0;
|
|
||||||
|
|
||||||
GpsTransportMetrics metrics =
|
|
||||||
GetTransportMetrics();
|
|
||||||
|
|
||||||
RedisService.AtualizarCampos(
|
RedisService.AtualizarCampos(
|
||||||
RedisService.ModKey(T_Code.Gps),
|
RedisService.ModKey(T_Code.Gps),
|
||||||
|
|
@ -2869,78 +2743,54 @@ namespace AgroBase.Services
|
||||||
("nSatelites", posicaoAtual.NumeroSatelites),
|
("nSatelites", posicaoAtual.NumeroSatelites),
|
||||||
("age", posicaoAtual.IdadeCorrecao),
|
("age", posicaoAtual.IdadeCorrecao),
|
||||||
|
|
||||||
("freq.posicao",
|
("freq.posicao", posicaoAtual.TimestampPos.frequencia),
|
||||||
posicaoAtual.TimestampPos.frequencia),
|
("freq.orientacao", posicaoAtual.TimestampOri.frequencia),
|
||||||
("freq.orientacao",
|
|
||||||
posicaoAtual.TimestampOri.frequencia),
|
|
||||||
|
|
||||||
("latency.posicao",
|
("latency.posicao", posicaoAtual.TimestampPos.dt),
|
||||||
posicaoAtual.TimestampPos.dt),
|
("latency.orientacao", posicaoAtual.TimestampOri.dt),
|
||||||
("latency.orientacao",
|
|
||||||
posicaoAtual.TimestampOri.dt),
|
|
||||||
|
|
||||||
("timestamp.posicao",
|
("timestamp.posicao", posicaoAtual.TimestampPos.valor),
|
||||||
posicaoAtual.TimestampPos.valor),
|
("timestamp.orientacao", posicaoAtual.TimestampOri.valor),
|
||||||
("timestamp.orientacao",
|
|
||||||
posicaoAtual.TimestampOri.valor),
|
|
||||||
|
|
||||||
("orientacao.status",
|
("orientacao.status", statusOrientacao),
|
||||||
statusOrientacao),
|
("orientacao.valida", orientacaoValida),
|
||||||
("orientacao.valida",
|
("orientacao.valor", valorOrientacao),
|
||||||
orientacaoValida),
|
|
||||||
("orientacao.valor",
|
|
||||||
valorOrientacao),
|
|
||||||
|
|
||||||
("heartbeat",
|
("heartbeat", posicaoAtual.Heartbeat),
|
||||||
posicaoAtual.Heartbeat),
|
|
||||||
|
|
||||||
("rtcm.received",
|
("rtcm.received", metrics.RtcmReceived),
|
||||||
metrics.RtcmReceived),
|
("rtcm.written", metrics.RtcmWritten),
|
||||||
("rtcm.written",
|
("rtcm.queue_depth", metrics.RtcmQueueDepth),
|
||||||
metrics.RtcmWritten),
|
("rtcm.last_rx_age_ms", metrics.LastRtcmReceivedAgeMs),
|
||||||
("rtcm.queue_depth",
|
("rtcm.last_write_age_ms", metrics.LastRtcmWrittenAgeMs),
|
||||||
metrics.RtcmQueueDepth),
|
("rtcm.drop_stale", metrics.RtcmDroppedStale),
|
||||||
("rtcm.last_rx_age_ms",
|
("rtcm.write_errors", metrics.RtcmWriteErrors)
|
||||||
metrics.LastRtcmReceivedAgeMs),
|
|
||||||
("rtcm.last_write_age_ms",
|
|
||||||
metrics.LastRtcmWrittenAgeMs),
|
|
||||||
("rtcm.drop_stale",
|
|
||||||
metrics.RtcmDroppedStale),
|
|
||||||
("rtcm.write_errors",
|
|
||||||
metrics.RtcmWriteErrors)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CorrecaoRTK_Ntrip = RedisService.GetField<bool>(RedisService.ModKey(T_Code.Gps), "correcao_ntrip", false);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
RecordError(
|
RecordError("[GPSService.AtualizaDadosRedis] " + ex.Message);
|
||||||
"[GPSService.AtualizaDadosRedis] " +
|
|
||||||
ex.Message
|
|
||||||
);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento
|
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(
|
||||||
.Sensoriamento
|
T_Code.Gps,
|
||||||
.InserirLog(
|
StatusModulo.Falha,
|
||||||
T_Code.Gps,
|
0,
|
||||||
StatusModulo.Falha,
|
"Erro ao salvar dados do GPS no Redis: " + ex.Message
|
||||||
0,
|
);
|
||||||
"Erro ao salvar dados do GPS no Redis: " +
|
|
||||||
ex.Message
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AtualizarAtrasoPosicoes(
|
public static void AtualizarAtrasoPosicoes(int errosConsiderar = 0)
|
||||||
int errosConsiderar = 0)
|
|
||||||
{
|
{
|
||||||
lock (_stateLock)
|
lock (_stateLock)
|
||||||
{
|
{
|
||||||
historicoPosicao.Enqueue(
|
historicoPosicao.Enqueue(UltimaLeitura.Clone());
|
||||||
UltimaLeitura.Clone()
|
|
||||||
);
|
|
||||||
|
|
||||||
while (historicoPosicao.Count > 1 &&
|
while (historicoPosicao.Count > 1 &&
|
||||||
(
|
(
|
||||||
|
|
|
||||||
|
|
@ -599,9 +599,9 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
public void AtualizarAgitadorCalda(ModoAgitadorCalda modo)
|
public void AtualizarAgitadorCalda(ModoAgitadorCalda modo)
|
||||||
{
|
{
|
||||||
var operacao = Variaveis.OperacaoEmAndamento;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
if (operacao?.Calibrando == true)
|
if (op.Sensoriamento.Operacao.Calibrando == true)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Durante a calibração, RealizarTestesIniciais()
|
* Durante a calibração, RealizarTestesIniciais()
|
||||||
|
|
@ -611,12 +611,12 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
|
|
||||||
var agitador =
|
var agitador =
|
||||||
operacao?.DispAtu?.Dados?.AgitadorDeCalda;
|
op?.DispAtu?.Dados?.AgitadorDeCalda;
|
||||||
|
|
||||||
if (!(agitador?.Inicializado ?? false))
|
if (!(agitador?.Inicializado ?? false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var controle = operacao.Parametros?.Controle;
|
var controle = op.Parametros?.Controle;
|
||||||
|
|
||||||
if (controle == null)
|
if (controle == null)
|
||||||
{
|
{
|
||||||
|
|
@ -626,18 +626,16 @@ namespace AgroBase.Services
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operacaoConcluida =
|
bool operacaoConcluida = op.Sensoriamento?.Operacao?.StatusOperacaoAtual == StatusOperacao.Concluido;
|
||||||
operacao.Sensoriamento?.StatusOperacao ==
|
|
||||||
StatusOperacao.Concluido;
|
|
||||||
|
|
||||||
bool operacaoAtiva =
|
bool operacaoAtiva =
|
||||||
operacao.Iniciado &&
|
op.Sensoriamento.Operacao.OperacaoIniciada &&
|
||||||
!operacao.Pausa &&
|
!op.Sensoriamento.Operacao.Pausa &&
|
||||||
!operacaoConcluida &&
|
!operacaoConcluida &&
|
||||||
PulverizadorLiberado;
|
PulverizadorLiberado;
|
||||||
|
|
||||||
bool bicosAtuando =
|
bool bicosAtuando =
|
||||||
operacao.DispAtu?.Dados?.BicosPulverizadores?
|
op.DispAtu?.Dados?.BicosPulverizadores?
|
||||||
.Any(x =>
|
.Any(x =>
|
||||||
x.Comandar &&
|
x.Comandar &&
|
||||||
x.ComandoAtuar)
|
x.ComandoAtuar)
|
||||||
|
|
|
||||||
|
|
@ -315,7 +315,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
private static async Task tmrLeitura_Tick()
|
private static async Task tmrLeitura_Tick()
|
||||||
{
|
{
|
||||||
bool usoNaoNecessario = !Iniciado || (picRGB == null && !Variaveis.OperacaoEmAndamento.Iniciado);
|
bool usoNaoNecessario = !Iniciado || (picRGB == null && !Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada);
|
||||||
tmrLeitura.SetInterval(usoNaoNecessario ? 1000 : 200);
|
tmrLeitura.SetInterval(usoNaoNecessario ? 1000 : 200);
|
||||||
|
|
||||||
if (usoNaoNecessario)
|
if (usoNaoNecessario)
|
||||||
|
|
@ -624,7 +624,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
public static Bitmap ExibirObstaculos(Bitmap bitmap, List<Subdivisao> subdivisoes, List<Obstaculo> obstaculos, bool ExibirTexto = false)
|
public static Bitmap ExibirObstaculos(Bitmap bitmap, List<Subdivisao> subdivisoes, List<Obstaculo> obstaculos, bool ExibirTexto = false)
|
||||||
{
|
{
|
||||||
if (bitmap == null || (!false && Variaveis.OperacaoEmAndamento.Iniciado))
|
if (bitmap == null || (!false && Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada))
|
||||||
{
|
{
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
List<byte> config2 = new List<byte>
|
List<byte> config2 = new List<byte>
|
||||||
{
|
{
|
||||||
Variaveis.LoraBaseParametros?.address ?? 0x01,
|
0x01, //Variaveis.LoraBaseParametros?.address ?? 0x01,
|
||||||
ParametrosSet.address,
|
ParametrosSet.address,
|
||||||
ParametrosSet.baudAndAirRate,
|
ParametrosSet.baudAndAirRate,
|
||||||
ParametrosSet.packetSizeAndPower,
|
ParametrosSet.packetSizeAndPower,
|
||||||
|
|
@ -139,16 +139,16 @@ namespace AgroBase.Services
|
||||||
// --- ENVIO (ideal: agregue em 1-2 frames) ---
|
// --- ENVIO (ideal: agregue em 1-2 frames) ---
|
||||||
var s = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
var s = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
||||||
|
|
||||||
foreach (var dado in LoRaSerializer.SerializeGPS(s.Gps))
|
//foreach (var dado in LoRaSerializer.SerializeGPS(s.Gps))
|
||||||
Variaveis.LoraService?.EnviarDadosLoRaViaCAN(dado);
|
// Variaveis.LoraService?.EnviarDadosLoRaViaCAN(dado);
|
||||||
|
|
||||||
foreach (var dado in LoRaSerializer.SerializeOperacao(s))
|
//foreach (var dado in LoRaSerializer.SerializeOperacao(s))
|
||||||
Variaveis.LoraService?.EnviarDadosLoRaViaCAN(dado);
|
// Variaveis.LoraService?.EnviarDadosLoRaViaCAN(dado);
|
||||||
|
|
||||||
foreach (var dado in LoRaSerializer.SerializeSensores(s))
|
//foreach (var dado in LoRaSerializer.SerializeSensores(s))
|
||||||
Variaveis.LoraService?.EnviarDadosLoRaViaCAN(dado);
|
// Variaveis.LoraService?.EnviarDadosLoRaViaCAN(dado);
|
||||||
|
|
||||||
Variaveis.LoraService?.EnviarDadosLoRaViaCAN(LoRaSerializer.SerializeControleAtual(s.Controle));
|
//Variaveis.LoraService?.EnviarDadosLoRaViaCAN(LoRaSerializer.SerializeControleAtual(s.Controle));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -301,11 +301,11 @@ namespace AgroBase.Services
|
||||||
return dados.ToArray();
|
return dados.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<byte[]> SerializeOperacao(OperacaoSensoriamentoLogModel sensoriamento)
|
public static List<byte[]> SerializeOperacao(OperacaoSensoriamentoConjuntoModel sensoriamento)
|
||||||
{
|
{
|
||||||
List<byte> _operacao = new List<byte>();
|
List<byte> _operacao = new List<byte>();
|
||||||
_operacao.AddRange(CanPrefix(DadosLoRaParse.DadosOperacao));
|
_operacao.AddRange(CanPrefix(DadosLoRaParse.DadosOperacao));
|
||||||
_operacao.Add((byte)(sensoriamento.StatusOperacao)); // 1 byte
|
_operacao.Add((byte)(sensoriamento.Operacao.StatusOperacaoAtual)); // 1 byte
|
||||||
_operacao.Add((byte)sensoriamento.Trajetoria.StatusCarro); // 1 byte
|
_operacao.Add((byte)sensoriamento.Trajetoria.StatusCarro); // 1 byte
|
||||||
_operacao.Add((byte)Convert.ToInt32(sensoriamento.Trajetoria.PercentualOperacao)); // 1 byte
|
_operacao.Add((byte)Convert.ToInt32(sensoriamento.Trajetoria.PercentualOperacao)); // 1 byte
|
||||||
_operacao.Add((byte)Convert.ToInt32(sensoriamento.Trajetoria.PercentualRuaAtual)); // 1 byte
|
_operacao.Add((byte)Convert.ToInt32(sensoriamento.Trajetoria.PercentualRuaAtual)); // 1 byte
|
||||||
|
|
@ -317,15 +317,15 @@ namespace AgroBase.Services
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<byte[]> SerializeSensores(OperacaoSensoriamentoLogModel sensoriamento)
|
public static List<byte[]> SerializeSensores(OperacaoSensoriamentoConjuntoModel sensoriamento)
|
||||||
{
|
{
|
||||||
List<byte> _sensores = new List<byte>();
|
List<byte> _sensores = new List<byte>();
|
||||||
_sensores.AddRange(CanPrefix(DadosLoRaParse.DadosSensores));
|
_sensores.AddRange(CanPrefix(DadosLoRaParse.DadosSensores));
|
||||||
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Bateria.PercentualBateria)); // 1 byte
|
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Bateria.PercentualBateria)); // 1 byte
|
||||||
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Movimentacao.TemperaturaMedia)); // 1 byte
|
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Movimentacao.TemperaturaMotorMedia)); // 1 byte
|
||||||
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Movimentacao.TemperaturaMedia)); // 1 byte
|
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Movimentacao.TemperaturaDriverMedia)); // 1 byte
|
||||||
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Trajetoria.AnguloCaminho)); // 1 byte
|
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Trajetoria.AnguloCaminho)); // 1 byte
|
||||||
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Movimentacao.VelocidadeMedia)); // 1 byte
|
_sensores.Add((byte)Convert.ToInt32(sensoriamento.Movimentacao.VelocidadeMediaMs)); // 1 byte
|
||||||
|
|
||||||
List<byte> _pulverizador = new List<byte>();
|
List<byte> _pulverizador = new List<byte>();
|
||||||
_pulverizador.AddRange(CanPrefix(DadosLoRaParse.DadosPulverizador));
|
_pulverizador.AddRange(CanPrefix(DadosLoRaParse.DadosPulverizador));
|
||||||
|
|
|
||||||
|
|
@ -418,15 +418,11 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
private static void DefinirDispositivo(List<string> modIds)
|
private static void DefinirDispositivo(List<string> modIds)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
foreach (var modId in modIds)
|
foreach (var modId in modIds)
|
||||||
{
|
{
|
||||||
var modulo =
|
var modulo = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == modId);
|
||||||
Variaveis
|
|
||||||
.OperacaoEmAndamento
|
|
||||||
.DispMvd
|
|
||||||
.Dados
|
|
||||||
.Modulos
|
|
||||||
.FirstOrDefault(x => x.Modulo_ID == modId);
|
|
||||||
|
|
||||||
if (modulo?.DirMotor == null)
|
if (modulo?.DirMotor == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -453,19 +449,16 @@ namespace AgroBase.Services
|
||||||
Mod_ID = modId,
|
Mod_ID = modId,
|
||||||
});
|
});
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.ModsCalibragem.TryGetValue(T_Code.Dir, out var m);
|
op.Sensoriamento.Operacao.ModsCalibragem.TryGetValue(T_Code.Dir, out var m);
|
||||||
|
|
||||||
if (m == null)
|
if (m == null)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.ModsCalibragem.Add(
|
op.Sensoriamento.Operacao.ModsCalibragem.Add(T_Code.Dir, new Dictionary<string, bool>());
|
||||||
T_Code.Dir,
|
|
||||||
new Dictionary<string, bool>()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Dir][modId] = false;
|
op.Sensoriamento.Operacao.ModsCalibragem[T_Code.Dir][modId] = false;
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(
|
op.Sensoriamento.InserirLog(
|
||||||
T_Code.Dir,
|
T_Code.Dir,
|
||||||
StatusModulo.Conectado,
|
StatusModulo.Conectado,
|
||||||
0,
|
0,
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,9 @@ namespace AgroBase.Services
|
||||||
{
|
{
|
||||||
public static List<OIDModel> DadosLeitura = new List<OIDModel>();
|
public static List<OIDModel> DadosLeitura = new List<OIDModel>();
|
||||||
|
|
||||||
private static T_Code Dispositivo { get; set; } =
|
private static T_Code Dispositivo { get; set; } = T_Code.Oid;
|
||||||
T_Code.Oid;
|
|
||||||
|
|
||||||
private static OidHandler _OidHandler { get; set; } =
|
private static OidHandler _OidHandler { get; set; } = new OidHandler();
|
||||||
new OidHandler();
|
|
||||||
|
|
||||||
private static AsyncTaskTimerModel tmrHeartbeat;
|
private static AsyncTaskTimerModel tmrHeartbeat;
|
||||||
|
|
||||||
|
|
@ -401,18 +399,13 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
private static void DefinirDispositivo(List<string> modIds)
|
private static void DefinirDispositivo(List<string> modIds)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
GarantirTimerHeartbeat();
|
GarantirTimerHeartbeat();
|
||||||
|
|
||||||
foreach (var modId in modIds)
|
foreach (var modId in modIds)
|
||||||
{
|
{
|
||||||
var modulo =
|
var modulo = op.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == modId)?.MovMotor;
|
||||||
Variaveis
|
|
||||||
.OperacaoEmAndamento
|
|
||||||
.DispMvd
|
|
||||||
.Dados
|
|
||||||
.Modulos
|
|
||||||
.FirstOrDefault(x => x.Modulo_ID == modId)?
|
|
||||||
.MovMotor;
|
|
||||||
|
|
||||||
if (modulo == null)
|
if (modulo == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -422,17 +415,12 @@ namespace AgroBase.Services
|
||||||
modulo._EnderecoCAN_Rx
|
modulo._EnderecoCAN_Rx
|
||||||
);
|
);
|
||||||
|
|
||||||
var leitura =
|
var leitura = DadosLeitura.FirstOrDefault(x => x.EnderecoTx == modulo._EnderecoCAN_Tx);
|
||||||
DadosLeitura.FirstOrDefault(
|
|
||||||
x => x.EnderecoTx == modulo._EnderecoCAN_Tx
|
|
||||||
);
|
|
||||||
|
|
||||||
if (leitura != null && !leitura.Configurado)
|
if (leitura != null && !leitura.Configurado)
|
||||||
ConfigurarDriver(modulo);
|
ConfigurarDriver(modulo);
|
||||||
|
|
||||||
if (!SerialService.DispositivosMapeados.Any(
|
if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Mov && x.Mod_ID == modId))
|
||||||
x => x.Dispositivo == T_Code.Mov &&
|
|
||||||
x.Mod_ID == modId))
|
|
||||||
{
|
{
|
||||||
SerialService.DispositivosMapeados.Add(
|
SerialService.DispositivosMapeados.Add(
|
||||||
new DispositivoDetalhesModel
|
new DispositivoDetalhesModel
|
||||||
|
|
@ -444,38 +432,22 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.ModsCalibragem
|
op.Sensoriamento.Operacao.ModsCalibragem.TryGetValue(T_Code.Mov, out var m);
|
||||||
.TryGetValue(T_Code.Mov, out var m);
|
|
||||||
|
|
||||||
if (m == null)
|
if (m == null)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.ModsCalibragem
|
op.Sensoriamento.Operacao.ModsCalibragem.Add(T_Code.Mov, new Dictionary<string, bool>());
|
||||||
.Add(
|
|
||||||
T_Code.Mov,
|
|
||||||
new Dictionary<string, bool>()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento
|
op.Sensoriamento.Operacao.ModsCalibragem[T_Code.Mov][modId] = false;
|
||||||
.ModsCalibragem[T_Code.Mov][modId] = false;
|
op.Sensoriamento.InserirLog(T_Code.Mov, StatusModulo.Conectado, 0, "Dispositivo conectado", modId);
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.Sensoriamento
|
|
||||||
.InserirLog(
|
|
||||||
T_Code.Mov,
|
|
||||||
StatusModulo.Conectado,
|
|
||||||
0,
|
|
||||||
"Dispositivo conectado",
|
|
||||||
modId
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void GarantirTimerHeartbeat()
|
private static void GarantirTimerHeartbeat()
|
||||||
{
|
{
|
||||||
if (tmrHeartbeat != null &&
|
if (tmrHeartbeat != null && (tmrHeartbeat.IsRunning))
|
||||||
(tmrHeartbeat.IsRunning))
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,7 @@ namespace AgroBase.Services.Operadores
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private static List<CameraWorkerItemModel> CamerasConectadas =
|
private static List<CameraWorkerItemModel> CamerasConectadas = CriarListaVaziaComPlaceholder();
|
||||||
CriarListaVaziaComPlaceholder();
|
|
||||||
|
|
||||||
private static DateTime _ultimoRefreshUtc = DateTime.MinValue;
|
private static DateTime _ultimoRefreshUtc = DateTime.MinValue;
|
||||||
private static bool _refreshEmAndamento;
|
private static bool _refreshEmAndamento;
|
||||||
|
|
@ -39,10 +38,9 @@ namespace AgroBase.Services.Operadores
|
||||||
* Pode chamar AtualizarDadosCameras() em tmrLeitura_Tick sem medo.
|
* Pode chamar AtualizarDadosCameras() em tmrLeitura_Tick sem medo.
|
||||||
* Se o tick estiver em 100 ms, este throttle evita martelar Redis.
|
* Se o tick estiver em 100 ms, este throttle evita martelar Redis.
|
||||||
*/
|
*/
|
||||||
private static readonly TimeSpan IntervaloMinimoRefresh =
|
private static readonly TimeSpan IntervaloMinimoRefresh = TimeSpan.FromMilliseconds(500);
|
||||||
TimeSpan.FromMilliseconds(500);
|
|
||||||
|
|
||||||
private bool DebugMode = true;
|
private bool DebugMode = false;
|
||||||
|
|
||||||
public static List<CameraWorkerItemModel> ListaCameras
|
public static List<CameraWorkerItemModel> ListaCameras
|
||||||
{
|
{
|
||||||
|
|
@ -59,10 +57,7 @@ namespace AgroBase.Services.Operadores
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
CameraWorkerItemModel item =
|
CameraWorkerItemModel item = ListaCameras.FirstOrDefault(x => x.dispositivo == T_Code.Snr);
|
||||||
ListaCameras.FirstOrDefault(
|
|
||||||
x => x.dispositivo == T_Code.Snr
|
|
||||||
);
|
|
||||||
|
|
||||||
return item?.ToOAK();
|
return item?.ToOAK();
|
||||||
}
|
}
|
||||||
|
|
@ -126,11 +121,7 @@ namespace AgroBase.Services.Operadores
|
||||||
if (string.IsNullOrWhiteSpace(mensagem))
|
if (string.IsNullOrWhiteSpace(mensagem))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var comando =
|
var comando = JsonConvert.DeserializeObject<ComandoRedis>(mensagem, _jsonSettings);
|
||||||
JsonConvert.DeserializeObject<ComandoRedis>(
|
|
||||||
mensagem,
|
|
||||||
_jsonSettings
|
|
||||||
);
|
|
||||||
|
|
||||||
if (comando == null)
|
if (comando == null)
|
||||||
return;
|
return;
|
||||||
|
|
@ -152,10 +143,7 @@ namespace AgroBase.Services.Operadores
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
MostrarLog(
|
MostrarLog("Erro ao deserializar resposta: " + ex.Message);
|
||||||
"Erro ao deserializar resposta: " +
|
|
||||||
ex.Message
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|
@ -165,10 +153,7 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
public void AtualizarSaude()
|
public void AtualizarSaude()
|
||||||
{
|
{
|
||||||
Saude =
|
Saude = OperadoresModels.AtualizarSaude(CtxKey.DadosCameraWorker);
|
||||||
OperadoresModels.AtualizarSaude(
|
|
||||||
CtxKey.DadosCameraWorker
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -193,8 +178,7 @@ namespace AgroBase.Services.Operadores
|
||||||
{
|
{
|
||||||
DateTime agoraUtc = DateTime.UtcNow;
|
DateTime agoraUtc = DateTime.UtcNow;
|
||||||
|
|
||||||
if (!forcar &&
|
if (!forcar && agoraUtc - _ultimoRefreshUtc < IntervaloMinimoRefresh)
|
||||||
agoraUtc - _ultimoRefreshUtc < IntervaloMinimoRefresh)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -204,9 +188,7 @@ namespace AgroBase.Services.Operadores
|
||||||
if (_refreshEmAndamento)
|
if (_refreshEmAndamento)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!forcar &&
|
if (!forcar && DateTime.UtcNow - _ultimoRefreshUtc < IntervaloMinimoRefresh)
|
||||||
DateTime.UtcNow - _ultimoRefreshUtc <
|
|
||||||
IntervaloMinimoRefresh)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -216,8 +198,7 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
List<CameraWorkerItemModel> novaLista =
|
List<CameraWorkerItemModel> novaLista = LerCamerasDoRedis();
|
||||||
LerCamerasDoRedis();
|
|
||||||
|
|
||||||
lock (_cameraLock)
|
lock (_cameraLock)
|
||||||
{
|
{
|
||||||
|
|
@ -227,10 +208,7 @@ namespace AgroBase.Services.Operadores
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine(
|
Variaveis.MostrarLog("[CameraWorkerService.AtualizarDadosCameras] Erro ao atualizar câmeras: " + ex.Message);
|
||||||
"[CameraWorkerService] Erro ao atualizar câmeras: " +
|
|
||||||
ex.Message
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|
@ -324,16 +302,12 @@ namespace AgroBase.Services.Operadores
|
||||||
return resultado;
|
return resultado;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CameraWorkerItemModel LerCameraDoRedis(
|
private static CameraWorkerItemModel LerCameraDoRedis(string redisIdOuMxId)
|
||||||
string redisIdOuMxId)
|
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(redisIdOuMxId))
|
if (string.IsNullOrWhiteSpace(redisIdOuMxId))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
string cameraStr =
|
string cameraStr = RedisService.Get(RedisService.CamKey(redisIdOuMxId));
|
||||||
RedisService.Get(
|
|
||||||
RedisService.CamKey(redisIdOuMxId)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(cameraStr))
|
if (string.IsNullOrWhiteSpace(cameraStr))
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -342,64 +316,42 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
camera =
|
camera = JsonConvert.DeserializeObject<CameraWorkerItemModel>(cameraStr, _jsonSettings);
|
||||||
JsonConvert.DeserializeObject<CameraWorkerItemModel>(
|
|
||||||
cameraStr,
|
|
||||||
_jsonSettings
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine(
|
Variaveis.MostrarLog("[CameraWorkerService.LerCameraDoRedis] Falha ao ler câmera " + redisIdOuMxId + ": " + ex.Message);
|
||||||
"[CameraWorkerService] Falha ao ler câmera " +
|
|
||||||
redisIdOuMxId + ": " + ex.Message
|
|
||||||
);
|
|
||||||
|
|
||||||
Console.WriteLine(
|
Variaveis.MostrarLog("[CameraWorkerService.LerCameraDoRedis] JSON câmera: " + cameraStr);
|
||||||
"[CameraWorkerService] JSON câmera: " +
|
|
||||||
cameraStr
|
|
||||||
);
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (camera == null ||
|
if (camera == null || string.IsNullOrWhiteSpace(camera.mx_id))
|
||||||
string.IsNullOrWhiteSpace(camera.mx_id))
|
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
string imuStr =
|
string imuStr = RedisService.Get(RedisService.CamImuKey(camera.mx_id));
|
||||||
RedisService.Get(
|
|
||||||
RedisService.CamImuKey(camera.mx_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(imuStr))
|
if (!string.IsNullOrWhiteSpace(imuStr))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var imu =
|
var imu = JsonConvert.DeserializeObject<OAKImuModel>(imuStr, _jsonSettings);
|
||||||
JsonConvert.DeserializeObject<OAKImuModel>(
|
|
||||||
imuStr,
|
|
||||||
_jsonSettings
|
|
||||||
);
|
|
||||||
|
|
||||||
camera.imu = imu?.dados;
|
camera.imu = imu?.dados;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine(
|
Variaveis.MostrarLog("[CameraWorkerService.LerCameraDoRedis] Falha ao ler IMU da câmera " + camera.mx_id + ": " + ex.Message);
|
||||||
"[CameraWorkerService] Falha ao ler IMU da câmera " +
|
|
||||||
camera.mx_id + ": " + ex.Message
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return camera;
|
return camera;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<CameraWorkerItemModel>
|
private static List<CameraWorkerItemModel> CriarListaVaziaComPlaceholder()
|
||||||
CriarListaVaziaComPlaceholder()
|
|
||||||
{
|
{
|
||||||
return new List<CameraWorkerItemModel>
|
return new List<CameraWorkerItemModel>
|
||||||
{
|
{
|
||||||
|
|
@ -411,23 +363,16 @@ namespace AgroBase.Services.Operadores
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OrdenarCamerasMantendoPlaceholder(
|
private static void OrdenarCamerasMantendoPlaceholder(List<CameraWorkerItemModel> cameras)
|
||||||
List<CameraWorkerItemModel> cameras)
|
|
||||||
{
|
{
|
||||||
if (cameras == null || cameras.Count <= 1)
|
if (cameras == null || cameras.Count <= 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CameraWorkerItemModel placeholder =
|
CameraWorkerItemModel placeholder = cameras.FirstOrDefault(x => x.dispositivo == T_Code.Vzo && x.modelo == "Sem Video");
|
||||||
cameras.FirstOrDefault(
|
|
||||||
x => x.dispositivo == T_Code.Vzo &&
|
|
||||||
x.modelo == "Sem Video"
|
|
||||||
);
|
|
||||||
|
|
||||||
var reais =
|
var reais =
|
||||||
cameras
|
cameras
|
||||||
.Where(x =>
|
.Where(x => !(x.dispositivo == T_Code.Vzo && x.modelo == "Sem Video"))
|
||||||
!(x.dispositivo == T_Code.Vzo &&
|
|
||||||
x.modelo == "Sem Video"))
|
|
||||||
.OrderBy(PrioridadeCamera)
|
.OrderBy(PrioridadeCamera)
|
||||||
.ThenBy(x => x.mx_id)
|
.ThenBy(x => x.mx_id)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
using AgroBase.Models;
|
using AgroBase.Models;
|
||||||
using AgroBase.Models.Operadores;
|
using AgroBase.Models.Operadores;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using OpenHardwareMonitor.Hardware;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
@ -13,11 +12,10 @@ namespace AgroBase.Services.Operadores
|
||||||
{
|
{
|
||||||
public class HealthWorkerService : IWorkerModel
|
public class HealthWorkerService : IWorkerModel
|
||||||
{
|
{
|
||||||
public HealthWorkerModel DadosLeitura = new HealthWorkerModel();
|
public static HealthWorkerModel DadosLeitura = new HealthWorkerModel();
|
||||||
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
||||||
public static List<ManagerWorkerMessageResponseModulosPendentesModel> ModulosSaude = new List<ManagerWorkerMessageResponseModulosPendentesModel>();
|
|
||||||
|
|
||||||
private bool DebugMode = true;
|
private bool DebugMode = false;
|
||||||
//private static bool AtualizandoRedis = false;
|
//private static bool AtualizandoRedis = false;
|
||||||
|
|
||||||
public void MostrarLog(string message, int limite = 500)
|
public void MostrarLog(string message, int limite = 500)
|
||||||
|
|
@ -96,17 +94,18 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
private static void AtualizarDadosContextoLocal()
|
private static void AtualizarDadosContextoLocal()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
RedisService.AtualizarCampos(
|
RedisService.AtualizarCampos(
|
||||||
CtxKey.DadosOperacao,
|
CtxKey.DadosOperacao,
|
||||||
("debug_mode", Variaveis.DebugMode),
|
("debug_mode", Variaveis.DebugMode),
|
||||||
("iniciado", Variaveis.OperacaoEmAndamento.Iniciado),
|
("iniciado", op.Sensoriamento.Operacao?.OperacaoIniciada),
|
||||||
("finalizando", Variaveis.OperacaoEmAndamento.Finalizando),
|
("finalizando", op.Sensoriamento.Operacao.Finalizando),
|
||||||
("calibrando", Variaveis.OperacaoEmAndamento.Calibrando),
|
("calibrando", op.Sensoriamento.Operacao.Calibrando),
|
||||||
("simulando", Variaveis.OperacaoEmAndamento.Simulando),
|
("simulando", op.Simulando),
|
||||||
("emergencia", Variaveis.OperacaoEmAndamento.Emergencia),
|
("emergencia", op.Sensoriamento.Operacao.Emergencia),
|
||||||
("pausa", Variaveis.OperacaoEmAndamento.Pausa)
|
("pausa", op.Sensoriamento.Operacao.Pausa)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
@ -117,6 +116,8 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
public static void AtualizarDadosContexto()
|
public static void AtualizarDadosContexto()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//if (AtualizandoRedis)
|
//if (AtualizandoRedis)
|
||||||
|
|
@ -127,7 +128,7 @@ namespace AgroBase.Services.Operadores
|
||||||
AtualizarDadosModulos();
|
AtualizarDadosModulos();
|
||||||
AtualizarDadosControleOperacao();
|
AtualizarDadosControleOperacao();
|
||||||
|
|
||||||
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
var _Sensoriamento = op.Sensoriamento;
|
||||||
|
|
||||||
if (_Sensoriamento == null)
|
if (_Sensoriamento == null)
|
||||||
{
|
{
|
||||||
|
|
@ -142,23 +143,18 @@ namespace AgroBase.Services.Operadores
|
||||||
pontoComparar.idxPonto < _t.QtdPontos - 1 ? pontoComparar.idxPonto + 1 :
|
pontoComparar.idxPonto < _t.QtdPontos - 1 ? pontoComparar.idxPonto + 1 :
|
||||||
pontoComparar.idxPonto) : 0;
|
pontoComparar.idxPonto) : 0;
|
||||||
|
|
||||||
double velocidadeMs = Variaveis.OperacaoEmAndamento.Simulando
|
double velocidadeMs = op.Simulando
|
||||||
? FuncoesMatematicas.CalculaVelocidadeMsPercentual(Variaveis.OperacaoEmAndamento.Controle.RPM_SP)
|
? FuncoesMatematicas.CalculaVelocidadeMsPercentual(op.Controle.RPM_SP)
|
||||||
: (_Sensoriamento.Movimentacao?.VelocidadeMedia ?? 0.0);
|
: (_Sensoriamento.Movimentacao?.VelocidadeMediaMs ?? 0.0);
|
||||||
|
|
||||||
double percentualVelSp = Variaveis.OperacaoEmAndamento.Controle?.PercentualVelocidadeSP ?? 0.0;
|
double percentualVelSp = op.Controle?.PercentualVelocidadeSP ?? 0.0;
|
||||||
double rpmSp = Variaveis.OperacaoEmAndamento.Controle?.RPM_SP ?? 0.0;
|
double rpmSp = op.Controle?.RPM_SP ?? 0.0;
|
||||||
|
|
||||||
bool comandoMovimentoAtivo =
|
bool comandoMovimentoAtivo = percentualVelSp > 0.5 || rpmSp > 1.0;
|
||||||
percentualVelSp > 0.5 ||
|
|
||||||
rpmSp > 1.0;
|
|
||||||
|
|
||||||
bool velocidadeFisicaAtiva =
|
bool velocidadeFisicaAtiva = Math.Abs(velocidadeMs) > 0.03; // 3 cm/s, ajustável
|
||||||
Math.Abs(velocidadeMs) > 0.03; // 3 cm/s, ajustável
|
|
||||||
|
|
||||||
bool carroEmMovimento =
|
bool carroEmMovimento = comandoMovimentoAtivo && velocidadeFisicaAtiva;
|
||||||
comandoMovimentoAtivo &&
|
|
||||||
velocidadeFisicaAtiva;
|
|
||||||
|
|
||||||
RedisService.AtualizarCampos(
|
RedisService.AtualizarCampos(
|
||||||
CtxKey.DadosContexto,
|
CtxKey.DadosContexto,
|
||||||
|
|
@ -210,7 +206,7 @@ namespace AgroBase.Services.Operadores
|
||||||
),
|
),
|
||||||
("Atuador", new
|
("Atuador", new
|
||||||
{
|
{
|
||||||
pressao_linha_regular = _Sensoriamento.Atuador?.PressaoLinha >= ((Variaveis.OperacaoEmAndamento.Parametros.Controle?.AtuPressaoLinha ?? 0) - 20),
|
pressao_linha_regular = _Sensoriamento.Atuador?.PressaoLinha >= ((op.Parametros.Controle?.AtuPressaoLinha ?? 0) - 10),
|
||||||
pressao_linha = _Sensoriamento.Atuador?.PressaoLinha ?? 0,
|
pressao_linha = _Sensoriamento.Atuador?.PressaoLinha ?? 0,
|
||||||
potencia_bomba = _Sensoriamento.Atuador?.LeituraPotenciaBomba ?? 0,
|
potencia_bomba = _Sensoriamento.Atuador?.LeituraPotenciaBomba ?? 0,
|
||||||
estado_bomba = _Sensoriamento.Atuador?.LeituraComandoBomba ?? false,
|
estado_bomba = _Sensoriamento.Atuador?.LeituraComandoBomba ?? false,
|
||||||
|
|
@ -274,6 +270,8 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
public static void AtualizarDadosOperacao(bool forcar = false)
|
public static void AtualizarDadosOperacao(bool forcar = false)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//if (AtualizandoRedis && !forcar)
|
//if (AtualizandoRedis && !forcar)
|
||||||
|
|
@ -285,25 +283,25 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
AtualizarDadosEquipamento();
|
AtualizarDadosEquipamento();
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.DispMvd == null)
|
if (op.DispMvd == null)
|
||||||
{
|
{
|
||||||
//AtualizandoRedis = false;
|
//AtualizandoRedis = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var _Parametros = Variaveis.OperacaoEmAndamento.Parametros;
|
var _Parametros = op.Parametros;
|
||||||
var pControle = _Parametros.Controle;
|
var pControle = _Parametros.Controle;
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var _Controle = op.Controle;
|
||||||
|
|
||||||
RedisService.AtualizarCampos(
|
RedisService.AtualizarCampos(
|
||||||
CtxKey.DadosOperacao,
|
CtxKey.DadosOperacao,
|
||||||
("configurado", true),
|
("configurado", true),
|
||||||
("modo", Variaveis.OperacaoEmAndamento.Parametros?.Modo ?? ModoOperacao.NaoDefinido),
|
("modo", op.Parametros?.Modo ?? ModoOperacao.NaoDefinido),
|
||||||
("tempo_aguardar_inicio_operacao", Variaveis.OperacaoEmAndamento.TempoIniciarOperacao),
|
("tempo_aguardar_inicio_operacao", op.TempoIniciarOperacao),
|
||||||
("modulos_mandatorios", _Parametros.ModulosMandatorios.Where(x => x.Mandatorio && x.Utilizar).Select(x => (int)x.Dispositivo).ToArray()),
|
("modulos_mandatorios", _Parametros.ModulosMandatorios.Where(x => x.Mandatorio && x.Utilizar).Select(x => (int)x.Dispositivo).ToArray()),
|
||||||
("modulos_opcionais", _Parametros.ModulosMandatorios.Where(x => !x.Mandatorio && x.Utilizar).Select(x => (int)x.Dispositivo).ToArray()),
|
("modulos_opcionais", _Parametros.ModulosMandatorios.Where(x => !x.Mandatorio && x.Utilizar).Select(x => (int)x.Dispositivo).ToArray()),
|
||||||
("parametros_mandatorios", _Parametros.ParametrosMandatorios.Where(x => x.Mandatorio && x.Utilizar).Select(x => (int)x.Parametro).ToArray()),
|
("parametros_mandatorios", _Parametros.ParametrosMandatorios.Where(x => x.Mandatorio && x.Utilizar).Select(x => (int)x.Parametro).ToArray()),
|
||||||
("ponto_mapa_ref", Variaveis.OperacaoEmAndamento.Trajetoria?._TrajetoriaFixa?.Select(p => new double[] { p.Posicao.Latitude, p.Posicao.Longitude }).FirstOrDefault()),
|
("ponto_mapa_ref", op.Trajetoria?._TrajetoriaFixa?.Select(p => new double[] { p.Posicao.Latitude, p.Posicao.Longitude }).FirstOrDefault()),
|
||||||
("Mov", new
|
("Mov", new
|
||||||
{
|
{
|
||||||
percent_vel_max = pControle.MovVelocidadeSErvasPercent,
|
percent_vel_max = pControle.MovVelocidadeSErvasPercent,
|
||||||
|
|
@ -317,7 +315,7 @@ namespace AgroBase.Services.Operadores
|
||||||
tipo_controle = (int)pControle.DirTipoMovimento,
|
tipo_controle = (int)pControle.DirTipoMovimento,
|
||||||
mpc = new
|
mpc = new
|
||||||
{
|
{
|
||||||
pontos = Variaveis.OperacaoEmAndamento.Trajetoria?._TrajetoriaFixa?
|
pontos = op.Trajetoria?._TrajetoriaFixa?
|
||||||
.Select(p => new
|
.Select(p => new
|
||||||
{
|
{
|
||||||
lat = p.Posicao.Latitude,
|
lat = p.Posicao.Latitude,
|
||||||
|
|
@ -329,7 +327,7 @@ namespace AgroBase.Services.Operadores
|
||||||
angulo_max_graus = pControle.DirAnguloMaximo,
|
angulo_max_graus = pControle.DirAnguloMaximo,
|
||||||
velocidade_min = Math.Round(FuncoesMatematicas.CalculaVelocidadeMsPercentual(pControle.MovVelocidadeCErvasPercent), 4),
|
velocidade_min = Math.Round(FuncoesMatematicas.CalculaVelocidadeMsPercentual(pControle.MovVelocidadeCErvasPercent), 4),
|
||||||
velocidade_max = Math.Round(FuncoesMatematicas.CalculaVelocidadeMsPercentual(pControle.MovVelocidadeSErvasPercent), 4),
|
velocidade_max = Math.Round(FuncoesMatematicas.CalculaVelocidadeMsPercentual(pControle.MovVelocidadeSErvasPercent), 4),
|
||||||
tempo_entre_comandos = (Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == Enums.T_Code.Dir)?.DelayEnvioComando ?? 500) / 1000.0,
|
tempo_entre_comandos = (op.Controle.TiposControle.FirstOrDefault(x => x.Tipo == Enums.T_Code.Dir)?.DelayEnvioComando ?? 500) / 1000.0,
|
||||||
horizonte = pControle.MpcHorizonte,
|
horizonte = pControle.MpcHorizonte,
|
||||||
passos_atraso = 1,
|
passos_atraso = 1,
|
||||||
}
|
}
|
||||||
|
|
@ -355,7 +353,7 @@ namespace AgroBase.Services.Operadores
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
if ((Variaveis.OperacaoEmAndamento.Parametros?.ControleAutomatico ?? false) && (Variaveis.OperacaoEmAndamento.Trajetoria?._TrajetoriaFixa?.Any() ?? false))
|
if ((op.Parametros?.ControleAutomatico ?? false) && (op.Trajetoria?._TrajetoriaFixa?.Any() ?? false))
|
||||||
{
|
{
|
||||||
var comando = new
|
var comando = new
|
||||||
{
|
{
|
||||||
|
|
@ -411,13 +409,14 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
private static void AtualizarDadosModulos()
|
private static void AtualizarDadosModulos()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.DispMvd == null) return;
|
if (op.DispMvd == null) return;
|
||||||
if (Variaveis.OperacaoEmAndamento.DispAtu == null) return;
|
if (op.DispAtu == null) return;
|
||||||
if (Variaveis.OperacaoEmAndamento.DispSen == null) return;
|
if (op.DispSen == null) return;
|
||||||
|
|
||||||
var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento;
|
var _Sensoriamento = op.Sensoriamento;
|
||||||
var agora_dt = DateTime.Now;
|
var agora_dt = DateTime.Now;
|
||||||
var agora = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
var agora = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||||||
|
|
||||||
|
|
@ -434,7 +433,7 @@ namespace AgroBase.Services.Operadores
|
||||||
var dirAtivos = new List<int>();
|
var dirAtivos = new List<int>();
|
||||||
var movAtivos = new List<int>();
|
var movAtivos = new List<int>();
|
||||||
|
|
||||||
foreach (var mod in Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos)
|
foreach (var mod in op.DispMvd.Dados.Modulos)
|
||||||
{
|
{
|
||||||
double erroAnguloDir = Math.Abs(mod.DirMotor.AnguloLeitura - mod.DirMotor.Angulo_SP);
|
double erroAnguloDir = Math.Abs(mod.DirMotor.AnguloLeitura - mod.DirMotor.Angulo_SP);
|
||||||
|
|
||||||
|
|
@ -455,7 +454,7 @@ namespace AgroBase.Services.Operadores
|
||||||
($"{endereco_dir}.conectado", mod.DirMotor.Inicializado),
|
($"{endereco_dir}.conectado", mod.DirMotor.Inicializado),
|
||||||
|
|
||||||
// legado
|
// legado
|
||||||
($"{endereco_dir}.freq_base", Variaveis.OperacaoEmAndamento.DispMvd.Dados.tmrRegistradorDIR.IntervalHz),
|
($"{endereco_dir}.freq_base", op.DispMvd.Dados.tmrRegistradorDIR.IntervalHz),
|
||||||
|
|
||||||
($"{endereco_dir}.endereco", mod.DirMotor._EnderecoCAN_Tx),
|
($"{endereco_dir}.endereco", mod.DirMotor._EnderecoCAN_Tx),
|
||||||
($"{endereco_dir}.mod_id", mod.Modulo_ID),
|
($"{endereco_dir}.mod_id", mod.Modulo_ID),
|
||||||
|
|
@ -586,9 +585,8 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var DadosSen = Variaveis.OperacaoEmAndamento.DispSen.Dados;
|
var DadosSen = op.DispSen.Dados;
|
||||||
DateTime ultimaRespostaSen =
|
DateTime ultimaRespostaSen = DadosSen.DadosLeitura?.UltimoComandoRespondido ?? DateTime.MinValue;
|
||||||
DadosSen.DadosLeitura?.UltimoComandoRespondido ?? DateTime.MinValue;
|
|
||||||
|
|
||||||
double idadeUltimaRespostaSenMs =
|
double idadeUltimaRespostaSenMs =
|
||||||
ultimaRespostaSen == DateTime.MinValue
|
ultimaRespostaSen == DateTime.MinValue
|
||||||
|
|
@ -821,9 +819,8 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var DadosAtu = Variaveis.OperacaoEmAndamento.DispAtu.Dados;
|
var DadosAtu = op.DispAtu.Dados;
|
||||||
DateTime ultimaRespostaAtu =
|
DateTime ultimaRespostaAtu = DadosAtu.DadosLeitura?.UltimoComandoRespondido ?? DateTime.MinValue;
|
||||||
DadosAtu.DadosLeitura?.UltimoComandoRespondido ?? DateTime.MinValue;
|
|
||||||
|
|
||||||
double idadeUltimaRespostaAtuMs =
|
double idadeUltimaRespostaAtuMs =
|
||||||
ultimaRespostaAtu == DateTime.MinValue
|
ultimaRespostaAtu == DateTime.MinValue
|
||||||
|
|
@ -831,10 +828,10 @@ namespace AgroBase.Services.Operadores
|
||||||
: (agora_dt - ultimaRespostaAtu).TotalMilliseconds;
|
: (agora_dt - ultimaRespostaAtu).TotalMilliseconds;
|
||||||
|
|
||||||
bool pulverizadorAutomatico =
|
bool pulverizadorAutomatico =
|
||||||
Variaveis.OperacaoEmAndamento.Parametros?.Controle?.PulverizadorAutomatico ?? false;
|
op.Parametros?.Controle?.PulverizadorAutomatico ?? false;
|
||||||
|
|
||||||
double pressaoAlvo =
|
double pressaoAlvo =
|
||||||
Variaveis.OperacaoEmAndamento.Parametros?.Controle?.AtuPressaoLinha ?? 0;
|
op.Parametros?.Controle?.AtuPressaoLinha ?? 0;
|
||||||
|
|
||||||
double pressaoLinha =
|
double pressaoLinha =
|
||||||
DadosAtu.PressaoLinha;
|
DadosAtu.PressaoLinha;
|
||||||
|
|
@ -853,11 +850,11 @@ namespace AgroBase.Services.Operadores
|
||||||
("pulverizador_automatico", pulverizadorAutomatico),
|
("pulverizador_automatico", pulverizadorAutomatico),
|
||||||
("pulverizador_liberado", DadosAtu.ContadorCarga.PulverizadorLiberado),
|
("pulverizador_liberado", DadosAtu.ContadorCarga.PulverizadorLiberado),
|
||||||
|
|
||||||
("operacao_iniciada", Variaveis.OperacaoEmAndamento.Iniciado),
|
("operacao_iniciada", op.Sensoriamento.Operacao.OperacaoIniciada),
|
||||||
("calibrando", Variaveis.OperacaoEmAndamento.Calibrando),
|
("calibrando", op.Sensoriamento.Operacao.Calibrando),
|
||||||
("pausa", Variaveis.OperacaoEmAndamento.Pausa),
|
("pausa", op.Sensoriamento.Operacao.Pausa),
|
||||||
("emergencia", Variaveis.OperacaoEmAndamento.Emergencia),
|
("emergencia", op.Sensoriamento.Operacao.Emergencia),
|
||||||
("finalizando", Variaveis.OperacaoEmAndamento.Finalizando),
|
("finalizando", op.Sensoriamento.Operacao.Finalizando),
|
||||||
|
|
||||||
("percentual_reservatorio", DadosAtu.ContadorCarga.PercentualAtual),
|
("percentual_reservatorio", DadosAtu.ContadorCarga.PercentualAtual),
|
||||||
("pressao_linha", pressaoLinha),
|
("pressao_linha", pressaoLinha),
|
||||||
|
|
@ -1073,16 +1070,16 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var DadosLra = Variaveis.LoraService;
|
//var DadosLra = Variaveis.LoraService;
|
||||||
RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Lra),
|
//RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Lra),
|
||||||
("timestamp", agora),
|
// ("timestamp", agora),
|
||||||
("conectado", DadosLra.Conectado),
|
// ("conectado", DadosLra.Conectado),
|
||||||
("configurado", DadosLra.Configurado),
|
// ("configurado", DadosLra.Configurado),
|
||||||
("tempo_base_tx", DadosLra.TempoEnvioDadosBase / 1000.0),
|
// ("tempo_base_tx", DadosLra.TempoEnvioDadosBase / 1000.0),
|
||||||
("tempo_base_rx", VariaveisEquipamento.TempoEntrePingsConexao / 1000.0),
|
// ("tempo_base_rx", VariaveisEquipamento.TempoEntrePingsConexao / 1000.0),
|
||||||
("last_tx", DadosLra.UltimoTxDados),
|
// ("last_tx", DadosLra.UltimoTxDados),
|
||||||
("last_rx", DadosLra.UltimoRxDados)
|
// ("last_rx", DadosLra.UltimoRxDados)
|
||||||
);
|
//);
|
||||||
|
|
||||||
var DadosMod = _Sensoriamento.DadosPerformance;
|
var DadosMod = _Sensoriamento.DadosPerformance;
|
||||||
RedisService.AtualizarCampos(
|
RedisService.AtualizarCampos(
|
||||||
|
|
@ -1090,7 +1087,7 @@ namespace AgroBase.Services.Operadores
|
||||||
// Base / sincronismo
|
// Base / sincronismo
|
||||||
("timestamp", agora),
|
("timestamp", agora),
|
||||||
("timestamp_unix_ms", DadosMod.TimestampUnixMs),
|
("timestamp_unix_ms", DadosMod.TimestampUnixMs),
|
||||||
("freq_base", 1.0 / Variaveis.OperacaoEmAndamento.tmrLeiturasInterval),
|
("freq_base", 1.0 / op.tmrLeiturasInterval),
|
||||||
|
|
||||||
// CPU
|
// CPU
|
||||||
("cpu_load_percent", DadosMod.CPU_load_percent ?? 0),
|
("cpu_load_percent", DadosMod.CPU_load_percent ?? 0),
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ namespace AgroBase.Services.Operadores
|
||||||
public ManagerWorkerModel DadosLeitura = new ManagerWorkerModel();
|
public ManagerWorkerModel DadosLeitura = new ManagerWorkerModel();
|
||||||
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
||||||
|
|
||||||
private bool DebugMode = true;
|
private bool DebugMode = false;
|
||||||
|
|
||||||
public void MostrarLog(string message, int limite = 500)
|
public void MostrarLog(string message, int limite = 500)
|
||||||
{
|
{
|
||||||
|
|
@ -76,6 +76,8 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
public void RedisCallback(string mensagem)
|
public void RedisCallback(string mensagem)
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var comando = JsonConvert.DeserializeObject<ComandoRedis>(mensagem);
|
var comando = JsonConvert.DeserializeObject<ComandoRedis>(mensagem);
|
||||||
|
|
@ -91,7 +93,7 @@ namespace AgroBase.Services.Operadores
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ManagerWorkerCommandType.EnviarDadosControle:
|
case ManagerWorkerCommandType.EnviarDadosControle:
|
||||||
if (Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico || Variaveis.OperacaoEmAndamento.Parametros.Controle.DirecionalAutomatico)
|
if (op.Parametros.Controle.MovimentoAutomatico || op.Parametros.Controle.DirecionalAutomatico)
|
||||||
{
|
{
|
||||||
AtualizarControle(comando.@params);
|
AtualizarControle(comando.@params);
|
||||||
}
|
}
|
||||||
|
|
@ -100,7 +102,7 @@ namespace AgroBase.Services.Operadores
|
||||||
case ManagerWorkerCommandType.FinalizarOperacao:
|
case ManagerWorkerCommandType.FinalizarOperacao:
|
||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
await op.FinalizarOperacao();
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -279,8 +281,10 @@ namespace AgroBase.Services.Operadores
|
||||||
if (novoComando == null)
|
if (novoComando == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
|
|
||||||
|
var _Controle = op.Controle;
|
||||||
|
var pControle = op.Parametros.Controle;
|
||||||
|
|
||||||
if (_Controle == null || pControle == null)
|
if (_Controle == null || pControle == null)
|
||||||
return;
|
return;
|
||||||
|
|
@ -318,10 +322,7 @@ namespace AgroBase.Services.Operadores
|
||||||
_Controle.PercentualVelocidadeSP = novoComando.percentual_velocidade;
|
_Controle.PercentualVelocidadeSP = novoComando.percentual_velocidade;
|
||||||
_Controle.EmFreio = pControle.FrenagemAutomaticaAoParar && novoComando.em_freio;
|
_Controle.EmFreio = pControle.FrenagemAutomaticaAoParar && novoComando.em_freio;
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(
|
op.AtualizarDadosControle(false, new List<T_Code>() { T_Code.Mov });
|
||||||
false,
|
|
||||||
new List<T_Code>() { T_Code.Mov }
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (podeAtualizarDirecional && (direcionalMudou || forcarAplicacao))
|
if (podeAtualizarDirecional && (direcionalMudou || forcarAplicacao))
|
||||||
|
|
@ -357,10 +358,7 @@ namespace AgroBase.Services.Operadores
|
||||||
novoComando.debug_custo ??
|
novoComando.debug_custo ??
|
||||||
new Dictionary<string, ManagerWorkerMessageResponseDebugCustoModel>();
|
new Dictionary<string, ManagerWorkerMessageResponseDebugCustoModel>();
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(
|
op.AtualizarDadosControle(false, new List<T_Code>() { T_Code.Dir });
|
||||||
false,
|
|
||||||
new List<T_Code>() { T_Code.Dir }
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,8 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
private async Task tmrHearthbeat_Tick()
|
private async Task tmrHearthbeat_Tick()
|
||||||
{
|
{
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
Conectado = false;
|
Conectado = false;
|
||||||
foreach (var worker in Workers)
|
foreach (var worker in Workers)
|
||||||
{
|
{
|
||||||
|
|
@ -79,7 +81,7 @@ namespace AgroBase.Services.Operadores
|
||||||
if (!Conectado)
|
if (!Conectado)
|
||||||
{
|
{
|
||||||
TempoDesconectado++;
|
TempoDesconectado++;
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado && (Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico || Variaveis.OperacaoEmAndamento.Parametros.Controle.DirecionalAutomatico))
|
if (op.Sensoriamento.Operacao.OperacaoIniciada && (op.Parametros.Controle.MovimentoAutomatico || op.Parametros.Controle.DirecionalAutomatico))
|
||||||
{
|
{
|
||||||
RedisService.AtualizarCampos(
|
RedisService.AtualizarCampos(
|
||||||
CtxKey.DadosOperacao,
|
CtxKey.DadosOperacao,
|
||||||
|
|
@ -88,8 +90,8 @@ namespace AgroBase.Services.Operadores
|
||||||
("configurado", false)
|
("configurado", false)
|
||||||
);
|
);
|
||||||
|
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var _Controle = op.Controle;
|
||||||
if (Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico)
|
if (op.Parametros.Controle.MovimentoAutomatico)
|
||||||
{
|
{
|
||||||
if (_Controle.PercentualVelocidadeSP > 0)
|
if (_Controle.PercentualVelocidadeSP > 0)
|
||||||
{
|
{
|
||||||
|
|
@ -101,7 +103,7 @@ namespace AgroBase.Services.Operadores
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Parametros.Controle.DirecionalAutomatico)
|
if (op.Parametros.Controle.DirecionalAutomatico)
|
||||||
{
|
{
|
||||||
if (_Controle.Angulo != 0)
|
if (_Controle.Angulo != 0)
|
||||||
{
|
{
|
||||||
|
|
@ -113,7 +115,7 @@ namespace AgroBase.Services.Operadores
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Parametros.Controle.PulverizadorAutomatico)
|
if (op.Parametros.Controle.PulverizadorAutomatico)
|
||||||
{
|
{
|
||||||
if (_Controle.Bicos.Any(x => x.ComandoAtuar))
|
if (_Controle.Bicos.Any(x => x.ComandoAtuar))
|
||||||
{
|
{
|
||||||
|
|
@ -125,7 +127,7 @@ namespace AgroBase.Services.Operadores
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.AtualizaInformacoesControleOperacao();
|
op.AtualizaInformacoesControleOperacao();
|
||||||
}
|
}
|
||||||
|
|
||||||
RedisService.DefinirEquipamentoDesconectado();
|
RedisService.DefinirEquipamentoDesconectado();
|
||||||
|
|
@ -140,7 +142,7 @@ namespace AgroBase.Services.Operadores
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TempoDesconectado = 0;
|
TempoDesconectado = 0;
|
||||||
if (!Variaveis.OperacaoEmAndamento.OperacaoConfigurada)
|
if (!op.Sensoriamento.Operacao.OperacaoConfigurada)
|
||||||
{
|
{
|
||||||
HealthWorkerService.AtualizarDadosOperacao(true);
|
HealthWorkerService.AtualizarDadosOperacao(true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ namespace AgroBase.Services.Operadores
|
||||||
public static VisualWorkerModel DadosLeitura = new VisualWorkerModel();
|
public static VisualWorkerModel DadosLeitura = new VisualWorkerModel();
|
||||||
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
||||||
|
|
||||||
private bool DebugMode = true;
|
private bool DebugMode = false;
|
||||||
|
|
||||||
private static double _lastTsSegmentacao = -1;
|
private static double _lastTsSegmentacao = -1;
|
||||||
private static double _lastTsDeteccao = -1;
|
private static double _lastTsDeteccao = -1;
|
||||||
|
|
@ -148,10 +148,7 @@ namespace AgroBase.Services.Operadores
|
||||||
{
|
{
|
||||||
AtualizarImu();
|
AtualizarImu();
|
||||||
|
|
||||||
DadosLeitura.Status =
|
DadosLeitura.Status = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude?.ModulosSaude?.FirstOrDefault(x => x.modulo == Enums.T_Code.Snr)?.status ?? Enums.StatusModulo.Desconectado;
|
||||||
HealthWorkerService.ModulosSaude
|
|
||||||
.FirstOrDefault(x => x.modulo == Enums.T_Code.Snr)?.status
|
|
||||||
?? Enums.StatusModulo.Desconectado;
|
|
||||||
|
|
||||||
string json = RedisService.Get(CtxKey.DadosVisualWorker);
|
string json = RedisService.Get(CtxKey.DadosVisualWorker);
|
||||||
|
|
||||||
|
|
@ -170,20 +167,11 @@ namespace AgroBase.Services.Operadores
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
double tsAnalise =
|
double tsAnalise = root["ts_analise"]?.Value<double>() ?? 0.0;
|
||||||
root["ts_analise"]?.Value<double>() ?? 0.0;
|
double tsSegmentacao = root["ts_segmentacao"]?.Value<double>() ?? 0.0;
|
||||||
|
double tsDeteccao = root["ts_deteccao"]?.Value<double>() ?? 0.0;
|
||||||
double tsSegmentacao =
|
double tsMatriz = root["ts_matriz_confianca"]?.Value<double>() ?? 0.0;
|
||||||
root["ts_segmentacao"]?.Value<double>() ?? 0.0;
|
double tsPerformance = root["ts_performance_visual"]?.Value<double>() ?? 0.0;
|
||||||
|
|
||||||
double tsDeteccao =
|
|
||||||
root["ts_deteccao"]?.Value<double>() ?? 0.0;
|
|
||||||
|
|
||||||
double tsMatriz =
|
|
||||||
root["ts_matriz_confianca"]?.Value<double>() ?? 0.0;
|
|
||||||
|
|
||||||
double tsPerformance =
|
|
||||||
root["ts_performance_visual"]?.Value<double>() ?? 0.0;
|
|
||||||
|
|
||||||
DadosLeitura.Timestamps.analise = tsAnalise;
|
DadosLeitura.Timestamps.analise = tsAnalise;
|
||||||
DadosLeitura.Timestamps.segmentacao = tsSegmentacao;
|
DadosLeitura.Timestamps.segmentacao = tsSegmentacao;
|
||||||
|
|
@ -193,24 +181,18 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
if (tsAnalise > 0)
|
if (tsAnalise > 0)
|
||||||
{
|
{
|
||||||
DadosLeitura.Analises.timestamp =
|
DadosLeitura.Analises.timestamp = FuncoesGlobais.UnixToDateTime(tsAnalise.ToString(System.Globalization.CultureInfo.InvariantCulture));
|
||||||
FuncoesGlobais.UnixToDateTime(tsAnalise.ToString(
|
|
||||||
System.Globalization.CultureInfo.InvariantCulture
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsSegmentacao > 0 &&
|
if (tsSegmentacao > 0 && tsSegmentacao != _lastTsSegmentacao)
|
||||||
tsSegmentacao != _lastTsSegmentacao)
|
|
||||||
{
|
{
|
||||||
var token = root["segmentacao"];
|
var token = root["segmentacao"];
|
||||||
|
|
||||||
if (token != null &&
|
if (token != null && token.Type != JTokenType.Null)
|
||||||
token.Type != JTokenType.Null)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var model =
|
var model = token.ToObject<VisualWorkerMessageSegmentacaoSemanticaModel>();
|
||||||
token.ToObject<VisualWorkerMessageSegmentacaoSemanticaModel>();
|
|
||||||
|
|
||||||
if (model != null)
|
if (model != null)
|
||||||
DadosLeitura.Analises.segmentacao = model;
|
DadosLeitura.Analises.segmentacao = model;
|
||||||
|
|
@ -224,21 +206,17 @@ namespace AgroBase.Services.Operadores
|
||||||
_lastTsSegmentacao = tsSegmentacao;
|
_lastTsSegmentacao = tsSegmentacao;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsDeteccao > 0 &&
|
if (tsDeteccao > 0 && tsDeteccao != _lastTsDeteccao)
|
||||||
tsDeteccao != _lastTsDeteccao)
|
|
||||||
{
|
{
|
||||||
var token = root["deteccao"];
|
var token = root["deteccao"];
|
||||||
|
|
||||||
if (token != null &&
|
if (token != null && token.Type != JTokenType.Null)
|
||||||
token.Type != JTokenType.Null)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var model =
|
var model = token.ToObject<List<VisualWorkerMessageDeteccaoModel>>();
|
||||||
token.ToObject<List<VisualWorkerMessageDeteccaoModel>>();
|
|
||||||
|
|
||||||
DadosLeitura.Analises.deteccao =
|
DadosLeitura.Analises.deteccao = model ?? new List<VisualWorkerMessageDeteccaoModel>();
|
||||||
model ?? new List<VisualWorkerMessageDeteccaoModel>();
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|
@ -249,18 +227,15 @@ namespace AgroBase.Services.Operadores
|
||||||
_lastTsDeteccao = tsDeteccao;
|
_lastTsDeteccao = tsDeteccao;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsMatriz > 0 &&
|
if (tsMatriz > 0 && tsMatriz != _lastTsMatrizConfianca)
|
||||||
tsMatriz != _lastTsMatrizConfianca)
|
|
||||||
{
|
{
|
||||||
var token = root["matriz_confianca"];
|
var token = root["matriz_confianca"];
|
||||||
|
|
||||||
if (token != null &&
|
if (token != null && token.Type != JTokenType.Null)
|
||||||
token.Type != JTokenType.Null)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var model =
|
var model = token.ToObject<VisualWorkerMessageMatrizConfiancaModel>();
|
||||||
token.ToObject<VisualWorkerMessageMatrizConfiancaModel>();
|
|
||||||
|
|
||||||
if (model != null)
|
if (model != null)
|
||||||
DadosLeitura.Analises.matriz_confianca = model;
|
DadosLeitura.Analises.matriz_confianca = model;
|
||||||
|
|
@ -274,18 +249,15 @@ namespace AgroBase.Services.Operadores
|
||||||
_lastTsMatrizConfianca = tsMatriz;
|
_lastTsMatrizConfianca = tsMatriz;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsPerformance > 0 &&
|
if (tsPerformance > 0 && tsPerformance != _lastTsPerformanceVisual)
|
||||||
tsPerformance != _lastTsPerformanceVisual)
|
|
||||||
{
|
{
|
||||||
var token = root["performance_visual"];
|
var token = root["performance_visual"];
|
||||||
|
|
||||||
if (token != null &&
|
if (token != null && token.Type != JTokenType.Null)
|
||||||
token.Type != JTokenType.Null)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var model =
|
var model = token.ToObject<VisualWorkerPerformanceModel>();
|
||||||
token.ToObject<VisualWorkerPerformanceModel>();
|
|
||||||
|
|
||||||
if (model != null)
|
if (model != null)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ namespace AgroBase.Services.Operadores
|
||||||
public static WeedWorkerModel DadosLeitura = new WeedWorkerModel();
|
public static WeedWorkerModel DadosLeitura = new WeedWorkerModel();
|
||||||
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
||||||
|
|
||||||
private bool DebugMode = true;
|
private bool DebugMode = false;
|
||||||
|
|
||||||
private static double _lastTsAnaliseWeed = -1;
|
private static double _lastTsAnaliseWeed = -1;
|
||||||
private static double _lastTsPerformanceWeed = -1;
|
private static double _lastTsPerformanceWeed = -1;
|
||||||
|
|
@ -54,6 +54,8 @@ namespace AgroBase.Services.Operadores
|
||||||
if (dictParams == null)
|
if (dictParams == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var op = Variaveis.OperacaoEmAndamento;
|
||||||
|
|
||||||
var novoComando = dictParams
|
var novoComando = dictParams
|
||||||
.Select(kv => new
|
.Select(kv => new
|
||||||
{
|
{
|
||||||
|
|
@ -64,21 +66,21 @@ namespace AgroBase.Services.Operadores
|
||||||
.ToDictionary(x => x.Key, x => x.Value);
|
.ToDictionary(x => x.Key, x => x.Value);
|
||||||
|
|
||||||
bool comandoMudou = false;
|
bool comandoMudou = false;
|
||||||
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
|
var _Controle = op.Controle;
|
||||||
foreach (var bico in _Controle.Bicos ?? new List<Models.Modules.AtuadorBicoModel>())
|
foreach (var bico in _Controle.Bicos ?? new List<Models.Modules.AtuadorBicoModel>())
|
||||||
{
|
{
|
||||||
novoComando.TryGetValue(bico.Posicao, out bool atuado);
|
novoComando.TryGetValue(bico.Posicao, out bool atuado);
|
||||||
if (!(Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga?.PulverizadorLiberado ?? false)) atuado = false;
|
if (!(op.DispAtu?.Dados?.ContadorCarga?.PulverizadorLiberado ?? false)) atuado = false;
|
||||||
if (!comandoMudou) comandoMudou = atuado != bico.ComandoAtuar;
|
if (!comandoMudou) comandoMudou = atuado != bico.ComandoAtuar;
|
||||||
bico.ComandoAtuar = atuado;
|
bico.ComandoAtuar = atuado;
|
||||||
}
|
}
|
||||||
if (comandoMudou)
|
if (comandoMudou)
|
||||||
{
|
{
|
||||||
Variaveis.MostrarLog("[WeedWorkerService] [AtualizarControle] Comando dos bicos alterado: " + JsonConvert.SerializeObject(novoComando));
|
Variaveis.MostrarLog("[WeedWorkerService] [AtualizarControle] Comando dos bicos alterado: " + JsonConvert.SerializeObject(novoComando));
|
||||||
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
|
var pControle = op.Parametros.Controle;
|
||||||
if (pControle.PulverizadorAutomatico)
|
if (pControle.PulverizadorAutomatico)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(false, new List<T_Code>() { T_Code.Atu });
|
op.AtualizarDadosControle(false, new List<T_Code>() { T_Code.Atu });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -189,37 +191,27 @@ namespace AgroBase.Services.Operadores
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine(
|
Variaveis.MostrarLog($"[WeedWorkerService.AtualizarAnalise] Erro ao interpretar DadosWeedWorker: {ex.Message}");
|
||||||
$"Erro ao interpretar DadosWeedWorker: {ex.Message}"
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
double tsAnalise =
|
double tsAnalise = root["ts_analise"]?.Value<double>() ?? 0.0;
|
||||||
root["ts_analise"]?.Value<double>() ?? 0.0;
|
double tsAnaliseWeed = root["ts_analise_weed"]?.Value<double>() ?? 0.0;
|
||||||
|
double tsPerformance = root["ts_performance_weed"]?.Value<double>() ?? 0.0;
|
||||||
double tsAnaliseWeed =
|
|
||||||
root["ts_analise_weed"]?.Value<double>() ?? 0.0;
|
|
||||||
|
|
||||||
double tsPerformance =
|
|
||||||
root["ts_performance_weed"]?.Value<double>() ?? 0.0;
|
|
||||||
|
|
||||||
DadosLeitura.Timestamps.analise = tsAnalise;
|
DadosLeitura.Timestamps.analise = tsAnalise;
|
||||||
DadosLeitura.Timestamps.analise_weed = tsAnaliseWeed;
|
DadosLeitura.Timestamps.analise_weed = tsAnaliseWeed;
|
||||||
DadosLeitura.Timestamps.performance_weed = tsPerformance;
|
DadosLeitura.Timestamps.performance_weed = tsPerformance;
|
||||||
|
|
||||||
if (tsAnaliseWeed > 0 &&
|
if (tsAnaliseWeed > 0 && tsAnaliseWeed != _lastTsAnaliseWeed)
|
||||||
tsAnaliseWeed != _lastTsAnaliseWeed)
|
|
||||||
{
|
{
|
||||||
JToken envelopeToken = root["analise"];
|
JToken envelopeToken = root["analise"];
|
||||||
|
|
||||||
if (envelopeToken != null &&
|
if (envelopeToken != null && envelopeToken.Type != JTokenType.Null)
|
||||||
envelopeToken.Type != JTokenType.Null)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var envelope =
|
var envelope = envelopeToken.ToObject<WeedWorkerAnaliseEnvelopeModel>();
|
||||||
envelopeToken.ToObject<WeedWorkerAnaliseEnvelopeModel>();
|
|
||||||
|
|
||||||
if (envelope != null)
|
if (envelope != null)
|
||||||
{
|
{
|
||||||
|
|
@ -233,33 +225,27 @@ namespace AgroBase.Services.Operadores
|
||||||
infer_gpu_ms = envelope.infer_gpu_ms
|
infer_gpu_ms = envelope.infer_gpu_ms
|
||||||
};
|
};
|
||||||
|
|
||||||
DadosLeitura.Analise =
|
DadosLeitura.Analise = envelope.analise ?? new WeedWorkerAnaliseModel();
|
||||||
envelope.analise ?? new WeedWorkerAnaliseModel();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine(
|
Variaveis.MostrarLog($"[WeedWorkerService.AtualizarAnalise] Erro ao desserializar análise de ervas: {ex.Message}");
|
||||||
$"Erro ao desserializar análise de ervas: {ex.Message}"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_lastTsAnaliseWeed = tsAnaliseWeed;
|
_lastTsAnaliseWeed = tsAnaliseWeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsPerformance > 0 &&
|
if (tsPerformance > 0 && tsPerformance != _lastTsPerformanceWeed)
|
||||||
tsPerformance != _lastTsPerformanceWeed)
|
|
||||||
{
|
{
|
||||||
JToken performanceToken = root["performance_weed"];
|
JToken performanceToken = root["performance_weed"];
|
||||||
|
|
||||||
if (performanceToken != null &&
|
if (performanceToken != null && performanceToken.Type != JTokenType.Null)
|
||||||
performanceToken.Type != JTokenType.Null)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var performance =
|
var performance = performanceToken.ToObject<WeedWorkerPerformanceModel>();
|
||||||
performanceToken.ToObject<WeedWorkerPerformanceModel>();
|
|
||||||
|
|
||||||
if (performance != null)
|
if (performance != null)
|
||||||
{
|
{
|
||||||
|
|
@ -269,9 +255,7 @@ namespace AgroBase.Services.Operadores
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine(
|
Variaveis.MostrarLog($"[WeedWorkerService.AtualizarAnalise] Erro ao desserializar performance weed: {ex.Message}");
|
||||||
$"Erro ao desserializar performance weed: {ex.Message}"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -297,8 +281,7 @@ namespace AgroBase.Services.Operadores
|
||||||
|
|
||||||
JToken imuToken = root["imu"];
|
JToken imuToken = root["imu"];
|
||||||
|
|
||||||
if (imuToken == null ||
|
if (imuToken == null || imuToken.Type == JTokenType.Null)
|
||||||
imuToken.Type == JTokenType.Null)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var imu = imuToken.ToObject<OAKImuModel>();
|
var imu = imuToken.ToObject<OAKImuModel>();
|
||||||
|
|
@ -317,36 +300,15 @@ namespace AgroBase.Services.Operadores
|
||||||
{
|
{
|
||||||
RedisService.AtualizarCampos(
|
RedisService.AtualizarCampos(
|
||||||
CtxKey.DadosWeedWorker,
|
CtxKey.DadosWeedWorker,
|
||||||
|
|
||||||
("analise.analise.ervas_no_radar", false),
|
("analise.analise.ervas_no_radar", false),
|
||||||
|
("analise.analise.controle", new Dictionary<string, bool>(Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.ToDictionary(x => x.Posicao.ToString(), x => false))),
|
||||||
("analise.analise.controle",
|
("analise.analise.estatisticas", new WeedWorkerAnaliseEstatisticasModel()),
|
||||||
new Dictionary<string, bool>(
|
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.DispAtu
|
|
||||||
.Dados
|
|
||||||
.BicosPulverizadores
|
|
||||||
.ToDictionary(
|
|
||||||
x => x.Posicao.ToString(),
|
|
||||||
x => false
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
("analise.analise.estatisticas",
|
|
||||||
new WeedWorkerAnaliseEstatisticasModel()
|
|
||||||
),
|
|
||||||
|
|
||||||
("ts_analise_weed", 0.0)
|
("ts_analise_weed", 0.0)
|
||||||
);
|
);
|
||||||
|
|
||||||
_lastTsAnaliseWeed = -1;
|
_lastTsAnaliseWeed = -1;
|
||||||
|
DadosLeitura.Analise = new WeedWorkerAnaliseModel();
|
||||||
DadosLeitura.Analise =
|
DadosLeitura.MetricasAnalise = new WeedWorkerAnaliseMetricasModel();
|
||||||
new WeedWorkerAnaliseModel();
|
|
||||||
|
|
||||||
DadosLeitura.MetricasAnalise =
|
|
||||||
new WeedWorkerAnaliseMetricasModel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
using AgroBase.Models.Operadores;
|
using AgroBase.Models;
|
||||||
using AgroBase.Services.Operadores;
|
using AgroBase.Models.Operadores;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using StackExchange.Redis;
|
using StackExchange.Redis;
|
||||||
|
|
@ -157,13 +157,14 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
public static void DefinirEquipamentoDesconectado()
|
public static void DefinirEquipamentoDesconectado()
|
||||||
{
|
{
|
||||||
|
var saude = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude?.ModulosSaude;
|
||||||
AtualizarCampos(
|
AtualizarCampos(
|
||||||
CtxKey.DadosOperacao,
|
CtxKey.DadosOperacao,
|
||||||
("motivo_nao_liberado", "Sem comunicação com o núcleo de processamento central"),
|
("motivo_nao_liberado", "Sem comunicação com o núcleo de processamento central"),
|
||||||
("liberado", false),
|
("liberado", false),
|
||||||
("configurado", false)
|
("configurado", false)
|
||||||
);
|
);
|
||||||
foreach (var Mod in HealthWorkerService.ModulosSaude)
|
foreach (var Mod in saude)
|
||||||
{
|
{
|
||||||
Mod.conectado = false;
|
Mod.conectado = false;
|
||||||
Mod.saude = 0;
|
Mod.saude = 0;
|
||||||
|
|
@ -177,7 +178,7 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
AtualizarCampos(
|
AtualizarCampos(
|
||||||
CtxKey.DadosOperacao,
|
CtxKey.DadosOperacao,
|
||||||
("status_modulos", HealthWorkerService.ModulosSaude)
|
("status_modulos", saude)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -850,43 +850,30 @@ namespace AgroBase.Services
|
||||||
// DETECÇÃO DE DISPOSITIVOS
|
// DETECÇÃO DE DISPOSITIVOS
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|
||||||
private static async Task<bool> ProcurarDispositivosCAN(
|
private static async Task<bool> ProcurarDispositivosCAN(SerialPort porta = null, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
SerialPort porta = null,
|
|
||||||
CancellationToken cancellationToken =
|
|
||||||
default(CancellationToken))
|
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
string name =
|
string name = porta?.PortName ?? CanManager.CanService._portName ?? "CAN";
|
||||||
porta?.PortName ??
|
|
||||||
CanManager.CanService._portName ??
|
|
||||||
"CAN";
|
|
||||||
|
|
||||||
AtualizarConsole(
|
AtualizarConsole(name + " - Procurando dispositivos no barramento CAN");
|
||||||
name +
|
|
||||||
" - Procurando dispositivos no barramento CAN"
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Uma candidata que não é CAN é simplesmente ignorada.
|
* Uma candidata que não é CAN é simplesmente ignorada.
|
||||||
* Nunca removemos mapeamentos CAN por causa desse teste.
|
* Nunca removemos mapeamentos CAN por causa desse teste.
|
||||||
*/
|
*/
|
||||||
if (porta != null &&
|
if (porta != null && !CanManager.CanService.PortaIsCan(porta))
|
||||||
!CanManager.CanService.PortaIsCan(porta))
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CanManager.CanService.Iniciado)
|
if (!CanManager.CanService.Iniciado)
|
||||||
{
|
{
|
||||||
bool initialized =
|
bool initialized = CanManager.CanService.Inicializar(250);
|
||||||
CanManager.CanService.Inicializar(250);
|
|
||||||
|
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
{
|
{
|
||||||
AtualizarConsole(
|
AtualizarConsole("Adaptador " + name + " não conectado!");
|
||||||
"Adaptador " + name + " não conectado!"
|
|
||||||
);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -894,22 +881,11 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.DispSen != null &&
|
if (Variaveis.OperacaoEmAndamento.DispSen != null && !Variaveis.OperacaoEmAndamento.DispSen.Dados.Conectado)
|
||||||
!Variaveis.OperacaoEmAndamento
|
|
||||||
.DispSen
|
|
||||||
.Dados
|
|
||||||
.Conectado)
|
|
||||||
{
|
{
|
||||||
AtualizarConsole(
|
AtualizarConsole(name + " - Procurando dispositivo SEN");
|
||||||
name + " - Procurando dispositivo SEN"
|
|
||||||
);
|
|
||||||
|
|
||||||
bool found =
|
bool found = await Variaveis.OperacaoEmAndamento.DispSen.Dados.VerificaDispositivoConectado().ConfigureAwait(false);
|
||||||
await Variaveis.OperacaoEmAndamento
|
|
||||||
.DispSen
|
|
||||||
.Dados
|
|
||||||
.VerificaDispositivoConectado()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
AtualizarConsole("Dispositivo SEN encontrado");
|
AtualizarConsole("Dispositivo SEN encontrado");
|
||||||
|
|
@ -917,22 +893,11 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.DispAtu != null &&
|
if (Variaveis.OperacaoEmAndamento.DispAtu != null && !Variaveis.OperacaoEmAndamento.DispAtu.Dados.Conectado)
|
||||||
!Variaveis.OperacaoEmAndamento
|
|
||||||
.DispAtu
|
|
||||||
.Dados
|
|
||||||
.Conectado)
|
|
||||||
{
|
{
|
||||||
AtualizarConsole(
|
AtualizarConsole(name + " - Procurando dispositivo ATU");
|
||||||
name + " - Procurando dispositivo ATU"
|
|
||||||
);
|
|
||||||
|
|
||||||
bool found =
|
bool found = await Variaveis.OperacaoEmAndamento.DispAtu.Dados.VerificaDispositivoConectado().ConfigureAwait(false);
|
||||||
await Variaveis.OperacaoEmAndamento
|
|
||||||
.DispAtu
|
|
||||||
.Dados
|
|
||||||
.VerificaDispositivoConectado()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
AtualizarConsole("Dispositivo ATU encontrado");
|
AtualizarConsole("Dispositivo ATU encontrado");
|
||||||
|
|
@ -940,30 +905,17 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
int expectedModules =
|
int expectedModules = Variaveis.OperacaoEmAndamento.DispMvd?.Dados?.Modulos?.Count() ?? 4;
|
||||||
Variaveis.OperacaoEmAndamento
|
|
||||||
.DispMvd?
|
|
||||||
.Dados?
|
|
||||||
.Modulos?
|
|
||||||
.Count() ?? 4;
|
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.DispMvd != null &&
|
if (Variaveis.OperacaoEmAndamento.DispMvd != null && !MKS057DCanService.Referenciando &&
|
||||||
!MKS057DCanService.Referenciando &&
|
|
||||||
(
|
(
|
||||||
!MKS057DCanService.Iniciado ||
|
!MKS057DCanService.Iniciado ||
|
||||||
MKS057DCanService.DadosLeitura
|
MKS057DCanService.DadosLeitura.Count(x => x.Iniciado) < expectedModules
|
||||||
.Count(x => x.Iniciado) <
|
|
||||||
expectedModules
|
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
AtualizarConsole(
|
AtualizarConsole(name + " - Procurando dispositivos MKS");
|
||||||
name + " - Procurando dispositivos MKS"
|
|
||||||
);
|
|
||||||
|
|
||||||
bool found =
|
bool found = await MKS057DCanService.VerificaDispositivoConectado().ConfigureAwait(false);
|
||||||
await MKS057DCanService
|
|
||||||
.VerificaDispositivoConectado()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
AtualizarConsole("Dispositivo MKS encontrado");
|
AtualizarConsole("Dispositivo MKS encontrado");
|
||||||
|
|
@ -974,19 +926,12 @@ namespace AgroBase.Services
|
||||||
if (Variaveis.OperacaoEmAndamento.DispMvd != null &&
|
if (Variaveis.OperacaoEmAndamento.DispMvd != null &&
|
||||||
(
|
(
|
||||||
!OIDCanService.Iniciado ||
|
!OIDCanService.Iniciado ||
|
||||||
OIDCanService.DadosLeitura
|
OIDCanService.DadosLeitura.Count(x => x.Iniciado) < expectedModules
|
||||||
.Count(x => x.Iniciado) <
|
|
||||||
expectedModules
|
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
AtualizarConsole(
|
AtualizarConsole(name + " - Procurando dispositivo OID");
|
||||||
name + " - Procurando dispositivo OID"
|
|
||||||
);
|
|
||||||
|
|
||||||
bool found =
|
bool found = await OIDCanService.VerificaDispositivoConectado().ConfigureAwait(false);
|
||||||
await OIDCanService
|
|
||||||
.VerificaDispositivoConectado()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
AtualizarConsole("Dispositivo OID encontrado");
|
AtualizarConsole("Dispositivo OID encontrado");
|
||||||
|
|
@ -996,14 +941,9 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
if (!DalyBMSService.Iniciado)
|
if (!DalyBMSService.Iniciado)
|
||||||
{
|
{
|
||||||
AtualizarConsole(
|
AtualizarConsole(name + " - Procurando dispositivo BAT");
|
||||||
name + " - Procurando dispositivo BAT"
|
|
||||||
);
|
|
||||||
|
|
||||||
bool found =
|
bool found = await DalyBMSService.VerificaDispositivoConectado().ConfigureAwait(false);
|
||||||
await DalyBMSService
|
|
||||||
.VerificaDispositivoConectado()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
AtualizarConsole("Dispositivo BAT encontrado");
|
AtualizarConsole("Dispositivo BAT encontrado");
|
||||||
|
|
@ -1027,25 +967,14 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
foreach (var camera in cameras)
|
foreach (var camera in cameras)
|
||||||
{
|
{
|
||||||
var health =
|
var health = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == camera.dispositivo);
|
||||||
HealthWorkerService.ModulosSaude
|
|
||||||
.FirstOrDefault(
|
|
||||||
x => x.modulo == camera.dispositivo
|
|
||||||
);
|
|
||||||
|
|
||||||
if (health == null)
|
if (health == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
DispositivoDetalhesModel mapped =
|
DispositivoDetalhesModel mapped = GetDispositivosMapeadosSnapshot().FirstOrDefault(x => x.Dispositivo == camera.dispositivo);
|
||||||
GetDispositivosMapeadosSnapshot()
|
|
||||||
.FirstOrDefault(
|
|
||||||
x => x.Dispositivo ==
|
|
||||||
camera.dispositivo
|
|
||||||
);
|
|
||||||
|
|
||||||
bool connected =
|
bool connected = health.status != StatusModulo.Desconectado;
|
||||||
health.status !=
|
|
||||||
StatusModulo.Desconectado;
|
|
||||||
|
|
||||||
if (mapped == null && connected)
|
if (mapped == null && connected)
|
||||||
{
|
{
|
||||||
|
|
@ -1066,24 +995,16 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<bool> ProcurarDispositivoLoRa(
|
private static async Task<bool> ProcurarDispositivoLoRa(SerialPort porta, CancellationToken cancellationToken)
|
||||||
SerialPort porta,
|
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
if (porta == null)
|
if (porta == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
AtualizarConsole(
|
AtualizarConsole(porta.PortName + " - Procurando dispositivo LRA");
|
||||||
porta.PortName +
|
|
||||||
" - Procurando dispositivo LRA"
|
|
||||||
);
|
|
||||||
|
|
||||||
bool found =
|
bool found = await LoRaBaseService.VerificaPortaLoRa(porta).ConfigureAwait(false);
|
||||||
await LoRaBaseService
|
|
||||||
.VerificaPortaLoRa(porta)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
|
|
@ -1095,18 +1016,14 @@ namespace AgroBase.Services
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<bool> ProcurarDispositivoGPS(
|
private static async Task<bool> ProcurarDispositivoGPS(SerialPort porta, CancellationToken cancellationToken)
|
||||||
SerialPort porta,
|
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
if (porta == null ||
|
if (porta == null || string.IsNullOrWhiteSpace(porta.PortName))
|
||||||
string.IsNullOrWhiteSpace(porta.PortName))
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SerialPort probe =
|
SerialPort probe = CriarPortaCandidata(porta.PortName);
|
||||||
CriarPortaCandidata(porta.PortName);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -1117,22 +1034,13 @@ namespace AgroBase.Services
|
||||||
try { probe.DiscardInBuffer(); }
|
try { probe.DiscardInBuffer(); }
|
||||||
catch { }
|
catch { }
|
||||||
|
|
||||||
const string command =
|
const string command = "gngga com3 1\r\n";
|
||||||
"gngga com3 1\r\n";
|
|
||||||
|
|
||||||
byte[] commandBytes =
|
byte[] commandBytes = Encoding.ASCII.GetBytes(command);
|
||||||
Encoding.ASCII.GetBytes(command);
|
|
||||||
|
|
||||||
probe.Write(
|
probe.Write(commandBytes, 0, commandBytes.Length);
|
||||||
commandBytes,
|
|
||||||
0,
|
|
||||||
commandBytes.Length
|
|
||||||
);
|
|
||||||
|
|
||||||
AtualizarConsole(
|
AtualizarConsole(probe.PortName + " - Procurando dispositivo GPS");
|
||||||
probe.PortName +
|
|
||||||
" - Procurando dispositivo GPS"
|
|
||||||
);
|
|
||||||
|
|
||||||
byte[] received =
|
byte[] received =
|
||||||
await LerAteCondicaoAsync(
|
await LerAteCondicaoAsync(
|
||||||
|
|
@ -1153,9 +1061,7 @@ namespace AgroBase.Services
|
||||||
*/
|
*/
|
||||||
GPSService.AtualizarPortaCOM(probe);
|
GPSService.AtualizarPortaCOM(probe);
|
||||||
|
|
||||||
AtualizarConsole(
|
AtualizarConsole("Dispositivo GPS encontrado");
|
||||||
"Dispositivo GPS encontrado"
|
|
||||||
);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -1170,10 +1076,7 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
RecordError(
|
RecordError("[SerialService.ProbeGPS] " + porta.PortName + ": " + ex.Message);
|
||||||
"[SerialService.ProbeGPS] " +
|
|
||||||
porta.PortName + ": " + ex.Message
|
|
||||||
);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -1185,24 +1088,14 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
private static void ProcurarDispositivosEthernet()
|
private static void ProcurarDispositivosEthernet()
|
||||||
{
|
{
|
||||||
var livox =
|
var livox = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorSaude.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Lvx);
|
||||||
HealthWorkerService.ModulosSaude
|
|
||||||
.FirstOrDefault(
|
|
||||||
x => x.modulo == T_Code.Lvx
|
|
||||||
);
|
|
||||||
|
|
||||||
if (livox == null)
|
if (livox == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DispositivoDetalhesModel mapped =
|
DispositivoDetalhesModel mapped = GetDispositivosMapeadosSnapshot().FirstOrDefault(x => x.Dispositivo == livox.modulo);
|
||||||
GetDispositivosMapeadosSnapshot()
|
|
||||||
.FirstOrDefault(
|
|
||||||
x => x.Dispositivo == livox.modulo
|
|
||||||
);
|
|
||||||
|
|
||||||
bool connected =
|
bool connected = livox.status != StatusModulo.Desconectado;
|
||||||
livox.status !=
|
|
||||||
StatusModulo.Desconectado;
|
|
||||||
|
|
||||||
if (mapped == null && connected)
|
if (mapped == null && connected)
|
||||||
{
|
{
|
||||||
|
|
@ -1210,18 +1103,9 @@ namespace AgroBase.Services
|
||||||
new DispositivoDetalhesModel
|
new DispositivoDetalhesModel
|
||||||
{
|
{
|
||||||
Dispositivo = livox.modulo,
|
Dispositivo = livox.modulo,
|
||||||
Endereco =
|
Endereco = LivoxManagerProcess.DadosLeitura.lidar_ip,
|
||||||
LivoxManagerProcess
|
Versao = LivoxManagerProcess.DadosLeitura.firmware_version,
|
||||||
.DadosLeitura
|
Mod_ID = LivoxManagerProcess.DadosLeitura.dev_type
|
||||||
.lidar_ip,
|
|
||||||
Versao =
|
|
||||||
LivoxManagerProcess
|
|
||||||
.DadosLeitura
|
|
||||||
.firmware_version,
|
|
||||||
Mod_ID =
|
|
||||||
LivoxManagerProcess
|
|
||||||
.DadosLeitura
|
|
||||||
.dev_type
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -1235,15 +1119,9 @@ namespace AgroBase.Services
|
||||||
// REMOÇÃO E ATUALIZAÇÃO DE MODELOS
|
// REMOÇÃO E ATUALIZAÇÃO DE MODELOS
|
||||||
// ============================================================
|
// ============================================================
|
||||||
|
|
||||||
private static async Task RemoverDispositivosAusentesAsync(
|
private static async Task RemoverDispositivosAusentesAsync(string[] currentPorts, CancellationToken cancellationToken)
|
||||||
string[] currentPorts,
|
|
||||||
CancellationToken cancellationToken)
|
|
||||||
{
|
{
|
||||||
var current =
|
var current = new HashSet<string>(currentPorts ?? new string[0], StringComparer.OrdinalIgnoreCase);
|
||||||
new HashSet<string>(
|
|
||||||
currentPorts ?? new string[0],
|
|
||||||
StringComparer.OrdinalIgnoreCase
|
|
||||||
);
|
|
||||||
|
|
||||||
List<DispositivoDetalhesModel> mappedCom =
|
List<DispositivoDetalhesModel> mappedCom =
|
||||||
GetDispositivosMapeadosSnapshot()
|
GetDispositivosMapeadosSnapshot()
|
||||||
|
|
|
||||||
|
|
@ -164,7 +164,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
public static Bitmap ExibirObstaculos(Bitmap bitmap, SonarCamModel leitura, bool ExibirTexto = false)
|
public static Bitmap ExibirObstaculos(Bitmap bitmap, SonarCamModel leitura, bool ExibirTexto = false)
|
||||||
{
|
{
|
||||||
if (bitmap == null || (!false && Variaveis.OperacaoEmAndamento.Iniciado))
|
if (bitmap == null || (!false && Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada))
|
||||||
{
|
{
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
bool sucesso = true;
|
bool sucesso = true;
|
||||||
|
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado && APIService.HasInternet)
|
if (!Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada && APIService.HasInternet)
|
||||||
{
|
{
|
||||||
List<string> Operacoes = Directory.GetDirectories(Variaveis.CaminhoOperacoes).ToList();
|
List<string> Operacoes = Directory.GetDirectories(Variaveis.CaminhoOperacoes).ToList();
|
||||||
foreach (string OperacaoID in Operacoes.Select(x => x.Split('/')[1]))
|
foreach (string OperacaoID in Operacoes.Select(x => x.Split('/')[1]))
|
||||||
|
|
|
||||||
|
|
@ -377,8 +377,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento != null &&
|
if (Variaveis.OperacaoEmAndamento != null && Variaveis.OperacaoEmAndamento.Sensoriamento.Operacao.OperacaoIniciada)
|
||||||
Variaveis.OperacaoEmAndamento.Iniciado)
|
|
||||||
{
|
{
|
||||||
ResultadoAtualizacao =
|
ResultadoAtualizacao =
|
||||||
"Atualização ignorada: operação em andamento.";
|
"Atualização ignorada: operação em andamento.";
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ def main():
|
||||||
from health_worker.modulos.movimentacao import ModuloMovimentacao
|
from health_worker.modulos.movimentacao import ModuloMovimentacao
|
||||||
from health_worker.modulos.sensoriamento import ModuloSensoriamento
|
from health_worker.modulos.sensoriamento import ModuloSensoriamento
|
||||||
from health_worker.modulos.atuador import ModuloAtuador
|
from health_worker.modulos.atuador import ModuloAtuador
|
||||||
from health_worker.modulos.lora import ModuloLoRa
|
#from health_worker.modulos.lora import ModuloLoRa
|
||||||
from health_worker.modulos.imu import CameraIMU
|
from health_worker.modulos.imu import CameraIMU
|
||||||
from health_worker.modulos.pc import ModuloPC
|
from health_worker.modulos.pc import ModuloPC
|
||||||
from health_worker.modulos.livox import ModuloLivox
|
from health_worker.modulos.livox import ModuloLivox
|
||||||
|
|
@ -29,7 +29,7 @@ def main():
|
||||||
T_Code.Mov: ModuloMovimentacao(),
|
T_Code.Mov: ModuloMovimentacao(),
|
||||||
T_Code.Sen: ModuloSensoriamento(),
|
T_Code.Sen: ModuloSensoriamento(),
|
||||||
T_Code.Atu: ModuloAtuador(),
|
T_Code.Atu: ModuloAtuador(),
|
||||||
T_Code.Lra: ModuloLoRa(),
|
#T_Code.Lra: ModuloLoRa(),
|
||||||
T_Code.Imu: CameraIMU(modulos_imu=[T_Code.Snr]),
|
T_Code.Imu: CameraIMU(modulos_imu=[T_Code.Snr]),
|
||||||
T_Code.Npc: ModuloPC(),
|
T_Code.Npc: ModuloPC(),
|
||||||
T_Code.Lvx: ModuloLivox(),
|
T_Code.Lvx: ModuloLivox(),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue