diff --git a/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs b/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs index 0d89d7da3..0b575ef4c 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmDiagnosticos.cs @@ -1423,7 +1423,7 @@ namespace AgroBase.Forms.IHM private async Task EnviarComandoRele(DispositivosService Dispositivo, SensorReleModel Rele, bool Ligar, int Delay) { var novoEstado = Ligar ? Estado.Ligado : Estado.Desligado; - GeneralJoystick.EnviarComandoSensoriamento(S_Code.sRLE, Rele.ID, novoEstado); + GeneralJoystick.EnviarComandoSensoriamento(Rele.Componente, Rele.ID, novoEstado); await Task.Delay(Delay); Dispositivo.Dados.RequisitarDadosModulo(Rele.ID_Num, CanMessagePosicaoDados.Dados1, CanMessagePosicaoDados.Dados1, true); await Task.Delay(Delay); @@ -1663,7 +1663,7 @@ namespace AgroBase.Forms.IHM await EnviarComandoSinaleiro(Dispositivo, Sinaleiro, true, 1000); } - StatusLED Status = Sinaleiro.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDLeitura).atual.valor; + StatusLED Status = Sinaleiro.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLedLeitura).atual.valor; idx = PreencheDadosLinha(grid, Testes, idx, Iniciado && Status == StatusLED.Aceso ? 1 : -1); if (Iniciado) @@ -1671,7 +1671,7 @@ namespace AgroBase.Forms.IHM await EnviarComandoSinaleiro(Dispositivo, Sinaleiro, false, 1000); } - Status = Sinaleiro.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDLeitura).atual.valor; + Status = Sinaleiro.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLedLeitura).atual.valor; idx = PreencheDadosLinha(grid, Testes, idx, Iniciado && Status == StatusLED.Apagado ? 0 : -1); } @@ -1682,9 +1682,8 @@ namespace AgroBase.Forms.IHM private async Task EnviarComandoSinaleiro(DispositivosService Dispositivo, SensorSinaleiroModel Sinaleiro, bool Ligar, int Delay) { - var Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(StatusOperacao.NaoIniciado); - Comportamento.statusLED = Ligar ? StatusLED.Aceso : StatusLED.Apagado; - GeneralJoystick.EnviarComandoSensoriamento(S_Code.sLED, Sinaleiro.ID, Comportamento); + var Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(Ligar ? StatusLED.Aceso : StatusLED.Apagado); + GeneralJoystick.EnviarComandoSensoriamento(Sinaleiro.Componente, Sinaleiro.ID, Comportamento); await Task.Delay(Delay); Dispositivo.Dados.RequisitarDadosModulo(Sinaleiro.ID_Num, CanMessagePosicaoDados.Dados1, CanMessagePosicaoDados.Dados1, true); await Task.Delay(Delay); diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs index 797dee59e..a0641b609 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs @@ -1450,9 +1450,9 @@ namespace AgroBase.Forms.Operacoes } var LogSen = LogsSensoriamento.FirstOrDefault(x => x.Momento == MomentoAtual); - pnlManual.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("MN"))?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDLeitura)?.atual?.valor == (int)Enums.StatusLED.Aceso ? Color.Yellow : Color.Gold; - pnlAutomatico.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("AT"))?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDLeitura)?.atual?.valor == (int)Enums.StatusLED.Aceso ? Color.Yellow : Color.Gold; - pnlOperacao.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("OP"))?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDLeitura)?.atual?.valor == (int)Enums.StatusLED.Aceso ? Color.Green : Color.DarkGreen; + pnlManual.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("MN"))?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLedLeitura)?.atual?.valor == (int)Enums.StatusLED.Aceso ? Color.Yellow : Color.Gold; + pnlAutomatico.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("AT"))?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLedLeitura)?.atual?.valor == (int)Enums.StatusLED.Aceso ? Color.Yellow : Color.Gold; + pnlOperacao.BackColor = LogSen.Sinaleiros?.FirstOrDefault(x => x.ID.Contains("OP"))?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLedLeitura)?.atual?.valor == (int)Enums.StatusLED.Aceso ? Color.Green : Color.DarkGreen; lblSEN_QualidadeWifi.Text = $"Qualidade Wi-Fi: {LogSen.QualidadeWifi} dBm"; lblSEN_LatenciaLoop.Text = $"Latencia de Loop: {LogSen.LatenciaLoop} ms"; diff --git a/AgroBase/AgroBase/Forms/Sensoriamento/frmSenConfig.Designer.cs b/AgroBase/AgroBase/Forms/Sensoriamento/frmSenConfig.Designer.cs index 4a1a7d94e..3a6197c33 100644 --- a/AgroBase/AgroBase/Forms/Sensoriamento/frmSenConfig.Designer.cs +++ b/AgroBase/AgroBase/Forms/Sensoriamento/frmSenConfig.Designer.cs @@ -35,7 +35,7 @@ this.lblTensao = new System.Windows.Forms.Label(); this.lblCorrente = new System.Windows.Forms.Label(); this.lblTemperatura = new System.Windows.Forms.Label(); - this.gridsTMP = new System.Windows.Forms.DataGridView(); + this.gridsNTC = new System.Windows.Forms.DataGridView(); this.lblPressao = new System.Windows.Forms.Label(); this.gridsULT = new System.Windows.Forms.DataGridView(); this.lblFluxo = new System.Windows.Forms.Label(); @@ -62,13 +62,14 @@ this.chbRequisitarDados = new System.Windows.Forms.CheckBox(); this.lblAddrTx = new System.Windows.Forms.Label(); this.txtEnderecoCAN_Tx = new System.Windows.Forms.TextBox(); - this.lblPotenciometro = new System.Windows.Forms.Label(); - this.gridsPOT = new System.Windows.Forms.DataGridView(); + this.lblMagnetico = new System.Windows.Forms.Label(); + this.gridsMAG = new System.Windows.Forms.DataGridView(); this.lblAddrRx = new System.Windows.Forms.Label(); this.txtEnderecoCAN_Rx = new System.Windows.Forms.TextBox(); + this.btnReiniciar = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.gridsTEN)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.gridsCOR)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.gridsTMP)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.gridsNTC)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.gridsULT)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.gridsFLX)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.gridsMAS)).BeginInit(); @@ -76,7 +77,7 @@ ((System.ComponentModel.ISupportInitialize)(this.nudBateriaValor)).BeginInit(); this.gpbBateria.SuspendLayout(); this.gpbCameras.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.gridsPOT)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.gridsMAG)).BeginInit(); this.SuspendLayout(); // // gridsTEN @@ -100,7 +101,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(1128, 690); + this.btnSalvar.Location = new System.Drawing.Point(1110, 695); this.btnSalvar.Name = "btnSalvar"; this.btnSalvar.Size = new System.Drawing.Size(75, 23); this.btnSalvar.TabIndex = 3; @@ -135,14 +136,14 @@ this.lblTemperatura.TabIndex = 7; this.lblTemperatura.Text = "Temperatura"; // - // gridsTMP + // gridsNTC // - this.gridsTMP.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.gridsTMP.Location = new System.Drawing.Point(15, 311); - this.gridsTMP.Name = "gridsTMP"; - this.gridsTMP.RowHeadersWidth = 51; - this.gridsTMP.Size = new System.Drawing.Size(578, 124); - this.gridsTMP.TabIndex = 6; + this.gridsNTC.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.gridsNTC.Location = new System.Drawing.Point(15, 311); + this.gridsNTC.Name = "gridsNTC"; + this.gridsNTC.RowHeadersWidth = 51; + this.gridsNTC.Size = new System.Drawing.Size(578, 124); + this.gridsNTC.TabIndex = 6; // // lblPressao // @@ -411,23 +412,23 @@ this.txtEnderecoCAN_Tx.TabIndex = 144; this.txtEnderecoCAN_Tx.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; // - // lblPotenciometro + // lblMagnetico // - this.lblPotenciometro.AutoSize = true; - this.lblPotenciometro.Location = new System.Drawing.Point(12, 581); - this.lblPotenciometro.Name = "lblPotenciometro"; - this.lblPotenciometro.Size = new System.Drawing.Size(167, 13); - this.lblPotenciometro.TabIndex = 147; - this.lblPotenciometro.Text = "Potenciometro (Angulo Direcional)"; + this.lblMagnetico.AutoSize = true; + this.lblMagnetico.Location = new System.Drawing.Point(12, 581); + this.lblMagnetico.Name = "lblMagnetico"; + this.lblMagnetico.Size = new System.Drawing.Size(102, 13); + this.lblMagnetico.TabIndex = 147; + this.lblMagnetico.Text = "Magnético (Angular)"; // - // gridsPOT + // gridsMAG // - this.gridsPOT.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.gridsPOT.Location = new System.Drawing.Point(15, 597); - this.gridsPOT.Name = "gridsPOT"; - this.gridsPOT.RowHeadersWidth = 51; - this.gridsPOT.Size = new System.Drawing.Size(578, 124); - this.gridsPOT.TabIndex = 146; + this.gridsMAG.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.gridsMAG.Location = new System.Drawing.Point(15, 597); + this.gridsMAG.Name = "gridsMAG"; + this.gridsMAG.RowHeadersWidth = 51; + this.gridsMAG.Size = new System.Drawing.Size(578, 124); + this.gridsMAG.TabIndex = 146; // // lblAddrRx // @@ -450,15 +451,27 @@ this.txtEnderecoCAN_Rx.TabIndex = 148; this.txtEnderecoCAN_Rx.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; // + // btnReiniciar + // + this.btnReiniciar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnReiniciar.Location = new System.Drawing.Point(1139, 454); + this.btnReiniciar.Name = "btnReiniciar"; + this.btnReiniciar.Size = new System.Drawing.Size(75, 23); + this.btnReiniciar.TabIndex = 150; + this.btnReiniciar.Text = "Reinciar"; + this.btnReiniciar.UseVisualStyleBackColor = true; + this.btnReiniciar.Click += new System.EventHandler(this.btnReiniciar_Click); + // // frmSenConfig // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1226, 730); + this.Controls.Add(this.btnReiniciar); this.Controls.Add(this.lblAddrRx); this.Controls.Add(this.txtEnderecoCAN_Rx); - this.Controls.Add(this.lblPotenciometro); - this.Controls.Add(this.gridsPOT); + this.Controls.Add(this.lblMagnetico); + this.Controls.Add(this.gridsMAG); this.Controls.Add(this.lblAddrTx); this.Controls.Add(this.txtEnderecoCAN_Tx); this.Controls.Add(this.chbRequisitarDados); @@ -473,7 +486,7 @@ this.Controls.Add(this.lblPressao); this.Controls.Add(this.gridsULT); this.Controls.Add(this.lblTemperatura); - this.Controls.Add(this.gridsTMP); + this.Controls.Add(this.gridsNTC); this.Controls.Add(this.lblCorrente); this.Controls.Add(this.lblTensao); this.Controls.Add(this.gridsCOR); @@ -487,7 +500,7 @@ this.Load += new System.EventHandler(this.frmSenConfig_Load); ((System.ComponentModel.ISupportInitialize)(this.gridsTEN)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.gridsCOR)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.gridsTMP)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.gridsNTC)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.gridsULT)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.gridsFLX)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.gridsMAS)).EndInit(); @@ -497,7 +510,7 @@ this.gpbBateria.PerformLayout(); this.gpbCameras.ResumeLayout(false); this.gpbCameras.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.gridsPOT)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.gridsMAG)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -510,7 +523,7 @@ private System.Windows.Forms.Label lblTensao; private System.Windows.Forms.Label lblCorrente; private System.Windows.Forms.Label lblTemperatura; - private System.Windows.Forms.DataGridView gridsTMP; + private System.Windows.Forms.DataGridView gridsNTC; private System.Windows.Forms.Label lblPressao; private System.Windows.Forms.DataGridView gridsULT; private System.Windows.Forms.Label lblFluxo; @@ -537,9 +550,10 @@ private System.Windows.Forms.CheckBox chbRequisitarDados; private System.Windows.Forms.Label lblAddrTx; private System.Windows.Forms.TextBox txtEnderecoCAN_Tx; - private System.Windows.Forms.Label lblPotenciometro; - private System.Windows.Forms.DataGridView gridsPOT; + private System.Windows.Forms.Label lblMagnetico; + private System.Windows.Forms.DataGridView gridsMAG; private System.Windows.Forms.Label lblAddrRx; private System.Windows.Forms.TextBox txtEnderecoCAN_Rx; + private System.Windows.Forms.Button btnReiniciar; } } \ No newline at end of file diff --git a/AgroBase/AgroBase/Forms/Sensoriamento/frmSenConfig.cs b/AgroBase/AgroBase/Forms/Sensoriamento/frmSenConfig.cs index 3405e0803..3965e4d15 100644 --- a/AgroBase/AgroBase/Forms/Sensoriamento/frmSenConfig.cs +++ b/AgroBase/AgroBase/Forms/Sensoriamento/frmSenConfig.cs @@ -5,7 +5,6 @@ using AgroBase.Services; using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using System.Windows.Forms; using static AgroBase.Models.Enums; @@ -116,7 +115,7 @@ namespace AgroBase.Forms.Sensoriamento { foreach (var Sensor in Sensores) { - string gridName = "grid" + Enum.GetName(typeof(S_Code), Sensor.Componente); + string gridName = $"grid{Sensor.Componente}"; DataGridView grid = this.Controls.OfType().ToList().FirstOrDefault(x => x.Name == gridName); if (grid != null && grid.Columns.Count == 0) { @@ -137,7 +136,7 @@ namespace AgroBase.Forms.Sensoriamento { foreach (var Sensor in Sensores) { - string gridName = "grid" + Enum.GetName(typeof(S_Code), Sensor.Componente); + string gridName = $"grid{Sensor.Componente}"; DataGridView grid = this.Controls.OfType().ToList().FirstOrDefault(x => x.Name == gridName); if (grid != null && grid.Columns.Count > 0) { @@ -168,7 +167,7 @@ namespace AgroBase.Forms.Sensoriamento foreach (var Sensor in Sensores) { - string gridName = "grid" + Enum.GetName(typeof(S_Code), Sensor.Componente); + string gridName = $"grid{Sensor.Componente}"; DataGridView grid = this.Controls.OfType().ToList().FirstOrDefault(x => x.Name == gridName); if (grid != null && grid.Rows.Count > 1) { @@ -274,5 +273,16 @@ namespace AgroBase.Forms.Sensoriamento ModbusService.AdicionarComandoNaFila(Comando);*/ } + private void btnReiniciar_Click(object sender, EventArgs e) + { + if (MessageBox.Show($"Tem certeza que deseja reiniciar o módulo {Dispositivo}?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + if (Dispositivo == T_Code.Atu) + GeneralJoystick.EnviarComandoAtuador(S_Code.sMOD, "", true); + if (Dispositivo == T_Code.Sen) + GeneralJoystick.EnviarComandoSensoriamento(S_Code.sMOD, "", true); + } + } + } } diff --git a/AgroBase/AgroBase/Forms/frmInstancial.cs b/AgroBase/AgroBase/Forms/frmInstancial.cs index f2131c05f..82070ee9f 100644 --- a/AgroBase/AgroBase/Forms/frmInstancial.cs +++ b/AgroBase/AgroBase/Forms/frmInstancial.cs @@ -104,7 +104,7 @@ namespace AgroBase.Forms LivoxManagerProcess.Dispose(); - AsyncTaskTimerModel.PararTimers(); + PythonService.EncerrarProcessos(); foreach (var Disp in Variaveis.DispositivosConectados) { @@ -112,12 +112,13 @@ namespace AgroBase.Forms Disp.SalvarParametros(Disp.Dados); } - while (!FilaService.Liberado) + var timeout = DateTime.Now.AddSeconds(10); + while (!CanManager.CanService.FilaLiberada && DateTime.Now < timeout) { - await Task.Delay(500); + await Task.Delay(200); } - PythonService.EncerrarProcessos(); + AsyncTaskTimerModel.PararTimers(); try { Environment.Exit(0); } catch { } } diff --git a/AgroBase/AgroBase/Models/GeneralJoystick.cs b/AgroBase/AgroBase/Models/GeneralJoystick.cs index 6806f60ef..15a5aeccb 100644 --- a/AgroBase/AgroBase/Models/GeneralJoystick.cs +++ b/AgroBase/AgroBase/Models/GeneralJoystick.cs @@ -754,6 +754,12 @@ namespace AgroBase switch (Componente) { + case S_Code.sMOD: + if (DispAtu?.Dados != null && Status == true) + { + (id_num, posicao, data) = DispAtu.Dados.ProtocoloComandoReset(); + } + break; case S_Code.sBMB: var Bomba = DispAtu?.Dados?.BombasPressurizadoras?.FirstOrDefault(x => x.ID == ID); if (Bomba != null) @@ -807,6 +813,12 @@ namespace AgroBase switch (Componente) { + case S_Code.sMOD: + if (DispSen?.Dados != null && Status == true) + { + (id_num, posicao, data) = DispSen.Dados.ProtocoloComandoReset(); + } + break; case S_Code.sLED: var Sinaleiro = DispSen?.Dados?.Sinaleiros?.FirstOrDefault(x => x.ID == ID && x.Inicializado); if (Sinaleiro != null) diff --git a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs index 85c1be740..742565dc7 100644 --- a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs +++ b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs @@ -869,6 +869,18 @@ namespace AgroBase.Models.Modules Variaveis.OperacaoEmAndamento.DispAtu?.AdicionarMensagemFila(ID_Num, posicaoTx, posicaoRx, null, aguardaResposta); } + public (int, CanMessagePosicaoDados, byte[]) ProtocoloComandoReset() + { + return ( + Variaveis.ID_Num_sMOD, + CanMessagePosicaoDados.Command1, + new byte[] + { + (byte)Estado.Reset + } + ); + } + public List<(int, CanMessagePosicaoDados, byte[])> ProtocoloConfiguracao(bool Conectar) { // Inicializar o dicionário @@ -1020,10 +1032,7 @@ namespace AgroBase.Models.Modules public async Task tmrRegistrador_Tick() { - if (Variaveis.Fechando) - { - return; - } + if (Variaveis.Fechando) return; tmrRegistrador.SetInterval(_TaxaAmostragem); @@ -1053,6 +1062,8 @@ namespace AgroBase.Models.Modules private void VerificaControleLeitura() { + if (Variaveis.Fechando) return; + foreach (var bico in BicosPulverizadores.Where(x => x.Comandar && x.Inicializado)) { Estado comandoEstado = bico.ComandoAtuar ? Estado.Ligado : Estado.Desligado; diff --git a/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs b/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs index fc5cc56bc..64bddfbf6 100644 --- a/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/MovimentacaoUnificadoModel.cs @@ -237,10 +237,7 @@ namespace AgroBase.Models.Modules private async Task tmrRegistradorMOV_Tick() { - if (Variaveis.Fechando) - { - return; - } + if (Variaveis.Fechando) return; if (!OIDCanService.Iniciado && SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Mov)) { @@ -287,10 +284,7 @@ namespace AgroBase.Models.Modules private async Task tmrRegistradorDIR_Tick() { - if (Variaveis.Fechando) - { - return; - } + if (Variaveis.Fechando) return; if (!MKS057DCanService.Iniciado && SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Dir)) { diff --git a/AgroBase/AgroBase/Models/Modules/PinoutModel.cs b/AgroBase/AgroBase/Models/Modules/PinoutModel.cs index 4355ffd72..d374e659e 100644 --- a/AgroBase/AgroBase/Models/Modules/PinoutModel.cs +++ b/AgroBase/AgroBase/Models/Modules/PinoutModel.cs @@ -422,8 +422,8 @@ namespace AgroBase.Models.Modules AQI, Iniciado, Energia, - StatusLEDLeitura, - StatusLEDComando, + StatusLedLeitura, + StatusLedID, ServoAnguloLeitura, ServoAnguloComando, EstadoLeitura, diff --git a/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs b/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs index e5fa5cf7f..47a5ccf5b 100644 --- a/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/SensoriamentoModel.cs @@ -10,6 +10,7 @@ using static AgroBase.Services.LoRaEspService; using AgroBase.Services.Operadores; using AgroBase.Models.Operadores; using System.Diagnostics; +using StackExchange.Redis; namespace AgroBase.Models.Modules { @@ -97,11 +98,13 @@ namespace AgroBase.Models.Modules ID_Num = 21, Descricao = "Sinaleiro indicação de modo Manual ativo", Componente = S_Code.sLED, + Controlar = true, + Mandatorio = true, Funcoes = new List() { FuncoesPinout.Sinaleiro, }, - Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(StatusOperacao.NaoIniciado), + Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(StatusLED.Apagado), ValoresLeituras = new List() { new SensorValoresLeituraModel() @@ -112,14 +115,14 @@ namespace AgroBase.Models.Modules }, new SensorValoresLeituraModel() { - funcao = FuncoesPinout.StatusLEDLeitura, - posicao = CanMessagePosicaoDados.Dados1, + funcao = FuncoesPinout.StatusLedID, + posicao = CanMessagePosicaoDados.Dados1, indice = 0, }, new SensorValoresLeituraModel() { - funcao = FuncoesPinout.StatusLEDComando, - posicao = CanMessagePosicaoDados.Dados1, + funcao = FuncoesPinout.StatusLedLeitura, + posicao = CanMessagePosicaoDados.Dados1, indice = 1, }, } @@ -130,11 +133,13 @@ namespace AgroBase.Models.Modules ID_Num = 22, Descricao = "Sinaleiro indicação de modo Automático ativo", Componente = S_Code.sLED, + Controlar = true, + Mandatorio = true, Funcoes = new List() { FuncoesPinout.Sinaleiro, }, - Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(StatusOperacao.NaoIniciado), + Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(StatusLED.Apagado), ValoresLeituras = new List() { new SensorValoresLeituraModel() @@ -145,13 +150,13 @@ namespace AgroBase.Models.Modules }, new SensorValoresLeituraModel() { - funcao = FuncoesPinout.StatusLEDLeitura, + funcao = FuncoesPinout.StatusLedID, posicao = CanMessagePosicaoDados.Dados1, indice = 0, }, new SensorValoresLeituraModel() { - funcao = FuncoesPinout.StatusLEDComando, + funcao = FuncoesPinout.StatusLedLeitura, posicao = CanMessagePosicaoDados.Dados1, indice = 1, }, @@ -163,11 +168,13 @@ namespace AgroBase.Models.Modules ID_Num = 23, Descricao = "Sinaleiro indicação do status da operação ativa", Componente = S_Code.sLED, + Controlar = true, + Mandatorio = true, Funcoes = new List() { FuncoesPinout.Sinaleiro, }, - Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(StatusOperacao.NaoIniciado), + Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(StatusLED.Apagado), ValoresLeituras = new List() { new SensorValoresLeituraModel() @@ -178,13 +185,13 @@ namespace AgroBase.Models.Modules }, new SensorValoresLeituraModel() { - funcao = FuncoesPinout.StatusLEDLeitura, + funcao = FuncoesPinout.StatusLedID, posicao = CanMessagePosicaoDados.Dados1, indice = 0, }, new SensorValoresLeituraModel() { - funcao = FuncoesPinout.StatusLEDComando, + funcao = FuncoesPinout.StatusLedLeitura, posicao = CanMessagePosicaoDados.Dados1, indice = 1, }, @@ -2131,6 +2138,18 @@ namespace AgroBase.Models.Modules Variaveis.OperacaoEmAndamento.DispSen?.AdicionarMensagemFila(ID_Num, posicaoTx, posicaoRx, null, aguardaResposta); } + public (int, CanMessagePosicaoDados, byte[]) ProtocoloComandoReset() + { + return ( + Variaveis.ID_Num_sMOD, + CanMessagePosicaoDados.Command1, + new byte[] + { + (byte)Estado.Reset + } + ); + } + public List<(int, CanMessagePosicaoDados, byte[])> ProtocoloConfiguracao(bool Conectar) { // Inicializar o dicionário @@ -2214,8 +2233,12 @@ namespace AgroBase.Models.Modules { var config = new List<(int, CanMessagePosicaoDados, byte[])>(); - foreach (var sinaleiro in Sinaleiros.Where(x => (ConfigurarTodos ? true : x.Inicializado != Conectar))) + foreach (var sinaleiro in Sinaleiros.Where(x => (x.Controlar && (ConfigurarTodos ? true : x.Inicializado != Conectar)) || (!x.Controlar && x.Inicializado))) { + if (!sinaleiro.Controlar && sinaleiro.Inicializado) + { + Conectar = false; + } (CanMessagePosicaoDados posicao, var payload) = sinaleiro.ProtocoloConfiguracao(Pinout, Conectar); if (payload != null) { @@ -2286,10 +2309,7 @@ namespace AgroBase.Models.Modules public async Task tmrRegistrador_Tick() { - if (Variaveis.Fechando) - { - return; - } + if (Variaveis.Fechando) return; tmrRegistrador.SetInterval(_TaxaAmostragem); @@ -2319,49 +2339,29 @@ namespace AgroBase.Models.Modules private void VerificaControleLeitura() { - if (true) // !frmDiagnosticos.Diagnosticando + if (Variaveis.Fechando) return; + + foreach (var sinaleiro in Sinaleiros.Where(x => x.Controlar && x.Inicializado)) { - var ledOP = Sinaleiros.FirstOrDefault(x => x.ID == "LEDOP" && x.Inicializado); - var ledAT = Sinaleiros.FirstOrDefault(x => x.ID == "LEDAT" && x.Inicializado); - var ledMN = Sinaleiros.FirstOrDefault(x => x.ID == "LEDMN" && x.Inicializado); - - var comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(); - var valOp = (int?)(ledOP?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDComando)?.atual?.valor) ?? 0; - if (ledOP != null && (!ledOP.Comportamento.Equals(comportamento) || valOp != (int)comportamento.statusLED)) + if (sinaleiro.Comportamento.statusLED != sinaleiro._StatusLed || sinaleiro.Comportamento.id != sinaleiro._StatusLedId) { - GeneralJoystick.EnviarComandoSensoriamento(ledOP.Componente, ledOP.ID, comportamento); + GeneralJoystick.EnviarComandoSensoriamento(sinaleiro.Componente, sinaleiro.ID, sinaleiro.Comportamento); } + } - var statusLedAt = Variaveis.OperacaoEmAndamento.Parametros.Controle.MovimentoAutomatico ? StatusLED.Aceso : StatusLED.Apagado; - var valAt = (int?)(ledAT?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDComando)?.atual?.valor) ?? 0; - if (ledAT != null && (!ledAT.Comportamento.statusLED.Equals(statusLedAt) || (valAt != (int)statusLedAt))) + foreach (var rele in Reles.Where(x => x.Controlar && x.Inicializado)) + { + if (rele.StatusControle != rele._EstadoLeitura) { - ledAT.Comportamento.statusLED = statusLedAt; - GeneralJoystick.EnviarComandoSensoriamento(ledAT.Componente, ledAT.ID, ledAT.Comportamento); + GeneralJoystick.EnviarComandoSensoriamento(rele.Componente, rele.ID, rele.StatusControle); } + } - var statusLedMn = Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.Manual ? StatusLED.Aceso : StatusLED.Apagado; - var valMn = (int?)(ledMN?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLEDComando)?.atual?.valor) ?? 0; - if (ledMN != null && (!ledMN.Comportamento.statusLED.Equals(statusLedMn) || (valMn != (int)statusLedMn))) + foreach (var servo in Servos.Where(x => x.Controlar && x.Inicializado)) + { + if (servo._AnguloControle != servo._AnguloLeiutra) { - ledMN.Comportamento.statusLED = statusLedMn; - GeneralJoystick.EnviarComandoSensoriamento(ledMN.Componente, ledMN.ID, ledMN.Comportamento); - } - - foreach (var rele in Reles.Where(x => x.Controlar && x.Inicializado)) - { - if (rele.StatusControle != rele._EstadoLeitura) - { - GeneralJoystick.EnviarComandoSensoriamento(rele.Componente, rele.ID, rele.StatusControle); - } - } - - foreach (var servo in Servos.Where(x => x.Controlar && x.Inicializado)) - { - if (servo._AnguloControle != servo._AnguloLeiutra) - { - GeneralJoystick.EnviarComandoSensoriamento(servo.Componente, servo.ID, servo._AnguloControle); - } + GeneralJoystick.EnviarComandoSensoriamento(servo.Componente, servo.ID, servo._AnguloControle); } } } @@ -2392,6 +2392,13 @@ namespace AgroBase.Models.Modules } } + public void AtualizarStatusSinaleiros(ModoOperacao Modo, StatusOperacao _statusOperacao) + { + Sinaleiros.First(x => x.ID == "LEDMN").Comportamento.statusLED = Modo == ModoOperacao.Manual ? StatusLED.Aceso : StatusLED.Apagado; + Sinaleiros.First(x => x.ID == "LEDAT").Comportamento.statusLED = Modo == ModoOperacao.Manual ? StatusLED.Apagado : StatusLED.Aceso; + Sinaleiros.First(x => x.ID == "LEDOP").Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(status_operacao: _statusOperacao); + } + } public class SensorModel @@ -2400,7 +2407,7 @@ namespace AgroBase.Models.Modules public int ID_Num { get; set; } public string Descricao { get; set; } public S_Code Componente { get; set; } - public bool Aferir { get; set; } = false; + public bool Aferir { get; set; } public bool Mandatorio { get; set; } public bool Liberado { @@ -2459,6 +2466,8 @@ namespace AgroBase.Models.Modules public int ID_Num { get; set; } public string Descricao { get; set; } public S_Code Componente { get; set; } + public bool Controlar { get; set; } + public bool Mandatorio { get; set; } public List Funcoes { get; set; } public SensorSinaleiroComportamentoModel Comportamento { get; set; } public bool Inicializado { get; set; } @@ -2470,6 +2479,8 @@ namespace AgroBase.Models.Modules } } public List ValoresLeituras { get; set; } + public int _StatusLedId => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLedID)?.atual?.valor ?? 99; + public StatusLED _StatusLed => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.StatusLedLeitura)?.atual?.valor ?? StatusLED.Apagado; public (CanMessagePosicaoDados, byte[]) ProtocoloConfiguracao(PinoutDataModel pinout, bool conectar) { @@ -2489,6 +2500,7 @@ namespace AgroBase.Models.Modules { List frame = new List { + (byte)Comportamento.id, (byte)Comportamento.statusLED, (byte)Comportamento.QtdPiscadas, (byte)(Comportamento.TempoMs / 10), @@ -2578,7 +2590,7 @@ namespace AgroBase.Models.Modules } } public int _AnguloControle { get; set; } - public int _AnguloLeiutra => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual?.valor ?? -1; + public int _AnguloLeiutra => (int)(ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual?.valor ?? -1); public bool Inicializado { get; set; } public DateTime UltimaLeitura { @@ -2622,6 +2634,8 @@ namespace AgroBase.Models.Modules public class SensorSinaleiroComportamentoModel { + public int id { get; set; } + public StatusOperacao? statusOperacao { get; set; } public StatusLED statusLED { get; set; } public int QtdPiscadas { get; set; } = 0; public int TempoMs { get; set; } = 0; @@ -2638,7 +2652,9 @@ namespace AgroBase.Models.Modules return statusLED == other.statusLED && QtdPiscadas == other.QtdPiscadas && TempoMs == other.TempoMs && - PausaMs == other.PausaMs; + PausaMs == other.PausaMs && + statusOperacao == other.statusOperacao && + id == other.id; } public override int GetHashCode() @@ -3087,9 +3103,9 @@ namespace AgroBase.Models.Modules } case CanMessagePosicaoDados.Dados1: { - StatusLED statusLeitura = (StatusLED)data[2]; - StatusLED statusComando = (StatusLED)data[3]; - AtualizarDados(ID_Num, posicao, componente, new List() { statusLeitura, statusComando }); + int statusId = data[2]; + StatusLED statusLeitura = (StatusLED)data[3]; + AtualizarDados(ID_Num, posicao, componente, new List() { statusId, statusLeitura }); break; } } diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 05105c783..408ed9056 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -120,7 +120,7 @@ namespace AgroBase.Models { foreach (var ind in mod.saude_individual) { - var ind_ant = saudeAnterior.FirstOrDefault(x => x.saude_individual.Any(y => y.id == ind.id))?.saude_individual?.FirstOrDefault(x => x.id == ind.id); + var ind_ant = saudeAnterior.FirstOrDefault(x => x.modulo == mod.modulo && x.saude_individual.Any(y => y.id == ind.id))?.saude_individual?.FirstOrDefault(x => x.id == ind.id); if (ind.status != ind_ant?.status) { string msg = ind.motivos.Any() ? string.Join("; ", ind.motivos) : $"{ind.status} ({ind.saude:0}%)"; @@ -839,28 +839,6 @@ namespace AgroBase.Models Variaveis.OperacaoEmAndamento.Parametros.DadosLeitura = new OperacaoParametrosDadosModel(); Variaveis.OperacaoEmAndamento.Sensoriamento = new OperacaoSensoriamentoLogModel(); - if (Variaveis.OperacaoEmAndamento.DispSen != null) - { - if (Variaveis.OperacaoEmAndamento.DispSen.Dados.ConfiguracaoSensorUltrassom == null) - { - Variaveis.OperacaoEmAndamento.DispSen.Dados.ConfiguracaoSensorUltrassom = UltrasonicA05Helper.CarregarConfiguracaoPadrao(ConfiguracaoSensorUltrassonico.NaoUtilizado); - } - - if (Variaveis.OperacaoEmAndamento.DispSen.Dados.Conectado) - { - Variaveis.OperacaoEmAndamento.DispSen.Dados.Sinaleiros.ForEach(x => x.Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(StatusOperacao.NaoIniciado)); - - Variaveis.OperacaoEmAndamento.DispSen.Dados.Sinaleiros.First(x => x.ID == (Modo == ModoOperacao.Manual ? "LEDMN" : "LEDAT")).Comportamento.statusLED = StatusLED.Aceso; - Variaveis.OperacaoEmAndamento.DispSen.Dados.Sinaleiros.First(x => x.ID == "LEDOP").Comportamento = VariaveisEquipamento.ComportamentoLedPorStatus(); - - //OperacaoCarregar.DispSen.Dados.Sinaleiros.ForEach(x => OperacaoCarregar.DispSen.AdicionarMensagemFila(OperacaoCarregar.DispSen.Dados.Modulo_ID, x.ProtocoloComando(), true, false)); - foreach (var Sinaleiro in Variaveis.OperacaoEmAndamento.DispSen.Dados.Sinaleiros) - { - GeneralJoystick.EnviarComandoSensoriamento(Sinaleiro.Componente, Sinaleiro.ID, Sinaleiro.Comportamento); - } - } - } - RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados(); @@ -886,19 +864,21 @@ namespace AgroBase.Models case T_Code.Atu: if (Variaveis.OperacaoEmAndamento.DispAtu != null) { - Variaveis.OperacaoEmAndamento.DispAtu.Dados.Sensores.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); - Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); - Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); - Variaveis.OperacaoEmAndamento.DispAtu.Dados.Servos.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); + var da = Variaveis.OperacaoEmAndamento.DispAtu.Dados; + da.Sensores.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); + da.BombasPressurizadoras.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); + da.BicosPulverizadores.ForEach(b => d.Add(b.ID, (b.Mandatorio, b.Comandar))); + da.Servos.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); } break; case T_Code.Sen: if (Variaveis.OperacaoEmAndamento.DispSen != null) { - Variaveis.OperacaoEmAndamento.DispSen.Dados.Sensores.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); - Variaveis.OperacaoEmAndamento.DispSen.Dados.Sinaleiros.ForEach(s => d.Add(s.ID, (true, true))); - Variaveis.OperacaoEmAndamento.DispSen.Dados.Servos.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); - Variaveis.OperacaoEmAndamento.DispSen.Dados.Reles.ForEach(r => d.Add(r.ID, (r.Mandatorio, r.Controlar))); + var ds = Variaveis.OperacaoEmAndamento.DispSen.Dados; + ds.Sensores.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Aferir))); + ds.Sinaleiros.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); + ds.Servos.ForEach(s => d.Add(s.ID, (s.Mandatorio, s.Controlar))); + ds.Reles.ForEach(r => d.Add(r.ID, (r.Mandatorio, r.Controlar))); } break; } @@ -926,23 +906,24 @@ namespace AgroBase.Models } break; case T_Code.Atu: + var da = Variaveis.OperacaoEmAndamento.DispAtu.Dados; foreach (var c in m.ComponentesEmUso) { - var s = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Sensores.FirstOrDefault(x => x.ID == c.Key); + var s = da.Sensores.FirstOrDefault(x => x.ID == c.Key); if (s != null) { s.Mandatorio = c.Value.Item1; s.Aferir = c.Value.Item2; continue; } - var bc = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.ID == c.Key); + var bc = da.BicosPulverizadores.FirstOrDefault(x => x.ID == c.Key); if (bc != null) { bc.Mandatorio = c.Value.Item1; bc.Comandar = c.Value.Item2; continue; } - var bo = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.ID == c.Key); + var bo = da.BombasPressurizadoras.FirstOrDefault(x => x.ID == c.Key); if (bo != null) { bo.Mandatorio = c.Value.Item1; @@ -952,29 +933,37 @@ namespace AgroBase.Models } break; case T_Code.Sen: + var ds = Variaveis.OperacaoEmAndamento.DispSen.Dados; foreach (var c in m.ComponentesEmUso) { - var s = Variaveis.OperacaoEmAndamento.DispSen.Dados.Sensores.FirstOrDefault(x => x.ID == c.Key); + var s = ds.Sensores.FirstOrDefault(x => x.ID == c.Key); if (s != null) { s.Mandatorio = c.Value.Item1; s.Aferir = c.Value.Item2; continue; } - var sv = Variaveis.OperacaoEmAndamento.DispSen.Dados.Servos.FirstOrDefault(x => x.ID == c.Key); + var sv = ds.Servos.FirstOrDefault(x => x.ID == c.Key); if (sv != null) { sv.Mandatorio = c.Value.Item1; sv.Controlar = c.Value.Item2; continue; } - var rl = Variaveis.OperacaoEmAndamento.DispSen.Dados.Reles.FirstOrDefault(x => x.ID == c.Key); + var rl = ds.Reles.FirstOrDefault(x => x.ID == c.Key); if (rl != null) { rl.Mandatorio = c.Value.Item1; rl.Controlar = c.Value.Item2; continue; } + var ld = ds.Sinaleiros.FirstOrDefault(x => x.ID == c.Key); + if (ld != null) + { + ld.Mandatorio = c.Value.Item1; + ld.Controlar = c.Value.Item2; + continue; + } } break; } @@ -1577,7 +1566,7 @@ namespace AgroBase.Models S_Code get_comp(string id) { - if (id == "") return S_Code.sMOD; + if (string.IsNullOrEmpty(id)) return S_Code.sMOD; var d_atu = Variaveis.OperacaoEmAndamento.DispAtu.Dados; if (d_atu.BicosPulverizadores.Any(x => x.ID == id)) return S_Code.sBIC; if (d_atu.BombasPressurizadoras.Any(x => x.ID == id)) return S_Code.sBMB; @@ -1613,6 +1602,7 @@ namespace AgroBase.Models { S_Code get_comp(string id) { + if (string.IsNullOrEmpty(id)) return S_Code.sMOD; var d_sen = Variaveis.OperacaoEmAndamento.DispSen.Dados; if (d_sen.Reles.Any(x => x.ID == id)) return S_Code.sRLE; if (d_sen.Servos.Any(x => x.ID == id)) return S_Code.sSRV; @@ -2329,6 +2319,7 @@ namespace AgroBase.Models double tmp_max = Math.Max(Variaveis.OperacaoEmAndamento.DadosPerformance?.GPU_temp ?? 0, Variaveis.OperacaoEmAndamento.DadosPerformance?.CPU_temp ?? 0); _DispMvd?.Dados?.AtualizarDadosFreio(); + _DispSen?.Dados?.AtualizarStatusSinaleiros(Variaveis.OperacaoEmAndamento.Modo, Variaveis.OperacaoEmAndamento.StatusAtual); _Cooler?.Atualizar(tmp_max, DateTime.Now); _Bateria?.AtualizarConsumo(_DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0); _Reservatorio?.AtualizarConsumo(_DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0, Variaveis.OperacaoEmAndamento.TempoDecorridoSegs); diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs index 36868ddce..d96ea2805 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs @@ -232,6 +232,8 @@ namespace AgroBase.Models.Operacoes ID_Num = x.ID_Num, Inicializado = x.Inicializado, Comportamento = x.Comportamento, + StatusLedId = x._StatusLedId, + StatusLed = x._StatusLed, UltimoComandoRespondido = x.UltimaLeitura }).ToList(), UltimoComandoRespondido = dSen.DadosLeitura.UltimoComandoRespondido @@ -469,6 +471,8 @@ namespace AgroBase.Models.Operacoes public int ID_Num { get; set; } public bool Inicializado { get; set; } public SensorSinaleiroComportamentoModel Comportamento { get; set; } + public int StatusLedId { get; set; } + public StatusLED StatusLed { get; set; } public DateTime UltimoComandoRespondido { get; set; } } diff --git a/AgroBase/AgroBase/Models/Variaveis.cs b/AgroBase/AgroBase/Models/Variaveis.cs index 82ef9402b..36732ad4e 100644 --- a/AgroBase/AgroBase/Models/Variaveis.cs +++ b/AgroBase/AgroBase/Models/Variaveis.cs @@ -310,88 +310,65 @@ namespace AgroBase.Models - public static SensorSinaleiroComportamentoModel ComportamentoLedPorStatus(StatusOperacao? _status = null) + public static SensorSinaleiroComportamentoModel ComportamentoLedPorStatus(StatusLED status_led = StatusLED.Apagado, StatusOperacao? status_operacao = null) { - if (_status == null) - { - _status = Variaveis.OperacaoEmAndamento.StatusAtual; - } - SensorSinaleiroComportamentoModel comportamento = new SensorSinaleiroComportamentoModel() { - statusLED = StatusLED.Apagado, + id = 99, + statusOperacao = status_operacao, + statusLED = status_led, QtdPiscadas = 0, TempoMs = 0, PausaMs = 0, }; - switch (_status) + if (status_operacao == null) return comportamento; + + comportamento.id = (int)((StatusOperacao)status_operacao); + + switch ((StatusOperacao)status_operacao) { case StatusOperacao.Parametrizando: { - comportamento = new SensorSinaleiroComportamentoModel() - { - statusLED = StatusLED.Piscando, - QtdPiscadas = 2, - TempoMs = 800, - PausaMs = 2000, - }; + comportamento.QtdPiscadas = 2; + comportamento.TempoMs = 800; + comportamento.PausaMs = 2000; break; } case StatusOperacao.NaoIniciado: case StatusOperacao.Concluido: { - comportamento = new SensorSinaleiroComportamentoModel() - { - statusLED = StatusLED.Piscando, - QtdPiscadas = 1, - TempoMs = 1000, - PausaMs = 2000, - }; + comportamento.QtdPiscadas = 1; + comportamento.TempoMs = 1000; + comportamento.PausaMs = 2000; break; } case StatusOperacao.Aguardando: { - comportamento = new SensorSinaleiroComportamentoModel() - { - statusLED = StatusLED.Piscando, - QtdPiscadas = 3, - TempoMs = 500, - PausaMs = 800, - }; + comportamento.QtdPiscadas = 3; + comportamento.TempoMs = 500; + comportamento.PausaMs = 800; break; } case StatusOperacao.Parado: { - comportamento = new SensorSinaleiroComportamentoModel() - { - statusLED = StatusLED.Piscando, - QtdPiscadas = 5, - TempoMs = 500, - PausaMs = 2000, - }; + comportamento.QtdPiscadas = 5; + comportamento.TempoMs = 500; + comportamento.PausaMs = 2000; break; } case StatusOperacao.EmAndamento: { - comportamento = new SensorSinaleiroComportamentoModel() - { - statusLED = StatusLED.Piscando, - QtdPiscadas = 1, - TempoMs = 500, - PausaMs = 1000, - }; + comportamento.QtdPiscadas = 1; + comportamento.TempoMs = 500; + comportamento.PausaMs = 1000; break; } case StatusOperacao.Calibrando: { - comportamento = new SensorSinaleiroComportamentoModel() - { - statusLED = StatusLED.Piscando, - QtdPiscadas = 2, - TempoMs = 500, - PausaMs = 800, - }; + comportamento.QtdPiscadas = 2; + comportamento.TempoMs = 500; + comportamento.PausaMs = 800; break; } } diff --git a/AgroBase/AgroBase/Services/CANService.cs b/AgroBase/AgroBase/Services/CANService.cs index 3df5969ed..1b02ed51a 100644 --- a/AgroBase/AgroBase/Services/CANService.cs +++ b/AgroBase/AgroBase/Services/CANService.cs @@ -169,6 +169,7 @@ namespace AgroBase.Services double FreqRx { get; set; } int ErrosCriticos { get; set; } double UltimoErroCritico { get; set; } + bool FilaLiberada { get; } } } \ No newline at end of file diff --git a/AgroBase/AgroBase/Services/CANServiceSerial.cs b/AgroBase/AgroBase/Services/CANServiceSerial.cs index f76d7d35e..269d5ee56 100644 --- a/AgroBase/AgroBase/Services/CANServiceSerial.cs +++ b/AgroBase/AgroBase/Services/CANServiceSerial.cs @@ -35,6 +35,21 @@ namespace AgroBase.Services private List Mensagens = new List(); private readonly object _LockMensagens = new object(); + public bool FilaLiberada + { + get + { + lock (_LockMensagens) + { + bool liberado = + Mensagens == null || + Mensagens.Count == 0 || + !Mensagens.Any(x => !x.Enviado && x.Momento >= DateTime.Now.AddSeconds(-10)); + return liberado; + } + } + } + public double UltimoTx { get; set; } = 0; private DateTime _ultimoTx = DateTime.MinValue; public double FreqTx { get; set; } = 0; diff --git a/AgroBase/AgroBase/Services/CANServiceWaveshare.cs b/AgroBase/AgroBase/Services/CANServiceWaveshare.cs index a379a8a63..387233710 100644 --- a/AgroBase/AgroBase/Services/CANServiceWaveshare.cs +++ b/AgroBase/AgroBase/Services/CANServiceWaveshare.cs @@ -35,6 +35,21 @@ namespace AgroBase.Services private List MensagensPendentes = new List(); private readonly object _LockMensagens = new object(); private bool DebugMode = false; + + public bool FilaLiberada + { + get + { + lock (_LockMensagens) + { + bool liberado = + MensagensPendentes == null || + MensagensPendentes.Count == 0 || + !MensagensPendentes.Any(x => !x.Enviado && x.Momento >= DateTime.Now.AddSeconds(-10)); + return liberado; + } + } + } public double UltimoTx { get; set; } = 0; private DateTime _ultimoTx = DateTime.MinValue; public double FreqTx { get; set; } = 0; diff --git a/AgroBase/AgroBase/Services/DispositivosService.cs b/AgroBase/AgroBase/Services/DispositivosService.cs index 1c337cf4e..35c488e29 100644 --- a/AgroBase/AgroBase/Services/DispositivosService.cs +++ b/AgroBase/AgroBase/Services/DispositivosService.cs @@ -149,6 +149,12 @@ namespace AgroBase.Comum if (Dados is SensoriamentoModel senModel && Dispositivo == T_Code.Sen) { clbDispositivos.Items.Clear(); + var Sinaleiros = senModel.Sinaleiros; + foreach (var Sinaleiro in Sinaleiros) + { + clbDispositivos.Items.Add(Sinaleiro.ID); + clbDispositivos.SetItemChecked(clbDispositivos.Items.Count - 1, Sinaleiro.Controlar); + } var Sensores = senModel.Sensores; foreach (var Sensor in Sensores) { @@ -327,6 +333,10 @@ namespace AgroBase.Comum { senModel.Servos.First(x => x.ID == Item.ToString()).Controlar = true; } + else if (senModel.Sinaleiros.Any(x => x.ID == Item.ToString())) + { + senModel.Sinaleiros.First(x => x.ID == Item.ToString()).Controlar = true; + } } } break; diff --git a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs index 5bc558d74..c9a6564be 100644 --- a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs @@ -309,6 +309,8 @@ namespace AgroBase.Services.Operadores //RedisService.SetObject(RedisService.ModKey(Enums.T_Code.Mov), string.Empty); //RedisService.SetObject(RedisService.ModKey(Enums.T_Code.Sen), string.Empty); + var dirAtivos = new List(); + var movAtivos = new List(); foreach (var mod in Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos) { int endereco_dir = mod.DirMotor._EnderecoCAN_Tx; @@ -327,8 +329,8 @@ namespace AgroBase.Services.Operadores ($"{endereco_dir}.sentido", mod.DirMotor.Sentido), ($"{endereco_dir}.sentido_sp", mod.DirMotor.Sentido_SP), ($"{endereco_dir}.sentido_real", mod.DirMotor.SentidoReal), - ($"{endereco_dir}.freq.io", mod.DirMotor.Leitura?.NumeroPulsos?.frequencia ?? 0), - ($"{endereco_dir}.freq.pulsos", mod.DirMotor.Leitura?.EntradaIN1?.frequencia ?? 0) + ($"{endereco_dir}.freq.pulsos", mod.DirMotor.Leitura?.NumeroPulsos?.frequencia ?? 0), + ($"{endereco_dir}.freq.io", mod.DirMotor.Leitura?.EntradaIN1?.frequencia ?? 0) ); int endereco_mov = mod.MovMotor._EnderecoCAN_Tx; @@ -355,7 +357,12 @@ namespace AgroBase.Services.Operadores ($"{endereco_mov}.freq.corrente_barramento", mod.MovMotor.Leitura?.CorrenteBarramento?.frequencia ?? 0), ($"{endereco_mov}.freq.temperatura", mod.MovMotor.Leitura?.Temperatura?.frequencia ?? 0) ); + + dirAtivos.Add(endereco_dir); + movAtivos.Add(endereco_mov); } + RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Dir), ($"ativos", dirAtivos.ToList())); + RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Mov), ($"ativos", movAtivos.ToList())); var DadosSen = Variaveis.OperacaoEmAndamento.DispSen.Dados; //Console.WriteLine("[HEALTH SEN] " + DadosSen.Conectado); @@ -365,6 +372,7 @@ namespace AgroBase.Services.Operadores ("freq_base", DadosSen.FrequenciaBase) ); var senSensoresAtualizados = new List<(string caminho, object valor)>(); + var senSensoresAtivos = new List(); foreach (var sensor in DadosSen.Sensores) { int tipo = (int)sensor.Componente; @@ -399,15 +407,19 @@ namespace AgroBase.Services.Operadores saude = saude ?? new { } }; + senSensoresAtivos.Add($"{tipo}.{id}"); senSensoresAtualizados.Add(($"{basePath}", sensorObj)); } + senSensoresAtualizados.Add(("sensores.ativos", senSensoresAtivos)); RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Sen), senSensoresAtualizados.ToArray()); var senServosAtualizados = new List<(string caminho, object valor)>(); + var senServosAtivos = new List(); foreach (var servo in DadosSen.Servos) { + int tipo = (int)servo.Componente; int id = servo.ID_Num; - string basePath = $"servos.{id}"; + string basePath = $"servos.{tipo}.{id}"; var saude = RedisService.GetField(RedisService.ModKey(Enums.T_Code.Sen), $"{basePath}.saude"); @@ -426,6 +438,7 @@ namespace AgroBase.Services.Operadores conectado = servo.Inicializado, id, label = servo.ID, + tipo, controlar = servo.Controlar, mandatorio = servo.Mandatorio, angulo_sp = servo._AnguloControle, @@ -434,15 +447,19 @@ namespace AgroBase.Services.Operadores saude = saude ?? new { } }; + senServosAtivos.Add($"{tipo}.{id}"); senServosAtualizados.Add(($"{basePath}", servoObj)); } + senServosAtualizados.Add(("servos.ativos", senServosAtivos)); RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Sen), senServosAtualizados.ToArray()); var senRelesAtualizados = new List<(string caminho, object valor)>(); + var senRelesAtivos = new List(); foreach (var rele in DadosSen.Reles) { + int tipo = (int)rele.Componente; int id = rele.ID_Num; - string basePath = $"reles.{id}"; + string basePath = $"reles.{tipo}.{id}"; var saude = RedisService.GetField(RedisService.ModKey(Enums.T_Code.Sen), $"{basePath}.saude"); @@ -461,6 +478,7 @@ namespace AgroBase.Services.Operadores conectado = rele.Inicializado, id, label = rele.ID, + tipo, controlar = rele.Controlar, mandatorio = rele.Mandatorio, dados, @@ -468,15 +486,19 @@ namespace AgroBase.Services.Operadores saude = saude ?? new { } }; + senRelesAtivos.Add($"{tipo}.{id}"); senRelesAtualizados.Add(($"{basePath}", releObj)); } + senRelesAtualizados.Add(("reles.ativos", senRelesAtivos)); RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Sen), senRelesAtualizados.ToArray()); var senLedsAtualizados = new List<(string caminho, object valor)>(); + var senLedsAtivos = new List(); foreach (var led in DadosSen.Sinaleiros) { + int tipo = (int)led.Componente; int id = led.ID_Num; - string basePath = $"sinaleiros.{id}"; + string basePath = $"sinaleiros.{tipo}.{id}"; var saude = RedisService.GetField(RedisService.ModKey(Enums.T_Code.Sen), $"{basePath}.saude"); @@ -495,15 +517,18 @@ namespace AgroBase.Services.Operadores conectado = led.Inicializado, id, label = led.ID, - controlar = true, - mandatorio = true, + tipo, + controlar = led.Controlar, + mandatorio = led.Mandatorio, dados, timestamp = agora, saude = saude ?? new { } }; + senLedsAtivos.Add($"{tipo}.{id}"); senLedsAtualizados.Add(($"{basePath}", ledObj)); } + senLedsAtualizados.Add(("sinaleiros.ativos", senLedsAtivos)); RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Sen), senLedsAtualizados.ToArray()); @@ -514,6 +539,7 @@ namespace AgroBase.Services.Operadores ("freq_base", DadosAtu.FrequenciaBase) ); var atuSensoresAtualizados = new List<(string caminho, object valor)>(); + var atuSensoresAtivos = new List(); foreach (var sensor in DadosAtu.Sensores) { int tipo = (int)sensor.Componente; @@ -548,11 +574,14 @@ namespace AgroBase.Services.Operadores saude = saude ?? new { } }; + atuSensoresAtivos.Add($"{tipo}.{id}"); atuSensoresAtualizados.Add(($"{basePath}", sensorObj)); } + atuSensoresAtualizados.Add(("sensores.ativos", atuSensoresAtivos)); RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Atu), atuSensoresAtualizados.ToArray()); var atuBicosAtualizados = new List<(string caminho, object valor)>(); + var atuBicosAtivos = new List(); foreach (var bico in DadosAtu.BicosPulverizadores) { int tipo = (int)bico.Componente; @@ -574,7 +603,7 @@ namespace AgroBase.Services.Operadores }) .ToList(); - var sensorObj = new + var bicoObj = new { conectado = bico.Inicializado, id, @@ -587,11 +616,14 @@ namespace AgroBase.Services.Operadores saude = saude ?? new { } }; - atuBicosAtualizados.Add(($"{basePath}", sensorObj)); + atuBicosAtualizados.Add(($"{basePath}", bicoObj)); + atuBicosAtivos.Add($"{tipo}.{id}"); } + atuBicosAtualizados.Add(("bicos.ativos", atuBicosAtivos)); RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Atu), atuBicosAtualizados.ToArray()); var atuBombasAtualizados = new List<(string caminho, object valor)>(); + var atuBombasAtivos = new List(); foreach (var bomba in DadosAtu.BombasPressurizadoras) { int tipo = (int)bomba.Componente; @@ -626,15 +658,19 @@ namespace AgroBase.Services.Operadores saude = saude ?? new { } }; + atuBombasAtivos.Add($"{tipo}.{id}"); atuBombasAtualizados.Add(($"{basePath}", sensorObj)); } + atuBombasAtualizados.Add(("bombas.ativos", atuBombasAtivos)); RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Atu), atuBombasAtualizados.ToArray()); var atuServosAtualizados = new List<(string caminho, object valor)>(); + var atuServosAtivos = new List(); foreach (var servo in DadosAtu.Servos) { + int tipo = (int)servo.Componente; int id = servo.ID_Num; - string basePath = $"servos.{id}"; + string basePath = $"servos.{tipo}.{id}"; var saude = RedisService.GetField(RedisService.ModKey(Enums.T_Code.Atu), $"{basePath}.saude"); @@ -653,6 +689,7 @@ namespace AgroBase.Services.Operadores conectado = servo.Inicializado, id, label = servo.ID, + tipo, controlar = servo.Controlar, mandatorio = servo.Mandatorio, angulo_sp = servo._AnguloControle, @@ -661,8 +698,10 @@ namespace AgroBase.Services.Operadores saude = saude ?? new { } }; + atuServosAtivos.Add($"{tipo}.{id}"); atuServosAtualizados.Add(($"{basePath}", servoObj)); } + atuServosAtualizados.Add(("servos.ativos", atuServosAtivos)); RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Atu), atuServosAtualizados.ToArray()); diff --git a/AgroBase/OperationControl/Windows/MainWindow.xaml b/AgroBase/OperationControl/Windows/MainWindow.xaml index 32ee7132d..a621ca700 100644 --- a/AgroBase/OperationControl/Windows/MainWindow.xaml +++ b/AgroBase/OperationControl/Windows/MainWindow.xaml @@ -216,9 +216,24 @@ + + + + +