1046 lines
40 KiB
C#
1046 lines
40 KiB
C#
using AgroBase.Forms;
|
|
using AgroBase.Forms.Atuador;
|
|
using AgroBase.Forms.Direcional;
|
|
using AgroBase.Forms.Movimentacao;
|
|
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.IO.Ports;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
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 DateTime _CriadoEm { get; set; }
|
|
public SerialPort _Porta { get; set; } = null;
|
|
public GroupBox gpbItem { get; set; }
|
|
public ComboBox cmbPorta { get; set; }
|
|
public ComboBox cmbBaudRate { get; set; }
|
|
public NumericUpDown nudAmostragem { get; set; }
|
|
public Label lblStatus { get; set; }
|
|
public Button btnConectar { get; set; }
|
|
public Button btnAtualizar { get; set; }
|
|
public TextBox txtEnvios { get; set; }
|
|
public RichTextBox txaConsole { get; set; }
|
|
public int _index { get; set; }
|
|
public List<DispositivoLogModel> Logs { get; set; } = new List<DispositivoLogModel>();
|
|
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 frmPlot { get; set; }
|
|
public Form frmPin { get; set; }
|
|
|
|
|
|
public AsyncTaskTimerModel tmrLimpeza;
|
|
public int Ticks { get; set; } = 0;
|
|
|
|
public int TempoConectado { get; set; } = 0;
|
|
|
|
public int BaudRate()
|
|
{
|
|
if (cmbBaudRate.SelectedIndex < 0)
|
|
{
|
|
return 0;
|
|
}
|
|
return Convert.ToInt32(cmbBaudRate.SelectedItem.ToString());
|
|
}
|
|
|
|
public string PortaCOM()
|
|
{
|
|
if (cmbPorta.SelectedIndex < 0)
|
|
{
|
|
return "";
|
|
}
|
|
return cmbPorta.SelectedItem.ToString();
|
|
}
|
|
|
|
public string StatusPorta()
|
|
{
|
|
string _status = _Porta.IsOpen ? "Conectado" : "Desconectado";
|
|
frmInstancial.frmPrincipal.lblStripErro.Text = _status;
|
|
return _status;
|
|
}
|
|
|
|
public void AtualizarPortas()
|
|
{
|
|
var DispositivosTipo = SerialService.DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).ToList();
|
|
for (int i = 0; i < DispositivosTipo.Count(); i++)
|
|
{
|
|
if (!cmbPorta.Items.Contains(DispositivosTipo[i].Endereco))
|
|
{
|
|
string PortaCom = DispositivosTipo[i].Endereco;
|
|
var _Porta = new SerialPort() { PortName = PortaCom, BaudRate = 115200 };
|
|
try
|
|
{
|
|
_Porta.Open();
|
|
_Porta.Close();
|
|
cmbPorta.Items.Add(PortaCom);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.Message);
|
|
}
|
|
}
|
|
}
|
|
if (cmbPorta.InvokeRequired)
|
|
{
|
|
cmbPorta.Invoke((MethodInvoker)delegate {
|
|
if (!DispositivosTipo.Any())
|
|
{
|
|
cmbPorta.Items.Clear();
|
|
cmbPorta.Text = "";
|
|
}
|
|
if (cmbPorta.Items.Count > 1)
|
|
cmbPorta.SelectedIndex = 1;
|
|
else if (cmbPorta.Items.Count > 0)
|
|
cmbPorta.SelectedIndex = 0;
|
|
});
|
|
}
|
|
else
|
|
{
|
|
if (!DispositivosTipo.Any())
|
|
{
|
|
cmbPorta.Items.Clear();
|
|
cmbPorta.Text = "";
|
|
}
|
|
if (cmbPorta.Items.Count > 1)
|
|
cmbPorta.SelectedIndex = 1;
|
|
else if (cmbPorta.Items.Count > 0)
|
|
cmbPorta.SelectedIndex = 0;
|
|
}
|
|
}
|
|
|
|
public void AtualizarBauds()
|
|
{
|
|
cmbBaudRate.Items.Clear();
|
|
cmbBaudRate.Text = "";
|
|
|
|
cmbBaudRate.Items.Add("9600");
|
|
cmbBaudRate.Items.Add("34800");
|
|
cmbBaudRate.Items.Add("115200");
|
|
|
|
cmbBaudRate.SelectedIndex = 2;
|
|
}
|
|
|
|
|
|
public bool ConectarPortaSerial()
|
|
{
|
|
try
|
|
{
|
|
_Porta.PortName = PortaCOM();
|
|
_Porta.BaudRate = BaudRate();
|
|
//_Porta = new SerialPort(PortaCOM(), BaudRate());
|
|
_Porta.ReadBufferSize = 16384;
|
|
_Porta.WriteBufferSize = 8192;
|
|
|
|
if (_Porta.IsOpen)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
_Porta.Open();
|
|
|
|
LimparBufferSerial(false);
|
|
|
|
lblStatus.Text = StatusPorta();
|
|
|
|
return _Porta.IsOpen;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
frmInstancial.frmPrincipal.lblStripErro.Text = "Erro ao conectar na porta '" + PortaCOM() + "' - " + ex.Message;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public bool DesconectarPortaSerial()
|
|
{
|
|
try
|
|
{
|
|
if (!_Porta.IsOpen)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
LimparBufferSerial(false);
|
|
|
|
Task.Run(() =>
|
|
{
|
|
try
|
|
{
|
|
_Porta.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// Log ou trate a exceção conforme necessário
|
|
MessageBox.Show($"Erro ao fechar a porta serial: {ex.Message}");
|
|
}
|
|
});
|
|
|
|
lblStatus.Text = StatusPorta();
|
|
|
|
return !_Porta.IsOpen;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
frmInstancial.frmPrincipal.lblStripErro.Text = "Erro ao desconectar da porta '" + PortaCOM() + "' - " + ex.Message;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void EnviarDadosSerial(string Dados)
|
|
{
|
|
if (!_Porta.IsOpen || string.IsNullOrEmpty(Dados))
|
|
{
|
|
throw new Exception("A porta " + _Porta.PortName + " não está aberta");
|
|
}
|
|
|
|
AtualizarConsole("> " + DateTime.Now.ToString("HH:mm:ss:fff") + " - " + Dados).ConfigureAwait(false);
|
|
|
|
try
|
|
{
|
|
bool erroEnvio = !SerialService.EnviarDadosPortaSerial(_Porta, Dados);
|
|
//Console.WriteLine("Dados enviados: " + Dados);
|
|
lock (_logsLock)
|
|
{
|
|
Logs.Add(new DispositivoLogModel()
|
|
{
|
|
Momento = DateTime.Now,
|
|
Enviado = true,
|
|
Protocolo = Dados,
|
|
ErroEnvio = erroEnvio,
|
|
});
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Erro ao enviar comando para a porta: " + _Porta.PortName + " - " + ex.Message);
|
|
throw ex;
|
|
}
|
|
}
|
|
|
|
public void AdicionarMensagemFila(string Mod_ID, string mensagem, bool _prioridade, bool _aguardaCallback)
|
|
{
|
|
if (_Porta.IsOpen && Mod_ID != "" && mensagem != "")
|
|
{
|
|
FilaService.AdicionarMensagemFila(Mod_ID, Dispositivo, mensagem, _prioridade, _aguardaCallback);
|
|
}
|
|
}
|
|
|
|
public Control InstanciarDispositivo(int index)
|
|
{
|
|
CarregarParametrosModulos();
|
|
|
|
Dados.IniciarRegistrador();
|
|
|
|
((dynamic)Dados).Conectado = false;
|
|
|
|
frmPin = new frmPinout(Dispositivo);
|
|
|
|
_Porta.DataReceived -= _Porta_DataReceived;
|
|
_Porta.DataReceived += _Porta_DataReceived;
|
|
|
|
gpbItem = new GroupBox()
|
|
{
|
|
Name = "gpb" + _Nome,
|
|
Text = _Descricao,
|
|
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 }
|
|
};
|
|
cmbPorta = new ComboBox()
|
|
{
|
|
Name = "cmb" + _Nome + "Por",
|
|
Text = "",
|
|
Location = new System.Drawing.Point() { X = 31, Y = 47 },
|
|
Size = new System.Drawing.Size() { Height = 24, Width = 89 },
|
|
DropDownStyle = ComboBoxStyle.DropDownList
|
|
};
|
|
AtualizarPortas();
|
|
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 }
|
|
};
|
|
cmbBaudRate = new ComboBox()
|
|
{
|
|
Name = "cmb" + _Nome + "Bau",
|
|
Text = "",
|
|
Location = new System.Drawing.Point() { X = 31, Y = 94 },
|
|
Size = new System.Drawing.Size() { Height = 24, Width = 89 },
|
|
DropDownStyle = ComboBoxStyle.DropDownList
|
|
};
|
|
AtualizarBauds();
|
|
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 = decimal.Parse(Dados.GetTaxaAmostragem()),
|
|
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;
|
|
btnAtualizar = new Button()
|
|
{
|
|
Name = "btn" + _Nome + "Att",
|
|
Text = "Atualizar",
|
|
Location = new System.Drawing.Point() { X = 31, Y = 170 },
|
|
Size = new System.Drawing.Size() { Height = 24, Width = 89 }
|
|
};
|
|
btnAtualizar.Click -= btnAtualizar_Click;
|
|
btnAtualizar.Click += btnAtualizar_Click;
|
|
btnConectar = new Button()
|
|
{
|
|
Name = "btn" + _Nome + "Con",
|
|
Text = "Conectar",
|
|
Location = new System.Drawing.Point() { X = 31, Y = 201 },
|
|
Size = new System.Drawing.Size() { Height = 24, Width = 89 }
|
|
};
|
|
btnConectar.Click -= btnConectar_Click;
|
|
btnConectar.Click += btnConectar_Click;
|
|
lblStatus = new Label()
|
|
{
|
|
Name = "lbl" + _Nome + "Sta",
|
|
Text = _Porta.IsOpen ? "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 (SerialService.DispositivosMotores.Contains(Dispositivo))
|
|
{
|
|
clbDispositivos.Items.Clear();
|
|
Models.MovSensoriamentoMotor[] Motores = { };
|
|
|
|
if (Dados is MovimentacaoModel movModel && Dispositivo == T_Code.Mov)
|
|
{
|
|
Motores = movModel.Motores.Select(x => new Models.MovSensoriamentoMotor { ID = x.ID, Comandar = x.Comandar }).ToArray();
|
|
}
|
|
else if (Dados is DirecionalModel dirModel && Dispositivo == T_Code.Dir)
|
|
{
|
|
Motores = dirModel.Motores.Select(x => new Models.MovSensoriamentoMotor { ID = x.ID, Comandar = x.Comandar }).ToArray();
|
|
}
|
|
|
|
foreach (var Motor in Motores)
|
|
{
|
|
clbDispositivos.Items.Add(Motor.ID);
|
|
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, Motor.Comandar);
|
|
}
|
|
}
|
|
else 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();
|
|
clbDispositivos.Items.Add(atuModel.BombaPressurizadora.ID.ToString());
|
|
clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, atuModel.BombaPressurizadora.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;
|
|
Button btnLimpar = new Button()
|
|
{
|
|
Name = "btn" + _Nome + "Lim",
|
|
Text = "Limpar",
|
|
Location = new System.Drawing.Point() { X = 480, Y = 47 },
|
|
Size = new System.Drawing.Size() { Height = 24, Width = 70 },
|
|
};
|
|
btnLimpar.Click -= btnLimpar_Click;
|
|
btnLimpar.Click += btnLimpar_Click;
|
|
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
|
|
};
|
|
tmrLimpeza = new AsyncTaskTimerModel("tmrLimpeza", tmrLimpeza_Tick, 1000, frmInstancial.frmPrincipal);
|
|
|
|
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 btnPlot = new Button()
|
|
{
|
|
Name = "btn" + _Nome + "Plot",
|
|
Text = "Plotagem",
|
|
Location = new System.Drawing.Point() { X = 135, Y = 201 },
|
|
Size = new System.Drawing.Size() { Height = 24, Width = 89 }
|
|
};
|
|
btnPlot.Click -= btnPlot_Click;
|
|
btnPlot.Click += btnPlot_Click;*/
|
|
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;
|
|
|
|
|
|
gpbItem.Controls.Add(lblPorta);
|
|
gpbItem.Controls.Add(cmbPorta);
|
|
gpbItem.Controls.Add(lblBaudRate);
|
|
gpbItem.Controls.Add(cmbBaudRate);
|
|
gpbItem.Controls.Add(lblAmostragem);
|
|
gpbItem.Controls.Add(nudAmostragem);
|
|
gpbItem.Controls.Add(lblDispositivos);
|
|
gpbItem.Controls.Add(clbDispositivos);
|
|
gpbItem.Controls.Add(btnAtualizar);
|
|
gpbItem.Controls.Add(btnConectar);
|
|
gpbItem.Controls.Add(lblStatus);
|
|
gpbItem.Controls.Add(lblEnvio);
|
|
gpbItem.Controls.Add(txtEnvios);
|
|
gpbItem.Controls.Add(btnLimpar);
|
|
gpbItem.Controls.Add(lblRecebidos);
|
|
gpbItem.Controls.Add(txaConsole);
|
|
gpbItem.Controls.Add(btnConfig);
|
|
//gpbItem.Controls.Add(btnPlot);
|
|
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 btnPlot_Click(object sender, EventArgs e)
|
|
{
|
|
if (frmPlot != null)
|
|
{
|
|
frmPlot.Show();
|
|
}
|
|
}
|
|
|
|
private void btnConfig_Click(object sender, EventArgs e)
|
|
{
|
|
if (frmConfig != null)
|
|
{
|
|
frmConfig.Show();
|
|
}
|
|
}
|
|
|
|
private async Task tmrLimpeza_Tick()
|
|
{
|
|
if (Ticks % 5 == 0)
|
|
{
|
|
LimparBufferSerial(true);
|
|
}
|
|
if (Ticks >= 30)
|
|
{
|
|
SalvarLog();
|
|
|
|
Ticks = -1;
|
|
}
|
|
Ticks++;
|
|
TempoConectado++;
|
|
}
|
|
|
|
private void SalvarLog()
|
|
{
|
|
lock (_logsLock)
|
|
{
|
|
if (Logs.Count == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
string Caminho = Variaveis.CaminhoLogsDispositivos + Dispositivo;
|
|
string NomeLog = _CriadoEm.ToString("dd_MM_yyyy_mm_ss") + ".json";
|
|
if (!Directory.Exists(Caminho))
|
|
{
|
|
Directory.CreateDirectory(Caminho);
|
|
}
|
|
if (!File.Exists(Caminho + "/" + NomeLog))
|
|
{
|
|
string jsonLog = JsonConvert.SerializeObject(Logs, Formatting.None);
|
|
File.WriteAllText(Caminho + "/" + NomeLog, jsonLog.Substring(0, jsonLog.Length - 1));
|
|
}
|
|
else
|
|
{
|
|
string jsonLog = JsonConvert.SerializeObject(Logs, Formatting.None);
|
|
jsonLog = jsonLog.Substring(1, jsonLog.Length - 2);
|
|
File.AppendAllText(Caminho + "/" + NomeLog, "," + jsonLog);
|
|
}
|
|
Logs = new List<DispositivoLogModel>();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
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.Mov:
|
|
if (Dados is MovimentacaoModel movModel)
|
|
{
|
|
movModel.Motores.ForEach(x => x.Comandar = false);
|
|
foreach (var Item in ((CheckedListBox)sender).CheckedItems)
|
|
{
|
|
movModel.Motores.First(x => x.ID == Item.ToString()).Comandar = true;
|
|
}
|
|
}
|
|
break;
|
|
case T_Code.Dir:
|
|
if (Dados is DirecionalModel dirModel)
|
|
{
|
|
dirModel.Motores.ForEach(x => x.Comandar = false);
|
|
foreach (var Item in ((CheckedListBox)sender).CheckedItems)
|
|
{
|
|
dirModel.Motores.First(x => x.ID == Item.ToString()).Comandar = true;
|
|
}
|
|
}
|
|
break;
|
|
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.BombaPressurizadora.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.BombaPressurizadora.ID == Item.ToString())
|
|
{
|
|
atuModel.BombaPressurizadora.Comandar = true;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case T_Code.Mvd:
|
|
if (Dados is MovimentacaoUnificadaModel mvdModel)
|
|
{
|
|
mvdModel.Modulos.ForEach(x =>
|
|
{
|
|
x.MovMotor.Comandar = false;
|
|
x.DirMotor.Comandar = false;
|
|
});
|
|
foreach (var Item in ((CheckedListBox)sender).CheckedItems)
|
|
{
|
|
if (mvdModel.Modulos.Any(x => (x.Modulo_ID + " " + x.MovMotor.ID) == Item.ToString()))
|
|
{
|
|
mvdModel.Modulos.FirstOrDefault(x => x.Modulo_ID == Item.ToString().Split(' ')[0] && x.MovMotor.ID == Item.ToString().Split(' ')[1]).MovMotor.Comandar = true;
|
|
}
|
|
else if (mvdModel.Modulos.Any(x => (x.Modulo_ID + " " + x.DirMotor.ID) == Item.ToString()))
|
|
{
|
|
mvdModel.Modulos.FirstOrDefault(x => x.Modulo_ID == Item.ToString().Split(' ')[0] && x.DirMotor.ID == Item.ToString().Split(' ')[1]).DirMotor.Comandar = true;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
var Config = Dados.ProtocoloConfiguracao(true);
|
|
frmInstancial.frmPrincipal.lblStripErro.Text = Config.Any() ? Config.FirstOrDefault().Value.FirstOrDefault() : "";
|
|
}
|
|
|
|
private void nudAmostragem_ValueChanged(object sender, EventArgs e)
|
|
{
|
|
Dados.SetTaxaAmostragem((Convert.ToInt32(((NumericUpDown)sender).Value)));
|
|
}
|
|
|
|
private void btnLimpar_Click(object sender, EventArgs e)
|
|
{
|
|
LimparBufferSerial(true);
|
|
}
|
|
|
|
public void LimparBufferSerial(bool LimparConsole)
|
|
{
|
|
try
|
|
{
|
|
if (LimparConsole)
|
|
{
|
|
txaConsole.Text = "";
|
|
}
|
|
|
|
if (_Porta.IsOpen)
|
|
{
|
|
_Porta.DiscardInBuffer();
|
|
_Porta.DiscardOutBuffer();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Erro ao limpar buffer da porta " + _Porta.PortName);
|
|
}
|
|
}
|
|
|
|
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)) };
|
|
}
|
|
|
|
private void _Porta_DataReceived(object sender, SerialDataReceivedEventArgs e)
|
|
{
|
|
string Recebido = "";
|
|
try
|
|
{
|
|
Recebido = SerialService.ReadLineWithTimeout(_Porta, 2000);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Erro ao receber dados da porta " + _Porta.PortName + " - " + ex.Message);
|
|
}
|
|
if (Recebido == "")
|
|
{
|
|
return;
|
|
}
|
|
|
|
string mensagem = "";
|
|
|
|
if (Recebido.Contains(SerialService.SplitMessage))
|
|
{
|
|
string Mod_ID = Recebido.Split(SerialService.SplitMessage[0])[0];
|
|
mensagem = Recebido.Substring(Mod_ID.Length + 1, Recebido.Length - Mod_ID.Length - 1);
|
|
var DadosMensagem = mensagem.Split(SerialService.SplitMessage[0]);
|
|
if (DadosMensagem.Length > 2 && int.TryParse(DadosMensagem[0], out int val))
|
|
{
|
|
try
|
|
{
|
|
F_Code funcao = (F_Code)(val);
|
|
switch (funcao)
|
|
{
|
|
case F_Code.Msg:
|
|
{
|
|
int _id = int.Parse(DadosMensagem[1]);
|
|
FilaService.MarcarMensagemRecebida(_id);
|
|
break;
|
|
}
|
|
case F_Code.Chk:
|
|
{
|
|
bool conectado = DadosMensagem[3] == "1";
|
|
Dados.DefineStatusConexao(Mod_ID, conectado);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
lock (_logsLock)
|
|
{
|
|
Logs.Add(new DispositivoLogModel()
|
|
{
|
|
Momento = DateTime.Now,
|
|
Enviado = false,
|
|
Protocolo = Recebido,
|
|
});
|
|
}
|
|
|
|
AtualizarConsole("< " + DateTime.Now.ToString("HH:mm:ss:fff") + " - " + Recebido).ConfigureAwait(false);
|
|
|
|
if (mensagem != "" && mensagem[0].ToString() == SerialService.BeginSensor && !EqualityComparer<T>.Default.Equals(Dados, default(T)))
|
|
{
|
|
Dados.RecebeProtocoloSerial(Recebido);
|
|
}
|
|
}
|
|
|
|
public void btnConectar_Click(object sender, EventArgs e)
|
|
{
|
|
var Config = new Dictionary<string, List<string>>();
|
|
|
|
if (_Porta.IsOpen)
|
|
{
|
|
LimparBufferSerial(false);
|
|
|
|
Config = Dados.ProtocoloConfiguracao(false);
|
|
foreach (var ProtocoloConfiguracao in Config)
|
|
{
|
|
if (ProtocoloConfiguracao.Key != "" && ProtocoloConfiguracao.Value.Any())
|
|
{
|
|
ProtocoloConfiguracao.Value.ForEach(x => AdicionarMensagemFila(ProtocoloConfiguracao.Key, x, true, true));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (ConectarPortaSerial())
|
|
{
|
|
LimparBufferSerial(false);
|
|
|
|
Config = Dados.ProtocoloConfiguracao(true);
|
|
foreach (var ProtocoloConfiguracao in Config)
|
|
{
|
|
if (ProtocoloConfiguracao.Key != "" && ProtocoloConfiguracao.Value.Any())
|
|
{
|
|
ProtocoloConfiguracao.Value.ForEach(x => AdicionarMensagemFila(ProtocoloConfiguracao.Key, x, true, true));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
GeneralJoystick.AtualizaDispositivo();
|
|
//tmrConexao.Enabled = true;
|
|
}
|
|
|
|
public void AcaoConexao()
|
|
{
|
|
if (!Dados.GetStatusConexao())
|
|
{
|
|
if (DesconectarPortaSerial())
|
|
{
|
|
AcaoDesconectar();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AcaoConectar();
|
|
}
|
|
}
|
|
|
|
public void AcaoDesconectar()
|
|
{
|
|
if (cmbPorta != null)
|
|
{
|
|
// Verifica se a invocação é necessária
|
|
if (cmbPorta.InvokeRequired)
|
|
{
|
|
// Invoca a ação na thread de UI
|
|
cmbPorta.Invoke(new Action(AcaoDesconectar));
|
|
}
|
|
else
|
|
{
|
|
// Código que altera as propriedades dos componentes
|
|
cmbPorta.Enabled = true;
|
|
cmbBaudRate.Enabled = true;
|
|
btnAtualizar.Enabled = true;
|
|
nudAmostragem.Enabled = true;
|
|
txtEnvios.ReadOnly = true;
|
|
txtEnvios.Text = "";
|
|
btnConectar.Text = "Conectar";
|
|
|
|
tmrLimpeza.Stop();
|
|
|
|
SalvarLog();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AcaoConectar()
|
|
{
|
|
// Verifica se a invocação é necessária
|
|
if (cmbPorta.InvokeRequired)
|
|
{
|
|
// Invoca a ação na thread de UI
|
|
cmbPorta.Invoke(new Action(AcaoConectar));
|
|
}
|
|
else
|
|
{
|
|
// Código que altera as propriedades dos componentes
|
|
cmbPorta.Enabled = false;
|
|
cmbBaudRate.Enabled = false;
|
|
btnAtualizar.Enabled = false;
|
|
nudAmostragem.Enabled = false;
|
|
txtEnvios.ReadOnly = false;
|
|
txtEnvios.Text = "";
|
|
btnConectar.Text = "Desconectar";
|
|
tmrLimpeza.Start();
|
|
}
|
|
}
|
|
|
|
private void btnAtualizar_Click(object sender, EventArgs e)
|
|
{
|
|
AtualizarPortas();
|
|
}
|
|
|
|
delegate void AtualizarConsoleDelegate(string Texto);
|
|
|
|
private async Task AtualizarConsole(string texto)
|
|
{
|
|
texto += Environment.NewLine;
|
|
|
|
if (txaConsole.InvokeRequired)
|
|
{
|
|
await Task.Run(() => txaConsole.Invoke(new Action(() => txaConsole.Text += texto)));
|
|
}
|
|
else
|
|
{
|
|
txaConsole.Text += texto;
|
|
}
|
|
}
|
|
|
|
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);
|
|
var Parametros = JsonConvert.DeserializeObject<T>(configText);
|
|
|
|
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;
|
|
}
|
|
|
|
File.WriteAllText(nomeArquivo, JsonConvert.SerializeObject(newConfig));
|
|
}
|
|
|
|
public void CarregarParametrosModulos()
|
|
{
|
|
switch (Dispositivo)
|
|
{
|
|
case T_Code.Mov:
|
|
Dados = CarregarParametros(MovimentacaoModel.CarregarParametrosIniciais());
|
|
frmPlot = new frmMovPlot();
|
|
frmConfig = new frmMovConfig();
|
|
|
|
MovimentacaoModel.Pinout = PinoutModel.CarregarPinout(Dispositivo);
|
|
break;
|
|
case T_Code.Dir:
|
|
Dados = CarregarParametros(DirecionalModel.CarregarParametrosIniciais());
|
|
frmPlot = new frmDirPlot();
|
|
frmConfig = new frmDirConfig();
|
|
|
|
DirecionalModel.Pinout = PinoutModel.CarregarPinout(Dispositivo);
|
|
break;
|
|
case T_Code.Sen:
|
|
Dados = CarregarParametros(SensoriamentoModel.CarregarParametrosIniciais());
|
|
SensoriamentoModel.LimparDados(Dados as SensoriamentoModel);
|
|
frmConfig = new frmSenConfig();
|
|
((frmSenConfig)frmConfig).Dispositivo = T_Code.Sen;
|
|
|
|
SensoriamentoModel.Pinout = PinoutModel.CarregarPinout(Dispositivo);
|
|
break;
|
|
case T_Code.Atu:
|
|
Dados = CarregarParametros(AtuadorModel.CarregarParametrosIniciais());
|
|
AtuadorModel.LimparDados(Dados as AtuadorModel);
|
|
frmConfig = new frmAtuConfig();
|
|
|
|
AtuadorModel.Pinout = PinoutModel.CarregarPinout(Dispositivo);
|
|
break;
|
|
case T_Code.Mvd:
|
|
Dados = CarregarParametros(MovimentacaoUnificadaModel.CarregarParametrosIniciais());
|
|
MovimentacaoUnificadaModel.LimparDados(Dados as MovimentacaoUnificadaModel);
|
|
frmConfig = new frmMvdConfig();
|
|
|
|
ModuloMvdModel.Pinout = PinoutModel.CarregarPinout(Dispositivo);
|
|
break;
|
|
default:
|
|
Dados = default(T);
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public class DispositivoLogModel
|
|
{
|
|
public DateTime Momento { get; set; }
|
|
public string Protocolo { get; set; }
|
|
public bool Enviado { get; set; }
|
|
public bool ErroEnvio { get; set; }
|
|
}
|
|
|
|
|
|
}
|