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

441 lines
22 KiB
C#

using AgroBase.Forms.Operacoes;
using AgroBase.Models;
using AgroBase.Models.Components;
using AgroBase.Models.Modules;
using AgroBase.Models.Operadores;
using AgroBase.Properties;
using AgroBase.Services;
using AgroBase.Services.Operadores;
using OpenHardwareMonitor.Hardware;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Forms.IHM
{
public partial class frmIHM : Form
{
AsyncTaskTimerModel tmrDispositivos;
public frmIHM()
{
InitializeComponent();
FuncoesGlobais.DefinirEventosPicBtn(picOperacao, "Erro ao carregar operação!", async () =>
{
frmInicioOperacao frm = new frmInicioOperacao();
frm.ShowDialog();
});
FuncoesGlobais.DefinirEventosPicBtn(picDiagnosticos, "Erro ao processar diagnóstico!", async () =>
{
frmDiagnosticos frm = new frmDiagnosticos();
frm.ShowDialog();
});
FuncoesGlobais.DefinirEventosPicBtn(picAjustes, "Erro ao realizar ajustes!", async () =>
{
frmAjustes frm = new frmAjustes();
frm.ShowDialog();
});
FuncoesGlobais.DefinirEventosPicBtn(picManual, "Erro ao carregar modo de controle manual!", async () =>
{
OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual, true);
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
{
frmDialogoMapa frm = new frmDialogoMapa();
frm.Show();
frm.InicializarModoManual();
}
else
{
CustomDialog.ShowDialog(
"Iniciar Operação Manual",
$"{Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada ?? ""}",
MessageBoxIcon.Error,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
});
FuncoesGlobais.DefinirEventosPicBtn(picDesligar, "Erro ao desligar equipamento!", async () =>
{
if (Variaveis.Producao)
{
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)
{
Process.Start("shutdown", "/s /t 0");
}
}
else
{
this.Close();
}
});
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();
CustomDialog.ShowDialog(
"Resultado",
"Atualização concluída com " + (sucesso ? "sucesso" : "falha") + "!\r\n\r\n" +
(!sucesso ?
("Arquivos não encontrados:\r\n\r\n" + string.Join("\r\n", arquivosNaoEncontrados)) :
"Nenhum arquivo pendente!"),
sucesso ? MessageBoxIcon.Asterisk : MessageBoxIcon.Error,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
else
{
CustomDialog.ShowDialog(
"Equipamento Desconectado",
"Impossível procurar por atualizações!",
MessageBoxIcon.Warning,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
});
}
private void frmIHM_Load(object sender, EventArgs e)
{
lblVersao.Text = "v " + Variaveis.Versao;
tmrDispositivos?.Dispose();
tmrDispositivos = new AsyncTaskTimerModel("tmrDispositivos", tmrDispositivos_Tick, 1000, this);
tmrDispositivos.Start();
lblCodigoFalha.Click -= LblCodigoFalha_Click;
lblCodigoFalha.Click += LblCodigoFalha_Click;
}
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();
var listaCameras = CameraWorkerService.ListaCameras;
foreach (var lbl in Labels)
{
T_Code Dispositivo = (T_Code)Enum.Parse(typeof(T_Code), lbl.Name.Split('_')[1]);
string Mod_ID = lbl.Name.Split('_').Length >= 3 ? lbl.Name.Split('_')[2] : lbl.Name.Split('_')[1];
if (Dispositivo == T_Code.Cam)
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
int idx = Convert.ToInt32(Mod_ID);
Mod_ID = T_Code.Cam.ToString() + "_" + Mod_ID;
var CameraSolo = CameraWorkerService.CamerasSolo.Count() > idx ? CameraWorkerService.CamerasSolo[idx] : null;
lbl.ForeColor = modDesconectado || CameraSolo?.Id == null ?
Color.Black
: !listaCameras.Any(x => x.mx_id == CameraSolo.Id) ?
Color.DarkRed :
Color.DarkGreen;
}
else if (Dispositivo == T_Code.Snr)
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
var CameraCaminho = CameraWorkerService.CameraCaminho;
lbl.ForeColor = modDesconectado || CameraCaminho?.Id == null ?
Color.Black
: !listaCameras.Any(x => x.mx_id == CameraCaminho.Id)
? Color.DarkRed
: Color.DarkGreen;
}
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 = CameraWorkerService.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;
}
else if (Dispositivo == T_Code.Lra)
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == T_Code.Snr);
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
var saudeLra = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
var lora = Variaveis.LoraService;
lbl.ForeColor =
lora == null || !(Variaveis.OperacaoEmAndamento.DispSen?.Dados?.Conectado ?? false)
? Color.Black
: saudeLra.status == StatusModulo.Alerta ? Color.Gold
: saudeLra.status == StatusModulo.Operante ? Color.DarkGreen
: Color.DarkRed;
}
else if (Dispositivo == T_Code.Sen || Dispositivo == T_Code.Atu)
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
if (Mod_ID.ToLower() == Dispositivo.ToString().ToLower())
{
lbl.ForeColor =
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;
}
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.sSRV)
{
var freio = Variaveis.OperacaoEmAndamento.DispSen.Dados.Servos.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
lbl.ForeColor = modDesconectado || freio == null
? Color.Black
: freio.Inicializado
? Color.DarkGreen
: Color.DarkRed;
}
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)
{
var bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.Componente == Sensor && x.ID.Contains(modId));
lbl.ForeColor = modDesconectado || bomba == null
? Color.Black
: bomba.Inicializado
? Color.DarkGreen
: Color.DarkRed;
}
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;
}
}
}
}
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;
}
}
bool mqttConectado = Variaveis.MqttServiceLocal.StatusConexao();
lblMqtt.Text = "MQTT: " + (mqttConectado ? "Conectado" : "Desconectado");
lblMqtt.ForeColor = mqttConectado ? Color.Green : Color.Red;
lblIA.Text = "IA: " + (VariaveisOperacao.Operadores.Conectado ? "Conectado" : "Desconectado");
lblIA.ForeColor = VariaveisOperacao.Operadores.Conectado ? Color.Green : Color.Red;
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
}
private void LblCodigoFalha_Click(object sender, EventArgs e)
{
string DescricaoFalha = Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada;
CustomDialog.ShowDialog(
"Código de Falha",
$"{DescricaoFalha}",
MessageBoxIcon.Information,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
private void lblModulo_Click(object sender, EventArgs e)
{
Label lbl = (Label)sender;
T_Code Dispositivo = (T_Code)Enum.Parse(typeof(T_Code), lbl.Name.Split('_')[1]);
string Mod_ID = lbl.Name.Split('_').Length >= 3 ? lbl.Name.Split('_')[2] : lbl.Name.Split('_')[1];
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);
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;
}
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.sSRV)
{
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;
}
}
StatusModulo status = Modulo?.Status ?? saudeGeral?.status ?? StatusModulo.Desconectado;
double saude = Modulo?.Saude ?? saudeGeral?.saude ?? 0;
string erros = Modulo?.Erros ?? string.Join(", ", (saudeGeral?.motivos ?? new List<string>() { "desconectado" })) ?? "desconectado";
if (saudeIndividual != null)
{
status = saudeIndividual.status;
saude = saudeIndividual.saude;
erros = string.Join(Environment.NewLine, saudeIndividual.motivos ?? new List<string>());
}
string msg =
$"Módulo: {Dispositivo}" +
$"\r\nID: {Mod_ID}" +
$"\r\nStatus: {status}" +
$"\r\nSaude: {saude}" +
$"\r\nVersão: {Modulo?.Versao ?? "0"}" +
$"\r\nErro: {erros}";
CustomDialog.ShowDialog(
"Detalhes",
$"{msg}",
status == StatusModulo.Falha ? MessageBoxIcon.Error : status == StatusModulo.Operante ? MessageBoxIcon.Information : MessageBoxIcon.Exclamation,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
}
}