refinamento nas rotinas assincronas e remocao de classes nao utilizadas

This commit is contained in:
Diego Freitas 2024-11-27 14:38:56 -03:00
parent 64b79bb62b
commit 9c90bec1d6
81 changed files with 2552 additions and 1766 deletions

Binary file not shown.

View File

@ -431,11 +431,9 @@
<Compile Include="Models\MKS057DModel.cs" />
<Compile Include="Models\ModbusModel.cs" />
<Compile Include="Models\Modules\AtuadorModel.cs" />
<Compile Include="Models\Modules\DirecionalModel.cs" />
<Compile Include="Models\Modules\DispositivoBaseModel.cs" />
<Compile Include="Models\Enums.cs" />
<Compile Include="Models\GeneralJoystick.cs" />
<Compile Include="Models\Modules\MovimentacaoModel.cs" />
<Compile Include="Models\Modules\MovimentacaoUnificadoModel.cs" />
<Compile Include="Models\Modules\PinoutModel.cs" />
<Compile Include="Models\Modules\SensoriamentoModel.cs" />

View File

@ -35,149 +35,7 @@ namespace AgroBase.Forms.Direcional
private void DesenharGraficos(object sender, PaintEventArgs e)
{
PictureBox pic = (PictureBox)sender;
var Motor = ((DirecionalModel)Variaveis.DispositivosConectados.FirstOrDefault(d => d.Dispositivo == T_Code.Dir).Dados).Motores.FirstOrDefault(m => m.ID == pic.Name.Replace("pic", ""));
Label lbl = Controls.OfType<Label>().FirstOrDefault(ctrl => ctrl.Name == pic.Name.Replace("pic", "lbl"));
lbl.Text = "SP: " + ((Motor.Sentido_SP == Sentido.Antihorario ? -1 : 1) * Motor.Angulo_SP).ToString("00") + "º - Angulo: " + Motor.Angulo.ToString("00") + "º - Sentido: " + Enum.GetName(typeof(Sentido), Motor.Sentido);
// Use o objeto Graphics para desenhar a representação do motor
Graphics g = e.Graphics;
int centerX = pic.Width / 2;
int centerY = pic.Height / 2;
int radius = Math.Min(centerX, centerY) - 30;
// Desenhe o círculo para representar o motor
g.DrawEllipse(Pens.Black, centerX - radius, centerY - radius, 2 * radius, 2 * radius);
// Desenhe a linha externa (set point)
double setPointAngleInRadians = (Motor.Sentido_SP == Sentido.Antihorario ? -1 : 1) * ((Motor.Angulo_SP * Math.PI) / 180);
int setPointX = centerX + (int)((radius + 10) * Math.Sin(setPointAngleInRadians));
int setPointY = centerY - (int)((radius + 10) * Math.Cos(setPointAngleInRadians));
g.DrawLine(Pens.Green, centerX, centerY, setPointX, setPointY);
// Desenhe a seta que indica o sentido
int arrowLength = 15; // Comprimento da seta
if (Motor.Sentido_SP == Sentido.Horario)
{
// Desenhe uma seta para a direita (sentido horário)
Point arrowStart = new Point(setPointX, setPointY);
Point arrowEnd = new Point(setPointX + arrowLength, setPointY);
g.DrawLine(Pens.Green, arrowStart, arrowEnd);
// Desenhe a "ponta" da seta (triângulo) para a direita
Point arrowPoint1 = new Point(setPointX + arrowLength - 5, setPointY - 5);
Point arrowPoint2 = new Point(setPointX + arrowLength - 5, setPointY + 5);
g.DrawLine(Pens.Green, arrowEnd, arrowPoint1);
g.DrawLine(Pens.Green, arrowEnd, arrowPoint2);
}
else
{
// Desenhe uma seta para a esquerda (sentido anti-horário)
Point arrowStart = new Point(setPointX, setPointY);
Point arrowEnd = new Point(setPointX - arrowLength, setPointY);
g.DrawLine(Pens.Green, arrowStart, arrowEnd);
// Desenhe a "ponta" da seta (triângulo) para a esquerda
Point arrowPoint1 = new Point(setPointX - arrowLength + 5, setPointY - 5);
Point arrowPoint2 = new Point(setPointX - arrowLength + 5, setPointY + 5);
g.DrawLine(Pens.Green, arrowEnd, arrowPoint1);
g.DrawLine(Pens.Green, arrowEnd, arrowPoint2);
}
// Desenhe uma linha para representar a posição do eixo do motor
double angleInRadians = (Motor.Angulo * Math.PI) / 180;
int x = centerX + (int)(radius * Math.Sin(angleInRadians));
int y = centerY - (int)(radius * Math.Cos(angleInRadians));
g.DrawLine(Pens.Red, centerX, centerY, x, y);
// Desenhe a seta que indica o sentido
if (Motor.Sentido == Sentido.Horario)
{
// Desenhe uma seta para a direita (sentido horário)
Point arrowStart = new Point(x, y);
Point arrowEnd = new Point(x + arrowLength, y);
g.DrawLine(Pens.Red, arrowStart, arrowEnd);
// Desenhe a "ponta" da seta (triângulo) para a direita
Point arrowPoint1 = new Point(x + arrowLength - 5, y - 5);
Point arrowPoint2 = new Point(x + arrowLength - 5, y + 5);
g.DrawLine(Pens.Red, arrowEnd, arrowPoint1);
g.DrawLine(Pens.Red, arrowEnd, arrowPoint2);
}
else
{
// Desenhe uma seta para a esquerda (sentido anti-horário)
Point arrowStart = new Point(x, y);
Point arrowEnd = new Point(x - arrowLength, y);
g.DrawLine(Pens.Red, arrowStart, arrowEnd);
// Desenhe a "ponta" da seta (triângulo) para a esquerda
Point arrowPoint1 = new Point(x - arrowLength + 5, y - 5);
Point arrowPoint2 = new Point(x - arrowLength + 5, y + 5);
g.DrawLine(Pens.Red, arrowEnd, arrowPoint1);
g.DrawLine(Pens.Red, arrowEnd, arrowPoint2);
}
// Desenhe os pontos nos angulos fixos
int radiusCircle = 5;
for (int i = 0; i < 4; i++)
{
double angle = ((i * 90) * Math.PI) / 180;
int xA = centerX + (int)((radius) * Math.Sin(angle)); // Adicione 20 para afastar do círculo principal
int yA = centerY - (int)((radius) * Math.Cos(angle)); // Adicione 20 para afastar do círculo principal
Rectangle rect = new Rectangle(xA - radiusCircle, yA - radiusCircle, 2 * radiusCircle, 2 * radiusCircle);
bool Acionado =
Motor.Ref000 && i == 0 ||
Motor.Ref090 && i == 1 ||
Motor.Ref180 && i == 2 ||
Motor.Ref270 && i == 3;
using (SolidBrush brush = new SolidBrush(Acionado ? Color.Red : Color.DarkRed))
{
g.FillEllipse(brush, rect);
}
string angleText = ((i * 90).ToString() + "°");
SizeF textSize = g.MeasureString(angleText, Font);
float textX = xA;
float textY = yA;
float textOffset = 12;
// Ajuste as coordenadas do texto com base no ângulo
if (angle == 0)
{
textX -= textSize.Width / 2;
textY -= textSize.Height - (textOffset * 2);
}
else if (angle == Math.PI / 2)
{
textX -= textSize.Width + textOffset;
textY -= textSize.Height / 2;
}
else if (angle == Math.PI)
{
textX -= textSize.Width / 2;
textY -= (textOffset * 2);
}
else if (angle == 3 * Math.PI / 2)
{
textX += textOffset;
textY -= textSize.Height / 2;
}
g.DrawString(angleText, Font, Brushes.Black, textX, textY);
}
}
private void frmDirPlot_FormClosing(object sender, FormClosingEventArgs e)
@ -188,14 +46,7 @@ namespace AgroBase.Forms.Direcional
private void btnReferenciar_Click(object sender, EventArgs e)
{
string ID = ((Button)sender).Name.Substring(3, 2);
var DispCon = Variaveis.DispositivosConectados.Where(x => x._Porta.IsOpen && x.Dispositivo == T_Code.Dir).ToList();
foreach (var Dispositivo in DispCon)
{
var Motor = ((DirecionalModel)Dispositivo.Dados).Motores.FirstOrDefault(x => x.ID == ID);
string Comando = Motor.ProtocoloComando(Direcao.Parado, true);
Dispositivo.AdicionarMensagemFila(((DirecionalModel)Dispositivo.Dados).Modulo_ID, Comando, true, false);
}
}
}

View File

@ -430,7 +430,7 @@ namespace AgroBase.Forms.IHM
private void tkbVelocidade_Scroll(object sender, EventArgs e)
{
double RPM = (tkbVelocidade.Value / 100.0) * VariaveisEquipamento.RPM_Max_Roda;
double Velocidade = MovimentacaoModel.CalculaVelocidadeRPM(RPM);
double Velocidade = FuncoesMatematicas.CalculaVelocidadeRPM(RPM);
Variaveis.OperacaoEmAndamento.Controle.PercentualVelocidadeSP = tkbVelocidade.Value;

View File

@ -591,7 +591,7 @@
private System.Windows.Forms.Label lblOperacaoLiberada;
private System.Windows.Forms.Label lblCodigoFalha;
private System.Windows.Forms.PictureBox picWifi;
private System.Windows.Forms.ProgressBar pgbAtualizacaoArquivos;
public System.Windows.Forms.Label lblProgressoAtualizacao;
public System.Windows.Forms.ProgressBar pgbAtualizacaoArquivos;
}
}

View File

@ -16,7 +16,6 @@ namespace AgroBase.Forms.IHM
public partial class frmIHM : Form
{
AsyncTaskTimerModel tmrDispositivos;
AsyncTaskTimerModel tmrAtualizacaoArquivos;
public ulong CodFalha = 0;
public frmIHM()
@ -97,23 +96,13 @@ namespace AgroBase.Forms.IHM
private void frmIHM_Load(object sender, EventArgs e)
{
lblVersao.Text = "v " + Variaveis.Versao;
tmrDispositivos = new AsyncTaskTimerModel("tmrDispositivos", tmrDispositivos_Tick, 5000, this);
tmrDispositivos.Start();
tmrAtualizacaoArquivos = new AsyncTaskTimerModel("tmrAtualizacaoArquivos", tmrAtualizacaoArquivos_Tick, 300, this);
tmrAtualizacaoArquivos.Start();
tmrDispositivos = new AsyncTaskTimerModel("tmrDispositivos", tmrDispositivos_Tick, 1000, this);
tmrDispositivos.Start();
lblCodigoFalha.Click += LblCodigoFalha_Click;
}
private async Task tmrAtualizacaoArquivos_Tick()
{
lblProgressoAtualizacao.Text = VersionamentoService.AtualizandoArquivos ? $"({VersionamentoService.ProgressoAtualizacao.ToString("0.00")}%) Atualizando arquivos..." : VersionamentoService.ResultadoAtualizacao;
pgbAtualizacaoArquivos.Value = (int)VersionamentoService.ProgressoAtualizacao;
tmrAtualizacaoArquivos.SetInterval(VersionamentoService.AtualizandoArquivos ? 300 : 5000);
}
private async Task tmrDispositivos_Tick()
{
CodFalha = Variaveis.OperacaoEmAndamento.RetornaCodigoFalha();
@ -169,8 +158,6 @@ namespace AgroBase.Forms.IHM
lblOperacaoLiberada.ForeColor = opLiberada ? Color.Green : Color.Red;
lblCodigoFalha.Text = $"Código de Falha: {CodFalha}";
picWifi.Image = APIService.HasInternet ? Resources.wifi_on : Resources.wifi_off;
await FuncoesGlobais.SafeExecuteAsync(() => SerialService.RealizarVarreduraPortasUSB());
}
private void LblCodigoFalha_Click(object sender, EventArgs e)

View File

@ -161,8 +161,8 @@ namespace AgroBase.Forms.Operacoes
chb.Checked = Variaveis.OperacaoEmAndamento.ModulosMandatorios.Any(x => x.Dispositivo == Dispositivo);
}
double velocidadeMax = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Max);
double velocidadeMin = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Min);
double velocidadeMax = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Max);
double velocidadeMin = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Min);
txtModoOperacao.Text = Variaveis.OperacaoEmAndamento.Modo.ToString();
txtDescricao.Text = Variaveis.OperacaoEmAndamento.Descricao;

View File

@ -16,8 +16,6 @@ namespace AgroBase.Forms
{
public partial class frmMovPlot : Form
{
private DispositivosService<MovimentacaoModel> DispMov;
public frmMovPlot()
{
InitializeComponent();
@ -31,62 +29,7 @@ namespace AgroBase.Forms
public void AtualizaGrafico()
{
DispMov = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x._Porta.IsOpen && x.Dispositivo == T_Code.Mov);
if (chartEF.InvokeRequired)
{
chartEF.Invoke(new Action(AtualizaGrafico));
}
else
{
foreach (var Motor in ((MovimentacaoModel)DispMov.Dados).Motores.Where(x => x.Comandar))
{
MovSensorimanetoGrafico Log = null;
if (Motor.LogGrafico.Count > 0)
{
Log = Motor.LogGrafico[Motor.LogGrafico.Count - 1];
}
double Minimo = 0;
double Maximo = 0;
Chart chart = (Chart)(this.Controls.Find("chart" + Motor.ID, false).First());
chart.Titles.Clear();
chart.Titles.Add(Motor.Descricao);
var Logs = (Motor.LogGrafico.Count > MovimentacaoModel.LogsManter ? Motor.LogGrafico.Skip(Math.Max(0, Motor.LogGrafico.Count - MovimentacaoModel.LogsManter)).Take(MovimentacaoModel.LogsManter).ToList() : Motor.LogGrafico).Where(log => log.ComponenteID == Motor.ID).ToList();
chart.Series.Clear();
List<string> Momentos = Logs.Select(x => x.Momento.ToString("mm:ss:fff")).ToList();
var serieRPMsp = new Series("RPM SP: " + (Log != null ? Log.RPM_SP : 0));
serieRPMsp.Points.DataBindXY(Momentos, Logs.Select(x => x.RPM_SP).ToList());
serieRPMsp.ChartType = SeriesChartType.Line;
chart.Series.Add(serieRPMsp);
Minimo = Logs.Min(x => x.RPM_SP) < Minimo ? Logs.Min(x => x.RPM_SP) : Minimo;
Maximo = Logs.Min(x => x.RPM_SP) > Maximo ? Logs.Min(x => x.RPM_SP) : Maximo;
var serieRPM = new Series("RPM: " + (Log != null ? Log.RPM : 0));
serieRPM.Points.DataBindXY(Momentos, Logs.Select(x => x.RPM).ToList());
serieRPM.ChartType = SeriesChartType.Spline;
chart.Series.Add(serieRPM);
Minimo = Logs.Min(x => x.RPM) < Minimo ? Logs.Min(x => x.RPM) : Minimo;
Maximo = Logs.Max(x => x.RPM) > Maximo ? Logs.Max(x => x.RPM) : Maximo;
var serieTemperatura = new Series("Temperatura: " + (Log != null ? Log.Temperatura : 0));
serieTemperatura.Points.DataBindXY(Momentos, Logs.Select(x => x.Temperatura).ToList());
serieTemperatura.ChartType = SeriesChartType.Line;
chart.Series.Add(serieTemperatura);
Minimo = Logs.Min(x => x.Temperatura) < Minimo ? Logs.Min(x => x.Temperatura) : Minimo;
Maximo = Logs.Max(x => x.Temperatura) > Maximo ? Logs.Max(x => x.Temperatura) : Maximo;
foreach (var legend in chart.Legends)
{
legend.Docking = Docking.Bottom;
}
chart.ChartAreas[0].AxisY.Minimum = Minimo - 5;
chart.ChartAreas[0].AxisY.Maximum = Maximo + 5;
}
}
}
}

View File

@ -59,8 +59,8 @@ namespace AgroBase.Forms.Operacoes
nudVelocidadeSemErvas.Maximum = Convert.ToInt32(VariaveisEquipamento.RPM_Max_Roda);
nudVelocidadeSemErvas.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.RPM_Max);
lblKmhCErvas.Text = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Min).ToString("0.00") + " Km/h";
lblKmhSErvas.Text = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Max).ToString("0.00") + " Km/h";
lblKmhCErvas.Text = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Min).ToString("0.00") + " Km/h";
lblKmhSErvas.Text = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Max).ToString("0.00") + " Km/h";
nudAnguloMaximo.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.Angulo_Max);
nudAnguloMinimo.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.Angulo_Min);
nudVelocidadeMP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP);
@ -115,12 +115,12 @@ namespace AgroBase.Forms.Operacoes
private void nudVelocidadeSemErvas_ValueChanged(object sender, EventArgs e)
{
lblKmhSErvas.Text = MovimentacaoModel.CalculaVelocidadeRPM((double)nudVelocidadeSemErvas.Value).ToString("0.00") + " Km/h";
lblKmhSErvas.Text = FuncoesMatematicas.CalculaVelocidadeRPM((double)nudVelocidadeSemErvas.Value).ToString("0.00") + " Km/h";
}
private void nudVelocidadeComErvas_ValueChanged(object sender, EventArgs e)
{
lblKmhCErvas.Text = MovimentacaoModel.CalculaVelocidadeRPM((double)nudVelocidadeComErvas.Value).ToString("0.00") + " Km/h";
lblKmhCErvas.Text = FuncoesMatematicas.CalculaVelocidadeRPM((double)nudVelocidadeComErvas.Value).ToString("0.00") + " Km/h";
}
void SalvarOperacao()

View File

@ -61,6 +61,7 @@
this.btnFreio = new System.Windows.Forms.Button();
this.cmbModFreio = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.chbRequisitarDados = new System.Windows.Forms.CheckBox();
((System.ComponentModel.ISupportInitialize)(this.gridsTEN)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.gridsCOR)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.gridsTMP)).BeginInit();
@ -94,7 +95,7 @@
// btnSalvar
//
this.btnSalvar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnSalvar.Location = new System.Drawing.Point(867, 554);
this.btnSalvar.Location = new System.Drawing.Point(867, 575);
this.btnSalvar.Name = "btnSalvar";
this.btnSalvar.Size = new System.Drawing.Size(75, 23);
this.btnSalvar.TabIndex = 3;
@ -374,7 +375,7 @@
// btnFreio
//
this.btnFreio.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnFreio.Location = new System.Drawing.Point(867, 499);
this.btnFreio.Location = new System.Drawing.Point(867, 543);
this.btnFreio.Name = "btnFreio";
this.btnFreio.Size = new System.Drawing.Size(75, 23);
this.btnFreio.TabIndex = 24;
@ -386,7 +387,7 @@
//
this.cmbModFreio.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbModFreio.FormattingEnabled = true;
this.cmbModFreio.Location = new System.Drawing.Point(867, 477);
this.cmbModFreio.Location = new System.Drawing.Point(867, 500);
this.cmbModFreio.Margin = new System.Windows.Forms.Padding(2);
this.cmbModFreio.Name = "cmbModFreio";
this.cmbModFreio.Size = new System.Drawing.Size(75, 21);
@ -395,17 +396,28 @@
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(864, 462);
this.label1.Location = new System.Drawing.Point(864, 485);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(42, 13);
this.label1.TabIndex = 27;
this.label1.Text = "Módulo";
//
// chbRequisitarDados
//
this.chbRequisitarDados.AutoSize = true;
this.chbRequisitarDados.Location = new System.Drawing.Point(15, 584);
this.chbRequisitarDados.Name = "chbRequisitarDados";
this.chbRequisitarDados.Size = new System.Drawing.Size(107, 17);
this.chbRequisitarDados.TabIndex = 28;
this.chbRequisitarDados.Text = "Requisitar Dados";
this.chbRequisitarDados.UseVisualStyleBackColor = true;
//
// frmSenConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(954, 585);
this.ClientSize = new System.Drawing.Size(954, 606);
this.Controls.Add(this.chbRequisitarDados);
this.Controls.Add(this.label1);
this.Controls.Add(this.cmbModFreio);
this.Controls.Add(this.btnFreio);
@ -482,5 +494,6 @@
private System.Windows.Forms.Button btnFreio;
private System.Windows.Forms.ComboBox cmbModFreio;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.CheckBox chbRequisitarDados;
}
}

View File

@ -39,6 +39,7 @@ namespace AgroBase.Forms.Sensoriamento
case T_Code.Sen:
{
Sensores = ((SensoriamentoModel)Disp.Dados).Sensores.ToList();
chbRequisitarDados.Checked = ((SensoriamentoModel)Disp.Dados).RequisitarDados;
AtualizarCameras();
break;
@ -46,6 +47,8 @@ namespace AgroBase.Forms.Sensoriamento
case T_Code.Atu:
{
Sensores = ((AtuadorModel)Disp.Dados).Sensores.ToList();
chbRequisitarDados.Checked = false;
break;
}
}
@ -196,6 +199,7 @@ namespace AgroBase.Forms.Sensoriamento
case T_Code.Sen:
{
var _Disp = (DispositivosService<SensoriamentoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
_Disp.Dados.RequisitarDados = chbRequisitarDados.Checked;
_Disp.Dados.Sensores = Sensores.ToList();
_Disp.Dados.CameraID_Caminho = cmbCaminho.Text;
_Disp.Dados.CameraID_Solo.Clear();

View File

@ -136,7 +136,7 @@ namespace AgroBase.Forms
Chart chart = (Chart)(pnlFundo.Controls.Find("chart" + Modulo.Modulo_ID, false).First());
chart.Titles.Clear();
chart.Titles.Add(Modulo.Modulo_ID);
var Logs = (Modulo.MovMotor.LogGrafico.Count > MovimentacaoModel.LogsManter ? Modulo.MovMotor.LogGrafico.Skip(Math.Max(0, Modulo.MovMotor.LogGrafico.Count - MovimentacaoModel.LogsManter)).Take(MovimentacaoModel.LogsManter).ToList() : Modulo.MovMotor.LogGrafico).Where(log => log.Modulo_ID == Modulo.Modulo_ID).ToList();
var Logs = (Modulo.MovMotor.LogGrafico.Count > MovimentacaoUnificadaModel.LogsManter ? Modulo.MovMotor.LogGrafico.Skip(Math.Max(0, Modulo.MovMotor.LogGrafico.Count - MovimentacaoUnificadaModel.LogsManter)).Take(MovimentacaoUnificadaModel.LogsManter).ToList() : Modulo.MovMotor.LogGrafico).Where(log => log.Modulo_ID == Modulo.Modulo_ID).ToList();
chart.Series.Clear();
List<string> Momentos = Logs.Select(x => x.Momento.ToString("mm:ss:fff")).ToList();

View File

@ -13,6 +13,8 @@ namespace AgroBase.Forms
public static bool DebugMode = true;
public static bool Fechando = false;
public static AsyncTaskTimerModel tmrVarreduraDispositivos;
public static frmPrincipal frmPrincipal = new frmPrincipal();
public static frmJoystick frmJoystick = new frmJoystick();
public static frmIHM frmIHM = new frmIHM()
@ -25,13 +27,13 @@ namespace AgroBase.Forms
public frmInstancial()
{
InitializeComponent();
FilaService.Inicializar();
BLD300RService.IniciarRotinas();
MKS057DService.IniciarRotinas();
ModbusService.IniciarRotinas();
KinectService.InicializarRotinas();
FilaService.IniciarRotinas();
//BLD300RService.IniciarRotinas();
//MKS057DService.IniciarRotinas();
//ModbusService.IniciarRotinas();
//KinectService.InicializarRotinas();
GeneralJoystick.IniciarRotinas();
VersionamentoService.AtualizarArquivoVersionamento(true).ConfigureAwait(false);
VersionamentoService.IniciarRotinas();
EncerrarProcessosPython();
}
@ -59,6 +61,24 @@ namespace AgroBase.Forms
{
FuncoesGlobais.AddApplicationToStartup();
IniciarConexaoMqtt();
Control control = new Control();
if (DebugMode)
{
control = frmPrincipal;
}
else
{
control = frmIHM;
}
tmrVarreduraDispositivos = new AsyncTaskTimerModel("tmrVarreduraDispositivos", tmrVarreduraDispositivos_Tick, SerialService.InteraloVerificacao, control);
tmrVarreduraDispositivos.Start();
}
private static async Task tmrVarreduraDispositivos_Tick()
{
await FuncoesGlobais.SafeExecuteAsync(async () => await SerialService.RealizarVarreduraPortasUSB());
}
private async void IniciarConexaoMqtt()
@ -70,6 +90,8 @@ namespace AgroBase.Forms
{
Fechando = true;
AsyncTaskTimerModel.PararTimers();
foreach (var Disp in Variaveis.DispositivosConectados)
{
if (Disp._Porta.IsOpen)
@ -111,9 +133,9 @@ namespace AgroBase.Forms
private void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e)
private async void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e)
{
EncerrarProcessos().ConfigureAwait(false);
await EncerrarProcessos();
e.Cancel = true;
}

View File

@ -156,6 +156,7 @@
this.Name = "frmKinect";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Kinect";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmKinect_FormClosing);
this.Load += new System.EventHandler(this.frmKinect_Load);
((System.ComponentModel.ISupportInitialize)(this.picProfundidade)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.picRGB)).EndInit();

View File

@ -1,13 +1,5 @@
using AgroBase.Models;
using AgroBase.Services;
using Microsoft.Kinect;
using AgroBase.Services;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AgroBase.Forms
@ -46,6 +38,11 @@ namespace AgroBase.Forms
{
KinectService.Parametros.SonarAtivado = ((CheckBox)sender).Checked;
}
private void frmKinect_FormClosing(object sender, FormClosingEventArgs e)
{
KinectService.picRGB = null;
}
}

