agrobot_base/AgroBase/AgroBase/Forms/IHM/frmIHM.cs

442 lines
21 KiB
C#
Raw Normal View History

2024-10-03 18:21:30 +00:00
using AgroBase.Forms.Operacoes;
using AgroBase.Models;
2025-03-26 17:42:33 +00:00
using AgroBase.Models.Components;
2025-07-23 15:14:50 +00:00
using AgroBase.Models.Modules;
using AgroBase.Models.Operadores;
using AgroBase.Properties;
using AgroBase.Services;
2025-07-11 16:38:08 +00:00
using AgroBase.Services.Operadores;
using System;
2025-03-26 17:42:33 +00:00
using System.Collections.Generic;
using System.Data;
2024-07-12 19:44:56 +00:00
using System.Diagnostics;
using System.Drawing;
using System.Linq;
2024-11-25 12:14:59 +00:00
using System.Threading.Tasks;
using System.Windows.Forms;
2024-07-26 19:54:25 +00:00
using static AgroBase.Models.Enums;
namespace AgroBase.Forms.IHM
{
public partial class frmIHM : Form
{
2024-11-25 12:14:59 +00:00
AsyncTaskTimerModel tmrDispositivos;
public frmIHM()
{
InitializeComponent();
2024-09-24 19:02:54 +00:00
FuncoesGlobais.DefinirEventosPicBtn(picOperacao, "Erro ao carregar operação!", async () =>
2024-07-12 19:44:56 +00:00
{
frmInicioOperacao frm = new frmInicioOperacao();
frm.ShowDialog();
});
2024-09-24 19:02:54 +00:00
FuncoesGlobais.DefinirEventosPicBtn(picDiagnosticos, "Erro ao processar diagnóstico!", async () =>
2024-07-12 19:44:56 +00:00
{
2024-07-16 20:04:09 +00:00
frmDiagnosticos frm = new frmDiagnosticos();
frm.ShowDialog();
2024-07-12 19:44:56 +00:00
});
2024-09-24 19:02:54 +00:00
FuncoesGlobais.DefinirEventosPicBtn(picAjustes, "Erro ao realizar ajustes!", async () =>
2024-07-12 19:44:56 +00:00
{
frmAjustes frm = new frmAjustes();
2024-07-12 19:44:56 +00:00
frm.ShowDialog();
});
2024-09-24 19:02:54 +00:00
FuncoesGlobais.DefinirEventosPicBtn(picManual, "Erro ao carregar modo de controle manual!", async () =>
{
OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual);
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
{
frmDialogoMapa frm = new frmDialogoMapa();
2024-10-03 18:21:30 +00:00
frm.Show();
frm.InicializarModoManual();
}
else
{
2025-03-26 17:42:33 +00:00
CustomDialog.ShowDialog(
"Iniciar Operação Manual",
2025-04-02 20:37:56 +00:00
$"{Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada ?? ""}",
2025-03-26 17:42:33 +00:00
MessageBoxIcon.Error,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
});
2024-09-24 19:02:54 +00:00
FuncoesGlobais.DefinirEventosPicBtn(picDesligar, "Erro ao desligar equipamento!", async () =>
2024-07-12 19:44:56 +00:00
{
2025-04-02 20:37:56 +00:00
if (Variaveis.Producao)
2024-07-12 19:44:56 +00:00
{
2025-04-02 20:37:56 +00:00
var res = CustomDialog.ShowDialog(
"Desligar",
"Deseja Desligar o Equipamento?",
MessageBoxIcon.Question,
new Dictionary<(string, DialogResult?), Action>()
{
{ ("Sim", DialogResult.Yes), () => { } },
{ ("Não", DialogResult.No), () => { } },
}
);
if (res == DialogResult.Yes)
2024-07-16 20:04:09 +00:00
{
Process.Start("shutdown", "/s /t 0");
}
2024-07-12 19:44:56 +00:00
}
2025-04-02 20:37:56 +00:00
else
{
this.Close();
}
2024-07-12 19:44:56 +00:00
});
FuncoesGlobais.DefinirEventosPicBtn(picWifi, "Erro ao procurar por atualizações!", async () =>
{
if (APIService.HasInternet)
{
await VersionamentoService.AtualizarArquivoVersionamento(true);
var arquivosNaoEncontrados = VersionamentoService.ArquivosNaoEncontrados.ToList();
bool sucesso = !arquivosNaoEncontrados.Any();
2025-03-26 17:42:33 +00:00
CustomDialog.ShowDialog(
"Resultado",
"Atualização concluída com " + (sucesso ? "sucesso" : "falha") + "!\r\n\r\n" +
2025-03-26 17:42:33 +00:00
(!sucesso ?
("Arquivos não encontrados:\r\n\r\n" + string.Join("\r\n", arquivosNaoEncontrados)) :
2025-03-26 17:42:33 +00:00
"Nenhum arquivo pendente!"),
sucesso ? MessageBoxIcon.Asterisk : MessageBoxIcon.Error,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
else
{
2025-03-26 17:42:33 +00:00
CustomDialog.ShowDialog(
"Equipamento Desconectado",
"Impossível procurar por atualizações!",
MessageBoxIcon.Warning,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
});
}
2024-07-16 20:04:09 +00:00
private void frmIHM_Load(object sender, EventArgs e)
{
2024-09-24 19:02:54 +00:00
lblVersao.Text = "v " + Variaveis.Versao;
2024-10-03 18:21:30 +00:00
2025-04-02 20:37:56 +00:00
tmrDispositivos?.Dispose();
tmrDispositivos = new AsyncTaskTimerModel("tmrDispositivos", tmrDispositivos_Tick, 1000, this);
tmrDispositivos.Start();
2025-04-02 20:37:56 +00:00
lblCodigoFalha.Click -= LblCodigoFalha_Click;
2024-10-03 18:21:30 +00:00
lblCodigoFalha.Click += LblCodigoFalha_Click;
}
2024-12-05 12:52:28 +00:00
private async Task tmrDispositivos_Tick()
{
try
{
// Atualizar controles da UI de forma segura
if (tmrDispositivos._uiControl.InvokeRequired)
{
tmrDispositivos._uiControl.Invoke(new Action(async () => await AtualizarControlesUI()));
}
else
{
await AtualizarControlesUI();
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro no tmrDispositivos_Tick: {ex.Message}");
}
}
private async Task AtualizarControlesUI()
{
var Labels = this.Controls.OfType<Label>().Where(y => y.Name.Contains("lblD_")).ToList();
2025-07-11 16:38:08 +00:00
var listaCameras = CameraWorkerService.GetListaCameras();
2025-05-16 14:14:08 +00:00
foreach (var lbl in Labels)
2024-12-05 12:52:28 +00:00
{
T_Code Dispositivo = (T_Code)Enum.Parse(typeof(T_Code), lbl.Name.Split('_')[1]);
2025-05-06 18:47:59 +00:00
string Mod_ID = lbl.Name.Split('_').Length >= 3 ? lbl.Name.Split('_')[2] : lbl.Name.Split('_')[1];
2024-12-05 12:52:28 +00:00
if (Dispositivo == T_Code.Cam)
2025-04-03 14:00:55 +00:00
{
2025-07-18 20:03:37 +00:00
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
int idx = Convert.ToInt32(Mod_ID);
2025-04-03 14:00:55 +00:00
Mod_ID = T_Code.Cam.ToString() + "_" + Mod_ID;
var CameraSolo = Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.Count() > idx ? Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo[idx] : null;
2025-07-18 20:03:37 +00:00
lbl.ForeColor = modDesconectado || CameraSolo?.Id == null ?
Color.Black
: !listaCameras.Any(x => x.Id == CameraSolo.Id) ?
2025-04-03 14:00:55 +00:00
Color.DarkRed :
Color.DarkGreen;
2025-04-03 14:00:55 +00:00
}
else if (Dispositivo == T_Code.Snr)
2024-12-05 12:52:28 +00:00
{
2025-07-18 20:03:37 +00:00
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
var CameraCaminho = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho;
2025-07-18 20:03:37 +00:00
lbl.ForeColor = modDesconectado || CameraCaminho?.Id == null ?
Color.Black
: !listaCameras.Any(x => x.Id == CameraCaminho.Id)
2024-12-05 12:52:28 +00:00
? Color.DarkRed
: Color.DarkGreen;
2025-05-06 18:47:59 +00:00
}
2025-07-21 18:36:04 +00:00
else if (Dispositivo == T_Code.Imu)
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == T_Code.Snr);
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
var saudeImu = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
var CameraCaminho = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho;
lbl.ForeColor =
modDesconectado || saudeImu == null ? Color.Black
: saudeImu.status == StatusModulo.Conectado ? Color.Blue
: saudeImu.status == StatusModulo.Falha ? Color.DarkRed
: saudeImu.status == StatusModulo.Alerta ? Color.Gold
: saudeImu.status == StatusModulo.Operante ? Color.DarkGreen
: Color.Black;
}
2025-07-23 15:14:50 +00:00
else if (Dispositivo == T_Code.Sen || Dispositivo == T_Code.Atu)
2025-05-06 18:47:59 +00:00
{
2025-07-18 20:03:37 +00:00
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
2025-05-06 18:47:59 +00:00
if (Mod_ID.ToLower() == Dispositivo.ToString().ToLower())
{
2025-07-18 20:03:37 +00:00
lbl.ForeColor =
2025-07-21 18:36:04 +00:00
modDesconectado ? Color.Black :
Modulo.Status == StatusModulo.Conectado ? Color.Blue :
Modulo.Status == StatusModulo.Falha ? Color.DarkRed :
Modulo.Status == StatusModulo.Alerta ? Color.Gold :
Modulo.Status == StatusModulo.Operante ? Color.DarkGreen
: Color.Black;
2025-05-06 18:47:59 +00:00
}
else
{
S_Code Sensor = string.IsNullOrEmpty(Mod_ID) ? S_Code.sVZO : (S_Code)Enum.Parse(typeof(S_Code), Mod_ID);
string modId = lbl.Name.Split('_').Length == 4 ? lbl.Name.Split('_')[3] : "";
if (Sensor == S_Code.sLRA)
{
2025-07-18 20:03:37 +00:00
var lora = Variaveis.LoraService;
lbl.ForeColor = modDesconectado || lora == null
2025-05-06 18:47:59 +00:00
? Color.Black
2025-05-16 14:14:08 +00:00
: lora.Conectado && !lora.Conectado
2025-05-06 18:47:59 +00:00
? Color.Gold
: lora.Configurado
? Color.DarkGreen
: Color.DarkRed;
}
else if (Sensor == S_Code.sFRO)
{
var freio = Variaveis.OperacaoEmAndamento.DispSen.Dados.Servos.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
2025-07-18 20:03:37 +00:00
lbl.ForeColor = modDesconectado || freio == null
? Color.Black
: freio.Inicializado
2025-05-06 18:47:59 +00:00
? Color.DarkGreen
: Color.DarkRed;
}
2025-07-23 15:14:50 +00:00
else if (Sensor == S_Code.sBIC)
{
var bico = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
lbl.ForeColor = modDesconectado || bico == null
? Color.Black
: bico.Inicializado
? Color.DarkGreen
: Color.DarkRed;
}
else if (Sensor == S_Code.sBMB)
2025-05-06 18:47:59 +00:00
{
2025-07-23 15:14:50 +00:00
var bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
lbl.ForeColor = modDesconectado || bomba == null
2025-07-18 20:03:37 +00:00
? Color.Black
2025-07-23 15:14:50 +00:00
: bomba.Inicializado
2025-05-06 18:47:59 +00:00
? Color.DarkGreen
: Color.DarkRed;
}
2025-07-23 15:14:50 +00:00
else if (Sensor != S_Code.sVZO)
{
SensorModel sensor = null;
if (Dispositivo == T_Code.Sen)
{
sensor = Variaveis.OperacaoEmAndamento.DispSen.Dados.Sensores.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
}
else if (Dispositivo == T_Code.Atu)
{
sensor = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Sensores.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
}
if (sensor != null)
{
lbl.ForeColor = modDesconectado || sensor == null
? Color.Black
: sensor.Inicializado
? Color.DarkGreen
: Color.DarkRed;
}
}
2025-05-06 18:47:59 +00:00
}
2025-05-16 14:14:08 +00:00
2024-12-05 12:52:28 +00:00
}
else
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo && (x.Mod_ID == Mod_ID || x.Mod_ID == null));
lbl.ForeColor =
Modulo == null || Modulo.Status == StatusModulo.Desconectado
? Color.Black
: Modulo.Status == StatusModulo.Conectado
? Color.Blue
: Modulo.Status == StatusModulo.Alerta ?
Color.Gold :
Modulo.Status == StatusModulo.Operante
? Color.DarkGreen
: Color.DarkRed;
2024-12-05 12:52:28 +00:00
}
2025-05-16 14:14:08 +00:00
}
2024-12-05 12:52:28 +00:00
bool mqttConectado = Variaveis.MqttService.StatusConexao();
lblMqtt.Text = "MQTT: " + (mqttConectado ? "Conectado" : "Desconectado");
lblMqtt.ForeColor = mqttConectado ? Color.Green : Color.Red;
2025-07-18 20:03:37 +00:00
lblIA.Text = "IA: " + (VariaveisOperacao.Operadores.Conectado ? "Conectado" : "Desconectado");
lblIA.ForeColor = VariaveisOperacao.Operadores.Conectado ? Color.Green : Color.Red;
2024-12-05 12:52:28 +00:00
bool opLiberada = Variaveis.OperacaoEmAndamento.OperacaoLiberada;
lblOperacaoLiberada.Text = "Operação Liberada: " + (opLiberada ? "Sim" : "Não");
lblOperacaoLiberada.ForeColor = opLiberada ? Color.Green : Color.Red;
picWifi.Image = APIService.HasInternet ? Resources.wifi_on : Resources.wifi_off;
await Task.CompletedTask; // Mantém a assinatura assíncrona
}
2024-11-25 12:14:59 +00:00
private void LblCodigoFalha_Click(object sender, EventArgs e)
{
string DescricaoFalha = Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada;
2025-03-26 17:42:33 +00:00
CustomDialog.ShowDialog(
"Código de Falha",
$"{DescricaoFalha}",
MessageBoxIcon.Information,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
2024-07-12 19:44:56 +00:00
private void lblModulo_Click(object sender, EventArgs e)
{
2024-07-12 19:44:56 +00:00
Label lbl = (Label)sender;
T_Code Dispositivo = (T_Code)Enum.Parse(typeof(T_Code), lbl.Name.Split('_')[1]);
2025-07-23 15:14:50 +00:00
string Mod_ID = lbl.Name.Split('_').Length >= 3 ? lbl.Name.Split('_')[2] : lbl.Name.Split('_')[1];
2024-07-12 19:44:56 +00:00
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo && (x.Mod_ID == Mod_ID || x.Mod_ID == null));
2025-07-11 16:38:08 +00:00
var saudeGeral = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
ManagerWorkerMessageResponseModulosPendentesSaudeModel saudeIndividual = null;
switch (Dispositivo)
{
case T_Code.Mov:
{
var enderecoMod = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == Mod_ID)?.MovMotor?._EnderecoCAN_Tx ?? 0x00;
saudeIndividual = saudeGeral.saude_individual.FirstOrDefault(x => Convert.ToByte(x.id) == enderecoMod);
break;
}
case T_Code.Dir:
{
var enderecoMod = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == Mod_ID)?.DirMotor?._EnderecoCAN_Tx ?? 0x00;
saudeIndividual = saudeGeral.saude_individual.FirstOrDefault(x => Convert.ToByte(x.id) == enderecoMod);
break;
}
2025-07-23 15:14:50 +00:00
case T_Code.Sen:
case T_Code.Atu:
{
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
if (Mod_ID.ToLower() == Dispositivo.ToString().ToLower())
{
saudeIndividual = null;
}
else
{
S_Code Sensor = string.IsNullOrEmpty(Mod_ID) ? S_Code.sVZO : (S_Code)Enum.Parse(typeof(S_Code), Mod_ID);
string modId = lbl.Name.Split('_').Length == 4 ? lbl.Name.Split('_')[3] : "";
if (Sensor == S_Code.sLRA)
{
//saudeIndividual = saudeGeral?.saude_individual.FirstOrDefault(x => x.id == )
}
else if (Sensor == S_Code.sFRO)
{
var freio = Variaveis.OperacaoEmAndamento.DispSen.Dados.Servos.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
saudeIndividual = saudeGeral.saude_individual.FirstOrDefault(x => x.id == freio.ID_Num.ToString());
}
else if (Sensor == S_Code.sBIC)
{
var bico = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
saudeIndividual = saudeGeral.saude_individual.FirstOrDefault(x => x.id == bico.ID_Num.ToString());
}
else if (Sensor == S_Code.sBMB)
{
var bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
saudeIndividual = saudeGeral.saude_individual.FirstOrDefault(x => x.id == bomba.ID_Num.ToString());
}
else if (Sensor != S_Code.sVZO)
{
SensorModel sensor = null;
if (Dispositivo == T_Code.Sen)
{
sensor = Variaveis.OperacaoEmAndamento.DispSen.Dados.Sensores.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
}
else if (Dispositivo == T_Code.Atu)
{
sensor = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Sensores.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
}
if (sensor != null)
{
saudeIndividual = saudeGeral.saude_individual.FirstOrDefault(x => x.id == sensor.ID_Num.ToString());
}
}
}
break;
}
}
2025-07-23 15:14:50 +00:00
StatusModulo status = Modulo?.Status ?? StatusModulo.Desconectado;
double saude = Modulo?.Saude ?? 0;
string erros = Modulo?.Erros ?? "desconectado";
if (saudeIndividual != null)
{
2025-07-23 15:14:50 +00:00
status = saudeIndividual.status;
saude = saudeIndividual.saude;
erros = string.Join(Environment.NewLine, saudeIndividual.motivos);
}
2025-07-23 15:14:50 +00:00
string msg =
$"Módulo: {Dispositivo}" +
$"\r\nID: {Mod_ID}" +
$"\r\nStatus: {status}" +
$"\r\nSaude: {saude}" +
$"\r\nVersão: {Modulo?.Versao ?? "0"}" +
$"\r\nErro: {erros}";
2024-07-12 19:44:56 +00:00
2025-03-26 17:42:33 +00:00
CustomDialog.ShowDialog(
2024-07-12 19:44:56 +00:00
"Detalhes",
2025-03-26 17:42:33 +00:00
$"{msg}",
2025-07-23 15:14:50 +00:00
status == StatusModulo.Falha ? MessageBoxIcon.Error : status == StatusModulo.Operante ? MessageBoxIcon.Information : MessageBoxIcon.Exclamation,
2025-03-26 17:42:33 +00:00
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
2024-07-12 19:44:56 +00:00
);
}
}
}