agrobot_base/AgroBase/AgroBase/Services/DispositivosService.cs

507 lines
21 KiB
C#

using AgroBase.Forms;
using AgroBase.Forms.Atuador;
using AgroBase.Forms.Sensoriamento;
using AgroBase.Models;
using AgroBase.Models.Modules;
using AgroBase.Services;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Comum
{
public class DispositivosService<T> : IDispositivosService where T : DispositivoBaseModel, new()
{
public T_Code Dispositivo { get; set; } = T_Code.Vzo;
public string _Nome { get; set; }
public string _Descricao { get; set; }
public int _TaxaAmostragem
{
get
{
return Dados._TaxaAmostragem;
}
set
{
Dados._TaxaAmostragem = value;
}
}
public DateTime CriadoEm
{
get
{
return SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo)?.CriadoEm ?? DateTime.Now;
}
}
public GroupBox gpbItem { get; set; }
public NumericUpDown nudAmostragem { get; set; }
public Label lblStatus { get; set; }
public TextBox txtEnvios { get; set; }
public RichTextBox txaConsole { get; set; }
public int _index { get; set; }
public List<string> Logs { get; set; } = new List<string>();
public readonly object _logsLock = new object();
public T Dados { get; set; } = new T();
DispositivoBaseModel IDispositivosService.Dados
{
get { return this.Dados; }
set { this.Dados = (T)value; } // Isso pode lançar uma exceção se o valor não for do tipo T
}
public Form frmConfig { get; set; }
public Form frmPin { get; set; }
//private AsyncTaskTimerModel tmrLogsDispositivo;
//public int TempoConectado { get; set; } = 0;
private void SalvarLog(DispositivoLogModel Log)
{
Logs.Add(JsonConvert.SerializeObject(Log));
VariaveisOperacao.RegistrarLogDispositivo(Logs, Dispositivo, ".json", 100);
}
public void AdicionarMensagemFila(int ID_Num, CanMessagePosicaoDados PosicaoTx, CanMessagePosicaoDados PosicaoRx, byte[] dados = null, bool get = true)
{
List<byte> payload = new List<byte>()
{
(byte)ID_Num,
};
if (dados != null)
{
payload.AddRange(dados);
}
CanService.AdicionarMensagemNaFila(Dispositivo, Dados._EnderecoCAN_Tx, Dados._EnderecoCAN_Rx, (byte)PosicaoTx, (byte)PosicaoRx, payload.ToArray(), get);
}
public Control InstanciarDispositivo(int index)
{
frmPin = new frmPinout(Dispositivo);
gpbItem = new GroupBox()
{
Name = "gpb" + _Nome,
Text = _Nome,
Location = new System.Drawing.Point() { X = 13, Y = 0 },
Size = new System.Drawing.Size() { Height = 251, Width = 580 },
};
AtualizaIndex(index);
Label lblPorta = new Label()
{
Name = "lbl" + _Nome + "Por",
Text = "Porta",
Location = new System.Drawing.Point() { X = 28, Y = 27 },
Size = new System.Drawing.Size() { Height = 17, Width = 42 }
};
Label lblBaudRate = new Label()
{
Name = "lbl" + _Nome + "Bau",
Text = "Baud Rate",
Location = new System.Drawing.Point() { X = 28, Y = 74 },
Size = new System.Drawing.Size() { Height = 17, Width = 75 }
};
Label lblAmostragem = new Label()
{
Name = "lbl" + _Nome + "Amo",
Text = "Amostragem (ms)",
Location = new System.Drawing.Point() { X = 31, Y = 124 },
Size = new System.Drawing.Size() { Height = 17, Width = 100 }
};
nudAmostragem = new NumericUpDown()
{
Name = "nud" + _Nome + "Amo",
Minimum = 0,
Maximum = 99999,
Value = Dados._TaxaAmostragem,
Location = new System.Drawing.Point() { X = 31, Y = 144 },
Size = new System.Drawing.Size() { Height = 24, Width = 89 }
};
nudAmostragem.ValueChanged -= nudAmostragem_ValueChanged;
nudAmostragem.ValueChanged += nudAmostragem_ValueChanged;
lblStatus = new Label()
{
Name = "lbl" + _Nome + "Sta",
Text = Dados.ConexaoAtiva ? "Conectado" : "Desconectado",
Location = new System.Drawing.Point() { X = 28, Y = 231 },
Size = new System.Drawing.Size() { Height = 17, Width = 100 }
};
Label lblDispositivos = new Label()
{
Name = "lbl" + _Nome + "Disp",
Text =
Dispositivo == T_Code.Sen ? "Sensores" :
Dispositivo == T_Code.Atu ? "Atuadores" :
SerialService.DispositivosMotores.Any(x => x == Dispositivo) ? "Motores" :
"Dispositivos",
Location = new System.Drawing.Point() { X = 135, Y = 27 },
Size = new System.Drawing.Size() { Height = 17, Width = 100 }
};
CheckedListBox clbDispositivos = new CheckedListBox()
{
Name = "clb" + _Nome,
Location = new System.Drawing.Point() { X = 135, Y = 45 },
Size = new System.Drawing.Size() { Height = 125, Width = 100 }
};
if (Dados is SensoriamentoModel senModel && Dispositivo == T_Code.Sen)
{
clbDispositivos.Items.Clear();
var Sensores = senModel.Sensores;
foreach (var Sensor in Sensores)
{
clbDispositivos.Items.Add(Sensor.ID);
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, Sensor.Aferir);
}
var Reles = senModel.Reles;
foreach (var Rele in Reles)
{
clbDispositivos.Items.Add(Rele.ID);
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, Rele.Controlar);
}
var Servos = senModel.Servos;
foreach (var Servo in Servos)
{
clbDispositivos.Items.Add(Servo.ID);
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, Servo.Controlar);
}
}
else if (Dados is AtuadorModel atuModel && Dispositivo == T_Code.Atu)
{
clbDispositivos.Items.Clear();
var Bombas = atuModel.BombasPressurizadoras.ToList();
foreach (var Bomba in Bombas)
{
clbDispositivos.Items.Add(Bomba.ID.ToString());
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, Bomba.Comandar);
}
var Bicos = atuModel.BicosPulverizadores.ToList();
foreach (var Bico in Bicos)
{
clbDispositivos.Items.Add(Bico.ID.ToString());
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, Bico.Comandar);
}
var Sensores = atuModel.Sensores.ToList();
foreach (var Sensor in Sensores)
{
clbDispositivos.Items.Add(Sensor.ID.ToString());
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, Sensor.Aferir);
}
}
else if (Dados is MovimentacaoUnificadaModel mvdModel && Dispositivo == T_Code.Mvd)
{
clbDispositivos.Items.Clear();
foreach (var modulo in mvdModel.Modulos)
{
clbDispositivos.Items.Add(modulo.Modulo_ID + " " + modulo.MovMotor.ID.ToString());
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, modulo.MovMotor.Comandar);
clbDispositivos.Items.Add(modulo.Modulo_ID + " " + modulo.DirMotor.ID.ToString());
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, modulo.DirMotor.Comandar);
}
}
clbDispositivos.ItemCheck -= clbDispositivos_ItemCheck;
clbDispositivos.ItemCheck += clbDispositivos_ItemCheck;
Label lblEnvio = new Label()
{
Name = "lbl" + _Nome + "Env",
Text = "Enviar dados",
Location = new System.Drawing.Point() { X = 255, Y = 27 },
Size = new System.Drawing.Size() { Height = 17, Width = 75 }
};
txtEnvios = new TextBox()
{
Name = "txt" + _Nome,
Text = "",
Location = new System.Drawing.Point() { X = 255, Y = 47 },
Size = new System.Drawing.Size() { Height = 24, Width = 215 },
ReadOnly = true
};
txtEnvios.KeyDown -= txtEnvios_KeyDown;
txtEnvios.KeyDown += txtEnvios_KeyDown;
Label lblRecebidos = new Label()
{
Name = "lbl" + _Nome + "Rec",
Text = "Dados recebidos",
Location = new System.Drawing.Point() { X = 255, Y = 74 },
Size = new System.Drawing.Size() { Height = 17, Width = 100 }
};
txaConsole = new RichTextBox()
{
Name = "txa" + _Nome,
Text = "",
Location = new System.Drawing.Point() { X = 255, Y = 94 },
Size = new System.Drawing.Size() { Height = 141, Width = 300 },
ReadOnly = true
};
Button btnConfig = new Button()
{
Name = "btn" + _Nome + "Config",
Text = "Configuração",
Location = new System.Drawing.Point() { X = 135, Y = 170 },
Size = new System.Drawing.Size() { Height = 24, Width = 89 }
};
btnConfig.Click -= btnConfig_Click;
btnConfig.Click += btnConfig_Click;
btnConfig.Enabled = frmConfig != null;
Button btnPinout = new Button()
{
Name = "btn" + _Nome + "Pinout",
Text = "Pinout",
Location = new System.Drawing.Point() { X = 135, Y = 201 },
Size = new System.Drawing.Size() { Height = 24, Width = 89 }
};
btnPinout.Click -= btnPinout_Click;
btnPinout.Click += btnPinout_Click;
//tmrLogsDispositivo = new AsyncTaskTimerModel("tmrLogsDispositivo_" + Dispositivo.ToString(), tmrLogsDispositivo_Tick, 1000);
//tmrLogsDispositivo.Start();
gpbItem.Controls.Add(lblPorta);
gpbItem.Controls.Add(lblBaudRate);
gpbItem.Controls.Add(lblAmostragem);
gpbItem.Controls.Add(nudAmostragem);
gpbItem.Controls.Add(lblDispositivos);
gpbItem.Controls.Add(clbDispositivos);
gpbItem.Controls.Add(lblStatus);
gpbItem.Controls.Add(lblEnvio);
gpbItem.Controls.Add(txtEnvios);
gpbItem.Controls.Add(lblRecebidos);
gpbItem.Controls.Add(txaConsole);
gpbItem.Controls.Add(btnConfig);
gpbItem.Controls.Add(btnPinout);
return gpbItem;
}
private void btnPinout_Click(object sender, EventArgs e)
{
if (frmPin != null)
{
frmPin = new frmPinout(Dispositivo);
frmPin.Show();
}
}
private void btnConfig_Click(object sender, EventArgs e)
{
if (frmConfig != null)
{
frmConfig.Show();
}
}
private void clbDispositivos_ItemCheck(object sender, ItemCheckEventArgs e)
{
((CheckedListBox)sender).ItemCheck -= clbDispositivos_ItemCheck;
((CheckedListBox)sender).SetItemCheckState(e.Index, e.NewValue);
((CheckedListBox)sender).ItemCheck += clbDispositivos_ItemCheck;
switch (Dispositivo)
{
case T_Code.Sen:
if (Dados is SensoriamentoModel senModel)
{
senModel.Sensores.ForEach(x => x.Aferir = false);
senModel.Reles.ForEach(x => x.Controlar = false);
senModel.Servos.ForEach(x => x.Controlar = false);
foreach (var Item in ((CheckedListBox)sender).CheckedItems)
{
if (senModel.Sensores.Any(x => x.ID == Item.ToString()))
{
senModel.Sensores.First(x => x.ID == Item.ToString()).Aferir = true;
}
else if (senModel.Reles.Any(x => x.ID == Item.ToString()))
{
senModel.Reles.First(x => x.ID == Item.ToString()).Controlar = true;
}
else if (senModel.Servos.Any(x => x.ID == Item.ToString()))
{
senModel.Servos.First(x => x.ID == Item.ToString()).Controlar = true;
}
}
}
break;
case T_Code.Atu:
if (Dados is AtuadorModel atuModel)
{
atuModel.BicosPulverizadores.ForEach(x => x.Comandar = false);
atuModel.Sensores.ForEach(x => x.Aferir = false);
atuModel.BombasPressurizadoras.ForEach(x => x.Comandar = false);
foreach (var Item in ((CheckedListBox)sender).CheckedItems)
{
if (atuModel.BicosPulverizadores.Any(x => x.ID == Item.ToString()))
{
atuModel.BicosPulverizadores.FirstOrDefault(x => x.ID == Item.ToString()).Comandar = true;
}
else if (atuModel.Sensores.Any(x => x.ID == Item.ToString()))
{
atuModel.Sensores.FirstOrDefault(x => x.ID == Item.ToString()).Aferir = true;
}
else if (atuModel.BombasPressurizadoras.Any(x => x.ID == Item.ToString()))
{
atuModel.BombasPressurizadoras.FirstOrDefault(x => x.ID == Item.ToString()).Comandar = true;
}
}
}
break;
case T_Code.Mvd:
if (Dados is MovimentacaoUnificadaModel mvdModel)
{
foreach (var md in mvdModel.Modulos)
{
bool mov_selecionado = ((CheckedListBox)sender).CheckedItems
.Cast<object>()
.Any(x => x.ToString() == (md.Modulo_ID + " " + md.MovMotor.ID));
md.MovMotor.Comandar = mov_selecionado;
bool dir_selecionado = ((CheckedListBox)sender).CheckedItems
.Cast<object>()
.Any(x => x.ToString() == (md.Modulo_ID + " " + md.DirMotor.ID));
md.DirMotor.Comandar = dir_selecionado;
}
}
break;
}
var Config = Dados.ProtocoloConfiguracao(true);
//frmInstancial.frmPrincipal.lblStripErro.Text = Config.Any() ? FuncoesGlobais.ConverterComandoBytesParaTexto(Config.First().ToArray()) : "";
}
private void nudAmostragem_ValueChanged(object sender, EventArgs e)
{
Dados._TaxaAmostragem = Convert.ToInt32(((NumericUpDown)sender).Value);
}
private void txtEnvios_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter && txtEnvios.Text != "")
{
string modId = txtEnvios.Text.Split('¬')[0];
string mensagem = txtEnvios.Text.Split('¬')[1];
//AdicionarMensagemFila(modId, mensagem, false, true);
txtEnvios.Text = "";
txtEnvios.Focus();
}
}
public void AtualizaIndex(int index)
{
_index = index;
gpbItem.Location = new System.Drawing.Point() { X = gpbItem.Location.X, Y = (220 + (_index * 210)) };
}
public void EnviarProtocolosConfiguracao(bool Conectar = true)
{
List<(int ID_Num, CanMessagePosicaoDados Posicao, byte[] dados)> Config = Dados.ProtocoloConfiguracao(Conectar);
foreach (var data in Config)
{
AdicionarMensagemFila(data.ID_Num, data.Posicao, CanMessagePosicaoDados.Status, data.dados, false);
}
}
private T CarregarParametros(dynamic empty)
{
//string nomeArquivo = Variaveis.CaminhoParametros + "parameters" + Enum.GetName(typeof(T_Code), Dispositivo) + ".par";
VersaoArquivoModel arquivo = VersionamentoService.ArquivoParametros(Dispositivo);
if (arquivo != null)
{
string nomeArquivo = arquivo.CaminhoCompleto;
if (!File.Exists(nomeArquivo))
{
var newConfig = empty;
File.WriteAllText(nomeArquivo, JsonConvert.SerializeObject(newConfig));
}
var configText = File.ReadAllText(nomeArquivo);
//Console.WriteLine(configText);
T Parametros = default(T);
try
{
Parametros = JsonConvert.DeserializeObject<T>(configText);
}
catch
{
var newConfig = empty;
File.WriteAllText(nomeArquivo, JsonConvert.SerializeObject(newConfig));
return CarregarParametros(empty);
}
return Parametros;
}
else
{
return empty;
}
}
public void SalvarParametros(DispositivoBaseModel newConfig)
{
string nomeArquivo = Variaveis.CaminhoParametros + "parameters" + Enum.GetName(typeof(T_Code), Dispositivo) + ".par";
VersaoArquivoModel arquivo = VersionamentoService.ArquivoParametros(Dispositivo);
if (arquivo != null)
{
nomeArquivo = arquivo.CaminhoCompleto;
}
newConfig.LimparDados(Dados);
try
{
File.WriteAllText(nomeArquivo, JsonConvert.SerializeObject(newConfig));
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao salvar parametrizacao para o modulo de endereco {newConfig._EnderecoCAN_Tx}");
}
}
public void CarregarParametrosModulos()
{
switch (Dispositivo)
{
case T_Code.Sen:
Dados = CarregarParametros(SensoriamentoModel.CarregarParametrosIniciais());
frmConfig = new frmSenConfig();
((frmSenConfig)frmConfig).Dispositivo = T_Code.Sen;
SensoriamentoModel.Pinout = PinoutModel.CarregarPinout(Dispositivo);
break;
case T_Code.Atu:
Dados = CarregarParametros(AtuadorModel.CarregarParametrosIniciais());
frmConfig = new frmAtuConfig();
AtuadorModel.Pinout = PinoutModel.CarregarPinout(Dispositivo);
break;
case T_Code.Mvd:
Dados = CarregarParametros(MovimentacaoUnificadaModel.CarregarParametrosIniciais());
frmConfig = new frmMvdConfig();
ModuloMvdModel.Pinout = PinoutModel.CarregarPinout(Dispositivo);
break;
default:
Dados = default(T);
break;
}
Dados.LimparDados(Dados);
}
}
public class DispositivoLogModel
{
public DateTime Momento { get; set; }
public string Protocolo { get; set; }
public bool Enviado { get; set; }
public bool ErroEnvio { get; set; }
}
}