agrobot_base/AgroBase/AgroBase/Services/DispositivosService.cs

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; }
}
}