View File

@ -50,46 +50,6 @@ namespace AgroBase.Forms
switch (TipoDisp)
{
case T_Code.Mov:
{
DispositivosService<MovimentacaoModel> Disp = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == TipoDisp);
if (Disp == null)
{
return;
}
this.Text = "Pinout - Movimentação";
Funcoes = MovimentacaoModel.Funcoes.ToList();
Pinout = MovimentacaoModel.Pinout;
Dispositivos = Disp.Dados.Motores.Select(x => new DispositivoDataModel()
{
ID = x.ID,
Funcoes = x.Funcoes
}).ToList();
break;
}
case T_Code.Dir:
{
DispositivosService<DirecionalModel> Disp = (DispositivosService<DirecionalModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == TipoDisp);
if (Disp == null)
{
return;
}
this.Text = "Pinout - Direcional";
Funcoes = DirecionalModel.Funcoes.ToList();
Pinout = DirecionalModel.Pinout;
Dispositivos = Disp.Dados.Motores.Select(x => new DispositivoDataModel()
{
ID = x.ID,
Funcoes = x.Funcoes
}).ToList();
break;
}
case T_Code.Sen:
{
DispositivosService<SensoriamentoModel> Disp = (DispositivosService<SensoriamentoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == TipoDisp);
@ -267,12 +227,6 @@ namespace AgroBase.Forms
switch (TipoDisp)
{
case T_Code.Mov:
MovimentacaoModel.Pinout = Pinout;
break;
case T_Code.Dir:
DirecionalModel.Pinout = Pinout;
break;
case T_Code.Sen:
SensoriamentoModel.Pinout = Pinout;
break;

View File

@ -122,11 +122,11 @@ namespace AgroBase
this.gpbAcoes.Controls.Add(this.erroStrip);
this.gpbAcoes.Controls.Add(this.pnlLateral);
this.gpbAcoes.Dock = System.Windows.Forms.DockStyle.Right;
this.gpbAcoes.Location = new System.Drawing.Point(470, 0);
this.gpbAcoes.Location = new System.Drawing.Point(479, 0);
this.gpbAcoes.Margin = new System.Windows.Forms.Padding(2);
this.gpbAcoes.Name = "gpbAcoes";
this.gpbAcoes.Padding = new System.Windows.Forms.Padding(2);
this.gpbAcoes.Size = new System.Drawing.Size(619, 609);
this.gpbAcoes.Size = new System.Drawing.Size(619, 634);
this.gpbAcoes.TabIndex = 0;
this.gpbAcoes.TabStop = false;
this.gpbAcoes.Text = "Conexão";
@ -137,7 +137,7 @@ namespace AgroBase
this.erroStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.lblStripErro,
this.lblStatusConexao});
this.erroStrip.Location = new System.Drawing.Point(2, 585);
this.erroStrip.Location = new System.Drawing.Point(2, 610);
this.erroStrip.Name = "erroStrip";
this.erroStrip.Padding = new System.Windows.Forms.Padding(1, 0, 10, 0);
this.erroStrip.Size = new System.Drawing.Size(615, 22);
@ -170,7 +170,7 @@ namespace AgroBase
this.pnlLateral.Location = new System.Drawing.Point(2, 15);
this.pnlLateral.Margin = new System.Windows.Forms.Padding(2);
this.pnlLateral.Name = "pnlLateral";
this.pnlLateral.Size = new System.Drawing.Size(615, 592);
this.pnlLateral.Size = new System.Drawing.Size(615, 617);
this.pnlLateral.TabIndex = 0;
//
// chbConexaoautomatica
@ -328,10 +328,10 @@ namespace AgroBase
this.lblStripOperacaoLiberada,
this.lblStripOperacaoStatus,
this.lblStripMqtt});
this.generalStrip.Location = new System.Drawing.Point(0, 587);
this.generalStrip.Location = new System.Drawing.Point(0, 612);
this.generalStrip.Name = "generalStrip";
this.generalStrip.Padding = new System.Windows.Forms.Padding(1, 0, 10, 0);
this.generalStrip.Size = new System.Drawing.Size(470, 22);
this.generalStrip.Size = new System.Drawing.Size(479, 22);
this.generalStrip.TabIndex = 1;
this.generalStrip.Text = "statusStrip1";
//
@ -362,7 +362,7 @@ namespace AgroBase
// lblStripMqtt
//
this.lblStripMqtt.Name = "lblStripMqtt";
this.lblStripMqtt.Size = new System.Drawing.Size(119, 15);
this.lblStripMqtt.Size = new System.Drawing.Size(119, 17);
this.lblStripMqtt.Text = "MQTT: Desconectado";
//
// gpbMovimentacao
@ -855,7 +855,7 @@ namespace AgroBase
this.lblProgressoAtualizacao.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.lblProgressoAtualizacao.AutoSize = true;
this.lblProgressoAtualizacao.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblProgressoAtualizacao.Location = new System.Drawing.Point(290, 566);
this.lblProgressoAtualizacao.Location = new System.Drawing.Point(290, 591);
this.lblProgressoAtualizacao.Name = "lblProgressoAtualizacao";
this.lblProgressoAtualizacao.Size = new System.Drawing.Size(152, 13);
this.lblProgressoAtualizacao.TabIndex = 48;
@ -864,27 +864,28 @@ namespace AgroBase
// pgbAtualizacaoArquivos
//
this.pgbAtualizacaoArquivos.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.pgbAtualizacaoArquivos.Location = new System.Drawing.Point(12, 561);
this.pgbAtualizacaoArquivos.Location = new System.Drawing.Point(9, 586);
this.pgbAtualizacaoArquivos.Name = "pgbAtualizacaoArquivos";
this.pgbAtualizacaoArquivos.Size = new System.Drawing.Size(272, 23);
this.pgbAtualizacaoArquivos.Size = new System.Drawing.Size(275, 23);
this.pgbAtualizacaoArquivos.TabIndex = 47;
//
// btnForcarAtualizacao
//
this.btnForcarAtualizacao.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.btnForcarAtualizacao.Location = new System.Drawing.Point(293, 532);
this.btnForcarAtualizacao.Location = new System.Drawing.Point(9, 559);
this.btnForcarAtualizacao.Margin = new System.Windows.Forms.Padding(2);
this.btnForcarAtualizacao.Name = "btnForcarAtualizacao";
this.btnForcarAtualizacao.Size = new System.Drawing.Size(149, 22);
this.btnForcarAtualizacao.Size = new System.Drawing.Size(109, 22);
this.btnForcarAtualizacao.TabIndex = 17;
this.btnForcarAtualizacao.Text = "Forçar Atualização";
this.btnForcarAtualizacao.Text = "Atualizar Arquivos";
this.btnForcarAtualizacao.UseVisualStyleBackColor = true;
this.btnForcarAtualizacao.Click += new System.EventHandler(this.btnForcarAtualizacao_Click);
//
// clbRotinas
//
this.clbRotinas.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.clbRotinas.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.clbRotinas.FormattingEnabled = true;
this.clbRotinas.Location = new System.Drawing.Point(9, 417);
this.clbRotinas.Name = "clbRotinas";
@ -907,7 +908,7 @@ namespace AgroBase
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1089, 609);
this.ClientSize = new System.Drawing.Size(1098, 634);
this.Controls.Add(this.btnAtualizarRotinas);
this.Controls.Add(this.clbRotinas);
this.Controls.Add(this.btnForcarAtualizacao);
@ -1022,11 +1023,11 @@ namespace AgroBase
private System.Windows.Forms.Button btnMKS;
public System.Windows.Forms.ToolStripStatusLabel lblStatusConexao;
public System.Windows.Forms.Label lblProgressoAtualizacao;
private System.Windows.Forms.ProgressBar pgbAtualizacaoArquivos;
private System.Windows.Forms.Button btnForcarAtualizacao;
private System.Windows.Forms.Button btnEthernet;
private System.Windows.Forms.CheckedListBox clbRotinas;
private System.Windows.Forms.Button btnAtualizarRotinas;
public System.Windows.Forms.ProgressBar pgbAtualizacaoArquivos;
}
}

View File

@ -19,7 +19,6 @@ namespace AgroBase
public partial class frmPrincipal : Form
{
AsyncTaskTimerModel tmrLoopDispositivos;
AsyncTaskTimerModel tmrAtualizacaoArquivos;
public frmPrincipal()
{
@ -28,12 +27,9 @@ namespace AgroBase
private void Form1_Load(object sender, EventArgs e)
{
tmrLoopDispositivos = new AsyncTaskTimerModel("tmrLoopDispositivos", tmrLoopDispositivos_Tick, SerialService.InteraloVerificacao, this);
tmrLoopDispositivos = new AsyncTaskTimerModel("tmrLoopDispositivos", tmrLoopDispositivos_Tick, 5000, this);
tmrLoopDispositivos.Start();
tmrAtualizacaoArquivos = new AsyncTaskTimerModel("tmrAtualizacaoArquivos", tmrAtualizacaoArquivos_Tick, 300, this);
tmrAtualizacaoArquivos.Start();
btnJoyAtt_Click(new object(), new EventArgs());
cmbModoOperacao.Items.Clear();
@ -41,9 +37,10 @@ namespace AgroBase
cmbModoOperacao.SelectedIndex = (int)Variaveis.OperacaoEmAndamento.Modo;
}
private void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e)
private async void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e)
{
frmInstancial.EncerrarProcessos().ConfigureAwait(false);
// Executa o encerramento dos processos de forma segura
await FuncoesGlobais.SafeExecuteAsync(async () => await frmInstancial.EncerrarProcessos());
e.Cancel = true;
}
@ -55,8 +52,14 @@ namespace AgroBase
private void AtualizarListaRotinas()
{
string[] timers = new string[] { };
lock (AsyncTaskTimerModel._timersLock)
{
timers = AsyncTaskTimerModel.Timers.Select(x => $"{x.StackTrace} -> {x.Id} - Interval: {x.Interval} - Tick: {x.TimeTick.TotalSeconds} s - State: {x.State.ToString()}").ToArray();
}
clbRotinas.Items.Clear();
clbRotinas.Items.AddRange(AsyncTaskTimerModel.Timers.Select(x => $"{x.StackTrace} -> {x.Id} - Interval: {x.Interval} - Running: {x.IsRunning}").ToArray());
clbRotinas.Items.AddRange(timers);
}
#region DISPOSITIVOS
@ -137,17 +140,37 @@ namespace AgroBase
bool opLiberada = Variaveis.OperacaoEmAndamento.OperacaoLiberada;
lblStripOperacaoLiberada.Text = "Operação Liberada: " + (opLiberada ? "Sim" : "Não");
lblStripOperacaoLiberada.ForeColor = opLiberada ? Color.Green : Color.Red;
if (chbConexaoautomatica.Checked)
{
await FuncoesGlobais.SafeExecuteAsync(() => SerialService.RealizarVarreduraPortasUSB());
AtualizaDadosGerais();
}
}
public void AtualizaDadosGerais()
{
bool PrimeiraExecucao = !Variaveis.DispositivosConectados.Any();
SerialService.DispositivosConexaoInicial.ForEach(Dispositivo =>
{
IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
if (dispositivoService == null)
{
dispositivoService = DispositivosServiceFactory.CreateDispositivoService(
Dispositivo,
"Nome: " + Enum.GetName(typeof(T_Code), Dispositivo),
"Descrição: " + string.Join(", ", SerialService.DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).Select(x => x.Mod_ID).ToArray()),
new SerialPort()
);
Variaveis.DispositivosConectados.Add(dispositivoService);
Control controle = dispositivoService.InstanciarDispositivo(Variaveis.DispositivosConectados.Count - 1);
controle.Location = new System.Drawing.Point(controle.Location.X, controle.Location.Y + (Variaveis.DispositivosConectados.Count * 50));
pnlLateral.Controls.Add(controle);
cmbDispositivos.Items.Add(dispositivoService._Descricao);
}
});
if (PrimeiraExecucao)
{
Variaveis.OperacaoEmAndamento = OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual);
}
lstDisponiveis.Items.Clear();
lstDisponiveis.Items.AddRange(
SerialService.DispositivosMapeados
@ -192,17 +215,8 @@ namespace AgroBase
{
VersionamentoService.ForcarDownloadArquivos = true;
VersionamentoService.AtualizarArquivoVersionamento(true).ConfigureAwait(false);
tmrAtualizacaoArquivos.SetInterval(300);
tmrAtualizacaoArquivos.Restart();
}
private async Task tmrAtualizacaoArquivos_Tick()
{
lblProgressoAtualizacao.Text = VersionamentoService.AtualizandoArquivos ? $"({VersionamentoService.ProgressoAtualizacao.ToString("0.00")}%) Atualizando arquivos..." : VersionamentoService.ResultadoAtualizacao;
pgbAtualizacaoArquivos.Value = (int)VersionamentoService.ProgressoAtualizacao;
tmrAtualizacaoArquivos.SetInterval(VersionamentoService.AtualizandoArquivos ? 300 : 5000);
}
#endregion
@ -259,7 +273,7 @@ namespace AgroBase
public void AtualizaRPM(int Percentual)
{
int RPM = Convert.ToInt32((Percentual / 100.0) * VariaveisEquipamento.RPM_Max_Roda);
double Velocidade = MovimentacaoModel.CalculaVelocidadeRPM(RPM);
double Velocidade = FuncoesMatematicas.CalculaVelocidadeRPM(RPM);
FuncoesGlobais.PreencheValorTrackBar(trkRPM, RPM);
FuncoesGlobais.PreencheValorTrackBar(trkKmh, Percentual);

View File

@ -120,9 +120,6 @@
<metadata name="erroStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>11, 10</value>
</metadata>
<metadata name="erroStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>11, 10</value>
</metadata>
<metadata name="generalStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>133, 16</value>
</metadata>

View File

@ -327,8 +327,8 @@ namespace AgroBase.Forms
double anguloControle = Variaveis.OperacaoEmAndamento.Controle.Angulo;
txtAnguloControle.Text = anguloControle.ToString("0.00");
double velocidade = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_SP);
double velocidadeMs = MovimentacaoModel.ConverteKmhParaMs(velocidade);
double velocidade = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_SP);
double velocidadeMs = FuncoesMatematicas.ConverteKmhParaMs(velocidade);
txtVelocidade.Text = velocidade.ToString("0.00");
TimeSpan tempoPassado = !chbAutomatico.Checked || UltimaAtualizacao == DateTime.MinValue ? new TimeSpan(10000000) : DateTime.Now - UltimaAtualizacao;

View File

@ -1,5 +1,4 @@
using OpenTK.Platform.Windows;
using System;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
@ -9,8 +8,39 @@ namespace AgroBase.Models
{
public class AsyncTaskTimerModel : IDisposable
{
public static readonly object _timersLock = new object();
public static List<AsyncTaskTimerModel> Timers { get; set; } = new List<AsyncTaskTimerModel>();
public static void PararTimers()
{
lock (_timersLock)
{
foreach (var timer in Timers)
{
timer.Stop();
}
}
}
private TimerState _state = TimerState.Created;
public TimerState State { get { return _state; } }
/// <summary>
/// Verifica se o timer foi iniciado e está executando.
/// </summary>
public bool IsRunning => _state == TimerState.Running;
/// <summary>
/// Verifica se o timer está parado.
/// </summary>
public bool IsStopped => _state == TimerState.Stopped;
/// <summary>
/// Verifica se o timer foi criado, mas ainda não foi iniciado.
/// </summary>
public bool IsCreated => _state == TimerState.Created;
private CancellationTokenSource _cancellationTokenSource;
private Func<Task> _taskToExecute;
private int _interval; // Intervalo em milissegundos
@ -22,7 +52,12 @@ namespace AgroBase.Models
private Control _uiControl;
private int _timeout = 60000;
private DateTime lastTick = DateTime.MinValue;
private DateTime beginTask = DateTime.MinValue;
private DateTime endTask = DateTime.MinValue;
/// <summary>
/// Obtém o tempo decorrido entre o início e o fim da tarefa.
/// </summary>
public TimeSpan TimeTick => endTask - beginTask;
private bool DebugMessages = true;
@ -34,8 +69,10 @@ namespace AgroBase.Models
/// <param name="uiControl">Controle para executar tarefas relacionadas à UI. Opcional.</param>
public AsyncTaskTimerModel(string id, Func<Task> taskToExecute, int interval, Control uiControl = null, int timeout = 60000)
{
if (string.IsNullOrEmpty(id)) throw new ArgumentNullException(nameof(id));
if (taskToExecute == null) throw new ArgumentNullException(nameof(taskToExecute));
//if (string.IsNullOrEmpty(id)) throw new ArgumentNullException(nameof(id));
if (string.IsNullOrEmpty(id)) return;
//if (taskToExecute == null) throw new ArgumentNullException(nameof(taskToExecute));
if (taskToExecute == null) return;
if (interval <= 0) throw new ArgumentException("Interval must be greater than zero.", nameof(interval));
if (timeout <= 0) throw new ArgumentException("Timeout must be greater than zero.", nameof(timeout));
@ -46,7 +83,10 @@ namespace AgroBase.Models
_timeout = timeout;
_uiControl = uiControl;
Timers.Add(this);
lock (_timersLock)
{
Timers.Add(this);
}
}
/// <summary>
@ -54,10 +94,14 @@ namespace AgroBase.Models
/// </summary>
public void Start()
{
if (_cancellationTokenSource != null) return;
if (VerificaDisposed()) return;
if (_state == TimerState.Running) return;
ExibirConsole($"START");
_state = TimerState.Running;
_cancellationTokenSource = new CancellationTokenSource();
ExibirConsole($"START");
Task.Run(() => TimerLoopAsync(_cancellationTokenSource.Token));
}
@ -66,11 +110,14 @@ namespace AgroBase.Models
/// </summary>
public void Stop()
{
if (_cancellationTokenSource == null) return;
if (VerificaDisposed()) return;
if (_state != TimerState.Running) return;
_cancellationTokenSource.Cancel();
_cancellationTokenSource = null;
_state = TimerState.Stopped;
ExibirConsole($"STOP");
}
@ -79,6 +126,8 @@ namespace AgroBase.Models
/// </summary>
public void Restart()
{
if (VerificaDisposed()) return;
Stop();
Start();
@ -90,6 +139,8 @@ namespace AgroBase.Models
/// </summary>
public void Toogle()
{
if (VerificaDisposed()) return;
if (IsRunning)
{
Stop();
@ -108,21 +159,12 @@ namespace AgroBase.Models
/// <param name="interval">Novo intervalo em milissegundos.</param>
public void SetInterval(int interval)
{
if (VerificaDisposed()) return;
if (interval <= 0) throw new ArgumentException("Interval must be greater than zero.", nameof(interval));
_interval = interval;
}
/// <summary>
/// Verifica se o timer está em execução.
/// </summary>
public bool IsRunning
{
get
{
return _cancellationTokenSource != null && !_cancellationTokenSource.Token.IsCancellationRequested && lastTick.AddMilliseconds(_timeout) >= DateTime.Now;
}
}
/// <summary>
/// Loop interno do timer com timeout na execução da tarefa.
/// </summary>
@ -130,24 +172,20 @@ namespace AgroBase.Models
{
while (!cancellationToken.IsCancellationRequested)
{
lastTick = DateTime.Now;
beginTask = DateTime.Now;
try
{
// Cria um token de cancelamento específico para o timeout
var timeoutCts = new CancellationTokenSource();
var timeoutToken = timeoutCts.Token;
var timeoutCts = new CancellationTokenSource(_timeout);
var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutCts.Token);
// Define o tempo limite para a execução da tarefa
timeoutCts.CancelAfter(_timeout);
var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutToken);
// Executa a tarefa com timeout
// Define a tarefa a ser executada
var taskToRun = _uiControl != null
? FuncoesGlobais.ExecutarMetodoComVerificacaoCrossThreadAsync(_uiControl, _taskToExecute)
: _taskToExecute();
// Aguarda a conclusão da tarefa ou o timeout
var completedTask = await Task.WhenAny(taskToRun, Task.Delay(_timeout, linkedTokenSource.Token));
if (completedTask == taskToRun)
@ -161,8 +199,7 @@ namespace AgroBase.Models
ExibirConsole($"TIMEOUT - tarefa excedeu {_timeout}ms");
}
// Aguarda o intervalo antes da próxima execução
await Task.Delay(_interval, cancellationToken);
endTask = DateTime.Now;
}
catch (OperationCanceledException)
{
@ -172,32 +209,40 @@ namespace AgroBase.Models
}
catch (Exception ex)
{
// Tratar erros inesperados
// Log de erros inesperados
ExibirConsole($"ERROR");
Console.WriteLine($"Erro no timer: {ex.Message}");
Console.WriteLine($"Erro no timer {_id}: {ex.Message}");
}
finally
{
// Garante que o intervalo é respeitado entre execuções
await Task.Delay(_interval, cancellationToken);
}
}
ExibirConsole($"ENCERRADO");
}
private bool _disposed = false;
/// <summary>
/// Descarta os recursos após finalizar o uso para liberar a memória.
/// </summary>
public void Dispose()
{
if (_disposed) return;
if (VerificaDisposed()) return;
// Cancela o token de cancelamento
Stop();
// Remove o timer da lista estática
Timers.Remove(this);
lock (_timersLock)
{
Timers.Remove(this);
}
// Libera o CancellationTokenSource
_cancellationTokenSource?.Dispose();
_disposed = true;
_state = TimerState.Disposed;
ExibirConsole($"DISPOSED");
}
@ -215,11 +260,28 @@ namespace AgroBase.Models
{
if (DebugMessages)
{
Console.WriteLine($"AsyncTaskTimer id = {_stackTrace} - {msg}");
Console.WriteLine($"AsyncTaskTimer id = {_stackTrace} -> {Id} - {msg}");
}
}
private bool VerificaDisposed()
{
bool _disposed = _state == TimerState.Disposed;
if (_disposed)
ExibirConsole($"O timer {Id} já foi descartado!");
return _disposed;
}
}
public enum TimerState
{
Created, // Apenas criado, mas não iniciado
Running, // Executando ativamente
Stopped, // Parado após ser iniciado
Disposed, // Descartado
}
}

