refinamento nas rotinas assincronas e remocao de classes nao utilizadas
This commit is contained in:
parent
64b79bb62b
commit
9c90bec1d6
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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>();
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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]]}}]}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
afe56ee07a44e7bdf0ff34262548be78816ffa76793d188967eb564a704ab6d0
|
||||
6f15a8df374baad6de514ad6cb80ffc96b3aa44597c56799d518e1cfd400d9aa
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"files.associations": {
|
||||
"cstddef": "cpp"
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
|
||||
]
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue