507 lines
21 KiB
C#
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; }
|
|
}
|
|
|
|
|
|
}
|