View File

@ -57,7 +57,13 @@ namespace AgroBase.Models
public void InicializarCamera()
{
var timers = AsyncTaskTimerModel.Timers.Where(x => x.StackTrace.Contains("CameraCaminhoModel") && x.Id.Contains(ID)).ToList();
List<AsyncTaskTimerModel> timers = new List<AsyncTaskTimerModel>();
lock (AsyncTaskTimerModel._timersLock)
{
timers = AsyncTaskTimerModel.Timers.Where(x => x.StackTrace.Contains("CameraCaminhoModel") && x.Id.Contains(ID)).ToList();
}
foreach (var timer in timers)
{
timer.Dispose();

View File

@ -480,7 +480,7 @@ namespace AgroBase
(!Variaveis.OperacaoEmAndamento.OperacaoLiberada ||
!Variaveis.OperacaoEmAndamento.Iniciado ||
Variaveis.OperacaoEmAndamento.Modo != ModoOperacao.Manual ||
!VerificaComandoValido(Tecla))
!VerificaComandoValidoSonar(Tecla))
)
{
return;
@ -737,7 +737,7 @@ namespace AgroBase
}
}
private static bool VerificaComandoValido(Keys Comando)
private static bool VerificaComandoValidoSonar(Keys Comando)
{
List<Keys> ComandosImpedidos = new List<Keys>();

View File

@ -144,11 +144,6 @@ namespace AgroBase.Models
if (StatusDetecao != UltimoStatusDetecao)
{
UltimoStatusDetecao = StatusDetecao;
if (StatusDetecao && Variaveis.OperacaoEmAndamento.DispMvd != null && Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.Any(x => x.MovMotor.BLD_Inicializado))
{
GeneralJoystick.EnviaComandoMotor(System.Windows.Forms.Keys.Escape, T_Code.Mov);
}
}
}

View File

@ -1004,7 +1004,7 @@ namespace AgroBase.Models
});
Variaveis.OperacaoEmAndamento.Mapa.IdxUltimoPontoTrajetoriaDinamica = 0;
if (KinectService.Iniciado && Variaveis.OperacaoEmAndamento.Sensoriamento.SonarFrontal_Kinect.StatusDetecao)
if (KinectService.Iniciado && KinectService.Leitura.StatusDetecao)
{
if (Variaveis.OperacaoEmAndamento.OpMapaGPS.StatusDentroRua.Contains(statusCarro))
{
@ -1012,7 +1012,7 @@ namespace AgroBase.Models
}
else
{
AjustarTrajetoriaParaDesvio(Variaveis.OperacaoEmAndamento.Sensoriamento.SonarFrontal_Kinect.ObstaculoCritico);
AjustarTrajetoriaParaDesvio(KinectService.Leitura.ObstaculoCritico);
}
}
}
@ -1188,8 +1188,8 @@ namespace AgroBase.Models
_caminho.Add(inicio);
double velocidade = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_SP);
double velocidadeMs = MovimentacaoModel.ConverteKmhParaMs(velocidade);
double velocidade = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_SP);
double velocidadeMs = FuncoesMatematicas.ConverteKmhParaMs(velocidade);
// Calcula o tempo que passou desde a última atualização
TimeSpan tempoPassado = UltimaAtualizacaoTrajetoriaDinamica == DateTime.MinValue ? new TimeSpan(10000000) : DateTime.Now - UltimaAtualizacaoTrajetoriaDinamica;
// Calcula a distância com base no tempo passado (em segundos)
@ -1360,9 +1360,9 @@ namespace AgroBase.Models
TrajetoriaDinamica.Clear();
caminho.ForEach(x => TrajetoriaDinamica.Add(x));
if (Variaveis.OperacaoEmAndamento.Sensoriamento.SonarFrontal_Kinect.DesvioNecessario)
if (KinectService.Leitura.DesvioNecessario)
{
AjustarTrajetoriaParaDesvio(Variaveis.OperacaoEmAndamento.Sensoriamento.SonarFrontal_Kinect.ObstaculoCritico);
AjustarTrajetoriaParaDesvio(KinectService.Leitura.ObstaculoCritico);
}
GPSService.AtualizarTrajetoriaDinamica();

View File

