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

336 lines
14 KiB
C#

using AgroBase.Forms.Operacoes;
using AgroBase.Models;
using AgroBase.Models.Components;
using AgroBase.Properties;
using AgroBase.Services;
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 ulong CodFalha = 0;
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);
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()
{
CodFalha = Variaveis.OperacaoEmAndamento.RetornaCodigoFalha();
var Labels = this.Controls.OfType<Label>().Where(y => y.Name.Contains("lblD_")).ToList();
Labels.ForEach(lbl =>
{
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 listaCameras = CameraService.AtualizaListaCameras();
var CameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminhoKinect;
if (CameraCaminho != null && Mod_ID == CameraCaminho.ID)
{
lbl.ForeColor = !listaCameras.Any(x => x.Value == CameraCaminho.CameraSelecionada) ? Color.DarkRed : CameraCaminho.camera.selectedCamera == 0 ? Color.Gold : Color.DarkGreen;
}
else
{
var CameraSolo = Variaveis.OperacaoEmAndamento.CamerasSolo.FirstOrDefault(x => x.ID == Mod_ID);
if (CameraSolo != null)
{
lbl.ForeColor = !listaCameras.Any(x => x.Value == CameraSolo.CameraSelecionada) ? Color.DarkRed : CameraSolo.camera.selectedCamera == 0 ? Color.Gold : Color.DarkGreen;
}
}
}
else
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo && (x.Mod_ID == Mod_ID || x.Mod_ID == null));
if (Modulo != null)
{
lbl.ForeColor = Modulo.Erro ? Color.Gold : Modulo.Conectado ? Color.DarkGreen : Color.DarkRed;
}
else
{
lbl.ForeColor = Color.Black;
}
}
});
bool mqttConectado = Variaveis.MqttService.StatusConexao();
lblMqtt.Text = "MQTT: " + (mqttConectado ? "Conectado" : "Desconectado");
lblMqtt.ForeColor = mqttConectado ? Color.Green : Color.Red;
bool wifiConectado = WifiService.WifiConectado;
bool wifiDisponivel = WifiService.WifiDisponivel;
lblWifi.Text = "Wi-Fi: " + (wifiConectado ? "Conectado" : wifiDisponivel ? "Disponível" : "Desconectado");
lblWifi.ForeColor = wifiConectado ? Color.Green : wifiDisponivel ? Color.Yellow : Color.Red;
bool opLiberada = Variaveis.OperacaoEmAndamento.OperacaoLiberada;
lblOperacaoLiberada.Text = "Operação Liberada: " + (opLiberada ? "Sim" : "Não");
lblOperacaoLiberada.ForeColor = opLiberada ? Color.Green : Color.Red;
lblCodigoFalha.Text = $"Código de Falha: {CodFalha}";
picWifi.Image = APIService.HasInternet ? Resources.wifi_on : Resources.wifi_off;
}
*/
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()
{
CodFalha = Variaveis.OperacaoEmAndamento.RetornaCodigoFalha();
var Labels = this.Controls.OfType<Label>().Where(y => y.Name.Contains("lblD_")).ToList();
var listaCameras = OAKCameraService.GetListaCameras();
Labels.ForEach(lbl =>
{
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 CameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminho;
if (CameraCaminho != null && Mod_ID == CameraCaminho.ID)
{
lbl.ForeColor = !listaCameras.Any(x => x.Id == CameraCaminho.DeviceID)
? Color.DarkRed
: CameraCaminho.camera.cameraIndex == 0
? Color.Gold
: Color.DarkGreen;
}
else
{
var CameraSolo = Variaveis.OperacaoEmAndamento.CamerasSolo.FirstOrDefault(x => x.ID == Mod_ID);
if (CameraSolo != null)
{
lbl.ForeColor = !listaCameras.Any(x => x.Id == CameraSolo.DeviceID) ?
Color.DarkRed :
CameraSolo.camera.cameraIndex == 0 ?
Color.Gold :
Color.DarkGreen;
}
}
}
else
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo && (x.Mod_ID == Mod_ID || x.Mod_ID == null));
lbl.ForeColor = Modulo == null
? Color.Black
: Modulo.Erro
? Color.Gold
: Modulo.Conectado
? Color.DarkGreen
: Color.DarkRed;
}
});
bool mqttConectado = Variaveis.MqttService.StatusConexao();
lblMqtt.Text = "MQTT: " + (mqttConectado ? "Conectado" : "Desconectado");
lblMqtt.ForeColor = mqttConectado ? Color.Green : Color.Red;
bool wifiConectado = WifiService.WifiConectado;
bool wifiDisponivel = WifiService.WifiDisponivel;
bool wifiConectando = WifiService.Conectando;
lblWifi.Text = "Wi-Fi: " + (wifiConectado ? "Conectado" : wifiConectando ? "Conectando..." : wifiDisponivel ? "Disponível" : "Desconectado");
lblWifi.ForeColor = wifiConectado ? Color.Green : wifiConectando ? Color.Black : wifiDisponivel ? Color.Yellow : Color.Red;
bool opLiberada = Variaveis.OperacaoEmAndamento.OperacaoLiberada;
lblOperacaoLiberada.Text = "Operação Liberada: " + (opLiberada ? "Sim" : "Não");
lblOperacaoLiberada.ForeColor = opLiberada ? Color.Green : Color.Red;
lblCodigoFalha.Text = $"Código de Falha: {CodFalha}";
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 = OperacaoModel.DescricaoCodigoFalha(CodFalha);
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));
string msg = "Módulo: " + Dispositivo +
"\r\nID: " + Mod_ID +
"\r\nConectado: " + (Modulo != null ? "Sim" : "Não") +
"\r\nInicializado: " + (Modulo != null && Modulo.Conectado ? "Sim" : "Não") +
"\r\nVersão: " + (Modulo != null ? Modulo.Versao : "") +
"\r\nErro: " + (Modulo != null && Modulo.Erro ? "Sim" : "Não") +
"\r\nStatus: " + (
lbl.ForeColor == Color.Black ? "Não conectado" :
lbl.ForeColor == Color.DarkRed ? "Não inicializado" :
lbl.ForeColor == Color.DarkGreen ? "Inicializado" :
lbl.ForeColor == Color.Gold ? "Não configurado" :
""
);
CustomDialog.ShowDialog(
"Detalhes",
$"{msg}",
Modulo != null && Modulo.Erro ? MessageBoxIcon.Error : Modulo != null && Modulo.Conectado ? MessageBoxIcon.Information : MessageBoxIcon.Exclamation,
new Dictionary<(string, dynamic), Action>()
{
{ ("OK", null), () => { } },
}
);
}
}
}