441 lines
22 KiB
C#
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), () => { } },
|
|
}
|
|
);
|
|
}
|
|
|
|
|
|
}
|
|
}
|