@ -25,6 +25,7 @@ namespace AgroBase.Models.Modules
public static int _TaxaAmostragem { get; set; } = 500;
public bool Conectado { get; set; } = false;
public DateTime UltimoProtocoloRecebido { get; set; } = DateTime.MaxValue.AddDays(-1);
public static PinoutDataModel Pinout { get; set; }
public static List<FuncoesPinout> Funcoes { get; set; } = new List<FuncoesPinout>()
{
@ -39,6 +40,8 @@ namespace AgroBase.Models.Modules
public List<SensorModel> Sensores { get; set; } = new List<SensorModel>();
public string ScriptDeteccaoErvas { get; set; } = PythonService.ScriptWeedDetector;
public AsyncTaskTimerModel tmrRegistrador;
#region MASSA
public double _MassaRef { get; set; } = 0.8;
public double _MassaLeituraRef { get; set; } = 40876.37;
@ -394,6 +397,8 @@ namespace AgroBase.Models.Modules
public void RecebeProtocoloSerial(string Protocolo)
{
UltimoProtocoloRecebido = DateTime.Now;
string Mod_ID = Protocolo.Split(SerialService.SplitMessage[0])[0];
string mensagem = Protocolo.Substring(Mod_ID.Length + 1, Protocolo.Length - Mod_ID.Length - 1);
if (!string.IsNullOrEmpty(Protocolo) && mensagem[0].ToString() == SerialService.BeginSensor)
@ -683,12 +688,28 @@ namespace AgroBase.Models.Modules
public void IniciarRegistrador()
{
if (!tmrRegistrador?.IsRunning ?? false)
{
LimparDados(this);
PararRegistrador();
tmrRegistrador = new AsyncTaskTimerModel("tmrRegistrador_" + T_Code.Atu.ToString(), tmrRegistrador_Tick, _TaxaAmostragem);
tmrRegistrador.Start();
}
}
public async Task LoopRegistrador()
{
public void PararRegistrador()
{
tmrRegistrador?.Dispose();
}
public async Task tmrRegistrador_Tick()
{
tmrRegistrador.SetInterval(_TaxaAmostragem);
Conectado = UltimoProtocoloRecebido.AddMilliseconds(10 * _TaxaAmostragem) >= DateTime.Now;
}
public (bool, List<string>) StatusModulosATU()

View File

@ -1,460 +0,0 @@
using AgroBase.Forms;
using AgroBase.Forms.Direcional;
using AgroBase.Services;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Models.Modules
{
public class DirecionalModel : DispositivoBaseModel
{
public string Modulo_ID { get; set; } = T_Code.Dir.ToString();
private bool _MensagemConexaoRecebida { get; set; } = false;
public bool MensagemConexaoRecebida(bool Reset = false)
{
if (Reset)
{
_MensagemConexaoRecebida = false;
}
return _MensagemConexaoRecebida;
}
public static int _TaxaAmostragem { get; set; } = 500;
public bool Conectado { get; set; } = false;
public bool AA_Ref000 { get; set; } = false;
public bool AA_Ref090 { get; set; } = false;
public bool AA_Ref270 { get; set; } = false;
public static int LogsManter { get; set; } = 60;
public static PinoutDataModel Pinout { get; set; }
public static List<FuncoesPinout> Funcoes { get; set; } = new List<FuncoesPinout>()
{
FuncoesPinout.Geral,
};
public List<DirSensoriamentoMotor> Motores { get; set; }
public static DirecionalModel CarregarParametrosIniciais()
{
return new DirecionalModel()
{
Motores = new List<DirSensoriamentoMotor>()
{
new DirSensoriamentoMotor() {
Canal = 0,
ID = "ET",
Descricao = "Esquerdo Trás",
ConfigSentidos = new ConfiguracaoSentidoMotor() {
Direita = Sentido.Antihorario,
Esquerda = Sentido.Horario,
Frente = Sentido.Parado,
Tras = Sentido.Parado
},
Funcoes = new List<FuncoesPinout>() {
FuncoesPinout.PUL,
FuncoesPinout.DIR,
FuncoesPinout.ENA,
/*FuncoesPinout.EncoderA,
FuncoesPinout.EncoderB,
FuncoesPinout.REF000,
FuncoesPinout.REF090,
FuncoesPinout.REF270,*/
FuncoesPinout.EncoderAbsoluto
}
},
new DirSensoriamentoMotor() {
Canal = 1,
ID = "EF",
Descricao = "Esquerdo Frente",
ConfigSentidos = new ConfiguracaoSentidoMotor() {
Direita = Sentido.Antihorario,
Esquerda = Sentido.Horario,
Frente = Sentido.Parado,
Tras = Sentido.Parado
},
Funcoes = new List<FuncoesPinout>() {
FuncoesPinout.PUL,
FuncoesPinout.DIR,
FuncoesPinout.ENA,
/*FuncoesPinout.EncoderA,
FuncoesPinout.EncoderB,
FuncoesPinout.REF000,
FuncoesPinout.REF090,
FuncoesPinout.REF270,*/
FuncoesPinout.EncoderAbsoluto
}
},
new DirSensoriamentoMotor() {
Canal = 2,
ID = "DT",
Descricao = "Direito Trás",
ConfigSentidos = new ConfiguracaoSentidoMotor() {
Direita = Sentido.Antihorario,
Esquerda = Sentido.Horario,
Frente = Sentido.Parado,
Tras = Sentido.Parado
},
Funcoes = new List<FuncoesPinout>() {
FuncoesPinout.PUL,
FuncoesPinout.DIR,
FuncoesPinout.ENA,
/*FuncoesPinout.EncoderA,
FuncoesPinout.EncoderB,
FuncoesPinout.REF000,
FuncoesPinout.REF090,
FuncoesPinout.REF270,*/
FuncoesPinout.EncoderAbsoluto
}
},
new DirSensoriamentoMotor() {
Canal = 3,
ID = "DF",
Descricao = "Direito Frente",
ConfigSentidos = new ConfiguracaoSentidoMotor() {
Direita = Sentido.Antihorario,
Esquerda = Sentido.Horario,
Frente = Sentido.Parado,
Tras = Sentido.Parado
},
Funcoes = new List<FuncoesPinout>() {
FuncoesPinout.PUL,
FuncoesPinout.DIR,
FuncoesPinout.ENA,
/*FuncoesPinout.EncoderA,
FuncoesPinout.EncoderB,
FuncoesPinout.REF000,
FuncoesPinout.REF090,
FuncoesPinout.REF270,*/
FuncoesPinout.EncoderAbsoluto
}
}
}
};
}
public Dictionary<string, List<string>> ProtocoloConfiguracao(bool Conectar)
{
// Inicializar o dicionário
var configDictionary = new Dictionary<string, List<string>>();
// Adicionar configurações dos Motores
var motoresConfig = Motores.Select(x => x.ProtocoloConfiguracaoMotor(Conectar)).ToList();
configDictionary.Add(Modulo_ID, motoresConfig);
// Adicionar configuração do ProtocoloMOD
string protocoloMOD =
((int)F_Code.Cfg).ToString() + SerialService.SplitMessage +
"MD" + SerialService.SplitParams +
(Conectar ? "1" : "0") + SerialService.SplitParams +
_TaxaAmostragem.ToString("00000");
var protocoloMODConfig = new List<string> { protocoloMOD };
configDictionary.Add(Modulo_ID, protocoloMODConfig);
return configDictionary;
}
public void RecebeProtocoloSerial(string Protocolo)
{
// #ET;00000;00000;00000;000
if (!string.IsNullOrEmpty(Protocolo) && Protocolo[0].ToString() == SerialService.BeginSensor)
{
string[] Dados = Protocolo.Replace(SerialService.BeginSensor, "").Split(SerialService.EndLine[0])[0].Split(';');
S_Code TipoSensor = (S_Code)(int.Parse(Dados[0]));
DirSensoriamentoMotor Motor = Motores.FirstOrDefault(x => x.ID == Dados[1]);
if (Motor == null)
{
if (Dados[1] == "MD")
{
Conectado = Dados[2] == "1";
_MensagemConexaoRecebida = true;
}
return;
}
try
{
bool AtualizaGrafico = false;
switch (TipoSensor)
{
case S_Code.sENC:
{
int _sentido = 0;
int.TryParse(Dados[2].ToString(), out _sentido);
Motor.Sentido = (Sentido)_sentido;
int _angulo = 0;
int.TryParse(Dados[3].ToString(), out _angulo);
Motor.Angulo = _angulo;
/*Motor.Ref000 = Dados[4] == "1";
Motor.Ref090 = Dados[5] == "1";
Motor.Ref270 = Dados[6] == "1";
bool r1 = Dados[7] == "1";
bool r2 = Dados[8] == "1";*/
bool r1 = Dados[4] == "1";
bool r2 = Dados[5] == "1";
Motor.Referenciando = r1;
Motor.Referenciado = r2;
AtualizaGrafico = true;
break;
}
case S_Code.sTST:
{
bool testando = Dados[1] == "1";
if (!Motor.Testando && testando)
{
Motor.LogTestes = new List<SensoriamentoMotorTestes>();
}
Motor.Testando = testando;
if (Motor.Testando && Dados.Length >= 4)
{
string componente = Dados[2];
string resultado = Dados[3];
string comando = Dados[4];
string leitura = Dados[5];
Motor.LogTestes.Add(new SensoriamentoMotorTestes()
{
Componente = componente,
Sucesso = resultado == "SUCESSO",
Resultado = resultado,
Comando = comando,
Leitura = leitura,
Momento = DateTime.Now
});
}
break;
}
case S_Code.sCFG:
{
Motor.Inicializado = Dados[2] == "1";
break;
}
}
if (AtualizaGrafico)
{
Motor.LogGrafico.Add(new DirSensorimanetoGrafico()
{
Momento = DateTime.Now,
ComponenteID = Motor.ID,
Angulo_SP = Motor.Angulo_SP,
Angulo = Motor.Angulo,
Sentido = Motor.Sentido,
Ref0 = Motor.Ref000,
Ref90 = Motor.Ref090,
Ref270 = Motor.Ref270,
});
if (Motor.LogGrafico.Count() > LogsManter)
{
Motor.LogGrafico.RemoveAt(0);
}
if (Variaveis.DispositivosConectados.Any(x => x.Dispositivo == T_Code.Dir))
{
//((frmDirPlot)(frmPrincipal.Dispositivos.First(x => x.Dispositivo == T_Code.Dir).frmPlot)).AtualizaGrafico();
//frmInstancial.frmAcompanhamento.tmrAtualizacao_Tick();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
public void DefineStatusConexao(string Mod_ID, bool conecatdo)
{
if (Mod_ID == Modulo_ID)
{
Conectado = conecatdo;
//Variaveis.OperacaoEmAndamento.DispDir.AcaoConexao();
}
}
public string GetTaxaAmostragem()
{
return _TaxaAmostragem.ToString("00000");
}
public void SetTaxaAmostragem(int TaxaAmostragem)
{
_TaxaAmostragem = TaxaAmostragem;
}
public bool GetStatusConexao()
{
return Conectado;
}
public PinoutDataModel CarregarPinout(string nomeArquivo)
{
if (!File.Exists(nomeArquivo))
{
var newPinout = new PinoutDataModel()
{
ExpansorGPIO = false,
EnderecoExpansor = "",
Pinos = PinoutModel.CarregarPinoutPadrao_S3(),
};
File.WriteAllText(nomeArquivo, JsonConvert.SerializeObject(newPinout));
}
var pinoutText = File.ReadAllText(nomeArquivo);
Pinout = JsonConvert.DeserializeObject<PinoutDataModel>(pinoutText);
return Pinout;
}
public void SalvarPinout(PinoutDataModel newPinout, string nomeArquivo)
{
File.WriteAllText(nomeArquivo, JsonConvert.SerializeObject(newPinout));
}
public void IniciarRegistrador()
{
}
public async Task LoopRegistrador()
{
}
}
public class DirSensoriamentoMotor
{
public int Canal { get; set; }
public string ID { get; set; }
public string Descricao { get; set; }
public bool Comandar { get; set; } = false;
public bool Inicializado { get; set; } = false;
public Sentido Sentido_SP { get; set; } = Sentido.Parado;
public Sentido Sentido { get; set; } = Sentido.Parado;
public double Angulo_SP { get; set; } = 0;
public double Angulo { get; set; } = 0;
public double Angulo_Offset { get; set; } = 0;
public int Velocidade { get; set; } = 50;
public bool Ref000 { get; set; } = false;
public bool Ref090 { get; set; } = false;
public bool Ref180 { get; set; } = false;
public bool Ref270 { get; set; } = false;
public bool Referenciando { get; set; } = false;
public bool Referenciado { get; set; } = false;
public bool Controlar { get; set; } = false;
public bool Estabilizar { get; set; } = false;
public bool Referenciar { get; set; } = false;
public bool Livre { get; set; } = false;
public ConfiguracaoSentidoMotor ConfigSentidos { get; set; }
public bool Testando { get; set; } = false;
public List<SensoriamentoMotorTestes> LogTestes { get; set; } = new List<SensoriamentoMotorTestes>();
public List<DirSensorimanetoGrafico> LogGrafico { get; set; } = new List<DirSensorimanetoGrafico>();
public List<FuncoesPinout> Funcoes { get; set; }
public string ProtocoloConfiguracaoMotor(bool Conectar)
{
var _pinout = new PinoutDataModel()
{
ExpansorGPIO = DirecionalModel.Pinout.ExpansorGPIO,
EnderecoExpansor = DirecionalModel.Pinout.EnderecoExpansor,
Pinos = DirecionalModel.Pinout.Pinos.ToList(),
};
_pinout.Pinos = _pinout.Pinos.Where(x => x.ComponenteID == ID).ToList();
string Protocolo =
((int)F_Code.Cfg).ToString() + SerialService.SplitMessage +
ID + SerialService.SplitParams +
(Conectar ? "1" : "0") + SerialService.SplitParams +
Canal.ToString() + SerialService.SplitParams +
(Comandar ? "1" : "0") + SerialService.SplitParams +
(Estabilizar ? "1" : "0") + SerialService.SplitParams +
(Referenciar ? "1" : "0") + SerialService.SplitParams +
Angulo_Offset.ToString() + SerialService.SplitParams +
PinoutModel.PinoProtocolo(_pinout, Funcoes);
return Protocolo;
}
public string ProtocoloComando(Direcao Direcao, bool _Ref = false)
{
if (Comandar && (Controlar))
{
Sentido_SP =
Direcao == Direcao.Direita ? ConfigSentidos.Direita :
Direcao == Direcao.Esquerda ? ConfigSentidos.Esquerda :
!Livre && Sentido_SP == Sentido.Horario ? Sentido.Antihorario :
!Livre && Sentido_SP == Sentido.Antihorario ? Sentido.Horario :
Sentido.Parado;
Angulo_SP = Livre ? -1 : (Direcao != Direcao.Cima && Direcao != Direcao.Baixo) ? 0 : Variaveis.OperacaoEmAndamento.Controle.Angulo;
Velocidade = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP);
string ProtocoloMotor =
((int)F_Code.Cmd).ToString() + SerialService.SplitMessage +
ID + SerialService.SplitParams +
((int)Sentido_SP).ToString() + SerialService.SplitParams +
Angulo_SP.ToString() + SerialService.SplitParams +
Velocidade.ToString() + SerialService.SplitParams +
(_Ref ? "1" : "0") + SerialService.SplitParams +
Angulo_Offset.ToString();
return ProtocoloMotor;
}
return "";
}
public string ProtocoloTeste()
{
if (Comandar)
{
string ProtocoloMotor =
((int)F_Code.Tst).ToString() + SerialService.SplitMessage +
ID;
return ProtocoloMotor;
}
return "";
}
}
public class SensoriamentoMotorTestes
{
public DateTime Momento { get; set; }
public string Componente { get; set; }
public bool Sucesso { get; set; }
public string Resultado { get; set; }
public string Comando { get; set; }
public string Leitura { get; set; }
}
public class DirSensorimanetoGrafico
{
public DateTime Momento { get; set; }
public string ComponenteID { get; set; }
public double Angulo_SP { get; set; }
public double Angulo { get; set; }
public bool Ref0 { get; set; }
public bool Ref90 { get; set; }
public bool Ref270 { get; set; }
public Sentido Sentido { get; set; }
}
}

View File

@ -1,10 +1,4 @@
using AgroBase.Models.Modules;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static AgroBase.Models.Enums;
using System.Collections.Generic;
namespace AgroBase.Models
{
@ -17,7 +11,7 @@ namespace AgroBase.Models
bool GetStatusConexao();
Dictionary<string, List<string>> ProtocoloConfiguracao(bool Conectar);
void IniciarRegistrador();
Task LoopRegistrador();
void PararRegistrador();
}
}

View File

@ -1,549 +0,0 @@
using AgroBase.Forms;
using AgroBase.Models.Modules;
using AgroBase.Services;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Models
{
public class MovimentacaoModel : DispositivoBaseModel
{
public string Modulo_ID { get; set; } = T_Code.Mov.ToString();
private bool _MensagemConexaoRecebida { get; set; } = false;
public bool MensagemConexaoRecebida(bool Reset = false)
{
if (Reset)
{
_MensagemConexaoRecebida = false;
}
return _MensagemConexaoRecebida;
}
public bool Conectado { get; set; } = false;
public static int _TaxaAmostragem { get; set; } = 500;
public static int NumPolos { get; set; } = 0;
public static int Rampa { get; set; } = 0;
public static int RPM_Max { get; set; } = 0;
public static int LogsManter { get; set; } = 60;
public static PinoutDataModel Pinout { get; set; }
public static List<FuncoesPinout> Funcoes { get; set; } = new List<FuncoesPinout>();
public List<MovSensoriamentoMotor> Motores { get; set; }
public static Direcao UltimaDirecao { get; set; } = Direcao.Parado;
public int TempoEmAtividade { get; set; } = 0;
public double DistanciaPercorridaTotal { get; set; } = 0;
public double DistanciaPercorridaParcial { get; set; } = 0;
public double DistanciaPercorridaOperacao { get; set; } = 0;
public AsyncTaskTimerModel tmrRegistrador { get; set; }
public static MovimentacaoModel CarregarParametrosIniciais()
{
return new MovimentacaoModel()
{
Motores = new List<MovSensoriamentoMotor>()
{
new MovSensoriamentoMotor() {
Canal = 1,
Endereco = "0x01",
ID = "ET",
Descricao = "Esquerdo Trás",
ConfigSentidos = new ConfiguracaoSentidoMotor() {
Direita = Sentido.Antihorario,
Esquerda = Sentido.Horario,
Frente = Sentido.Horario,
Tras = Sentido.Antihorario
},
Funcoes = new List<FuncoesPinout>() {
FuncoesPinout.TMP,
}
},
new MovSensoriamentoMotor() {
Canal = 2,
Endereco = "0x02",
ID = "EF",
Descricao = "Esquerdo Frente",
ConfigSentidos = new ConfiguracaoSentidoMotor() {
Direita = Sentido.Antihorario,
Esquerda = Sentido.Horario,
Frente = Sentido.Horario,
Tras = Sentido.Antihorario
},
Funcoes = new List<FuncoesPinout>() {
FuncoesPinout.TMP,
}
},
new MovSensoriamentoMotor() {
Canal = 3,
Endereco = "0x03",
ID = "DT",
Descricao = "Direito Trás",
ConfigSentidos = new ConfiguracaoSentidoMotor() {
Direita = Sentido.Horario,
Esquerda = Sentido.Antihorario,
Frente = Sentido.Horario,
Tras = Sentido.Antihorario
},
Funcoes = new List<FuncoesPinout>() {
FuncoesPinout.TMP,
}
},
new MovSensoriamentoMotor() {
Canal = 4,
Endereco = "0x04",
ID = "DF",
Descricao = "Direito Frente",
ConfigSentidos = new ConfiguracaoSentidoMotor() {
Direita = Sentido.Antihorario,
Esquerda = Sentido.Horario,
Frente = Sentido.Antihorario,
Tras = Sentido.Horario
},
Funcoes = new List<FuncoesPinout>() {
FuncoesPinout.TMP,
}
}
},
};
}
public Dictionary<string, List<string>> ProtocoloConfiguracao(bool Conectar)
{
// Inicializar o dicionário
var configDictionary = new Dictionary<string, List<string>>();
// Adicionar configurações dos Motores que devem ser comandados
var motoresConfig = Motores
.Where(x => x.Comandar)
.Select(x => x.ProtocoloConfiguracaoMotor(Conectar))
.ToList();
configDictionary.Add(Modulo_ID, motoresConfig);
// Adicionar configuração do ProtocoloMOD
string protocoloMOD =
((int)F_Code.Cfg).ToString() + SerialService.SplitMessage +
"MD" + SerialService.SplitParams +
(Conectar ? "1" : "0") + SerialService.SplitParams +
_TaxaAmostragem.ToString();
var protocoloMODConfig = new List<string> { protocoloMOD };
configDictionary.Add(Modulo_ID, protocoloMODConfig);
return configDictionary;
}
public void RecebeProtocoloSerial(string Protocolo)
{
if (!string.IsNullOrEmpty(Protocolo) && Protocolo[0].ToString() == SerialService.BeginSensor)
{
try
{
string[] Dados = Protocolo.Replace(SerialService.BeginSensor, "").Split(SerialService.EndLine[0])[0].Split(';');
S_Code TipoSensor = (S_Code)(int.Parse(Dados[0]));
MovSensoriamentoMotor Motor = Motores.FirstOrDefault(x => x.ID == Dados[1]);
if (Motor == null)
{
if (Dados[1] == "MD")
{
Conectado = Dados[2] == "1";
_MensagemConexaoRecebida = true;
}
return;
}
bool AtualizaGrafico = false;
try
{
switch (TipoSensor)
{
case S_Code.sBLD:
{
double rpm = 0;
double.TryParse(Dados[2].Replace(".", ","), out rpm);
Motor.RPM = rpm;
double temperatura = 0;
double.TryParse(Dados[3].Replace(".", ","), out temperatura);
temperatura = FuncoesMatematicas.CalcularTemperatura(temperatura, -1.038);
Motor.Temperatura = temperatura;
double tensao = 0;
double.TryParse(Dados[4].Replace(".", ","), out tensao);
Motor.Tensao = tensao;
double corrente_max = 0;
double.TryParse(Dados[5].Replace(".", ","), out corrente_max);
corrente_max = FuncoesMatematicas.Map(corrente_max, 15780, 16799, 0, 20.6);
Motor.Corrente_Max = corrente_max;
bool ligado = Dados[6] == "1";
Motor.Ligado = ligado;
int sentido = 0;
int.TryParse(Dados[7], out sentido);
Motor.Sentido = (Sentido)sentido;
bool freio = Dados[8] == "1";
Motor.Freio = freio;
int codAlarme = 0;
int.TryParse(Dados[9], out codAlarme);
Motor.CodigoAlarme = codAlarme;
double tempDriver = 0;
double.TryParse(Dados[10].Replace(".", ","), out tempDriver);
tempDriver = FuncoesMatematicas.CalcularTemperatura(tempDriver, 0);
Motor.TemperaturaDriver = tempDriver;
AtualizaGrafico = true;
break;
}
case S_Code.sTST:
{
bool testando = Dados[2] == "1";
if (!Motor.Testando && testando)
{
Motor.LogTestes = new List<SensoriamentoMotorTestes>();
}
Motor.Testando = testando;
if (Motor.Testando && Dados.Length >= 5)
{
string componente = Dados[1];
string resultado = Dados[2];
string comando = Dados[3];
string leitura = Dados[4];
Motor.LogTestes.Add(new SensoriamentoMotorTestes()
{
Componente = componente,
Sucesso = resultado == "SUCESSO",
Resultado = resultado,
Comando = comando,
Leitura = leitura,
Momento = DateTime.Now
});
}
break;
}
case S_Code.sCFG:
{
Motor.Inicializado = Dados[2] == "1";
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
if (AtualizaGrafico)
{
Motor.LogGrafico.Add(new MovSensorimanetoGrafico()
{
Momento = DateTime.Now,
ComponenteID = Motor.ID,
RPM_SP = Motor.RPM_SP,
RPM = Motor.RPM,
Temperatura = Motor.Temperatura,
Sentido = Motor.Sentido,
Velocidade = Motor.VelocidadeInstantanea,
TemperaturaDriver = Motor.TemperaturaDriver,
Tensao = Motor.Tensao,
});
if (Motor.LogGrafico.Count() > LogsManter)
{
Motor.LogGrafico.RemoveAt(0);
}
//frmInstancial.frmAcompanhamento.tmrAtualizacao_Tick();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
public void DefineStatusConexao(string Mod_ID, bool conecatdo)
{
if (Mod_ID == Modulo_ID)
{
Conectado = conecatdo;
//Variaveis.OperacaoEmAndamento.DispMov.AcaoConexao();
}
}
public string GetTaxaAmostragem()
{
return _TaxaAmostragem.ToString("00000");
}
public void SetTaxaAmostragem(int TaxaAmostragem)
{
_TaxaAmostragem = TaxaAmostragem;
}
public bool GetStatusConexao()
{
return Conectado;
}
public void IniciarRegistrador()
{
tmrRegistrador?.Dispose();
tmrRegistrador = new AsyncTaskTimerModel("tmrRegistrador", tmrRegistrador_Tick, 1000);
tmrRegistrador.Start();
}
private async Task tmrRegistrador_Tick()
{
if (UltimaDirecao != Direcao.Parado)
{
TempoEmAtividade++;
double VelocidadeMedia = Motores.Average(x => x.VelocidadeInstantanea * 1000 / 3600);
DistanciaPercorridaTotal += 1 * VelocidadeMedia;
DistanciaPercorridaParcial += (UltimaDirecao == Direcao.Frente ? 1 : UltimaDirecao == Direcao.Tras ? -1 : 0) * VelocidadeMedia;
DistanciaPercorridaOperacao += 1 * VelocidadeMedia;
}
}
public static double CalculaVelocidadeRPM(double RPM)
{
double VelocidadeInstantanea = Math.Round((Math.PI * VariaveisEquipamento.DiametroRoda * 60 * RPM) / 1000, 2); // Km/h
return VelocidadeInstantanea;
}
public static double CalculaRPMVelocidade(double Velocidade)
{
double RPM = Math.Round((Velocidade * 1000) / (Math.PI * VariaveisEquipamento.DiametroRoda * 60), 2);
return RPM;
}
public static double ConverteKmhParaMs(double Velocidade)
{
return Velocidade / 3.6;
}
public async Task LoopRegistrador()
{
}
}
public class MovSensoriamentoMotor
{
public int Canal { get; set; }
public string ID { get; set; }
public string Descricao { get; set; }
// SETs
public string Endereco { get; set; }
public bool Ligado { get; set; } = false;
public bool Freio { get; set; } = false;
public int CodigoAlarme { get; set; } = 0;
public int RPM_SP { get; set; } = 0;
public Sentido Sentido_SP { get; set; } = Sentido.Parado;
public int NumeroPolos { get; set; } = 2;
public int Rampa { get; set;} = 0;
public int RPM_Max { get; set; } = 800;
// GETs
public double RPM { get; set; } = 0;
public Sentido Sentido { get; set; } = Sentido.Parado;
public double Temperatura { get; set; } = 0;
public double TemperaturaDriver { get; set; } = 0;
public double Tensao { get; set; } = 0;
public double Corrente_Max { get; set; } = 0;
public bool Comandar { get; set; } = false;
public bool Alarme { get; set; } = false;
public bool Inicializado { get; set; } = false;
public bool Testando { get; set; } = false;
public double VelocidadeInstantanea { get; set; } = 0;
public double Corrente { get; set; } = 0;
public ConfiguracaoSentidoMotor ConfigSentidos { get; set; }
public List<AlarmeModel> Alarmes { get; set; } = new List<AlarmeModel>();
public List<SensoriamentoMotorTestes> LogTestes { get; set; } = new List<SensoriamentoMotorTestes>();
public List<MovSensorimanetoGrafico> LogGrafico { get; set; } = new List<MovSensorimanetoGrafico>();
public List<FuncoesPinout> Funcoes { get; set; }
public string ProtocoloConfiguracaoMotor(bool Conectar)
{
var _pinout = new PinoutDataModel()
{
ExpansorGPIO = MovimentacaoModel.Pinout.ExpansorGPIO,
EnderecoExpansor = MovimentacaoModel.Pinout.EnderecoExpansor,
Pinos = MovimentacaoModel.Pinout.Pinos.ToList(),
};
_pinout.Pinos = _pinout.Pinos.Where(x => x.ComponenteID == ID).ToList();
string Protocolo =
((int)F_Code.Cfg).ToString() + SerialService.SplitMessage +
ID + SerialService.SplitParams +
(Conectar ? "1" : "0") + SerialService.SplitParams +
Canal.ToString() + SerialService.SplitParams +
Endereco + SerialService.SplitParams +
NumeroPolos + SerialService.SplitParams +
Rampa + SerialService.SplitParams +
RPM_Max + SerialService.SplitParams +
PinoutModel.PinoProtocolo(_pinout, Funcoes); // 29 ~ 51
return Protocolo;
}
public string ProtocoloComando(Direcao DirecaoAtual, bool CmdAlarme = false)
{
if (Comandar && (!Alarme || CmdAlarme))
{
if (!CmdAlarme)
{
MovimentacaoModel.UltimaDirecao = DirecaoAtual;
}
RPM_SP =
DirecaoAtual == Direcao.Parado ? 0 :
CmdAlarme ? 0 :
Variaveis.OperacaoEmAndamento.Controle.RPM_SP;
switch (DirecaoAtual)
{
case Direcao.Frente:
Sentido_SP = ConfigSentidos.Frente;
break;
case Direcao.Tras:
Sentido_SP = ConfigSentidos.Tras;
break;
case Direcao.Esquerda:
Sentido_SP = ConfigSentidos.Esquerda;
break;
case Direcao.Direita:
Sentido_SP = ConfigSentidos.Direita;
break;
case Direcao.Parado:
default:
Sentido_SP = ConfigSentidos.Parado;
break;
}
string ProtocoloMotor = "";
ProtocoloMotor =
((int)F_Code.Cmd).ToString() + SerialService.SplitMessage +
ID + SerialService.SplitParams +
((int)Sentido_SP).ToString() + SerialService.SplitParams +
RPM_SP.ToString() + SerialService.SplitParams +
(Freio ? "1" : "0");
return ProtocoloMotor;
}
return "";
}
public string ProtocoloTeste()
{
if (Comandar)
{
string ProtocoloMotor =
((int)F_Code.Tst).ToString() + SerialService.SplitMessage +
ID;
return ProtocoloMotor;
}
return "";
}
public void AtualizarSensoresMotor(SensorModel Sensor)
{
bool Computar = true;
switch (Sensor.Componente)
{
case S_Code.sTMP:
Temperatura = Sensor.Leituras[0];
break;
case S_Code.sCOR:
Corrente = Sensor.Leituras[0];
Tensao = Sensor.Leituras[1];
break;
default:
Computar = false;
break;
}
if (!Computar)
{
return;
}
AlarmeModel _Alarme = new AlarmeModel()
{
Tipo = Sensor.Componente,
Valor = Sensor.Leituras[0],
Maximo = Sensor.Leituras[0] > Sensor.LimiteMaximo,
Minimo = Sensor.Leituras[0] < Sensor.LimiteMinimo,
ParaMaximo = false,
ParaMinimo = false
};
bool Adicionado = false;
var Alm = Alarmes.FirstOrDefault(x => x.Tipo == _Alarme.Tipo);
if (Alm == null)
{
Alm = _Alarme;
Alarmes.Add(Alm);
Adicionado = true;
}
bool AlarmeAnterior = (Alm.Maximo && Alm.ParaMaximo) || (Alm.Minimo && Alm.ParaMinimo);
bool AlarmeAtual = (_Alarme.Maximo && _Alarme.ParaMaximo) || (_Alarme.Minimo && _Alarme.ParaMinimo);
if (Inicializado && (!AlarmeAnterior || Adicionado) && AlarmeAtual) // Motor iniciado, Não estava em alarme anteriormente ou foi adicionado agora, alarme atual
{
//Variaveis.OperacaoEmAndamento.DispMov.AdicionarMensagemFila(Variaveis.OperacaoEmAndamento.DispMov.Dados.Modulo_ID, ProtocoloComando(Direcao.Frente, true), true, false);
}
Alm.Valor = _Alarme.Valor;
Alm.Maximo = _Alarme.Maximo;
Alm.Minimo = _Alarme.Minimo;
Alarme = Alarmes.Any(x => (x.Maximo && x.ParaMaximo) || (x.Minimo && x.ParaMinimo));
}
}
public class SensoriamentoMotorTestes
{
public DateTime Momento { get; set; }
public string Componente { get; set; }
public bool Sucesso { get; set; }
public string Resultado { get; set; }
public string Comando { get; set; }
public string Leitura { get; set; }
}
public class MovSensorimanetoGrafico
{
public DateTime Momento { get; set; }
public string ComponenteID { get; set; }
public int RPM_SP { get; set; }
public double RPM { get; set; }
public double Temperatura { get; set; }
public double TemperaturaDriver { get; set; }
public Sentido Sentido { get; set; }
public double Velocidade { get; set; }
public double Tensao { get; set; }
}
}

View File

@ -1,5 +1,4 @@
using AgroBase.Forms;
using AgroBase.Services;
using AgroBase.Services;
using System;
using System.Collections.Generic;
using System.Linq;
@ -35,6 +34,9 @@ namespace AgroBase.Models.Modules
public string IP_Bld { get; set; } = "192.168.105.10";
public string IP_Mks { get; set; } = "192.168.105.11";
public static int LogsManter { get; set; } = 60;
public AsyncTaskTimerModel tmrRegistrador;
public List<ModuloMvdModel> Modulos { get; set; } = new List<ModuloMvdModel>();
@ -373,63 +375,65 @@ namespace AgroBase.Models.Modules
public void IniciarRegistrador()
{
Modulos.ForEach(x =>
if (!tmrRegistrador?.IsRunning ?? false)
{
x.MovMotor.Inicializado = false;
x.DirMotor.Inicializado = false;
});
LoopRegistrador().ConfigureAwait(false);
LimparDados(this);
PararRegistrador();
tmrRegistrador = new AsyncTaskTimerModel("tmrRegistrador_" + T_Code.Mvd.ToString(), tmrRegistrador_Tick, _TaxaAmostragem);
tmrRegistrador.Start();
}
}
public async Task LoopRegistrador()
public void PararRegistrador()
{
while (true)
tmrRegistrador?.Dispose();
}
public async Task tmrRegistrador_Tick()
{
tmrRegistrador.SetInterval(_TaxaAmostragem);
if (UltimaDirecao != Direcao.Parado)
{
await Task.Delay(_TaxaAmostragem);
TempoEmAtividade++;
double VelocidadeMedia = Modulos.Where(x => x.Conectado).Average(x => x.MovMotor.VelocidadeInstantanea * _TaxaAmostragem / 3600.0);
DistanciaPercorridaTotal += 1 * VelocidadeMedia;
DistanciaPercorridaParcial += (UltimaDirecao == Direcao.Frente ? 1 : UltimaDirecao == Direcao.Tras ? -1 : 0) * VelocidadeMedia;
DistanciaPercorridaOperacao += 1 * VelocidadeMedia;
Variaveis.OperacaoEmAndamento.Sensoriamento.VelocidadeMedia = VelocidadeMedia;
}
if (Conectado)
DateTime Agora = DateTime.Now;
if (Modulos.Any(x => x.Conectado && x.UltimoProtocoloRecebido.AddMilliseconds(_TaxaAmostragem * 20) < Agora))
{
foreach (var Modulo in Modulos.Where(x => x.Conectado && x.UltimoProtocoloRecebido.AddMilliseconds(_TaxaAmostragem * 20) < Agora))
{
if (UltimaDirecao != Direcao.Parado)
{
TempoEmAtividade++;
double VelocidadeMedia = Modulos.Where(x => x.Conectado).Average(x => x.MovMotor.VelocidadeInstantanea * _TaxaAmostragem / 3600.0);
DistanciaPercorridaTotal += 1 * VelocidadeMedia;
DistanciaPercorridaParcial += (UltimaDirecao == Direcao.Frente ? 1 : UltimaDirecao == Direcao.Tras ? -1 : 0) * VelocidadeMedia;
DistanciaPercorridaOperacao += 1 * VelocidadeMedia;
Variaveis.OperacaoEmAndamento.Sensoriamento.VelocidadeMedia = VelocidadeMedia;
}
DateTime Agora = DateTime.Now;
if (Modulos.Any(x => x.Conectado && x.UltimoProtocoloRecebido.AddMilliseconds(_TaxaAmostragem * 20) < Agora))
{
foreach (var Modulo in Modulos.Where(x => x.Conectado && x.UltimoProtocoloRecebido.AddMilliseconds(_TaxaAmostragem * 20) < Agora))
{
Modulo.MovMotor.Inicializado = false;
Modulo.DirMotor.Inicializado = false;
}
}
/*foreach (var Modulo in Modulos.Where(x => (!x.MovMotor.Inicializado && x.MovMotor.Comandar) || (!x.DirMotor.Inicializado && x.DirMotor.Comandar)))
{
if (!Modulo.MovMotor.Inicializado && Modulo.MovMotor.Comandar)
{
string Protocolo = Modulo.MovMotor.ProtocoloConfiguracao(true);
Variaveis.OperacaoEmAndamento.DispMvd.AdicionarMensagemFila(Modulo.Modulo_ID, Protocolo, true, false);
}
if (!Modulo.DirMotor.Inicializado && Modulo.DirMotor.Comandar)
{
string Protocolo = Modulo.DirMotor.ProtocoloConfiguracao(true);
Variaveis.OperacaoEmAndamento.DispMvd.AdicionarMensagemFila(Modulo.Modulo_ID, Protocolo, true, false);
}
}*/
foreach (var Modulo in Modulos.Where(x => x.RequisitarDados && (x.MovMotor.Inicializado || x.DirMotor.Inicializado)))
{
string Protocolo = Modulo.ProtocoloAquisicaoDados();
Variaveis.OperacaoEmAndamento.DispMvd.AdicionarMensagemFila(Modulo.Modulo_ID, Protocolo, false, false);
}
Modulo.MovMotor.Inicializado = false;
Modulo.DirMotor.Inicializado = false;
}
}
/*foreach (var Modulo in Modulos.Where(x => (!x.MovMotor.Inicializado && x.MovMotor.Comandar) || (!x.DirMotor.Inicializado && x.DirMotor.Comandar)))
{
if (!Modulo.MovMotor.Inicializado && Modulo.MovMotor.Comandar)
{
string Protocolo = Modulo.MovMotor.ProtocoloConfiguracao(true);
Variaveis.OperacaoEmAndamento.DispMvd.AdicionarMensagemFila(Modulo.Modulo_ID, Protocolo, true, false);
}
if (!Modulo.DirMotor.Inicializado && Modulo.DirMotor.Comandar)
{
string Protocolo = Modulo.DirMotor.ProtocoloConfiguracao(true);
Variaveis.OperacaoEmAndamento.DispMvd.AdicionarMensagemFila(Modulo.Modulo_ID, Protocolo, true, false);
}
}*/
foreach (var Modulo in Modulos.Where(x => x.RequisitarDados && (x.MovMotor.Inicializado || x.DirMotor.Inicializado)))
{
string Protocolo = Modulo.ProtocoloAquisicaoDados();
Variaveis.OperacaoEmAndamento.DispMvd.AdicionarMensagemFila(Modulo.Modulo_ID, Protocolo, false, false);
}
}
@ -483,6 +487,7 @@ namespace AgroBase.Models.Modules
}
}
public class ModuloMvdModel
@ -696,7 +701,7 @@ namespace AgroBase.Models.Modules
{
get
{
return MovimentacaoModel.CalculaVelocidadeRPM(RPM_Roda);
return FuncoesMatematicas.CalculaVelocidadeRPM(RPM_Roda);
}
}
@ -1458,7 +1463,7 @@ namespace AgroBase.Models.Modules
int ajuste = anguloSP;
if (anguloSP == -1)
{
double Rpm_Atual = MovimentacaoModel.CalculaRPMVelocidade(Variaveis.OperacaoEmAndamento.Sensoriamento.VelocidadeMedia);
double Rpm_Atual = FuncoesMatematicas.CalculaRPMVelocidade(Variaveis.OperacaoEmAndamento.Sensoriamento.VelocidadeMedia);
// Garante que os valores de RPM sejam válidos
Rpm_Atual = Math.Max(Rpm_Atual, 0);

View File

@ -1,5 +1,4 @@
using AgroBase.Forms;
using AgroBase.Services;
using AgroBase.Services;
using System;
using System.Collections.Generic;
using System.Linq;
@ -25,6 +24,7 @@ namespace AgroBase.Models.Modules
public static int _TaxaAmostragem { get; set; } = 500;
public bool Conectado { get; set; } = false;
public DateTime UltimoProtocoloRecebido { get; set; } = DateTime.MaxValue.AddDays(-1);
public static int LogsManter { get; set; } = 60;
public static PinoutDataModel Pinout { get; set; }
public static bool ExpansorGPIO { get; set; } = false;
@ -53,6 +53,7 @@ namespace AgroBase.Models.Modules
power = LoRaService.CodigosPowers[22],
};
public AsyncTaskTimerModel tmrRegistrador;
public static SensoriamentoModel CarregarParametrosIniciais()
{
@ -439,6 +440,7 @@ namespace AgroBase.Models.Modules
public static void LimparDados(SensoriamentoModel Dados)
{
Dados.Conectado = false;
Dados.UltimoProtocoloRecebido = DateTime.MaxValue.AddDays(-1);
Dados.Reles.ForEach(x =>
{
x.Inicializado = false;
@ -512,7 +514,7 @@ namespace AgroBase.Models.Modules
// Adicionar configurações dos Servos
var servosConfig = Servos
.Where(x => x.Controlar)
.Select(x => x.ProtocoloConfiguracaoFreio(Pinout, Conectar))
.Select(x => x.ProtocoloConfiguracaoServo(Pinout, Conectar))
.ToList();
configDictionary[Modulo_ID].AddRange(servosConfig);
@ -565,6 +567,8 @@ namespace AgroBase.Models.Modules
public void RecebeProtocoloSerial(string Protocolo)
{
UltimoProtocoloRecebido = DateTime.Now;
string Mod_ID = Protocolo.Split(SerialService.SplitMessage[0])[0];
string mensagem = Protocolo.Substring(Mod_ID.Length + 1, Protocolo.Length - Mod_ID.Length - 1);
if (!string.IsNullOrEmpty(Protocolo) && mensagem[0].ToString() == SerialService.BeginSensor)
@ -932,12 +936,58 @@ namespace AgroBase.Models.Modules
public void IniciarRegistrador()
{
if (!tmrRegistrador?.IsRunning ?? false)
{
LimparDados(this);
PararRegistrador();
tmrRegistrador = new AsyncTaskTimerModel("tmrRegistrador_" + T_Code.Sen.ToString(), tmrRegistrador_Tick, _TaxaAmostragem);
tmrRegistrador.Start();
}
}
public async Task LoopRegistrador()
public void PararRegistrador()
{
tmrRegistrador?.Dispose();
}
public async Task tmrRegistrador_Tick()
{
tmrRegistrador.SetInterval(_TaxaAmostragem);
Conectado = UltimoProtocoloRecebido.AddMilliseconds(10 * _TaxaAmostragem) >= DateTime.Now;
foreach (var Sensor in Sensores.Where(x => x.Aferir && !x.Inicializado))
{
string Protocolo = Sensor.ProtocoloConfiguracaoSensor(Pinout, true);
Variaveis.OperacaoEmAndamento.DispSen.AdicionarMensagemFila(Modulo_ID, Protocolo, true, false);
}
foreach (var Sinaleiro in Sinaleiros.Where(x => !x.Inicializado))
{
string Protocolo = Sinaleiro.ProtocoloConfiguracaoSinaleiro(Pinout, true);
Variaveis.OperacaoEmAndamento.DispSen.AdicionarMensagemFila(Modulo_ID, Protocolo, true, false);
}
foreach (var Rele in Reles.Where(x => x.Controlar && !x.Inicializado))
{
string Protocolo = Rele.ProtocoloConfiguracaoRele(Pinout, true);
Variaveis.OperacaoEmAndamento.DispSen.AdicionarMensagemFila(Modulo_ID, Protocolo, true, false);
}
foreach (var Servo in Servos.Where(x => x.Controlar && !x.Inicializado))
{
string Protocolo = Servo.ProtocoloConfiguracaoServo(Pinout, true);
Variaveis.OperacaoEmAndamento.DispSen.AdicionarMensagemFila(Modulo_ID, Protocolo, true, false);
}
if (RequisitarDados)
{
foreach (var Sensor in Sensores.Where(x => x.Aferir && x.Inicializado))
{
RequisitarDadosComponente(Sensor.Componente, Sensor.ID);
}
}
}
public void RequisitarDadosComponente(S_Code Componente, string ID)
@ -1121,7 +1171,7 @@ namespace AgroBase.Models.Modules
public int _AnguloControle { get; set; }
public int _AnguloLeitura { get; set; }
public string ProtocoloConfiguracaoFreio(PinoutDataModel Pinout, bool Conectar)
public string ProtocoloConfiguracaoServo(PinoutDataModel Pinout, bool Conectar)
{
var _pinout = new PinoutDataModel()
{

View File

@ -31,23 +31,32 @@ namespace AgroBase.Models
{
tmrLogs?.Dispose();
tmrLogs = new AsyncTaskTimerModel("tmrLogs", tmrLogs_Tick, 1000);
tmrLogs.Start();
tmrLeituras?.Dispose();
tmrLeituras = new AsyncTaskTimerModel("tmrLeitura", tmrLeituras_Tick, 500, chartGraficos);
tmrLeituras.Start();
}
if (computer == null)
{
computer = new Computer()
if (computer == null)
{
CPUEnabled = true,
GPUEnabled = true,
RAMEnabled = true,
HDDEnabled = true,
};
computer.Open();
computer = new Computer()
{
CPUEnabled = true,
GPUEnabled = true,
RAMEnabled = true,
HDDEnabled = true,
};
try
{
computer.Open();
}
catch (ArgumentOutOfRangeException ex)
{
}
catch (Exception ex)
{
}
}
}
}
@ -230,7 +239,7 @@ namespace AgroBase.Models
bool _operacaoLiberada = _modsConectados;
if (_operacaoLiberada && Variaveis.OperacaoEmAndamento.ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.CameraSolo && x.Mandatorio) && Variaveis.OperacaoEmAndamento.CamerasSolo.Count(x => x.Iniciada) < Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo) _operacaoLiberada = false;
if (_operacaoLiberada && Variaveis.OperacaoEmAndamento.ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Kinect && x.Mandatorio) && (Variaveis.OperacaoEmAndamento.Sensoriamento.SonarFrontal_Kinect == null || !Variaveis.OperacaoEmAndamento.Sensoriamento.SonarFrontal_Kinect.Iniciado)) _operacaoLiberada = false;
if (_operacaoLiberada && Variaveis.OperacaoEmAndamento.ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Kinect && x.Mandatorio) && (!KinectService.Iniciado || KinectService.Leitura == null)) _operacaoLiberada = false;
if (_operacaoLiberada && Variaveis.OperacaoEmAndamento.ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Mapa && x.Mandatorio) && !Variaveis.OperacaoEmAndamento.Mapa.mapaService.Carregado) _operacaoLiberada = false;
if (_operacaoLiberada && Variaveis.OperacaoEmAndamento.ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Joystick && x.Mandatorio && GeneralJoystick.JoystickConectado == null)) _operacaoLiberada = false;
if (_operacaoLiberada && !Variaveis.OperacaoEmAndamento.DispositivosIndividuaisConectados) _operacaoLiberada = false;
@ -468,8 +477,8 @@ namespace AgroBase.Models
public string TempoEstimadoRestante()
{
// Velocidades em RPM
double velocidadeSemErvas = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Max);
double velocidadeComErvas = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Min);
double velocidadeSemErvas = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Max);
double velocidadeComErvas = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Min);
double velocidadeDirecionamento = velocidadeSemErvas * 0.6;
// Conversão de velocidades para m/s
@ -775,6 +784,8 @@ namespace AgroBase.Models
public async Task IniciarOperacao(OperacaoControleModel controle = null, bool DaIHM = true)
{
tmrLogs?.Start();
Iniciado = true;
Simulando = false;
TimestampInicio = DateTime.Now.Ticks;
@ -846,9 +857,6 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.Iniciado = false;
Variaveis.OperacaoEmAndamento.TimestampFim = DateTime.Now.Ticks;
//tmrLogs.Stop();
//tmrParametrizacao.Start();
if (!Variaveis.OperacaoEmAndamento.Simulando)
{
SalvarLogs(false);
@ -857,6 +865,8 @@ namespace AgroBase.Models
AtualizarSinaleiroOperacao();
Variaveis.OperacaoEmAndamento.Finalizando = false;
tmrLogs?.Stop();
}
public async Task RealizarCalibragemInicialAsync()
@ -1677,6 +1687,11 @@ namespace AgroBase.Models
public void AtualizarDadosPerformance()
{
if (computer == null || computer.Hardware == null)
{
return;
}
if (DateTime.Now > UltimaLeituraPerformance.AddSeconds(1))
{
UltimaLeituraPerformance = DateTime.Now;

View File

@ -599,7 +599,7 @@ namespace AgroBase.Models
{
get
{
return DistanciaMedia / MovimentacaoModel.ConverteKmhParaMs(Variaveis.OperacaoEmAndamento.Sensoriamento.VelocidadeMedia);
return DistanciaMedia / FuncoesMatematicas.ConverteKmhParaMs(Variaveis.OperacaoEmAndamento.Sensoriamento.VelocidadeMedia);
}
}
public double DeslocamentoNecessarioDesvio

View File

@ -698,8 +698,10 @@ namespace AgroBase.Models
bitmapRedimensionado.Dispose();
}
private static Bitmap RemoverBordasPretas(Bitmap imagem, Color corBorda)
private static Bitmap RemoverBordasPretas(Bitmap _imagem, Color corBorda)
{
Bitmap imagem = (Bitmap)_imagem.Clone();
int xMin = imagem.Width, xMax = 0, yMin = imagem.Height, yMax = 0;
// Iterar sobre todos os pixels para encontrar os limites da imagem sem bordas com a cor especificada
@ -917,6 +919,23 @@ namespace AgroBase.Models
return valor;
}
public static double CalculaVelocidadeRPM(double RPM)
{
double VelocidadeInstantanea = Math.Round((Math.PI * VariaveisEquipamento.DiametroRoda * 60 * RPM) / 1000, 2); // Km/h
return VelocidadeInstantanea;
}
public static double CalculaRPMVelocidade(double Velocidade)
{
double RPM = Math.Round((Velocidade * 1000) / (Math.PI * VariaveisEquipamento.DiametroRoda * 60), 2);
return RPM;
}
public static double ConverteKmhParaMs(double Velocidade)
{
return Velocidade / 3.6;
}
}
}

View File

@ -189,6 +189,8 @@ namespace AgroBase.Services
public static void IniciarRotinas()
{
PararRotinas();
tmrLoopComandos = new AsyncTaskTimerModel("tmrLoopComandos", tmrLoopComandos_Tick, 100);
tmrLoopComandos.Start();
@ -196,6 +198,13 @@ namespace AgroBase.Services
tmrReceberDados.Start();
}
public static void PararRotinas()
{
tmrLoopComandos?.Dispose();
tmrReceberDados?.Dispose();
}
// Inicializa o serviço Ethernet com IP e porta específicos
public static async Task<bool> InicializarEthernetService(string ipAddress, int port)
{
@ -346,6 +355,11 @@ namespace AgroBase.Services
private static void DefinirDispositivo(List<string> Mod_IDs)
{
if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Bld))
{
IniciarRotinas();
}
foreach (var Mod_ID in Mod_IDs)
{
var Modulo = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == Mod_ID);

View File

@ -1,7 +1,5 @@
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;
@ -12,6 +10,7 @@ using System.Collections.Generic;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AgroBase.Models.Enums;
@ -53,28 +52,32 @@ namespace AgroBase.Comum
public int TempoConectado { get; set; } = 0;
private int _baudRate;
public int BaudRate()
{
if (cmbBaudRate.SelectedIndex < 0)
return _baudRate;
/*if (cmbBaudRate.SelectedIndex < 0)
{
return 0;
}
return Convert.ToInt32(cmbBaudRate.SelectedItem.ToString());
return Convert.ToInt32(cmbBaudRate.SelectedItem.ToString());*/
}
private string _portName;
public string PortaCOM()
{
if (cmbPorta.SelectedIndex < 0)
return _portName;
/*if (cmbPorta.SelectedIndex < 0)
{
return "";
}
return cmbPorta.SelectedItem.ToString();
return cmbPorta.SelectedItem.ToString();*/
}
public string StatusPorta()
{
string _status = _Porta.IsOpen ? "Conectado" : "Desconectado";
frmInstancial.frmPrincipal.lblStripErro.Text = _status;
//frmInstancial.frmPrincipal.lblStripErro.Text = _status;
return _status;
}
@ -83,25 +86,35 @@ namespace AgroBase.Comum
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))
FuncoesGlobais.ExecutarMetodoComVerificacaoCrossThread<bool>(frmInstancial.frmPrincipal, () =>
{
string PortaCom = DispositivosTipo[i].Endereco;
var _Porta = new SerialPort() { PortName = PortaCom, BaudRate = 115200 };
try
if (cmbPorta != null)
{
_Porta.Open();
_Porta.Close();
cmbPorta.Items.Add(PortaCom);
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);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return true;
});
}
if (cmbPorta.InvokeRequired)
FuncoesGlobais.ExecutarMetodoComVerificacaoCrossThread<bool>(frmInstancial.frmPrincipal, () =>
{
cmbPorta.Invoke((MethodInvoker)delegate {
if (cmbPorta != null)
{
if (!DispositivosTipo.Any())
{
cmbPorta.Items.Clear();
@ -111,20 +124,16 @@ namespace AgroBase.Comum
cmbPorta.SelectedIndex = 1;
else if (cmbPorta.Items.Count > 0)
cmbPorta.SelectedIndex = 0;
});
}
else
{
if (!DispositivosTipo.Any())
{
cmbPorta.Items.Clear();
cmbPorta.Text = "";
if (cmbPorta.Text != "")
{
_baudRate = 115200;
_portName = cmbPorta.Text;
}
}
if (cmbPorta.Items.Count > 1)
cmbPorta.SelectedIndex = 1;
else if (cmbPorta.Items.Count > 0)
cmbPorta.SelectedIndex = 0;
}
return true;
});
}
public void AtualizarBauds()
@ -212,7 +221,7 @@ namespace AgroBase.Comum
throw new Exception("A porta " + _Porta.PortName + " não está aberta");
}
AtualizarConsole("> " + DateTime.Now.ToString("HH:mm:ss:fff") + " - " + Dados).ConfigureAwait(false);
AtualizarConsole("> " + DateTime.Now.ToString("HH:mm:ss:fff") + " - " + Dados);
try
{
@ -248,8 +257,6 @@ namespace AgroBase.Comum
{
CarregarParametrosModulos();
Dados.IniciarRegistrador();
((dynamic)Dados).Conectado = false;
frmPin = new frmPinout(Dispositivo);
@ -358,27 +365,7 @@ namespace AgroBase.Comum
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)
if (Dados is SensoriamentoModel senModel && Dispositivo == T_Code.Sen)
{
clbDispositivos.Items.Clear();
var Sensores = senModel.Sensores;
@ -473,7 +460,7 @@ namespace AgroBase.Comum
Size = new System.Drawing.Size() { Height = 141, Width = 300 },
ReadOnly = true
};
tmrLimpeza = new AsyncTaskTimerModel("tmrLimpeza", tmrLimpeza_Tick, 1000, frmInstancial.frmPrincipal);
tmrLimpeza = new AsyncTaskTimerModel("tmrLimpeza_" + Dispositivo.ToString(), tmrLimpeza_Tick, 1000, frmInstancial.frmPrincipal);
Button btnConfig = new Button()
{
@ -613,26 +600,6 @@ namespace AgroBase.Comum
((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)
{
@ -757,6 +724,8 @@ namespace AgroBase.Comum
private void _Porta_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Dados.IniciarRegistrador();
string Recebido = "";
try
{
@ -772,6 +741,7 @@ namespace AgroBase.Comum
}
string mensagem = "";
//Console.WriteLine(Recebido);
if (Recebido.Contains(SerialService.SplitMessage))
{
@ -816,7 +786,7 @@ namespace AgroBase.Comum
});
}
AtualizarConsole("< " + DateTime.Now.ToString("HH:mm:ss:fff") + " - " + Recebido).ConfigureAwait(false);
AtualizarConsole("< " + DateTime.Now.ToString("HH:mm:ss:fff") + " - " + Recebido);
if (mensagem != "" && mensagem[0].ToString() == SerialService.BeginSensor && !EqualityComparer<T>.Default.Equals(Dados, default(T)))
{
@ -826,6 +796,10 @@ namespace AgroBase.Comum
public void btnConectar_Click(object sender, EventArgs e)
{
var dispositivosConexaoInicial = SerialService.DispositivosMapeados
.Where(x => SerialService.DispositivosConexaoInicial.Contains(x.Dispositivo))
.ToList();
var Config = new Dictionary<string, List<string>>();
if (_Porta.IsOpen)
@ -857,8 +831,6 @@ namespace AgroBase.Comum
}
}
}
GeneralJoystick.AtualizaDispositivo();
//tmrConexao.Enabled = true;
}
public void AcaoConexao()
@ -931,20 +903,27 @@ namespace AgroBase.Comum
AtualizarPortas();
}
delegate void AtualizarConsoleDelegate(string Texto);
private async Task AtualizarConsole(string texto)
private void AtualizarConsole(string texto)
{
if (frmInstancial.Fechando)
{
return;
}
texto += Environment.NewLine;
if (txaConsole.InvokeRequired)
{
await Task.Run(() => txaConsole.Invoke(new Action(() => txaConsole.Text += texto)));
}
else
FuncoesGlobais.ExecutarMetodoComVerificacaoCrossThread(txaConsole, () =>
{
if (txaConsole.IsDisposed || txaConsole.Disposing)
{
return false;
}
txaConsole.Text += texto;
}
return true;
});
}
private T CarregarParametros(dynamic empty)
@ -989,20 +968,6 @@ namespace AgroBase.Comum
{
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);

View File

@ -17,24 +17,6 @@ namespace AgroBase.Services
{
switch (tipoDispositivo)
{
case T_Code.Mov:
return new DispositivosService<MovimentacaoModel>
{
Dispositivo = tipoDispositivo,
_Nome = nome,
_Descricao = descricao,
_Porta = porta,
_CriadoEm = DateTime.Now,
};
case T_Code.Dir:
return new DispositivosService<DirecionalModel>
{
Dispositivo = tipoDispositivo,
_Nome = nome,
_Descricao = descricao,
_Porta = porta,
_CriadoEm = DateTime.Now,
};
case T_Code.Sen:
return new DispositivosService<SensoriamentoModel>
{

View File

@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using static AgroBase.Models.Enums;
@ -13,6 +14,7 @@ namespace AgroBase.Services
private static readonly object _lock = new object();
private static int _counter = 1;
private static AsyncTaskTimerModel tmrFila;
private static bool DebugMessages = false;
public static bool Liberado
{
@ -20,18 +22,29 @@ namespace AgroBase.Services
{
lock (_lock)
{
return !MensagensFila.Any(x => !x.Enviado && x.AdicionadoEm.AddSeconds(10) > DateTime.Now);
return MensagensFila == null || !MensagensFila.Any(x => !x.Enviado && x.AdicionadoEm.AddSeconds(10) > DateTime.Now);
}
}
}
public static void Inicializar()
public static void IniciarRotinas()
{
MensagensFila = new List<MensagemFilaModel>();
tmrFila = new AsyncTaskTimerModel("tmrFila", tmrFila_Tick, 10);
lock (_lock)
{
MensagensFila = new List<MensagemFilaModel>();
}
PararRotinas();
tmrFila = new AsyncTaskTimerModel("tmrFila", tmrFila_Tick, 100);
tmrFila.Start();
}
public static void PararRotinas()
{
tmrFila?.Dispose();
}
public static void AdicionarMensagemFila(string Modulo_ID, T_Code Dispositivo, string Mensagem, bool _prioridade, bool _aguardaCallback)
{
lock (_lock)
@ -53,16 +66,27 @@ namespace AgroBase.Services
}
}
private static void MarcarMensagemEnviada(int Id)
public static void MarcarMensagemEnviada(int Id)
{
lock (_lock)
{
var Mensagem = MensagensFila.FirstOrDefault(x => x.Id == Id);
if (Mensagem != null && !Mensagem.Enviado)
{
Console.WriteLine($"Marcando mensagem {Id} como enviada: {Mensagem.Mensagem}");
Mensagem.Enviado = true;
Mensagem.EnviadoEm = DateTime.Now;
try
{
Mensagem.Enviado = true;
Mensagem.EnviadoEm = DateTime.Now;
if (DebugMessages)
{
Console.WriteLine($"Mensagem {Id} marcada como enviada: {Mensagem.Mensagem}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao marcar mensagem como enviada: {ex.Message}");
}
}
}
}
@ -74,40 +98,47 @@ namespace AgroBase.Services
var Mensagem = MensagensFila.FirstOrDefault(x => x.Id == Id);
if (Mensagem != null && !Mensagem.Recebido)
{
Mensagem.Enviado = true;
Mensagem.Recebido = true;
Mensagem.RecebidoEm = DateTime.Now;
Console.WriteLine($"Mensagem {Id} marcada como recebida: {Mensagem.Mensagem}");
try
{
Mensagem.Enviado = true;
Mensagem.Recebido = true;
Mensagem.RecebidoEm = DateTime.Now;
if (DebugMessages)
{
Console.WriteLine($"Mensagem {Id} marcada como recebida: {Mensagem.Mensagem}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao marcar mensagem como recebida: {ex.Message}");
}
}
}
}
private static bool RealizarEnvio(MensagemFilaModel Mensagem)
{
var Dispositivo = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Mensagem.Dispositivo);
if (Dispositivo != null)
try
{
try
{
Dispositivo.EnviarDadosSerial(
SerialService.BeginLine +
Mensagem.Id +
SerialService.SplitMessage +
Mensagem.ID_Modulo +
SerialService.SplitMessage +
Mensagem.Mensagem +
SerialService.EndLine
);
return true;
}
catch (Exception ex)
{
Console.WriteLine("Erro ao enviar mensagem para o dispositivo " + Dispositivo.Dispositivo.ToString() + " - " + ex.Message);
return false;
}
var Dispositivo = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Mensagem.Dispositivo);
if (Dispositivo == null) return false;
Dispositivo.EnviarDadosSerial(
SerialService.BeginLine +
Mensagem.Id +
SerialService.SplitMessage +
Mensagem.ID_Modulo +
SerialService.SplitMessage +
Mensagem.Mensagem +
SerialService.EndLine
);
return true;
}
else
catch (Exception ex)
{
Console.WriteLine($"Erro ao enviar mensagem para o dispositivo {Mensagem.Dispositivo}: {ex.Message}");
return false;
}
}
@ -141,6 +172,19 @@ namespace AgroBase.Services
}
public static async Task tmrFila_Tick()
{
var timeoutCts = new CancellationTokenSource(5000); // Timeout de 5 segundos por tick
try
{
await ExecutarTickAsync(timeoutCts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("Timeout ao executar tmrFila_Tick.");
}
}
private static async Task ExecutarTickAsync(CancellationToken token)
{
RemoverDuplicatas();
@ -149,8 +193,10 @@ namespace AgroBase.Services
var Filas = MensagensFila.Where(x => !x.Enviado).GroupBy(x => x.Dispositivo);
foreach (var Fila in Filas)
{
token.ThrowIfCancellationRequested();
var Dispositivo = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Fila.Key);
if (!Dispositivo._Porta.IsOpen)
if (!Dispositivo?._Porta.IsOpen ?? true)
{
lock (_lock)
{
@ -164,7 +210,10 @@ namespace AgroBase.Services
MensagemFilaModel Mensagem = null;
lock (_lock)
{
Mensagem = MensagensFila.Where(x => x.Dispositivo == Fila.Key).OrderByDescending(x => x.Prioridade).ThenBy(x => x.AdicionadoEm).FirstOrDefault(x => !x.Enviado);
Mensagem = MensagensFila.Where(x => x.Dispositivo == Fila.Key)
.OrderByDescending(x => x.Prioridade)
.ThenBy(x => x.AdicionadoEm)
.FirstOrDefault(x => !x.Enviado);
}
if (Mensagem != null)

View File

@ -1,10 +1,6 @@
using AgroBase.Models;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AgroBase.Models.Enums;

View File

@ -70,12 +70,19 @@ namespace AgroBase.Services
public static bool MostrarGrade { get; set; } = false;
public static bool MostrarTexto { get; set; } = false;
public static void InicializarRotinas()
public static void IniciarRotinas()
{
PararRotinas();
tmrLeitura = new AsyncTaskTimerModel("tmrLeitura", tmrLeitura_Tick, 200);
tmrLeitura.Start();
}
public static void PararRotinas()
{
tmrLeitura?.Dispose();
}
public static bool InicializarKinect(DataGridView dg = null, PictureBox pcRgb = null, PictureBox pcPf = null, TrackBar tkAng = null)
{
gridDados = dg;
@ -177,7 +184,10 @@ namespace AgroBase.Services
{
try
{
kinectSensor.ElevationAngle = Angulo;
if (kinectSensor != null && kinectSensor.IsRunning)
{
kinectSensor.ElevationAngle = Angulo;
}
}
catch (Exception ex)
{
@ -196,6 +206,8 @@ namespace AgroBase.Services
Erro = !Iniciado,
Versao = "1",
});
IniciarRotinas();
}
}
@ -305,9 +317,10 @@ namespace AgroBase.Services
private static async Task tmrLeitura_Tick()
{
tmrLeitura.SetInterval(Iniciado ? 200 : 1000);
bool usoNaoNecessario = !Iniciado || (picRGB == null && !Variaveis.OperacaoEmAndamento.Iniciado);
tmrLeitura.SetInterval(usoNaoNecessario ? 1000 : 200);
if (!Iniciado)
if (usoNaoNecessario)
{
return;
}
@ -329,8 +342,7 @@ namespace AgroBase.Services
AtualizarPictureBoxes();
if (Leitura.DesvioNecessario && Leitura.DirecaoDesvio == Direcao.Parado && Variaveis.OperacaoEmAndamento.DispMvd != null && Variaveis.OperacaoEmAndamento.DispMvd.Dados.Conectado)
if (Parametros.SonarAtivado && Leitura.DesvioNecessario && Leitura.DirecaoDesvio == Direcao.Parado && Variaveis.OperacaoEmAndamento.DispMvd != null && Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.Any(x => x.MovMotor.BLD_Inicializado))
{
GeneralJoystick.EnviaComandoMotor(Keys.Escape, T_Code.Mov);
}
@ -769,6 +781,8 @@ namespace AgroBase.Services
public static void RecalibrarSubdivisoes()
{
Parametros.Subdivisoes.Clear();
CalcularProfundidadeMedia(depthPixels, Parametros.Subdivisoes, Parametros.depthFrameWidth, Parametros.minDepth, Parametros.maxDepth);
}
private static void DesenharTrajetoriaRobo(Graphics g, List<Subdivisao> subdivisoes)

View File

@ -124,9 +124,7 @@ namespace AgroBase.Services
public static List<LoRaProtocoloTransmissaoModel> LeituraDadosOperacao = new List<LoRaProtocoloTransmissaoModel>();
private static AsyncTaskTimerModel tmrEnvio;
private static bool RotinaEnvioIniciada = false;
private static AsyncTaskTimerModel tmrPing;
private static bool RotinaPingsIniciada = false;
public static async Task<bool> VerificaPortaLoRa(SerialPort porta)
@ -135,7 +133,12 @@ namespace AgroBase.Services
porta.BaudRate = 9600;
var comando = ComandoRequisitarParametros();
await AlterarStatusReleModo(Estado.Ligado);
if (!await AlterarStatusReleModo(Estado.Ligado))
{
porta.Close();
return false;
}
if (!EnviarComando(porta, comando))
{
porta.Close();
@ -198,38 +201,42 @@ namespace AgroBase.Services
if (Iniciado)
{
DefinirDispositivo();
if (!RotinaEnvioIniciada)
{
RotinaEnvioIniciada = true;
tmrEnvio?.Dispose();
tmrEnvio = new AsyncTaskTimerModel("tmrEnvio", tmrEnvio_Tick, 500);
tmrEnvio.Start();
}
if (!RotinaPingsIniciada && !Variaveis.IsAgroMonitor)
{
RotinaPingsIniciada = true;
tmrPing?.Dispose();
tmrPing = new AsyncTaskTimerModel("tmrPing", tmrPing_Tick, VariaveisEquipamento.TempoEntrePingsConexao);
tmrEnvio.Start();
}
}
}
private static void DefinirDispositivo()
{
if (Iniciado)
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{
Endereco = _PortaLoRa.PortName,
Dispositivo = T_Code.Lra,
Erro = !Iniciado,
Versao = "220"
});
Endereco = _PortaLoRa.PortName,
Dispositivo = T_Code.Lra,
Erro = !Iniciado,
Versao = "220"
});
IniciarRotinas();
}
public static void IniciarRotinas()
{
PararRotinas();
tmrEnvio = new AsyncTaskTimerModel("tmrEnvio", tmrEnvio_Tick, 500);
tmrEnvio.Start();
if (Variaveis.IsAgroMonitor)
{
tmrPing = new AsyncTaskTimerModel("tmrPing", tmrPing_Tick, VariaveisEquipamento.TempoEntrePingsConexao);
tmrEnvio.Start();
}
}
public static void PararRotinas()
{
tmrEnvio?.Dispose();
tmrPing?.Dispose();
}
private static void PortaLoRa_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (_PortaLoRa.IsOpen)
@ -759,8 +766,8 @@ namespace AgroBase.Services
{
if (Iniciado && !Variaveis.IsAgroMonitor)
{
double velocidadeMax = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Max);
double velocidadeMin = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Min);
double velocidadeMax = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Max);
double velocidadeMin = FuncoesMatematicas.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_Min);
double TemperaturaCampo = WT901CService.Iniciado ? WT901CService.DadosLeitura.Temperatura : 0;
(bool dirOperante, List<string> dirModsFalha) = Variaveis.OperacaoEmAndamento.DispMvd.Dados.StatusModulosMKS(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento);

