agrobot_base/AgroBase/AgroBase/Forms/frmPinout.cs

466 lines
19 KiB
C#

using AgroBase.Comum;
using AgroBase.Models.Modules;
using AgroBase.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using static AgroBase.Models.Enums;
using AgroBase.Services;
using System.Text.RegularExpressions;
namespace AgroBase.Forms
{
public partial class frmPinout : Form
{
public T_Code TipoDisp;
List<string> Pinos = new List<string>()
{
Enum.GetName(typeof(FuncoesPinout), FuncoesPinout.NaoConectado),
};
List<FuncoesPinout> Funcoes = new List<FuncoesPinout>();
PinoutDataModel Pinout = new PinoutDataModel();
List<DispositivoDataModel> Dispositivos = new List<DispositivoDataModel>();
public frmPinout(T_Code tipo)
{
InitializeComponent();
TipoDisp = tipo;
}
private void frmPinout_Load(object sender, EventArgs e)
{
cbTipo.Items.Clear();
cbTipo.Items.AddRange(Enum.GetNames(typeof(TiposControladores)));
Pinos = new List<string>()
{
Enum.GetName(typeof(FuncoesPinout), FuncoesPinout.NaoConectado),
};
Funcoes = new List<FuncoesPinout>();
Pinout = new PinoutDataModel()
{
ExpansorGPIO = false,
EnderecoGPIO = "0x20",
ExpansorADS = false,
EnderecoADS = "0x48",
Pinos = new List<PinoutModel>(),
};
Dispositivos = new List<DispositivoDataModel>();
switch (TipoDisp)
{
case T_Code.Sen:
{
DispositivosService<SensoriamentoModel> Disp = (DispositivosService<SensoriamentoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == TipoDisp);
if (Disp == null)
{
return;
}
this.Text = "Pinout - Sensoriamento";
Funcoes = SensoriamentoModel.Funcoes.ToList();
Pinout = SensoriamentoModel.Pinout;
Dispositivos.Add(new DispositivoDataModel()
{
ID = "",
Funcoes = Funcoes
});
Dispositivos.AddRange(Disp.Dados.Sensores.Select(x => new DispositivoDataModel()
{
ID = x.ID,
Funcoes = x.Funcoes
}));
Dispositivos.AddRange(Disp.Dados.Sinaleiros.Select(x => new DispositivoDataModel()
{
ID = x.ID,
Funcoes = x.Funcoes
}));
Dispositivos.AddRange(Disp.Dados.Reles.Select(x => new DispositivoDataModel()
{
ID = x.ID,
Funcoes = x.Funcoes
}));
Dispositivos.AddRange(Disp.Dados.Servos.Select(x => new DispositivoDataModel()
{
ID = x.ID,
Funcoes = x.Funcoes
}));
Dispositivos.Add(new DispositivoDataModel()
{
ID = Variaveis.LoraService.ID,
Funcoes = Variaveis.LoraService.Funcoes
});
break;
}
case T_Code.Atu:
{
DispositivosService<AtuadorModel> Disp = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == TipoDisp);
if (Disp == null)
{
return;
}
this.Text = "Pinout - Atuador";
Funcoes = AtuadorModel.Funcoes.ToList();
Pinout = AtuadorModel.Pinout;
Dispositivos = new List<DispositivoDataModel>();
Dispositivos.AddRange(Disp.Dados.BombasPressurizadoras.Select(x => new DispositivoDataModel()
{
ID = x.ID,
Funcoes = x.Funcoes
}).ToList());
Dispositivos.AddRange(Disp.Dados.BicosPulverizadores.Select(x => new DispositivoDataModel()
{
ID = x.ID,
Funcoes = x.Funcoes
}).ToList());
Dispositivos.AddRange(Disp.Dados.Sensores.Select(x => new DispositivoDataModel()
{
ID = x.ID,
Funcoes = x.Funcoes
}).ToList());
break;
}
case T_Code.Mvd:
{
DispositivosService<MovimentacaoUnificadaModel> Disp = (DispositivosService<MovimentacaoUnificadaModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == TipoDisp);
if (Disp == null)
{
return;
}
this.Text = "Pinout - Movimentação Unificado";
Funcoes = ModuloMvdModel.Funcoes.ToList();
Pinout = ModuloMvdModel.Pinout;
Dispositivos = new List<DispositivoDataModel>();
Dispositivos.Add(new DispositivoDataModel()
{
ID = Disp.Dados.Modulos.First().MovMotor.ID,
Funcoes = Disp.Dados.Modulos.First().MovMotor.Funcoes
});
Dispositivos.Add(new DispositivoDataModel()
{
ID = Disp.Dados.Modulos.First().DirMotor.ID,
Funcoes = Disp.Dados.Modulos.First().DirMotor.Funcoes
});
break;
}
}
cmbMCPendereco.Items.Clear();
cmbMCPendereco.Items.AddRange(new string[] { "0x20 (GND)" });
cmbMCPendereco.SelectedIndex = 0;
chbMCP.Checked = Pinout.ExpansorGPIO;
//txtMCP1.Text = Pinout.EnderecoGPIO;
cmbADSendereco.Items.Clear();
cmbADSendereco.Items.AddRange(new string[] { "0x48 (GND)", "0x49 (VCC)", "0x4A (SDA)", "0x4B (SCL)" });
cmbADSendereco.SelectedIndex = 0;
chbADS.Checked = Pinout.ExpansorADS;
//txtADS1.Text = Pinout.EnderecoADS;
Funcoes.ForEach(x => Pinos.Add(TipoDisp.ToString() + " " + Enum.GetName(typeof(FuncoesPinout), x)));
foreach (var Dispositivo in Dispositivos)
{
Dispositivo.Funcoes?.ForEach(x => Pinos.Add(Dispositivo.ID + " " + Enum.GetName(typeof(FuncoesPinout), x)));
}
List<ComboBox> cmbsControlador = this.Controls.OfType<ComboBox>().Where(x => x.Name.Contains("cmb")).ToList();
AtualizarPinoutBarramento(cmbsControlador);
List<ComboBox> cmbsMcp = gpbMCP.Controls.OfType<ComboBox>().Where(x => !x.Name.Contains("endereco")).ToList();
AtualizarPinoutBarramento(cmbsMcp);
List<ComboBox> cmbsAds = gpbADS.Controls.OfType<ComboBox>().Where(x => !x.Name.Contains("endereco")).ToList();
AtualizarPinoutBarramento(cmbsAds);
AtualizaTipoControlador(Pinout.Pinos.FirstOrDefault().Controlador, false);
}
private void AtualizarPinoutBarramento(List<ComboBox> cmbs)
{
foreach (var cmb in cmbs)
{
cmb.SelectedIndexChanged -= Cmb_SelectedIndexChanged;
cmb.SelectedIndexChanged += Cmb_SelectedIndexChanged;
cmb.Items.Clear();
Pinos.ForEach(x => cmb.Items.Add(x));
cmb.SelectedIndex = 0;
string pino = cmb.Name.Replace("cmb", "");
var Selecionado = Pinout.Pinos.FirstOrDefault(x => x.Descricao == pino);
if (Selecionado != null)
{
cmb.Enabled =
(Selecionado.Barramento == TiposBarramentos.CONTROLADOR && Selecionado.Habilitado) ||
(Selecionado.Barramento == TiposBarramentos.EXPANSOR_GPIO && chbMCP.Checked && cmb.Name.Contains("MCP")) ||
(Selecionado.Barramento == TiposBarramentos.EXPANSOR_ADS && chbADS.Checked && cmb.Name.Contains("ADS"));
if (Selecionado.Habilitado && cmb.Enabled)
{
cmb.SelectedItem = Selecionado.ComponenteID + " " + Enum.GetName(typeof(FuncoesPinout), Selecionado.Funcao);
}
}
}
}
private void frmPinout_FormClosing(object sender, FormClosingEventArgs e)
{
}
private void Cmb_SelectedIndexChanged(object sender, EventArgs e)
{
var cmb = (ComboBox)sender;
this.Controls.OfType<ComboBox>().Where(x => x.Name != cmb.Name && x.SelectedItem != null && x.SelectedItem.ToString() == cmb.SelectedItem.ToString()).ToList().ForEach(x => x.SelectedIndex = 0);
}
private void btnSalvar_Click(object sender, EventArgs e)
{
List<ComboBox> cmbsControlador = this.Controls.OfType<ComboBox>().Where(x => x.Name.Contains("cmb") && x.Enabled && x.Visible).ToList();
SalvarPinoutBarramento(cmbsControlador);
/*for (int i = 0; i < cmbMCPendereco.Items.Count; i++)
{
atualizarPinosMCP(i);
List<ComboBox> cmbsMcp = gpbMCP.Controls.OfType<ComboBox>().Where(x => !x.Name.Contains("endereco")).ToList();
SalvarPinoutBarramento(cmbsMcp);
}
for (int i = 0; i < cmbADSendereco.Items.Count; i++)
{
atualizarPinosADS(i);
List<ComboBox> cmbsAds = gpbADS.Controls.OfType<ComboBox>().Where(x => !x.Name.Contains("endereco")).ToList();
SalvarPinoutBarramento(cmbsAds);
}*/
Pinout.ExpansorGPIO = chbMCP.Checked;
//Pinout.EnderecoGPIO = txtMCP1.Text;
Pinout.ExpansorADS = chbADS.Checked;
//Pinout.EnderecoADS = txtADS1.Text;
VersaoArquivoModel arquivo = VersionamentoService.ArquivoPinout(TipoDisp);
if (arquivo != null)
{
PinoutModel.SalvarPinout(Pinout, arquivo.CaminhoCompleto);
}
switch (TipoDisp)
{
case T_Code.Sen:
SensoriamentoModel.Pinout = Pinout;
break;
case T_Code.Atu:
AtuadorModel.Pinout = Pinout;
break;
case T_Code.Mvd:
ModuloMvdModel.Pinout = Pinout;
break;
}
}
private void SalvarPinoutBarramento(List<ComboBox> cmbs)
{
foreach (var cmb in cmbs)
{
string ComponenteID = cmb.SelectedItem.ToString().Split(' ').Length > 1 ? cmb.SelectedItem.ToString().Split(' ')[0] : "";
FuncoesPinout Funcao = (FuncoesPinout)Enum.Parse(typeof(FuncoesPinout), ComponenteID != "" ? (cmb.SelectedItem.ToString().Split(' ')[1]) : cmb.SelectedItem.ToString());
string pino = cmb.Name.Replace("cmb", "");
var _pino = Pinout.Pinos.FirstOrDefault(x => x.Descricao == pino);
if (_pino == null)
{
_pino = new PinoutModel()
{
Controlador = TiposControladores.TODOS,
Descricao = pino,
Habilitado = true,
Pino = Convert.ToInt32(Regex.Match(pino, @"\d+").Value),
Barramento = TiposBarramentos.CONTROLADOR,
ComponenteID = "",
Funcao = FuncoesPinout.NaoConectado
};
Pinout.Pinos.Add(_pino);
}
_pino.Funcao = Funcao;
_pino.ComponenteID = ComponenteID;
_pino.Barramento =
cmb.Name.Contains("MCP") ? TiposBarramentos.EXPANSOR_GPIO :
cmb.Name.Contains("ADS") ? TiposBarramentos.EXPANSOR_ADS :
TiposBarramentos.CONTROLADOR;
}
}
private void cbTipo_SelectedIndexChanged(object sender, EventArgs e)
{
TiposControladores Tipo = (TiposControladores)(((ComboBox)sender).SelectedIndex);
if (Pinout.Pinos.FirstOrDefault().Controlador != Tipo)
{
AtualizaTipoControlador(Tipo, true);
}
}
private void AtualizaTipoControlador(TiposControladores TipoControlador, bool Novo)
{
switch (TipoControlador)
{
case TiposControladores.ESP32_S3:
imgESP32.Image = Properties.Resources.esp32_s3;
imgESP32.Size = new Size(304, 688);
imgESP32.Location = new Point(130, 2);
if (Novo)
Pinout = new PinoutDataModel()
{
ExpansorGPIO = false,
EnderecoGPIO = "0x20",
ExpansorADS = false,
EnderecoADS = "0x48",
Pinos = PinoutModel.CarregarPinoutPadrao_S3(),
};
break;
case TiposControladores.ESP32_WROVER:
imgESP32.Image = Properties.Resources.esp32_wrover;
imgESP32.Size = new Size(304, 540);
imgESP32.Location = new Point(130, 40);
if (Novo)
Pinout = new PinoutDataModel()
{
ExpansorGPIO = false,
EnderecoGPIO = "0x20",
ExpansorADS = false,
EnderecoADS = "0x48",
Pinos = PinoutModel.CarregarPinoutPadrao_Wrover(),
};
break;
}
List<ComboBox> cmbs = this.Controls.OfType<ComboBox>().Where(x => x.Name.Contains("cmb")).ToList();
foreach (var cmb in cmbs)
{
cmb.Visible = Pinout.Pinos.Any(x => x.Descricao == cmb.Name.Replace("cmb", ""));
cmb.Enabled = cmb.Visible ? Pinout.Pinos.First(x => x.Descricao == cmb.Name.Replace("cmb", "")).Habilitado : false;
}
cbTipo.SelectedIndex = (int)TipoControlador;
chbMCP.Checked = Pinout.ExpansorGPIO;
chbADS.Checked = Pinout.ExpansorADS;
}
private void chbExpansor_CheckedChanged(object sender, EventArgs e)
{
CheckBox chb = sender as CheckBox;
if (chb.Name.Contains("MCP"))
{
AtualizarCombosMCP(chb);
}
else if (chb.Name.Contains("ADS"))
{
AtualizarCombosADS(chb);
}
}
private void AtualizarCombosMCP(CheckBox chb)
{
if (chb.Checked && !Pinout.Pinos.Any(x => x.Barramento == TiposBarramentos.EXPANSOR_GPIO))
{
Pinout.Pinos.AddRange(PinoutModel.CarregarPinoutPadrao_MCP());
}
string ID = chb.Name.Replace("chbMCP", "");
GroupBox gpb = this.Controls.OfType<GroupBox>().FirstOrDefault(x => x.Name == "gpbMCP" + ID);
foreach (var cmb in gpb.Controls.OfType<ComboBox>())
{
cmb.Enabled = chb.Checked;
}
TextBox txt = gpb.Controls.OfType<TextBox>().FirstOrDefault(x => x.Name == "txtMCP" + ID);
txt.Enabled = chb.Checked;
}
private void AtualizarCombosADS(CheckBox chb)
{
if (chb.Checked && !Pinout.Pinos.Any(x => x.Barramento == TiposBarramentos.EXPANSOR_ADS))
{
Pinout.Pinos.AddRange(PinoutModel.CarregarPinoutPadrao_ADS());
}
string ID = chb.Name.Replace("chbADS", "");
GroupBox gpb = this.Controls.OfType<GroupBox>().FirstOrDefault(x => x.Name == "gpbADS" + ID);
foreach (var cmb in gpb.Controls.OfType<ComboBox>())
{
cmb.Enabled = chb.Checked;
}
ComboBox cmbAddr = gpb.Controls.OfType<ComboBox>().FirstOrDefault(x => x.Name.Contains("endereco"));
cmbAddr.Enabled = chb.Checked;
}
private void cmbADSendereco_SelectedIndexChanged(object sender, EventArgs e)
{
atualizarPinosADS(cmbADSendereco.SelectedIndex);
}
private void atualizarPinosADS(int addr)
{
cmbADS_A0.Name = $"cmbADS_A{addr}{0}";
cmbADS_A1.Name = $"cmbADS_A{addr}{1}";
cmbADS_A2.Name = $"cmbADS_A{addr}{2}";
cmbADS_A3.Name = $"cmbADS_A{addr}{3}";
List<ComboBox> cmbsAds = gpbADS.Controls.OfType<ComboBox>().Where(x => !x.Name.Contains("endereco")).ToList();
AtualizarPinoutBarramento(cmbsAds);
}
private void cmbMCPendereco_SelectedIndexChanged(object sender, EventArgs e)
{
atualizarPinosMCP(cmbMCPendereco.SelectedIndex);
}
private void atualizarPinosMCP(int addr)
{
cmbMCP_A0.Name = $"cmbMCP_A{addr}{0}";
cmbMCP_A1.Name = $"cmbMCP_A{addr}{1}";
cmbMCP_A2.Name = $"cmbMCP_A{addr}{2}";
cmbMCP_A3.Name = $"cmbMCP_A{addr}{3}";
cmbMCP_A4.Name = $"cmbMCP_A{addr}{4}";
cmbMCP_A5.Name = $"cmbMCP_A{addr}{5}";
cmbMCP_A6.Name = $"cmbMCP_A{addr}{6}";
cmbMCP_A7.Name = $"cmbMCP_A{addr}{7}";
cmbMCP_B0.Name = $"cmbMCP_B{addr}{0}";
cmbMCP_B1.Name = $"cmbMCP_B{addr}{1}";
cmbMCP_B2.Name = $"cmbMCP_B{addr}{2}";
cmbMCP_B3.Name = $"cmbMCP_B{addr}{3}";
cmbMCP_B4.Name = $"cmbMCP_B{addr}{4}";
cmbMCP_B5.Name = $"cmbMCP_B{addr}{5}";
cmbMCP_B6.Name = $"cmbMCP_B{addr}{6}";
cmbMCP_B7.Name = $"cmbMCP_B{addr}{7}";
List<ComboBox> cmbsMcp = gpbMCP.Controls.OfType<ComboBox>().Where(x => !x.Name.Contains("endereco")).ToList();
AtualizarPinoutBarramento(cmbsMcp);
}
private void btnADSfixar_Click(object sender, EventArgs e)
{
List<ComboBox> cmbsAds = gpbADS.Controls.OfType<ComboBox>().Where(x => !x.Name.Contains("endereco")).ToList();
SalvarPinoutBarramento(cmbsAds);
}
private void btnMCPfixar_Click(object sender, EventArgs e)
{
List<ComboBox> cmbsMcp = gpbMCP.Controls.OfType<ComboBox>().Where(x => !x.Name.Contains("endereco")).ToList();
SalvarPinoutBarramento(cmbsMcp);
}
}
class DispositivoDataModel
{
public string ID { get; set; }
public List<FuncoesPinout> Funcoes { get; set; }
}
}