View File

@ -42,12 +42,21 @@ namespace AgroBase.Services
public static void IniciarRotinas()
{
PararRotinas();
tmrLoopComandos = new AsyncTaskTimerModel("tmrLoopComandos", tmrLoopComandos_Tick, 100);
tmrLoopComandos.Start();
tmrReceberDados = new AsyncTaskTimerModel("tmrReceberDados", tmrReceberDados_Tick, TaxaAmostragem);
tmrReceberDados.Start();
}
public static void PararRotinas()
{
tmrLoopComandos?.Dispose();
tmrReceberDados?.Dispose();
}
// Inicializa o serviço Ethernet com IP e porta específicos
public static async Task<bool> InicializarEthernetService(string ipAddress, int port)
{
@ -153,6 +162,11 @@ namespace AgroBase.Services
private static void DefinirDispositivo(List<string> Mod_IDs)
{
if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Mks))
{
IniciarRotinas();
}
foreach (var Mod_ID in Mod_IDs)
{
var Modulo = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == Mod_ID);

View File

@ -1,5 +1,6 @@
using AgroBase.Forms;
using AgroBase.Models;
using Microsoft.SqlServer.Server;
using System;
using System.Collections.Generic;
using System.IO;
@ -49,12 +50,21 @@ namespace AgroBase.Services
public static void IniciarRotinas()
{
PararRotinas();
tmrLoopComandos = new AsyncTaskTimerModel("tmrLoopComandos", tmrLoopComandos_Tick, 100);
tmrLoopComandos.Start();
tmrReceberDados = new AsyncTaskTimerModel("tmrReceberDados", tmrReceberDados_Tick, TaxaAmostragem);
tmrReceberDados.Start();
}
public static void PararRotinas()
{
tmrLoopComandos?.Dispose();
tmrReceberDados?.Dispose();
}
public static void DefinirPortaCOM(SerialPort Porta)
{
if (!Iniciado)
@ -76,12 +86,16 @@ namespace AgroBase.Services
{
_PortaModbus.Open();
}
IniciarRotinas();
}
public static void LimparDadosPorta()
{
_PortaModbus.Close();
_PortaModbus = null;
PararRotinas();
}
private static void DescartarDadosBuffer()

View File

@ -101,11 +101,7 @@ namespace AgroBase.Services
IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Dispositivo && x._Porta.PortName == Endereco);
if (dispositivoService != null)
{
if (!dispositivoService._Porta.IsOpen)
{
dispositivoService.btnConectar_Click(new object(), new EventArgs());
}
DispositivoConectado = dispositivoService._Porta.IsOpen;
return dispositivoService._Porta != null && dispositivoService._Porta.IsOpen && dispositivoService.Dados.GetStatusConexao();
}
else
{
@ -332,7 +328,7 @@ namespace AgroBase.Services
_Porta.Open();
if (!PortaDispositivoProprio && !Variaveis.OperacaoEmAndamento.DispAtu.Dados.Conectado)
if (!PortaDispositivoProprio && !DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Atu))
{
ProtocoloCheck = Variaveis.OperacaoEmAndamento.DispAtu.Dados.ProtocoloVerificacao(true);
@ -350,7 +346,7 @@ namespace AgroBase.Services
AtualizarConsole("Dispositivo ATU encontrado");
}
}
if (!PortaDispositivoProprio && !Variaveis.OperacaoEmAndamento.DispSen.Dados.Conectado)
if (!PortaDispositivoProprio && !DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Sen))
{
ProtocoloCheck = Variaveis.OperacaoEmAndamento.DispSen.Dados.ProtocoloVerificacao(true);
@ -413,8 +409,18 @@ namespace AgroBase.Services
DispositivosMapeados.Remove(Dispositivo);
}
/*if (DispositivosMapeados.Any(x => DispositivosConexaoInicial.Contains(x.Dispositivo)))
{
FilaService.IniciarRotinas();
}
else
{
FilaService.PararRotinas();
}*/
if (DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Knt) && !KinectService.Iniciado)
{
KinectService.PararRotinas();
DispositivosMapeados.Remove(DispositivosMapeados.First(x => x.Dispositivo == T_Code.Knt));
}
@ -434,11 +440,37 @@ namespace AgroBase.Services
{
VarreduraEmAndamento = false;
VersionamentoService.AtualizarArquivoVersionamento(false).ConfigureAwait(false);
SyncDataService.SincronizarArquivosComServidor().ConfigureAwait(false);
RealizarVerificacaoDeRotina();
}
}
private static void RealizarVerificacaoDeRotina()
{
FuncoesGlobais.SafeExecuteAsync(async () =>
{
try
{
await VersionamentoService.AtualizarArquivoVersionamento(false);
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao atualizar arquivo de versionamento: {ex.Message}");
}
}).ConfigureAwait(false);
FuncoesGlobais.SafeExecuteAsync(async () =>
{
try
{
await SyncDataService.SincronizarArquivosComServidor();
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao sincronizar arquivos com o servidor: {ex.Message}");
}
}).ConfigureAwait(false);
}
private static bool ProcessarRespostaDispositivo(SerialPort Porta)
{
if (Porta.BytesToRead <= 15 || Porta.BytesToRead >= 30)
@ -519,38 +551,24 @@ namespace AgroBase.Services
public static void AtualizarDispositivos()
{
bool PrimeiraExecucao = !Variaveis.DispositivosConectados.Any();
var Portas = SerialPort.GetPortNames().ToList();
DispositivosConexaoInicial.ForEach(Dispositivo =>
{
IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
if (dispositivoService == null)
if (dispositivoService != null)
{
dispositivoService = DispositivosServiceFactory.CreateDispositivoService(
Dispositivo,
"Nome: " + Enum.GetName(typeof(T_Code), Dispositivo),
"Descrição: " + string.Join(", ", DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).Select(x => x.Mod_ID).ToArray()),
new SerialPort()
);
Variaveis.DispositivosConectados.Add(dispositivoService);
dispositivoService.AtualizarPortas();
Control controle = dispositivoService.InstanciarDispositivo(Variaveis.DispositivosConectados.Count - 1);
controle.Location = new System.Drawing.Point(controle.Location.X, controle.Location.Y + (Variaveis.DispositivosConectados.Count * 50));
frmInstancial.frmPrincipal.pnlLateral.Controls.Add(controle);
frmInstancial.frmPrincipal.cmbDispositivos.Items.Add(dispositivoService._Descricao);
}
dispositivoService.AtualizarPortas();
if (dispositivoService.PortaCOM() != "" && !dispositivoService._Porta.IsOpen && (frmInstancial.frmPrincipal.chbConexaoautomatica.Checked || !frmInstancial.DebugMode))
{
dispositivoService.btnConectar_Click(new object(), new EventArgs());
if (
Portas.Contains(dispositivoService.PortaCOM()) &&
(!dispositivoService._Porta.IsOpen || (dispositivoService._Porta.IsOpen && !dispositivoService.Dados.GetStatusConexao()))
)
{
dispositivoService.btnConectar_Click(new object(), new EventArgs());
}
}
});
if (PrimeiraExecucao)
{
Variaveis.OperacaoEmAndamento = OperacaoModel.CarregarParametrosOperacaoPadrao(ModoOperacao.Manual);
}
}
private static async Task<bool> TentarIdentificarDispositivo(SerialPort porta)
@ -906,5 +924,6 @@ namespace AgroBase.Services
}
}
}
}

View File

@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Services
@ -19,6 +20,7 @@ namespace AgroBase.Services
public static Action<double> AtualizarProgresso { get; set; }
public static string ResultadoAtualizacao { get; set; } = "";
public static bool ForcarDownloadArquivos { get; set; } = false;
public static AsyncTaskTimerModel tmrAtualizacaoArquivos;
private static List<VersaoArquivoModel> _ArquivosVersionados { get; set; } = CarregarArquivosVersionadosPadrao();
public static VersaoArquivoModel ArquivoModeloStreetDetector
{
@ -90,6 +92,14 @@ namespace AgroBase.Services
}
}
public static void IniciarRotinas()
{
tmrAtualizacaoArquivos?.Dispose();
tmrAtualizacaoArquivos = new AsyncTaskTimerModel("tmrAtualizarArquivos", tmrAtualizacaoArquivos_Tick, 300);
FuncoesGlobais.SafeExecuteAsync(async () => await AtualizarArquivoVersionamento(true)).ConfigureAwait(false);
}
private static List<VersaoArquivoModel> CarregarArquivosVersionadosPadrao()
{
return new List<VersaoArquivoModel>()
@ -304,6 +314,8 @@ namespace AgroBase.Services
return;
}
tmrAtualizacaoArquivos.Restart();
AtualizandoArquivos = true;
ProgressoAtualizacao = 0.0;
ResultadoAtualizacao = "Verificando atualizações...";
@ -485,5 +497,34 @@ namespace AgroBase.Services
}
}
private static async Task tmrAtualizacaoArquivos_Tick()
{
string progressoStr = AtualizandoArquivos ? $"({ProgressoAtualizacao.ToString("0.00")}%) Atualizando arquivos..." : ResultadoAtualizacao;
int progressoInt = (int)ProgressoAtualizacao;
AtualizarConsole(progressoStr, progressoInt);
if (progressoInt >= 100)
{
tmrAtualizacaoArquivos.Stop();
}
}
private static void AtualizarConsole(string msg, int val)
{
Console.WriteLine(msg);
if (!Variaveis.IsAgroMonitor && frmInstancial.frmPrincipal.Created)
{
frmInstancial.frmPrincipal.Invoke((MethodInvoker)(() =>
{
frmInstancial.frmPrincipal.lblProgressoAtualizacao.Text = msg;
FuncoesGlobais.PreencheValorProgressBar(frmInstancial.frmPrincipal.pgbAtualizacaoArquivos, val);
frmInstancial.frmIHM.lblProgressoAtualizacao.Text = msg;
FuncoesGlobais.PreencheValorProgressBar(frmInstancial.frmIHM.pgbAtualizacaoArquivos, val);
}));
}
}
}
}

View File

@ -92318,3 +92318,30 @@ Parameter name: values
25/11/2024 16:13:52:509 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=False, Parametro=AlarmeCode, Valor=0
25/11/2024 16:13:52:537 - Endereço 3 (192.168.105.10): Resposta inválida. C6
25/11/2024 16:13:52:537 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=False, Parametro=NumPolos, Valor=10
26/11/2024 12:24:51:664 - Endereço 4 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Tensao, Valor=0
26/11/2024 12:24:51:695 - Endereço 1 (192.168.105.10): Resposta inválida. EC
26/11/2024 12:24:51:695 - Endereço 1 (192.168.105.10): Timeout ou erro ao receber resposta. GET=False, Parametro=ControleRS485, Valor=1
26/11/2024 14:09:57:946 - Endereço 1 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=AlarmeCode, Valor=0
26/11/2024 14:10:44:278 - Endereço 2 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Enabled, Valor=0
26/11/2024 14:16:21:832 - Endereço 1 (192.168.105.10): Resposta inválida. BF-A4
26/11/2024 14:16:53:218 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=RPM, Valor=0
26/11/2024 14:17:02:372 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Enabled, Valor=0
26/11/2024 14:17:04:262 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Breaked, Valor=0
26/11/2024 14:17:04:811 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Direction, Valor=0
26/11/2024 14:17:05:314 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Tensao, Valor=0
26/11/2024 14:17:05:682 - Endereço 3 (192.168.105.10): Resposta inválida. 8F-3C
26/11/2024 14:17:05:683 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Temperatura, Valor=0
26/11/2024 16:56:08:372 - Endereço 1 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=RPM, Valor=0
27/11/2024 09:36:38:676 - Endereço 2 (192.168.105.10): Resposta inválida. DF-15
27/11/2024 09:36:38:697 - Endereço 3 (192.168.105.10): Resposta inválida. F2
27/11/2024 09:36:38:698 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Temperatura, Valor=0
27/11/2024 09:36:47:477 - Endereço 3 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Direction, Valor=0
27/11/2024 09:36:47:509 - Endereço 2 (192.168.105.10): Resposta inválida. DF
27/11/2024 09:36:47:509 - Endereço 2 (192.168.105.10): Timeout ou erro ao receber resposta. GET=False, Parametro=ControleRS485, Valor=1
27/11/2024 10:03:36:423 - Endereço 3 (192.168.105.10): Resposta inválida. F2-8F
27/11/2024 10:05:18:954 - Endereço 1 (192.168.105.10): Resposta inválida. A1-4E
27/11/2024 10:05:19:483 - Endereço 4 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Enabled, Valor=0
27/11/2024 10:05:19:984 - Endereço 4 (192.168.105.10): Timeout ou erro ao receber resposta. GET=True, Parametro=Breaked, Valor=0
27/11/2024 10:05:20:187 - Endereço 2 (192.168.105.10): Timeout ou erro ao receber resposta. GET=False, Parametro=ControleRS485, Valor=1
27/11/2024 10:05:20:214 - Endereço 2 (192.168.105.10): Resposta inválida. 23
27/11/2024 10:05:20:215 - Endereço 2 (192.168.105.10): Timeout ou erro ao receber resposta. GET=False, Parametro=AlarmeCode, Valor=0

View File

@ -1 +1 @@
{"Modulo_ID":"Atu","RequisitarDados":false,"Conectado":false,"QuantidadeBicos":4,"DensidadeHerbicida":1.05,"AtuacaoNivelAlto":true,"BicosPulverizadores":[{"ID":"B01","Posicao":1,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0,"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B02","Posicao":2,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0,"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B03","Posicao":3,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0,"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B04","Posicao":4,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0,"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0}],"BombaPressurizadora":{"ID":"BOMBA","BombaAtuada":false,"Ligado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[14,35,36,37,5],"Pressao":0.0,"Potencia":0.0},"Sensores":[{"LogGrafico":[],"ID":"FLXLN","Prioridade":23,"Descricao":"Fluxo na linha principal","Componente":198,"Aferir":true,"DelayAmostragem":300,"Inicializado":false,"Testando":false,"Funcoes":[25],"Parametros":[],"UnidadeMedida":"mL/s","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"MASRS","Prioridade":3,"Descricao":"Massa do reservatório de herbicida","Componente":532,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[22,23],"Parametros":[],"UnidadeMedida":"Kg","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":50.0,"LimiteMinimo":5.0},{"LogGrafico":[],"ID":"PRSLN","Prioridade":3,"Descricao":"Pressão na linha principal","Componente":333,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[24],"Parametros":[["Vmin","000.00"],["Vmax","004.50"],["Pmax","174.04"]],"UnidadeMedida":"psi","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":120.0,"LimiteMinimo":60.0}],"ScriptDeteccaoErvas":"weed_detector-1_0.py","_MassaRef":0.8,"_MassaLeituraRef":40876.37,"_MassaLeituraExtra":1895800.0,"_MassaLeitura":1895800.0,"MassaReservatorio":0.0,"VolumeReservatorio":0.0,"PercentualReservatorio":0.0,"VolumeVazaoAferido":0.0,"_FluxoMlRef":102.0,"_FluxoPulsoRef":80.0,"_LeituraPulsos":0,"_LeituraPeriodo":0,"VazaoFluxoMLpS":0.0,"VolumeVazaoML":0.0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0,"_PressaoVmin":0.0,"_PressaoVmax":4.5,"_PressaoMax":174.045,"_LeituraPressao":0.0,"PressaoLinha":0.0,"PressaoLinhaCalc":0.0}
{"tmrRegistrador":null,"Modulo_ID":"Atu","RequisitarDados":false,"Conectado":false,"UltimoProtocoloRecebido":"9999-12-30T23:59:59.9999999","QuantidadeBicos":4,"DensidadeHerbicida":1.05,"AtuacaoNivelAlto":true,"BicosPulverizadores":[{"ID":"B01","Posicao":1,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0,"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B02","Posicao":2,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0,"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B03","Posicao":3,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0,"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0},{"ID":"B04","Posicao":4,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0,"Atuacoes":0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0}],"BombaPressurizadora":{"ID":"BOMBA","BombaAtuada":false,"Ligado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[14,35,36,37,5],"Pressao":0.0,"Potencia":0.0},"Sensores":[{"LogGrafico":[],"ID":"FLXLN","Prioridade":23,"Descricao":"Fluxo na linha principal","Componente":198,"Aferir":true,"DelayAmostragem":300,"Inicializado":false,"Testando":false,"Funcoes":[25],"Parametros":[],"UnidadeMedida":"mL/s","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"MASRS","Prioridade":3,"Descricao":"Massa do reservatório de herbicida","Componente":532,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[22,23],"Parametros":[],"UnidadeMedida":"Kg","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":50.0,"LimiteMinimo":5.0},{"LogGrafico":[],"ID":"PRSLN","Prioridade":3,"Descricao":"Pressão na linha principal","Componente":333,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[24],"Parametros":[["Vmin","000.00"],["Vmax","004.50"],["Pmax","174.04"]],"UnidadeMedida":"psi","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":120.0,"LimiteMinimo":60.0}],"ScriptDeteccaoErvas":"weed_detector-1_0.py","_MassaRef":0.8,"_MassaLeituraRef":40876.37,"_MassaLeituraExtra":1895800.0,"_MassaLeitura":1895800.0,"MassaReservatorio":0.0,"VolumeReservatorio":0.0,"PercentualReservatorio":0.0,"VolumeVazaoAferido":0.0,"_FluxoMlRef":102.0,"_FluxoPulsoRef":80.0,"_LeituraPulsos":0,"_LeituraPeriodo":0,"VazaoFluxoMLpS":0.0,"VolumeVazaoML":0.0,"InicioAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0,"_PressaoVmin":0.0,"_PressaoVmax":4.5,"_PressaoMax":174.045,"_LeituraPressao":0.0,"PressaoLinha":0.0,"PressaoLinhaCalc":0.0}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"Id":"1517","Name":"22_11_2024_17_15_15","Length":0.0,"Dist1":0.0,"Dist2":0.0},"geometry":{"id":null,"type":"LineString","coordinates":[[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0]]}}]}
{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"Id":"1517","Name":"26_11_2024_12_20_32","Length":0.0,"Dist1":0.0,"Dist2":0.0},"geometry":{"id":null,"type":"LineString","coordinates":[[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0]]}}]}

View File

@ -25,7 +25,7 @@
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style>
#map_de44fd37fbf21ae6dc8f3a06c1c22698 {
#map_fb7fae76b8912b825bfcbacefba64a99 {
position: relative;
width: 100.0%;
height: 100.0%;
@ -39,14 +39,14 @@
<body>
<div class="folium-map" id="map_de44fd37fbf21ae6dc8f3a06c1c22698" ></div>
<div class="folium-map" id="map_fb7fae76b8912b825bfcbacefba64a99" ></div>
</body>
<script>
var map_de44fd37fbf21ae6dc8f3a06c1c22698 = L.map(
"map_de44fd37fbf21ae6dc8f3a06c1c22698",
var map_fb7fae76b8912b825bfcbacefba64a99 = L.map(
"map_fb7fae76b8912b825bfcbacefba64a99",
{
center: [0.0, 0.0],
crs: L.CRS.EPSG3857,
@ -60,13 +60,13 @@
var tile_layer_128bbe7678c39ac9692430482343ca46 = L.tileLayer(
var tile_layer_044fd806725958f2ceba8a29674a1581 = L.tileLayer(
"https://tile.openstreetmap.org/{z}/{x}/{y}.png",
{"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
);
tile_layer_128bbe7678c39ac9692430482343ca46.addTo(map_de44fd37fbf21ae6dc8f3a06c1c22698);
tile_layer_044fd806725958f2ceba8a29674a1581.addTo(map_fb7fae76b8912b825bfcbacefba64a99);
</script>
@ -87,7 +87,7 @@
}
trajeto_json_add({"features": []});
trajeto_json.addTo(map_de44fd37fbf21ae6dc8f3a06c1c22698);
trajeto_json.addTo(map_fb7fae76b8912b825bfcbacefba64a99);
function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria);
@ -145,7 +145,7 @@
var marcadorDinamico = L.marker([0, 0], {
icon: customIcon
}).addTo(map_de44fd37fbf21ae6dc8f3a06c1c22698);
}).addTo(map_fb7fae76b8912b825bfcbacefba64a99);
// Conectar ao broker MQTT
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
@ -183,7 +183,7 @@
marcadorDinamico.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
map_de44fd37fbf21ae6dc8f3a06c1c22698.setView(novaPosicao, map_de44fd37fbf21ae6dc8f3a06c1c22698.getZoom());
map_fb7fae76b8912b825bfcbacefba64a99.setView(novaPosicao, map_fb7fae76b8912b825bfcbacefba64a99.getZoom());
});
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {

View File

@ -25,7 +25,7 @@
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style>
#map_f4618322b26ef6900f1125b33a98b933 {
#map_3a6ee7bba36940e9d499b3e1146ba342 {
position: relative;
width: 100.0%;
height: 100.0%;
@ -39,14 +39,14 @@
<body>
<div class="folium-map" id="map_f4618322b26ef6900f1125b33a98b933" ></div>
<div class="folium-map" id="map_3a6ee7bba36940e9d499b3e1146ba342" ></div>
</body>
<script>
var map_f4618322b26ef6900f1125b33a98b933 = L.map(
"map_f4618322b26ef6900f1125b33a98b933",
var map_3a6ee7bba36940e9d499b3e1146ba342 = L.map(
"map_3a6ee7bba36940e9d499b3e1146ba342",
{
center: [0.0, 0.0],
crs: L.CRS.EPSG3857,
@ -60,13 +60,13 @@
var tile_layer_51e21784728e165fdac4114417c9be97 = L.tileLayer(
var tile_layer_271f980a40f4791484e27c8be9426593 = L.tileLayer(
"https://tile.openstreetmap.org/{z}/{x}/{y}.png",
{"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
);
tile_layer_51e21784728e165fdac4114417c9be97.addTo(map_f4618322b26ef6900f1125b33a98b933);
tile_layer_271f980a40f4791484e27c8be9426593.addTo(map_3a6ee7bba36940e9d499b3e1146ba342);
@ -82,7 +82,7 @@
}*/
});
}
function geo_json_0724bb7f6b75e35871d716caa4a037af_onEachFeature(feature, layer) {
function geo_json_38566299a76c70c481ab3e83d466df2d_onEachFeature(feature, layer) {
layer.on({
click: function(e) {
@ -118,20 +118,20 @@
}*/
});
};
var geo_json_0724bb7f6b75e35871d716caa4a037af = L.geoJson(null, {
onEachFeature: geo_json_0724bb7f6b75e35871d716caa4a037af_onEachFeature,
var geo_json_38566299a76c70c481ab3e83d466df2d = L.geoJson(null, {
onEachFeature: geo_json_38566299a76c70c481ab3e83d466df2d_onEachFeature,
});
function geo_json_0724bb7f6b75e35871d716caa4a037af_add (data) {
geo_json_0724bb7f6b75e35871d716caa4a037af
function geo_json_38566299a76c70c481ab3e83d466df2d_add (data) {
geo_json_38566299a76c70c481ab3e83d466df2d
.addData(data);
}
geo_json_0724bb7f6b75e35871d716caa4a037af_add({"features": [{"geometry": {"coordinates": [[0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]], "id": null, "type": "LineString"}, "id": 0, "properties": {"Dist1": 0.0, "Dist2": 0.0, "Id": "1517", "Length": 0.0, "Name": "22_11_2024_17_15_15"}, "type": "Feature"}], "type": "FeatureCollection"});
geo_json_38566299a76c70c481ab3e83d466df2d_add({"features": [{"geometry": {"coordinates": [[0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0]], "id": null, "type": "LineString"}, "id": 0, "properties": {"Dist1": 0.0, "Dist2": 0.0, "Id": "1517", "Length": 0.0, "Name": "26_11_2024_12_20_32"}, "type": "Feature"}], "type": "FeatureCollection"});
geo_json_0724bb7f6b75e35871d716caa4a037af.addTo(map_f4618322b26ef6900f1125b33a98b933);
geo_json_38566299a76c70c481ab3e83d466df2d.addTo(map_3a6ee7bba36940e9d499b3e1146ba342);
</script>
@ -152,7 +152,7 @@
}
trajeto_json_add({"features": []});
trajeto_json.addTo(map_f4618322b26ef6900f1125b33a98b933);
trajeto_json.addTo(map_3a6ee7bba36940e9d499b3e1146ba342);
function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria);
@ -210,7 +210,7 @@
}
trajeto_dinamico_json_add({"features": []});
trajeto_dinamico_json.addTo(map_f4618322b26ef6900f1125b33a98b933);
trajeto_dinamico_json.addTo(map_3a6ee7bba36940e9d499b3e1146ba342);
function adicionarGeometriaDinamica(novaGeometria) {
trajeto_dinamico_json.addData(novaGeometria);
@ -263,9 +263,9 @@
var marcadorEquipamento = L.marker([0, 0], {
icon: customIcon
}).addTo(map_f4618322b26ef6900f1125b33a98b933);
}).addTo(map_3a6ee7bba36940e9d499b3e1146ba342);
var marcadorBase = L.marker([0, 0], {}).addTo(map_f4618322b26ef6900f1125b33a98b933);
var marcadorBase = L.marker([0, 0], {}).addTo(map_3a6ee7bba36940e9d499b3e1146ba342);
var icon = L.AwesomeMarkers.icon(
{"extraClasses": "fa-rotate-0", "icon": "info-sign", "iconColor": "white", "markerColor": "red", "prefix": "glyphicon"}
);
@ -347,7 +347,7 @@
}
if (foco) {
map_f4618322b26ef6900f1125b33a98b933.setView(novaPosicao, map_f4618322b26ef6900f1125b33a98b933.getZoom());
map_3a6ee7bba36940e9d499b3e1146ba342.setView(novaPosicao, map_3a6ee7bba36940e9d499b3e1146ba342.getZoom());
}
}
@ -364,7 +364,7 @@
function atualizarSelecaoRuas(selecionadas) {
selecionadas = JSON.parse(selecionadas);
RuasSelecionadas = Array.isArray(selecionadas) ? [...selecionadas] : [];
geo_json_0724bb7f6b75e35871d716caa4a037af.eachLayer(function (layer) {
geo_json_38566299a76c70c481ab3e83d466df2d.eachLayer(function (layer) {
if (RuasSelecionadas.includes(parseInt(layer.feature.id))) {
layer.setStyle({ color: 'blue' });
} else {

View File

@ -1 +1 @@
afe56ee07a44e7bdf0ff34262548be78816ffa76793d188967eb564a704ab6d0
6f15a8df374baad6de514ad6cb80ffc96b3aa44597c56799d518e1cfd400d9aa

View File

@ -24,14 +24,22 @@ namespace OpenHardwareMonitor.Hardware.CPU {
List<CPUID> threads = new List<CPUID>();
for (int i = 0; i < ThreadAffinity.ProcessorGroupCount; i++) {
for (int j = 0; j < 64; j++) {
int processorsPerGroup = Math.Min(64, Environment.ProcessorCount / ThreadAffinity.ProcessorGroupCount);
for (int j = 0; j < processorsPerGroup; j++) {
try {
// Validar a afinidade antes de continuar
if (!ThreadAffinity.IsValid(GroupAffinity.Single((ushort)i, j)))
continue;
// Obter o CPUID
var cpuid = CPUID.Get(i, j);
if (cpuid != null)
threads.Add(cpuid);
} catch (ArgumentOutOfRangeException) {
} catch (OverflowException ex) {
Console.WriteLine($"Erro de overflow em i={i}, j={j}: {ex.Message}");
continue;
} catch (ArgumentOutOfRangeException) {
// Ignorar erros de faixa
continue;
}
}
}

View File

@ -94,7 +94,15 @@ namespace OpenHardwareMonitor.Hardware {
Add(new Mainboard.MainboardGroup(smbios, settings));
if (cpuEnabled)
Add(new CPU.CPUGroup(settings));
try {
Add(new CPU.CPUGroup(settings));
} catch (OverflowException ex) {
Console.WriteLine($"Erro ao criar CPUGroup: {ex.Message}");
// Trate o erro, por exemplo, ignore a entrada ou registre um log.
} catch (Exception ex) {
Console.WriteLine($"Erro inesperado: {ex.Message}");
// Tratar outras exceções que possam ocorrer.
}
if (ramEnabled)
Add(new RAM.RAMGroup(smbios, settings));

View File

@ -0,0 +1,5 @@
{
"files.associations": {
"cstddef": "cpp"
}
}

View File

@ -0,0 +1,72 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#ifndef ReleModel
#define ReleModel
class Rele {
public:
Rele(String _modID, String _id, int _taxaAmostragem = 2000) {
Mod_ID = _modID;
_ID = _id;
}
String Mod_ID;
String _ID;
PinoModel _pino;
bool Iniciado = false;
Estado _Status = Desligado;
void Inicializar() {
if (Iniciado) {
//EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
if (_pino.Definido()) {
_pino.Conectar(false);
Iniciado = true;
}
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void Desligar() {
if (!Iniciado) {
//EnviarDadosSerial(_ID + " nao esta inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
// Redefinir as configurações para os valores iniciais
_pino.Desconectar();
//EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void AtualizarStatus(Estado novoEstado) {
bool status = novoEstado == Ligado;
_pino.set(status);
_Status = (Estado)_pino.get();
}
void AtualizarLeitura() {
_Status = (Estado)_pino.get();
}
void RequisitarDados() {
AtualizarLeitura();
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sRLE, _ID, MontarDadosProtocoloRele(Iniciado, _Status)));
}
};
#endif

View File

@ -0,0 +1,95 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#include <Adafruit_INA219.h>
#ifndef SensorCorrenteModel
#define SensorCorrenteModel
class SensorCorrente {
public:
SensorCorrente(String _modID, String _id) {
Mod_ID = _modID;
_ID = _id;
}
// Variáveis
Adafruit_INA219 sINA219;
// Definições
String Mod_ID = "";
String _ID;
S_Code _componente = sCOR;
byte _Endereco;
double _A_Shunt;
bool Iniciado = false;
float busVoltage = 0;
float shuntVoltage = 0;
float current = 0;
float power = 0;
void Inicializar() {
if (Iniciado) {
//EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
if (_Endereco > 0x00) {
Wire.beginTransmission(_Endereco);
byte error = Wire.endTransmission();
if (error == 0) {
sINA219 = Adafruit_INA219(_Endereco);
Iniciado = sINA219.begin();
if (Iniciado) {
if (_A_Shunt == 3.2) {
sINA219.setCalibration_32V_2A();
}
else if (_A_Shunt == 50) {
sINA219.setCalibration_50A_75mV();
}
else if (_A_Shunt == 100) {
sINA219.setCalibration_100A_75mV();
}
}
}
else {
Iniciado = false;
EnviarDadosSerial(Mod_ID, _ID + " nao iniciado, endereco " + _Endereco + " nao encontrado!");
}
}
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void Desligar() {
if (!Iniciado) {
//EnviarDadosSerial(_ID + " nao esta inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
//EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void AferirCorrente() {
busVoltage = sINA219.getBusVoltage_V();
shuntVoltage = sINA219.getShuntVoltage_mV();
current = sINA219.getCurrent_mA();
power = sINA219.getPower_mW();
}
void RequisitarDados() {
AferirCorrente();
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCOR, _ID, MontarDadosProtocoloINA226(busVoltage, shuntVoltage, current, power)));
}
};
#endif

View File

@ -0,0 +1,143 @@
#include "SerialService.h"
#include "Pinout.h"
#ifndef SensorFluxoModel
#define SensorFluxoModel
class SensorFluxo {
public:
SensorFluxo(String _modID, String _id) {
Mod_ID = _modID;
_ID = _id;
}
// Definições
String Mod_ID = "";
String _ID;
S_Code _componente = sFLX;
PinoModel _pino;
int _TaxaAmostragem = 2000;
int _delayAmostragem;
int _prioridade;
float _calibragem;
bool Iniciado = false;
bool Checando = false;
// Consumo
volatile int ultimaLeitura = 0;
volatile unsigned int tempoAnterior = 0;
volatile int _Pulsos = 0;
volatile long _PeriodoTotal = 0;
volatile float _Fluxo = 0;
void Inicializar() {
if (Iniciado) {
//EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
_pino.Conectar();
ultimaLeitura = _pino.get();
tempoAnterior = 0;
_Pulsos = 0;
_PeriodoTotal = 0;
_Fluxo = 0;
if (SFTaskHandle == NULL) {
xTaskCreatePinnedToCore(&SensorFluxo::SFTaskWrapper, "SFTask", 10000, this, _prioridade, &SFTaskHandle, tskNO_AFFINITY);
}
//EnviarDadosSerial(_ID + " Iniciado");
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void Desligar() {
if (!Iniciado) {
//EnviarDadosSerial(_ID + " nao esta inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
// Parar a execução das tarefas
vTaskDelete(SFTaskHandle);
SFTaskHandle = NULL;
delay(50); // Aguarda um tempo para garantir o desligamento da tarefa
// Redefinir as configurações para os valores iniciais
_pino.Desconectar();
//EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
private:
TaskHandle_t SFTaskHandle = NULL;
static void SFTaskWrapper(void *pvParameters) {
SensorFluxo *sensor = static_cast<SensorFluxo*>(pvParameters);
sensor->SFTask();
}
void SFTask() {
unsigned long firstMilis = millis();
volatile int pulsosA = 0;
volatile float periodo = 0;
while (1)
{
if (!Iniciado) {
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
vTaskDelay(pdMS_TO_TICKS(1000));
continue;
}
bool Leitura = _pino.get() == 1;
if (Leitura != ultimaLeitura) {
ultimaLeitura = Leitura;
_Pulsos++;
// Calcular o período em microssegundos
unsigned long tempoAtual = micros();
unsigned long periodoUs = _Pulsos == 1 ? 0 : (tempoAtual - tempoAnterior);
periodo = periodoUs / 1000.0; // Converte de us para ms (2300 us para 2,3 ms)
_PeriodoTotal += periodo;
//CalcularFluxo(periodo);
tempoAnterior = tempoAtual;
}
long intMillis = (millis() - firstMilis);
int Tempo = _TaxaAmostragem + _delayAmostragem;
// A cada _TaxaAmostragem, enviar os dados para o software
if (intMillis >= Tempo) {
if (_Pulsos == pulsosA) {
_PeriodoTotal = 0;
_Pulsos = 0;
}
//EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sFLX, _ID, MontarDadosProtocoloFluxo(pulsos, periodoTotal)));
pulsosA = _Pulsos;
firstMilis = millis();
}
// Aguarda metade do menor período possível entre leituras
vTaskDelay(pdMS_TO_TICKS(1));
}
}
};
#endif

View File

@ -0,0 +1,71 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#include <MechaQMC5883.h>
#ifndef SensorMagnetometroModel
#define SensorMagnetometroModel
class SensorMagnetometro {
public:
SensorMagnetometro(String _modID, String _id, int _taxaAmostragem = 2000) {
Mod_ID = _modID;
_ID = _id;
}
// Variáveis
MechaQMC5883* qmc = new MechaQMC5883();
// Definições
String Mod_ID;
String _ID;
S_Code _componente = sMAG;
byte _Endereco;
bool Iniciado = false;
void Inicializar() {
if (Iniciado) {
//EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
qmc.init();
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void Desligar() {
if (!Iniciado) {
//EnviarDadosSerial(_ID + " nao esta inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
//EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void AferirOrientacao() {
int x, y, z;
float orientacao;
qmc.read(&x, &y, &z,&orientacao);
}
void RequisitarDados() {
AferirOrientacao();
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sMAG, _ID, MontarDadosProtocoloMagnetometro(x, y, z, orientacao)));
}
};
#endif

View File

@ -0,0 +1,67 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#ifndef SensorNivelModel
#define SensorNivelModel
class SensorNivel {
public:
SensorNivel(String _modID, String _id, int _taxaAmostragem = 2000) {
Mod_ID = _modID;
_ID = _id;
_TaxaAmostragem = _taxaAmostragem;
}
// Definições
String Mod_ID = "";
String _ID;
S_Code _componente = sNVL;
PinoModel _pino;
int _TaxaAmostragem = 0;
double leitura = 0;
bool Iniciado = false;
bool Checando = false;
void Inicializar() {
if (Iniciado) {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "1"));
return;
}
leitura = 0;
_pino.Conectar(); // Conecta o pino antes de criar a tarefa
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "1"));
}
void Desligar() {
if (!Iniciado) {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "0"));
return;
}
_pino.Desconectar(); // Desconecta o pino
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "0"));
}
void AferirNivel() {
leitura = _pino.get();
}
void RequisitarDados() {
AferirNivel();
//EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sNVL, _ID, MontarDadosProtocoloPressao(Iniciado, leitura)));
}
};
#endif

View File

@ -0,0 +1,66 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#ifndef SensorPressaoModel
#define SensorPressaoModel
class SensorPressao {
public:
SensorPressao(String _modID, String _id) {
Mod_ID = _modID;
_ID = _id;
}
// Definições
String Mod_ID = "";
String _ID;
S_Code _componente = sPRS;
PinoModel _pino;
double leitura = 0;
bool Iniciado = false;
bool Checando = false;
void Inicializar() {
if (Iniciado) {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "1"));
return;
}
leitura = 0;
_pino.Conectar(); // Conecta o pino antes de criar a tarefa
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "1"));
}
void Desligar() {
if (!Iniciado) {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "0"));
return;
}
_pino.Desconectar(); // Desconecta o pino
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "0"));
}
void AferirPressao() {
leitura = _pino.get();
}
void RequisitarDados() {
AferirPressao();
//EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sPRS, _ID, MontarDadosProtocoloPressao(Iniciado, leitura)));
}
};
#endif

View File

@ -0,0 +1,204 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#ifndef SensorSonarModel
#define SensorSonarModel
class SensorSonar {
public:
SensorSonar(String _modID, String _id) {
Mod_ID = _modID;
_ID = _id;
}
// Definições
String Mod_ID;
String _ID;
S_Code _componente = sSNR;
PinoModel _pinoE;
PinoModel _pinoT;
PinoModel _pinoServoX;
PinoModel _pinoServoY;
int _delayAmostragem;
int _prioridade;
Servo _ServoX;
Servo _ServoY;
int _AgPlus;
int _AgPosition;
bool Iniciado = false;
long _distancia = 0;
long _angulo = 0;
int _posicao = 0;
void Inicializar() {
if (Iniciado) {
//EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
_pinoE.Conectar();
_pinoT.Conectar();
if (_pinoServoX.Definido()) {
_ServoX.attach(_pinoServoX.num);
_ServoX.write(0);
}
if (_pinoServoY.Definido()) {
_ServoY.attach(_pinoServoY.num);
_ServoY.write(0);
}
xTaskCreatePinnedToCore(&SensorSonar::SSTaskWrapper, "SSTask", 5000, this, _prioridade, &SSTaskHandle, tskNO_AFFINITY);
//EnviarDadosSerial(_ID + " Iniciado");
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void Desligar() {
if (!Iniciado) {
//EnviarDadosSerial(_ID + " nao esta inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
// Parar a execução das tarefas
vTaskDelete(SSTaskHandle);
if (_pinoServoX.Definido()) {
_ServoX.detach();
}
if (_pinoServoY.Definido()) {
_ServoY.detach();
}
// Redefinir as configurações para os valores iniciais
_pinoE.Desconectar();
_pinoT.Desconectar();
//EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void RequisitarDados() {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sSNR, _ID, MontarDadosProtocoloSonar(_distancia, _angulo, _posicao)));
}
private:
TaskHandle_t SSTaskHandle = NULL;
static void SSTaskWrapper(void *pvParameters) {
SensorSonar *sensor = static_cast<SensorSonar*>(pvParameters);
sensor->SSTask();
}
/*int idx = 0;
int distancias[36];
int angulos[36];*/
void SSTask() {
bool Horario = true;
bool Subindo = true;
int position = 0;
unsigned long firstMilis = millis();
while (1)
{
if (!Iniciado) {
// Caso não esteja conectado, aguarda 1 segundo até a próxima verificação, liberando uso de CPU
vTaskDelay(1000);
continue;
}
if (Subindo) {
for (position = 0; position < 2; position++) {
position = 1; // REMOVER
_ServoY.write(position * _AgPosition); // Move o servo para o ângulo desejado
//vTaskDelay(100); // Espera meio segundo para o servo se mover
if (Horario) {
for(int angle = 0; angle <= 180; angle += _AgPlus) { // Move o servo de 0 a 180 graus
LeituraSonar(angle, position);
}
Horario = false;
}
else {
for(int angle = 180; angle > 0; angle -= _AgPlus) { // Move o servo de 0 a 180 graus
LeituraSonar(angle, position);
}
Horario = true;
}
}
Subindo = false;
}
else {
for (position = 2; position > 0; position--) {
position = 1; // REMOVER
_ServoY.write(position * _AgPosition); // Move o servo para o ângulo desejado
//vTaskDelay(100); // Espera meio segundo para o servo se mover
if (Horario) {
for(int angle = 0; angle <= 180; angle += _AgPlus) { // Move o servo de 0 a 180 graus
LeituraSonar(angle, position);
}
Horario = false;
}
else {
for(int angle = 180; angle > 0; angle -= _AgPlus) { // Move o servo de 0 a 180 graus
LeituraSonar(angle, position);
}
Horario = true;
}
}
Subindo = true;
}
}
}
void LeituraSonar(int angle, int position) {
long duration, distance;
for (int i = 0; i < 3; i++) {
_pinoT.set(false);
delayMicroseconds(2);
_pinoT.set(true);
delayMicroseconds(10);
_pinoT.set(false);
duration = pulseIn(_pinoE.num, HIGH);
distance = (duration / 2) / 29.1; // Calcula a distância em centímetros
if (distance > 10) {
break;
}
}
/*angulos[idx] = angle;
distancias[idx] = distance;
idx++;*/
_ServoX.write(angle); // Move o servo para o ângulo desejado
vTaskDelay(30); // Espera meio segundo para o servo se mover
_distancia = distance;
_angulo = angle;
_posicao = position;
RequisitarDados();
/*if (idx >= 35) {
EnviarDadosSerial(MontarProtocoloSensor(sSNR, _ID, MontarDadosProtocoloSonarM(distancias, angulos, position)));
idx = 0;
}*/
}
};
#endif

View File

@ -0,0 +1,67 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#ifndef SensorTemperaturaModel
#define SensorTemperaturaModel
class SensorTemperatura {
public:
SensorTemperatura(String _modID, String _id) {
Mod_ID = _modID;
_ID = _id;
}
// Definições
String Mod_ID = "";
String _ID;
S_Code _componente = sTMP;
PinoModel _pino;
double leitura = 0;
bool Iniciado = false;
bool Checando = false;
void Inicializar() {
if (Iniciado) {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "1"));
return;
}
leitura = 0;
_pino.Conectar(); // Conecta o pino antes de criar a tarefa
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "1"));
}
void Desligar() {
if (!Iniciado) {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "0"));
return;
}
_pino.Desconectar(); // Desconecta o pino
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "0"));
}
void AferirTemperatura() {
leitura = _pino.get();
}
void RequisitarDados() {
AferirTemperatura();
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sTMP, _ID, MontarDadosProtocoloTemperatura(Iniciado, leitura)));
}
};
#endif

View File

@ -0,0 +1,85 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#ifndef SensorUltrassomModel
#define SensorUltrassomModel
class SensorUltrassom {
public:
SensorUltrassom(String _modID, String _id) {
Mod_ID = _modID;
_ID = _id;
}
// Variáveis
#define SOUND_SPEED 0.034
long duration = 0;
float distanceCm = 0;
// Definições
String Mod_ID;
String _ID;
S_Code _componente = sULT;
PinoModel _pinoE;
PinoModel _pinoT;
bool Iniciado = false;
void Inicializar() {
if (Iniciado) {
//EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
_pinoE.Conectar();
_pinoT.Conectar();
//EnviarDadosSerial(_ID + " Iniciado");
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void Desligar() {
if (!Iniciado) {
//EnviarDadosSerial(_ID + " nao esta inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
// Redefinir as configurações para os valores iniciais
_pinoE.Desconectar();
_pinoT.Desconectar();
//EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void AferirDistancia() {
_pinoT.set(false);
delayMicroseconds(2);
_pinoT.set(true);
delayMicroseconds(10);
_pinoT.set(false);
duration = pulseIn(_pinoE.num, HIGH);
distanceCm = duration * SOUND_SPEED / 2;
}
void RequisitarDados() {
AferirDistancia();
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sULT, _ID, MontarDadosProtocoloUltrassom(distanceCm, duration)));
}
};
#endif

View File

@ -4,11 +4,15 @@
#ifndef SerialService
#define SerialService
bool DebugMode = true;
const char BeginLine = '@';
const char EndLine = '$';
const char BeginSensor = '#';
const char* SplitMessage = ";";
const char* SplitParams = ",";
const char* SplitConfig = "*";
const char* SplitSubParams = "~";
const int MAX_PROTOCOLS = 20;
class ProtocoloSerial {
@ -71,6 +75,16 @@ std::vector<ProtocoloSerial> LerBufferSerialFila(String Mod_ID) {
return protocolos;
}
void PrintTela(String msg, bool ln = true) {
if (Serial && DebugMode) {
if (ln) {
Serial.println(msg);
}
else {
Serial.print(msg);
}
}
}
void EnviarDadosSerial(String Mod_ID, String Mensagem) {
@ -366,4 +380,11 @@ String MontarDadosProtocoloFreio(bool Iniciado, int Angulo) {
return Protocolo;
}
String MontarDadosProtocoloTemperatura(bool Iniciado, float temperatura) {
String Protocolo = (String)"" +
(Iniciado ? "1" : "0") + SplitMessage +
(String)temperatura;
return Protocolo;
}
#endif

View File

@ -0,0 +1,77 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#include <ESP32Servo.h>
#ifndef ServoFreioModel
#define ServoFreioModel
class ServoFreio {
public:
ServoFreio(String _modID, String _id) {
Mod_ID = _modID;
_ID = _id;
}
String Mod_ID;
String _ID;
PinoModel _pino;
bool Incremental = true;
bool Iniciado = false;
int _Angulo = 0;
Servo _Servo;
void Inicializar() {
if (Iniciado) {
//EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
if (_pino.Definido()) {
_Servo.attach(_pino.num);
_Servo.write(Incremental ? 0 : 180);
}
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void Desligar() {
if (!Iniciado) {
//EnviarDadosSerial(_ID + " nao esta inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
// Redefinir as configurações para os valores iniciais
if (_pino.Definido()) {
_Servo.detach();
}
//EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void AtualizarAngulo(int novoAngulo) {
_Angulo = novoAngulo;
_Servo.write(_Angulo);
}
void RequisitarDados() {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sFRO, _ID, MontarDadosProtocoloFreio(Iniciado, _Angulo)));
}
};
#endif

View File

@ -0,0 +1,124 @@
#include "SerialService.h"
#include "Pinout.h"
#include "Utils.h"
#ifndef SinaleiroModel
#define SinaleiroModel
class Sinaleiro {
public:
Sinaleiro(String _modID, String _id, int _taxaAmostragem = 2000) {
Mod_ID = _modID;
_ID = _id;
}
String Mod_ID;
String _ID;
PinoModel _pino;
bool Iniciado = false;
StatusLED _Status = Apagado;
StatusLED _StatusLeitura = Apagado;
int _Qtd = 0;
int _TempoMs = 0;
int _PausaMs = 0;
void Inicializar() {
if (Iniciado) {
//EnviarDadosSerial(_ID + " ja inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
_pino.Conectar(false);
xTaskCreatePinnedToCore(&Sinaleiro::LEDTaskWrapper, "LEDTask", 5000, this, 6, &LEDTaskHandle, tskNO_AFFINITY);
//EnviarDadosSerial(_ID + " Iniciado");
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void Desligar() {
if (!Iniciado) {
//EnviarDadosSerial(_ID + " nao esta inicializado");
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
return;
}
// Parar a execução das tarefas
vTaskDelete(LEDTaskHandle);
// Redefinir as configurações para os valores iniciais
_pino.Desconectar();
//EnviarDadosSerial(_ID + " Desligado");
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, Iniciado ? "1" : "0"));
}
void AtualizarLeitura() {
_StatusLeitura = (StatusLED)_pino.get();
}
void RequisitarDados() {
AtualizarLeitura();
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sLED, _ID, MontarDadosProtocoloLED(Iniciado, _StatusLeitura)));
}
private:
TaskHandle_t LEDTaskHandle = NULL;
static void LEDTaskWrapper(void *pvParameters) {
Sinaleiro *led = static_cast<Sinaleiro*>(pvParameters);
led->LEDTask();
}
void LEDTask() {
unsigned long lastMillis = millis();
bool ledState = false;
int piscadasAtual = 0;
bool emPausa = false;
while (1) {
unsigned long currentMillis = millis();
if (_Status != Piscando) {
_pino.set(_Status == Aceso);
_StatusLeitura = (StatusLED)_pino.get();
}
else if (_Status == Piscando && piscadasAtual < _Qtd) {
if (!emPausa && (currentMillis - lastMillis >= _TempoMs)) {
ledState = !ledState;
_pino.set(ledState);
lastMillis = currentMillis;
if (!ledState) { // Se o LED acabou de ser desligado, incrementa o contador de piscadas
piscadasAtual++;
}
} else if (emPausa && (currentMillis - lastMillis >= _PausaMs)) {
emPausa = false;
lastMillis = currentMillis;
}
} else if (piscadasAtual >= _Qtd) {
// Se alcançou a quantidade desejada de piscadas, entra em pausa
if (!emPausa) {
ledState = false;
_pino.set(false); // Garante que o LED está desligado
emPausa = true;
piscadasAtual = 0; // Reseta o contador de piscadas
lastMillis = currentMillis;
}
}
vTaskDelay(1); // Pequena pausa para liberar o CPU
}
}
};
#endif

View File

@ -0,0 +1,85 @@
#include "SerialService.h"
#include "Pinout.h"
#ifndef SolenoideModel
#define SolenoideModel
bool AtuacaoNivelAlto = true;
class Solenoide {
public:
// Construtor
Solenoide(String _modID, String _id) {
Mod_ID = _modID;
_ID = _id;
}
// Definições
String Mod_ID = "";
String _ID;
PinoModel _pinoSolenoide;
Estado _Status = Desligado;
bool Iniciado = false;
bool Testando = false;
// Consumo
bool StatusSolenoide;
// Entrada de dados
bool _SolenoideAtuada = !AtuacaoNivelAlto;
void Inicializar() {
if (Iniciado) {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "1"));
return;
}
// Define o estado inicial da solenoide
_SolenoideAtuada = !AtuacaoNivelAlto;
// Conecta o pino da solenoide com o estado inicial configurado
_pinoSolenoide.Conectar(_SolenoideAtuada);
// Atualiza o status da solenoide para refletir o estado inicial
StatusSolenoide = _pinoSolenoide.get() == (AtuacaoNivelAlto ? 1 : 0);
Iniciado = true;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "1"));
}
void Desligar() {
if (!Iniciado) {
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "0"));
return;
}
// Desconecta o pino da solenoide
_pinoSolenoide.Desconectar();
delay(50); // Pequeno delay para garantir a liberação do pino
Iniciado = false;
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, _ID, "0"));
}
void AlterarStatusSolenoide(bool status) {
_SolenoideAtuada = status;
_pinoSolenoide.set(_SolenoideAtuada);
StatusSolenoide = _pinoSolenoide.get() == (AtuacaoNivelAlto ? 1 : 0);
}
void AtualizarLeitura() {
_Status = (Estado)_pinoSolenoide.get();
}
void RequisitarDados() {
AtualizarLeitura();
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sRLE, _ID, MontarDadosProtocoloRele(Iniciado, _Status)));
}
};
#endif

View File

@ -0,0 +1,8 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
"version": "0.2.0",
"configurations": [
]
}

View File

@ -0,0 +1,498 @@
// Dispositivo: Sensoriamento
// Versão Firmware: 12
// Ultima atualização: 27/11/2024
// Atualização: Unificado protocolo de retorno
#include <ArduinoJson.h>
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SerialService.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\Utils.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\Pinout.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SensorTemperaturaModel.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SensorCorrenteModel.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\SinaleiroModel.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\ReleModel.h"
#include "C:\ZendionInc\agrobot_base\Firmware\Modulos\ServoFreioModel.h"
//#include <SimpleKalmanFilter.h>
#include <Wire.h>
#define D_Code Sen
#define VERSION 12
String Mod_ID = "Sen";
#define _pinoLED RGB_BUILTIN
long _baudRate = 115200;
bool Conectado = false;
int _TaxaAmostragem;
volatile bool RequisitarDados = false;
int FrequenciaMaxima = 10000;
PinoModel _pinoSDA = PinoModel(21, CONTROLADOR, _INPUT);
PinoModel _pinoSCL = PinoModel(22, CONTROLADOR, _INPUT);
std::vector<SensorTemperatura*> listaSensoresTemperatura;
// Função para inicializar os sensores de temperatura com IDs e pinos específicos
void inicializarSensoresTemperatura(String configSensores) {
// Verifica se há sensores já na lista
if (!listaSensoresTemperatura.empty()) {
PrintTela("Limpando lista de sensores de temperatura existente...");
for (auto* sensor : listaSensoresTemperatura) {
sensor->Desligar(); // Desliga cada sensor antes de remover
PrintTela("Sensor de Temperatura " + sensor->_ID + " desligado.");
delete sensor;
}
listaSensoresTemperatura.clear(); // Limpa a lista após desligar todos os itens
}
if (configSensores.length() > 0) {
std::vector<String> temperaturaConfigs = SplitString(configSensores, SplitConfig); // Divide a configuração por vírgulas
for (const String& config : temperaturaConfigs) {
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
if (partes.size() == 5) {
String id = partes[0];
TiposBarramentos pinoB = (TiposBarramentos)partes[1].toInt();
int pino = partes[2].toInt();
SensorTemperatura* sensor = new SensorTemperatura(Mod_ID, id);
sensor->_pino = PinoModel(pino, pinoB, _INPUT, ANALOGICO);
sensor->Inicializar();
listaSensoresTemperatura.push_back(sensor);
PrintTela("Sensor de temperatura " + id + " inicializado no pino " + String(pino));
} else {
PrintTela("Configuração inválida para sensor de temperatura: " + config);
}
}
} else {
PrintTela("Configuração de sensor de temperatura não encontrada.");
}
}
std::vector<SensorCorrente*> listaSensoresCorrente;
// Função para inicializar os sensores de corrente com IDs e pinos específicos
void inicializarSensoresCorrente(String configSensores) {
// Verifica se há sensores já na lista
if (!listaSensoresCorrente.empty()) {
PrintTela("Limpando lista de sensores de corrente existente...");
for (auto* sensor : listaSensoresCorrente) {
sensor->Desligar(); // Desliga cada sensor antes de remover
PrintTela("Sensor de Corrente " + sensor->_ID + " desligado.");
delete sensor;
}
listaSensoresCorrente.clear(); // Limpa a lista após desligar todos os itens
}
if (configSensores.length() > 0) {
std::vector<String> correnteConfigs = SplitString(configSensores, SplitConfig); // Divide a configuração por vírgulas
for (const String& config : correnteConfigs) {
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
if (partes.size() == 5) {
String id = partes[0];
String _endereco = partes[1];
int _a_max = partes[2].toDouble();
SensorCorrente* sensor = new SensorCorrente(Mod_ID, id);
sensor->_Endereco = stringToByte(_endereco);
sensor->_A_Shunt = _a_max;
sensor->Inicializar();
listaSensoresCorrente.push_back(sensor);
PrintTela("Sensor de corrente " + id + " inicializado no endereco " + _endereco);
} else {
PrintTela("Configuração inválida para sensor de corrente: " + config);
}
}
} else {
PrintTela("Configuração de sensor de corrente não encontrada.");
}
}
std::vector<Sinaleiro*> listaSinaleiros;
// Função para inicializar os sinaleiros com IDs e pinos específicos
void inicializarSinaleiros(String configSensores) {
// Verifica se há sensores já na lista
if (!listaSinaleiros.empty()) {
PrintTela("Limpando lista de sinaleiros existente...");
for (auto* sensor : listaSinaleiros) {
sensor->Desligar(); // Desliga cada sensor antes de remover
PrintTela("Sinaleiro " + sensor->_ID + " desligado.");
delete sensor;
}
listaSinaleiros.clear(); // Limpa a lista após desligar todos os itens
}
if (configSensores.length() > 0) {
std::vector<String> sinaleiroConfigs = SplitString(configSensores, SplitConfig); // Divide a configuração por vírgulas
for (const String& config : sinaleiroConfigs) {
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
if (partes.size() == 3) {
String id = partes[0];
TiposBarramentos pinoB = (TiposBarramentos)partes[1].toInt();
int pino = partes[2].toInt();
Sinaleiro* sensor = new Sinaleiro(Mod_ID, id);
sensor->_pino = PinoModel(pino, pinoB, _OUTPUT);
sensor->Inicializar();
listaSinaleiros.push_back(sensor);
PrintTela("Sinaleiro " + id + " inicializado no pino " + String(pino));
} else {
PrintTela("Configuração inválida para sinaleiro: " + config);
}
}
} else {
PrintTela("Configuração de sinaleiro não encontrada.");
}
}
std::vector<Rele*> listaReles;
// Função para inicializar os reles com IDs e pinos específicos
void inicializarReles(String configSensores) {
// Verifica se há sensores já na lista
if (!listaReles.empty()) {
PrintTela("Limpando lista de reles existente...");
for (auto* sensor : listaReles) {
sensor->Desligar(); // Desliga cada sensor antes de remover
PrintTela("Rele " + sensor->_ID + " desligado.");
delete sensor;
}
listaReles.clear(); // Limpa a lista após desligar todos os itens
}
if (configSensores.length() > 0) {
std::vector<String> releConfigs = SplitString(configSensores, SplitConfig); // Divide a configuração por vírgulas
for (const String& config : releConfigs) {
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
if (partes.size() == 3) {
String id = partes[0];
TiposBarramentos pinoB = (TiposBarramentos)partes[1].toInt();
int pino = partes[2].toInt();
Rele* sensor = new Rele(Mod_ID, id);
sensor->_pino = PinoModel(pino, pinoB, _OUTPUT);
sensor->Inicializar();
listaReles.push_back(sensor);
PrintTela("Rele " + id + " inicializado no pino " + String(pino));
} else {
PrintTela("Configuração inválida para rele: " + config);
}
}
} else {
PrintTela("Configuração de rele não encontrada.");
}
}
std::vector<ServoFreio*> listaServoFreios;
// Função para inicializar os servo freios com IDs e pinos específicos
void inicializarServoFreios(String configSensores) {
// Verifica se há sensores já na lista
if (!listaServoFreios.empty()) {
PrintTela("Limpando lista de servo freios existente...");
for (auto* sensor : listaServoFreios) {
sensor->Desligar(); // Desliga cada sensor antes de remover
PrintTela("Servo Freio " + sensor->_ID + " desligado.");
delete sensor;
}
listaServoFreios.clear(); // Limpa a lista após desligar todos os itens
}
if (configSensores.length() > 0) {
std::vector<String> servoFreioConfigs = SplitString(configSensores, SplitConfig); // Divide a configuração por vírgulas
for (const String& config : servoFreioConfigs) {
std::vector<String> partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-'
if (partes.size() == 4) {
String id = partes[0];
bool inc = partes[1] == "1";
TiposBarramentos pinoB = (TiposBarramentos)partes[2].toInt();
int pino = partes[3].toInt();
ServoFreio* sensor = new ServoFreio(Mod_ID, id);
sensor->Incremental = inc;
sensor->_pino = PinoModel(pino, pinoB, _OUTPUT);
sensor->Inicializar();
listaServoFreios.push_back(sensor);
PrintTela("Servo Freio " + id + " inicializado no pino " + String(pino));
} else {
PrintTela("Configuração inválida para servo freio: " + config);
}
}
} else {
PrintTela("Configuração de servo freio não encontrada.");
}
}
void setup() {
Serial.begin(_baudRate);
iniciarMCP(D_Code, Mod_ID, _pinoSDA.num, _pinoSCL.num, 0x20, false);
}
void loop() {
std::vector<ProtocoloSerial> protocolos = LerBufferSerialFila(Mod_ID);
for (int i = 0; i < protocolos.size(); i++) {
ProcessarProtocolo(protocolos[i]);
}
if (!RequisitarDados) {
enviarLogsPeriodicamente();
}
delay(1);
}
// Função para enviar logs do sensor periodicamente via MQTT
unsigned long ultimoEnvioLogs = 0;
const unsigned long intervaloEnvioLogs = 1000; // 1 segundo
void enviarLogsPeriodicamente() {
unsigned long tempoAtual = millis();
// Verifica se o intervalo de 5 segundos já passou
if (tempoAtual - ultimoEnvioLogs >= intervaloEnvioLogs) {
ultimoEnvioLogs = tempoAtual; // Atualiza o tempo do último envio
enviarDadosSensores(); // Chama o método que já envia os dados do sensor via MQTT
}
}
void enviarDadosSensores() {
if (Conectado) {
PrintTela("Atualizando dados dos sensores...");
// Aferir dados dos sensores
for (auto* sensor : listaSensoresTemperatura) {
sensor->AferirTemperatura();
}
// Aferir dados dos sensores
for (auto* sensor : listaSensoresCorrente) {
sensor->AferirCorrente();
}
// Aferir dados dos sensores
for (auto* sensor : listaSinaleiros) {
sensor->AtualizarLeitura();
}
// Aferir dados dos sensores
for (auto* sensor : listaReles) {
sensor->AtualizarLeitura();
}
String jsonString = MontarMensagemSensores() + String(EndLine);
EnviarDadosSerial(Mod_ID, jsonString);
}
}
String MontarMensagemSensores() {
// Criação de um objeto JSON dinâmico com tamanho adequado
DynamicJsonDocument jsonDoc(1024);
// Array JSON para sensores de temperatura
JsonArray sensoresTemperaturaArray = jsonDoc.createNestedArray("sensores_temperatura");
for (const auto* sensor : listaSensoresTemperatura) {
JsonObject sensorData = sensoresTemperaturaArray.createNestedObject();
sensorData["id"] = sensor->_ID;
sensorData["iniciado"] = sensor->Iniciado;
sensorData["leitura"] = sensor->leitura;
}
// Array JSON para sensores de corrente
JsonArray sensoresCorrenteArray = jsonDoc.createNestedArray("sensores_corrente");
for (const auto* sensor : listaSensoresCorrente) {
JsonObject sensorData = sensoresCorrenteArray.createNestedObject();
sensorData["id"] = sensor->_ID;
sensorData["iniciado"] = sensor->Iniciado;
sensorData["busVoltage"] = sensor->busVoltage;
sensorData["shuntVoltage"] = sensor->shuntVoltage;
sensorData["current"] = sensor->current;
sensorData["power"] = sensor->power;
}
// Array JSON para sinaleiros
JsonArray sinaleirosArray = jsonDoc.createNestedArray("sinaleiros");
for (const auto* sensor : listaSinaleiros) {
JsonObject sensorData = sinaleirosArray.createNestedObject();
sensorData["id"] = sensor->_ID;
sensorData["iniciado"] = sensor->Iniciado;
sensorData["leitura"] = sensor->_StatusLeitura;
}
// Array JSON para reles
JsonArray relesArray = jsonDoc.createNestedArray("reles");
for (const auto* sensor : listaReles) {
JsonObject sensorData = relesArray.createNestedObject();
sensorData["id"] = sensor->_ID;
sensorData["iniciado"] = sensor->Iniciado;
sensorData["leitura"] = sensor->_Status;
}
// Array JSON para servo freios
JsonArray servoFreiosArray = jsonDoc.createNestedArray("servo_freios");
for (const auto* sensor : listaServoFreios) {
JsonObject sensorData = servoFreiosArray.createNestedObject();
sensorData["id"] = sensor->_ID;
sensorData["iniciado"] = sensor->Iniciado;
sensorData["angulo"] = sensor->_Angulo;
}
// Serializa o JSON para uma string
String jsonString;
serializeJson(jsonDoc, jsonString);
int messageSize = jsonString.length();
PrintTela("Tamanho da mensagem: ", false);
PrintTela((String)messageSize);
return jsonString;
}
void ProcessarProtocolo(ProtocoloSerial Mensagem) {
switch (Mensagem.funcao) {
case Chk:
ProcessarChk(Mensagem);
break;
case Cfg:
ProcessarCfg(Mensagem);
break;
case Cmd:
ProcessarCmd(Mensagem);
break;
case Req:
ProcessarReq(Mensagem);
break;
}
if (Mensagem.idMensagem > 0) {
EnviarDadosSerial(Mod_ID, MontarProtocoloMensagemRecebida(Mensagem.idMensagem));
}
}
void ProcessarChk(ProtocoloSerial Mensagem) {
EnviarDadosSerial(Mod_ID, MontarProtocoloVerificacao(D_Code, VERSION, Conectado));
}
void ProcessarCfg(ProtocoloSerial Mensagem) {
std::vector<String> Partes = SplitString(Mensagem.protocolo, (char*)",");
String ID = Partes[0];
bool Conectar = Partes[1] == "1";
if (ID == "MD") {
_TaxaAmostragem = Partes[2].toInt();
RequisitarDados = Partes[3] == "1";
TiposBarramentos pinoSDAB = (TiposBarramentos)Partes[4].toInt();
int pinoSDA = Partes[5].toInt();
TiposBarramentos pinoSCLB = (TiposBarramentos)Partes[6].toInt();
int pinoSCL = Partes[7].toInt();
if (pinoSDA > -1 && pinoSCL > -1) {
_pinoSDA = PinoModel(pinoSDA, pinoSDAB, _INPUT);
_pinoSCL = PinoModel(pinoSCL, pinoSCLB, _INPUT);
Wire.end();
Wire.begin(_pinoSDA.num, _pinoSCL.num);
}
EnviarDadosSerial(Mod_ID, MontarProtocoloSensor(sCFG, "MD", Conectar ? "1" : "0"));
vTaskDelay(pdMS_TO_TICKS(100));
Conectado = Conectar;
}
else {
S_Code componente = (S_Code)Partes[2].toInt();
String config = Partes[3];
switch (componente) {
case sTMP: {
inicializarSensoresTemperatura(config);
break;
}
case sCOR: {
inicializarSensoresCorrente(config);
break;
}
case sLED: {
inicializarSinaleiros(config);
break;
}
case sRLE: {
inicializarReles(config);
break;
}
case sFRO: {
inicializarServoFreios(config);
break;
}
}
}
}
void ProcessarCmd(ProtocoloSerial Mensagem) {
std::vector<String> Partes = SplitString(Mensagem.protocolo, (char*)",");
String ID = Partes[0];
S_Code componente = (S_Code)Partes[1].toInt();
switch (componente) {
case sLED: {
for (auto* _led : listaSinaleiros) {
if (_led->_ID == ID) {
_led->_Status = (StatusLED)Partes[2].toInt();
_led->_Qtd = Partes[3].toInt();
_led->_TempoMs = Partes[4].toInt();
_led->_PausaMs = Partes[5].toInt();
return;
}
}
break;
}
case sRLE: {
for (auto* _rele : listaReles) {
if (_rele->_ID == ID) {
Estado novoEstado = (Estado)Partes[2].toInt();
_rele->AtualizarStatus(novoEstado);
}
}
break;
}
case sFRO: {
for (auto* _freio : listaServoFreios) {
if (_freio->_ID == ID) {
int novoAngulo = Partes[2].toInt();
_freio->AtualizarAngulo(novoAngulo);
}
}
break;
}
}
}
void ProcessarReq(ProtocoloSerial Mensagem) {
enviarDadosSensores();
}