diff --git a/AgroBase/AgroBase/AgroBase.csproj b/AgroBase/AgroBase/AgroBase.csproj index cffaa4171..b780ca09a 100644 --- a/AgroBase/AgroBase/AgroBase.csproj +++ b/AgroBase/AgroBase/AgroBase.csproj @@ -513,6 +513,7 @@ frmOperacao.cs + UserControl diff --git a/AgroBase/AgroBase/Forms/IHM/Controls/HmiAgitatorModeSelector.cs b/AgroBase/AgroBase/Forms/IHM/Controls/HmiAgitatorModeSelector.cs index 94d59c16a..3caaef83c 100644 --- a/AgroBase/AgroBase/Forms/IHM/Controls/HmiAgitatorModeSelector.cs +++ b/AgroBase/AgroBase/Forms/IHM/Controls/HmiAgitatorModeSelector.cs @@ -1,4 +1,5 @@ using AgroBase.Forms.IHM.Controls; +using AgroBase.Models; using System; using System.ComponentModel; using System.Drawing; @@ -13,7 +14,7 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls private readonly Button _btnContinuo; private readonly Button _btnIntermitente; - private string _selectedMode = "Continuo"; + private Enums.ModoAgitadorCalda _selectedMode = Enums.ModoAgitadorCalda.SemAgitacao; public event EventHandler SelectedModeChanged; @@ -50,9 +51,9 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls Controls.Add(layout); - _btnSemAgitacao.Click += delegate { SelectedMode = "SemAgitacao"; }; - _btnContinuo.Click += delegate { SelectedMode = "Continuo"; }; - _btnIntermitente.Click += delegate { SelectedMode = "Intermitente"; }; + _btnSemAgitacao.Click += delegate { SelectedMode = Enums.ModoAgitadorCalda.SemAgitacao; }; + _btnContinuo.Click += delegate { SelectedMode = Enums.ModoAgitadorCalda.Continuo; }; + _btnIntermitente.Click += delegate { SelectedMode = Enums.ModoAgitadorCalda.Intermitente; }; AtualizarAparencia(); } @@ -80,9 +81,9 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls private void AtualizarAparencia() { - AplicarEstado(_btnSemAgitacao, _selectedMode == "SemAgitacao"); - AplicarEstado(_btnContinuo, _selectedMode == "Continuo"); - AplicarEstado(_btnIntermitente, _selectedMode == "Intermitente"); + AplicarEstado(_btnSemAgitacao, _selectedMode == Enums.ModoAgitadorCalda.SemAgitacao); + AplicarEstado(_btnContinuo, _selectedMode == Enums.ModoAgitadorCalda.Continuo); + AplicarEstado(_btnIntermitente, _selectedMode == Enums.ModoAgitadorCalda.Intermitente); } private static void AplicarEstado(Button button, bool selecionado) @@ -103,24 +104,15 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls [Category("Dados")] [DefaultValue("Continuo")] - public string SelectedMode + public Enums.ModoAgitadorCalda SelectedMode { get { return _selectedMode; } set { - string novo; - - if (string.Equals(value, "SemAgitacao", StringComparison.OrdinalIgnoreCase)) - novo = "SemAgitacao"; - else if (string.Equals(value, "Intermitente", StringComparison.OrdinalIgnoreCase)) - novo = "Intermitente"; - else - novo = "Continuo"; - - if (_selectedMode == novo) + if (_selectedMode == value) return; - _selectedMode = novo; + _selectedMode = value; AtualizarAparencia(); if (SelectedModeChanged != null) diff --git a/AgroBase/AgroBase/Forms/IHM/Controls/HmiModeSelector.cs b/AgroBase/AgroBase/Forms/IHM/Controls/HmiModeSelector.cs index c1f283de6..ea8bd95d1 100644 --- a/AgroBase/AgroBase/Forms/IHM/Controls/HmiModeSelector.cs +++ b/AgroBase/AgroBase/Forms/IHM/Controls/HmiModeSelector.cs @@ -1,4 +1,5 @@ using AgroBase.Forms.IHM.Controls; +using AgroBase.Models; using System; using System.ComponentModel; using System.Drawing; @@ -11,7 +12,7 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls { private readonly Button _btnMpc; private readonly Button _btnPid; - private string _selectedMode = "MPC"; + private Enums.TiposControladorDirecional _selectedMode = Enums.TiposControladorDirecional.MPC; public event EventHandler SelectedModeChanged; @@ -60,8 +61,8 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls Controls.Add(root); - _btnMpc.Click += delegate { SelectedMode = "MPC"; }; - _btnPid.Click += delegate { SelectedMode = "PID"; }; + _btnMpc.Click += delegate { SelectedMode = Enums.TiposControladorDirecional.MPC; }; + _btnPid.Click += delegate { SelectedMode = Enums.TiposControladorDirecional.PID; }; AtualizarAparencia(); } @@ -90,8 +91,8 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls private void AtualizarAparencia() { - AplicarEstado(_btnMpc, _selectedMode == "MPC"); - AplicarEstado(_btnPid, _selectedMode == "PID"); + AplicarEstado(_btnMpc, _selectedMode == Enums.TiposControladorDirecional.MPC); + AplicarEstado(_btnPid, _selectedMode == Enums.TiposControladorDirecional.PID); } private static void AplicarEstado(Button button, bool selected) @@ -112,19 +113,15 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls [Category("Dados")] [DefaultValue("MPC")] - public string SelectedMode + public Enums.TiposControladorDirecional SelectedMode { get { return _selectedMode; } set { - string novo = string.Equals(value, "PID", StringComparison.OrdinalIgnoreCase) - ? "PID" - : "MPC"; - - if (_selectedMode == novo) + if (_selectedMode == value) return; - _selectedMode = novo; + _selectedMode = value; AtualizarAparencia(); if (SelectedModeChanged != null) diff --git a/AgroBase/AgroBase/Forms/IHM/Controls/HmiNavigationMetric.cs b/AgroBase/AgroBase/Forms/IHM/Controls/HmiNavigationMetric.cs index dc0b5877e..8957b38af 100644 --- a/AgroBase/AgroBase/Forms/IHM/Controls/HmiNavigationMetric.cs +++ b/AgroBase/AgroBase/Forms/IHM/Controls/HmiNavigationMetric.cs @@ -15,6 +15,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao DoubleBuffered = true; BackColor = HmiTheme.Surface; Height = 24; + Width = 72; MinimumSize = new Size(105, 22); Margin = Padding.Empty; Padding = new Padding(2, 0, 2, 1); @@ -77,5 +78,13 @@ namespace AgroBase.Forms.IHM.Controls.Operacao get { return _lblValor.ForeColor; } set { _lblValor.ForeColor = value; } } + + [Category("Layout")] + [DefaultValue(72)] + public int LarguraValor + { + get { return _lblValor.Width; } + set { _lblValor.Width = System.Math.Max(35, value); } + } } } diff --git a/AgroBase/AgroBase/Forms/IHM/Controls/HmiNozzleCard.cs b/AgroBase/AgroBase/Forms/IHM/Controls/HmiNozzleCard.cs index e8c205bd8..cab262f02 100644 --- a/AgroBase/AgroBase/Forms/IHM/Controls/HmiNozzleCard.cs +++ b/AgroBase/AgroBase/Forms/IHM/Controls/HmiNozzleCard.cs @@ -27,12 +27,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao public HmiNozzleCard() { - SetStyle( - ControlStyles.AllPaintingInWmPaint | - ControlStyles.UserPaint | - ControlStyles.OptimizedDoubleBuffer | - ControlStyles.ResizeRedraw, - true); + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true); DoubleBuffered = true; BackColor = HmiTheme.SurfaceRaised; @@ -109,12 +104,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao _nozzleGlyph.Click += HandleClick; } - private static Label MakeLabel( - string text, - float size, - FontStyle style, - Color color, - ContentAlignment align) + private static Label MakeLabel(string text, float size, FontStyle style, Color color, ContentAlignment align) { return new Label { @@ -146,50 +136,16 @@ namespace AgroBase.Forms.IHM.Controls.Operacao e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; - Color border = GetStateColor(_state); + Color border = FuncoesIHM.CorPorStatusModulo(_state); - using (Pen glow = new Pen( - Color.FromArgb(45, border.R, border.G, border.B), - 4F)) + using (Pen glow = new Pen(Color.FromArgb(45, border.R, border.G, border.B), 4F)) { - e.Graphics.DrawRectangle( - glow, - 2, - 2, - Math.Max(1, Width - 5), - Math.Max(1, Height - 5)); + e.Graphics.DrawRectangle(glow, 2, 2, Math.Max(1, Width - 5), Math.Max(1, Height - 5)); } using (Pen pen = new Pen(border, 1.3F)) { - e.Graphics.DrawRectangle( - pen, - 0, - 0, - Math.Max(1, Width - 1), - Math.Max(1, Height - 1)); - } - } - - private static Color GetStateColor(StatusModulo state) - { - switch (state) - { - case StatusModulo.Desconectado: - return HmiTheme.TextMuted; - - case StatusModulo.Conectado: - return HmiTheme.Info; - - case StatusModulo.Falha: - return HmiTheme.Danger; - - case StatusModulo.Alerta: - return HmiTheme.Warning; - - case StatusModulo.Operante: - default: - return HmiTheme.Success; + e.Graphics.DrawRectangle(pen, 0, 0, Math.Max(1, Width - 1), Math.Max(1, Height - 1)); } } diff --git a/AgroBase/AgroBase/Forms/IHM/Controls/HmiWheelStatusCard.cs b/AgroBase/AgroBase/Forms/IHM/Controls/HmiWheelStatusCard.cs index e0e6e9481..580e88fe5 100644 --- a/AgroBase/AgroBase/Forms/IHM/Controls/HmiWheelStatusCard.cs +++ b/AgroBase/AgroBase/Forms/IHM/Controls/HmiWheelStatusCard.cs @@ -11,11 +11,13 @@ namespace AgroBase.Forms.IHM.Controls.Operacao { private readonly Label _lblTitulo; + private readonly Label _lblDirTitulo; private readonly CheckBox _chkDir; private readonly Label _lblDirSp; private readonly Label _lblDirAtual; private readonly Label _lblDirStatus; + private readonly Label _lblMovTitulo; private readonly CheckBox _chkMov; private readonly Label _lblMovSp; private readonly Label _lblMovAtual; @@ -25,13 +27,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao public HmiWheelStatusCard() { - SetStyle( - ControlStyles.AllPaintingInWmPaint | - ControlStyles.UserPaint | - ControlStyles.OptimizedDoubleBuffer | - ControlStyles.ResizeRedraw, - true - ); + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true); DoubleBuffered = true; BackColor = HmiTheme.SurfaceRaised; @@ -50,26 +46,11 @@ namespace AgroBase.Forms.IHM.Controls.Operacao Padding = Padding.Empty }; - root.ColumnStyles.Add( - new ColumnStyle(SizeType.Percent, 100F) - ); - - // Título pequeno, liberando espaço para os dados. - root.RowStyles.Add( - new RowStyle(SizeType.Absolute, 18F) - ); - - root.RowStyles.Add( - new RowStyle(SizeType.Absolute, 1F) - ); - - root.RowStyles.Add( - new RowStyle(SizeType.Percent, 50F) - ); - - root.RowStyles.Add( - new RowStyle(SizeType.Percent, 50F) - ); + root.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); + root.RowStyles.Add(new RowStyle(SizeType.Absolute, 18F)); + root.RowStyles.Add(new RowStyle(SizeType.Absolute, 1F)); + root.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); + root.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); _lblTitulo = new Label { @@ -81,11 +62,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao BackColor = Color.FromArgb(28, 34, 38), ForeColor = HmiTheme.Text, - Font = new Font( - "Segoe UI", - 7.8F, - FontStyle.Bold - ), + Font = new Font("Segoe UI", 7.8F, FontStyle.Bold), Text = "EF", TextAlign = ContentAlignment.MiddleCenter, @@ -101,7 +78,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao Margin = Padding.Empty }; - var pnlDir = CriarBloco( + (Panel pnlDir, Label lblDir) = CriarBloco( "DIR", HmiTheme.Manual, out _chkDir, @@ -110,7 +87,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao out _lblDirStatus ); - var pnlMov = CriarBloco( + (Panel pnlMov, Label lblMov) = CriarBloco( "MOV", HmiTheme.Info, out _chkMov, @@ -119,11 +96,13 @@ namespace AgroBase.Forms.IHM.Controls.Operacao out _lblMovStatus ); + _lblDirTitulo = lblDir; _lblDirSp.Text = "SP +0,0°"; _lblDirAtual.Text = "AT +0,0°"; _lblDirStatus.Text = "Parado"; _lblDirStatus.ForeColor = HmiTheme.Success; + _lblMovTitulo = lblMov; _lblMovSp.Text = "SP 0 rpm"; _lblMovAtual.Text = "AT 0 rpm"; _lblMovStatus.Text = "Sem freio"; @@ -142,13 +121,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao _chkMov.BringToFront(); } - private static Panel CriarBloco( - string titulo, - Color corTitulo, - out CheckBox check, - out Label lblSp, - out Label lblAtual, - out Label lblStatus) + private static (Panel, Label) CriarBloco(string titulo, Color corTitulo, out CheckBox check, out Label lblSp, out Label lblAtual, out Label lblStatus) { var panel = new Panel { @@ -168,25 +141,11 @@ namespace AgroBase.Forms.IHM.Controls.Operacao Padding = Padding.Empty }; - layout.ColumnStyles.Add( - new ColumnStyle(SizeType.Percent, 100F) - ); - - layout.RowStyles.Add( - new RowStyle(SizeType.Absolute, 18F) - ); - - layout.RowStyles.Add( - new RowStyle(SizeType.Percent, 30F) - ); - - layout.RowStyles.Add( - new RowStyle(SizeType.Percent, 30F) - ); - - layout.RowStyles.Add( - new RowStyle(SizeType.Percent, 40F) - ); + layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); + layout.RowStyles.Add(new RowStyle(SizeType.Absolute, 18F)); + layout.RowStyles.Add(new RowStyle(SizeType.Percent, 30F)); + layout.RowStyles.Add(new RowStyle(SizeType.Percent, 30F)); + layout.RowStyles.Add(new RowStyle(SizeType.Percent, 40F)); var header = new Panel { @@ -203,11 +162,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao BackColor = Color.Transparent, ForeColor = corTitulo, - Font = new Font( - "Segoe UI", - 6.6F, - FontStyle.Bold - ), + Font = new Font("Segoe UI", 6.6F, FontStyle.Bold), Text = titulo, TextAlign = ContentAlignment.MiddleLeft, @@ -231,11 +186,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao lblAtual = CriarLabelDado("AT 0"); lblStatus = CriarLabelDado("Parado"); - lblStatus.Font = new Font( - "Segoe UI", - 5.8F, - FontStyle.Bold - ); + lblStatus.Font = new Font("Segoe UI", 5.8F, FontStyle.Bold); layout.Controls.Add(header, 0, 0); layout.Controls.Add(lblSp, 0, 1); @@ -244,7 +195,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao panel.Controls.Add(layout); - return panel; + return (panel, lblTitulo); } private static Label CriarLabelDado(string texto) @@ -333,20 +284,24 @@ namespace AgroBase.Forms.IHM.Controls.Operacao public void AtualizarDados( bool dir_em_uso, + StatusModulo dir_status, double dir_ang_sp, double dir_ang_at, Sentido dir_sentido, bool mov_em_uso, + StatusModulo mov_status, double mov_vel_sp, double mov_vel_at, bool mov_freio ) { + _lblDirTitulo.ForeColor = FuncoesIHM.CorPorStatusModulo(dir_status); CheckDir.Checked = dir_em_uso; DirecionalSp = $"{dir_ang_sp}"; DirecionalAtual = $"{dir_ang_at}"; StatusDirecional = $"{dir_sentido}"; + _lblMovTitulo.ForeColor = FuncoesIHM.CorPorStatusModulo(mov_status); CheckMov.Checked = mov_em_uso; MovimentoSp = $"{mov_vel_sp}"; MovimentoAtual = $"{mov_vel_at}"; diff --git a/AgroBase/AgroBase/Forms/IHM/FuncoesIHM.cs b/AgroBase/AgroBase/Forms/IHM/FuncoesIHM.cs new file mode 100644 index 000000000..b9fbf3183 --- /dev/null +++ b/AgroBase/AgroBase/Forms/IHM/FuncoesIHM.cs @@ -0,0 +1,355 @@ +using AgroBase.Forms.IHM.Controls; +using AgroBase.Models; +using System; +using System.Drawing; +using static AgroBase.Models.Enums; + +namespace AgroBase.Forms.IHM +{ + public class FuncoesIHM + { + public static Color MisturarCores(Color baseColor, Color accentColor, float pesoAccent) + { + pesoAccent = Math.Max(0F, Math.Min(1F, pesoAccent)); + + float pesoBase = 1F - pesoAccent; + + return Color.FromArgb( + (int)(baseColor.R * pesoBase + accentColor.R * pesoAccent), + (int)(baseColor.G * pesoBase + accentColor.G * pesoAccent), + (int)(baseColor.B * pesoBase + accentColor.B * pesoAccent) + ); + } + + public static Color CorPorPercentual(double percentual) + { + percentual = Limitar(percentual, 0, 100); + + if (percentual <= 50) + { + double fator = percentual / 50.0; + + return InterpolarCor(HmiTheme.Danger, HmiTheme.Warning, fator); + } + + double fatorVerde = (percentual - 50) / 50.0; + + return InterpolarCor(HmiTheme.Warning, HmiTheme.Success, fatorVerde); + } + + public static Color CorPorValorESaude(double valor, double saude) + { + double notaFinal = Math.Min(Limitar(valor, 0, 100), Limitar(saude, 0, 100)); + + return CorPorPercentual(notaFinal); + } + + public static Color CorTemperatura(double temperatura, double saudeModulo) + { + Color corTemperatura; + + if (temperatura <= 45) + { + corTemperatura = HmiTheme.Success; + } + else if (temperatura <= 60) + { + double fator = (temperatura - 45) / (60 - 45); + + corTemperatura = InterpolarCor(HmiTheme.Success, HmiTheme.Warning, fator); + } + else if (temperatura <= 75) + { + double fator = (temperatura - 60) / (75 - 60); + + corTemperatura = InterpolarCor(HmiTheme.Warning, HmiTheme.Danger, fator); + } + else + { + corTemperatura = HmiTheme.Danger; + } + + Color corSaude = CorPorPercentual(saudeModulo); + + /* + * Se a saúde estiver muito baixa, + * ela prevalece sobre a temperatura. + */ + if (saudeModulo < 40) + return corSaude; + + return corTemperatura; + } + + public static Color CorDistanciaBase(double distanciaMetros, double distanciaMaximaMetros) + { + if (double.IsNaN(distanciaMetros) || double.IsInfinity(distanciaMetros) || distanciaMetros < 0) + { + return HmiTheme.Danger; + } + + double percentualSaudavel = 100 - (distanciaMetros / distanciaMaximaMetros * 100); + + return CorPorPercentual(percentualSaudavel); + } + + public static Color InterpolarCor(Color inicial, Color final, double fator) + { + fator = Limitar(fator, 0, 1); + + int r = (int)Math.Round(inicial.R + (final.R - inicial.R) * fator); + + int g = (int)Math.Round(inicial.G + (final.G - inicial.G) * fator); + + int b = (int)Math.Round(inicial.B + (final.B - inicial.B) * fator); + + return Color.FromArgb(r, g, b); + } + + public static Color CorPorStatusModulo(StatusModulo state) + { + switch (state) + { + case StatusModulo.Desconectado: + return HmiTheme.TextMuted; + + case StatusModulo.Conectado: + return HmiTheme.Info; + + case StatusModulo.Falha: + return HmiTheme.Danger; + + case StatusModulo.Alerta: + return HmiTheme.Warning; + + case StatusModulo.Operante: + default: + return HmiTheme.Success; + } + } + + public static Color CorPorAutonomia(double distanciaCapaz, double distanciaNecessaria, double limiar) + { + StatusModulo status = CalcularStatusAutonomiaCorredor(distanciaCapaz, distanciaNecessaria, limiar); + switch (status) + { + case StatusModulo.Operante: + return HmiTheme.Success; + case StatusModulo.Alerta: + return HmiTheme.Warning; + case StatusModulo.Falha: + return HmiTheme.Danger; + default: + return HmiTheme.Disabled; + } + } + + public static Color CorPorErroNumerico(double atual, double sp, double limiarWarning, double limiarDanger) + { + double erro = Math.Abs(atual - sp); + + if (erro >= Math.Abs(limiarDanger)) + return HmiTheme.Danger; + + if (erro >= Math.Abs(limiarWarning)) + return HmiTheme.Warning; + + return HmiTheme.Success; + } + + public static Color CorPorErroAngular(double atual, double sp, double limiarWarning, double limiarDanger) + { + double erro = Math.Abs(CalcularErroAngular(atual, sp)); + + if (erro >= Math.Abs(limiarDanger)) + return HmiTheme.Danger; + + if (erro >= Math.Abs(limiarWarning)) + return HmiTheme.Warning; + + return HmiTheme.Success; + } + + + public static double NotaQualidadeGnss(TiposCorrecaoGPS qualidade) + { + switch (qualidade) + { + case TiposCorrecaoGPS.RTKFixo: + return 100; + + case TiposCorrecaoGPS.BaseFix: + return 100; + + case TiposCorrecaoGPS.RTKFlutuante: + return 78; + + case TiposCorrecaoGPS.PPS: + return 65; + + case TiposCorrecaoGPS.DGPS: + return 58; + + case TiposCorrecaoGPS.DeadReckoing: + return 35; + + case TiposCorrecaoGPS.Autonomo: + return 22; + + case TiposCorrecaoGPS.SemCorrecao: + default: + return 0; + } + } + + public static double NotaPrecisaoGnss(double precisaoCm) + { + if (precisaoCm <= 2) + return 100; + + if (precisaoCm <= 5) + return InterpolarValor(precisaoCm, 2, 5, 100, 90); + + if (precisaoCm <= 10) + return InterpolarValor(precisaoCm, 5, 10, 90, 75); + + if (precisaoCm <= 30) + return InterpolarValor(precisaoCm, 10, 30, 75, 50); + + if (precisaoCm <= 100) + return InterpolarValor(precisaoCm, 30, 100, 50, 20); + + return 5; + } + + public static double CalcularNotaGnss(TiposCorrecaoGPS qualidade, double precisaoCm, double saudeModulo) + { + double notaFix = NotaQualidadeGnss(qualidade); + + double notaPrecisao = NotaPrecisaoGnss(precisaoCm); + + /* + * O pior dos três critérios define a cor. + * + * RTK Fixo com saúde ruim não fica verde. + * Saúde boa com modo autônomo também não. + */ + return Math.Min(notaFix, Math.Min(notaPrecisao, Limitar(saudeModulo, 0, 100))); + } + + public static StatusModulo CalcularStatusAutonomiaCorredor(double distanciaCapaz, double distanciaNecessaria, double limiar) + { + StatusModulo status = + distanciaNecessaria > (distanciaCapaz + limiar) ? StatusModulo.Operante : + distanciaNecessaria > (distanciaCapaz - limiar) ? StatusModulo.Alerta : + StatusModulo.Falha; + return status; + } + + public static double CalcularErroAngular(double atual, double sp) + { + double erro = (atual - sp) % 360.0; + + if (erro > 180.0) + erro -= 360.0; + else if (erro < -180.0) + erro += 360.0; + + return erro; + } + + + public static string FormatarQualidadeGnss(TiposCorrecaoGPS qualidade) + { + switch (qualidade) + { + case Enums.TiposCorrecaoGPS.SemCorrecao: + return "Sem correção"; + + case Enums.TiposCorrecaoGPS.Autonomo: + return "Autônomo"; + + case Enums.TiposCorrecaoGPS.DGPS: + return "DGPS"; + + case Enums.TiposCorrecaoGPS.PPS: + return "PPS"; + + case Enums.TiposCorrecaoGPS.RTKFixo: + return "RTK Fixo"; + + case Enums.TiposCorrecaoGPS.RTKFlutuante: + return "RTK Flutuante"; + + case Enums.TiposCorrecaoGPS.DeadReckoing: + return "Dead Reckoning"; + + case Enums.TiposCorrecaoGPS.BaseFix: + return "Base Fix"; + + default: + return "Desconhecido"; + } + } + + public static string FormatarDistancia(double distanciaMetros) + { + if (double.IsNaN(distanciaMetros) || double.IsInfinity(distanciaMetros) || distanciaMetros < 0) + { + return "Indisponível"; + } + + if (distanciaMetros >= 1000) + { + return $"{distanciaMetros / 1000.0:0.00} km"; + } + + return $"{distanciaMetros:0.0} m"; + } + + public static string FormatarTempo(TimeSpan tempo) + { + if (tempo < TimeSpan.Zero) + tempo = TimeSpan.Zero; + + int horasTotais = (int)tempo.TotalHours; + + return string.Format( + "{0:00}:{1:00}:{2:00}", + horasTotais, + tempo.Minutes, + tempo.Seconds + ); + } + + + + public static double InterpolarValor(double valor, double origemMinima, double origemMaxima, double destinoInicial, double destinoFinal) + { + if (origemMaxima <= origemMinima) + return destinoInicial; + + double fator = (valor - origemMinima) / (origemMaxima - origemMinima); + + fator = Limitar(fator, 0, 1); + + return destinoInicial + (destinoFinal - destinoInicial) * fator; + } + + public static double Limitar(double valor, double minimo, double maximo) + { + return Math.Max(minimo, Math.Min(maximo, valor)); + } + + + + public static void AplicarEstadoPainel(HmiRoundedPanel panel, Color color) + { + panel.BorderColor = color; + panel.Invalidate(); + } + + + + } +} diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosAtuador.Designer.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosAtuador.Designer.cs index 43b48e431..9d6ab6dcc 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosAtuador.Designer.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosAtuador.Designer.cs @@ -1,4 +1,6 @@ -namespace AgroBase.Forms.IHM.Operacao.Parametros +using AgroBase.Models; + +namespace AgroBase.Forms.IHM.Operacao.Parametros { partial class ucParametrosAtuador { @@ -106,7 +108,7 @@ this.seletorModoAgitador.Margin = new System.Windows.Forms.Padding(0, 3, 0, 5); this.seletorModoAgitador.MinimumSize = new System.Drawing.Size(0, 40); this.seletorModoAgitador.Name = "seletorModoAgitador"; - this.seletorModoAgitador.SelectedMode = "Continuo"; + this.seletorModoAgitador.SelectedMode = Enums.ModoAgitadorCalda.SemAgitacao; this.seletorModoAgitador.Size = new System.Drawing.Size(282, 42); this.seletorModoAgitador.TabIndex = 2; // diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosAtuador.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosAtuador.cs index 3ae00ed89..3b5eac449 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosAtuador.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosAtuador.cs @@ -1,36 +1,20 @@ -using System; +using AgroBase.Models; +using System; using System.Windows.Forms; namespace AgroBase.Forms.IHM.Operacao.Parametros { public partial class ucParametrosAtuador : UserControl { - public event EventHandler ParametrosAlterados; + private OperacaoModel op; + private bool _carregandoDados; public ucParametrosAtuador() { InitializeComponent(); - ConfigurarEstadoInicial(); VincularEventos(); } - private void ConfigurarEstadoInicial() - { - seletorModoAgitador.SelectedMode = "Continuo"; - - paramKp.Value = 1.00M; - paramKi.Value = 0.10M; - paramKd.Value = 0.00M; - - paramBicosEmUso.Value = 7M; - paramPressaoLinha.Value = 18M; - - paramInicioTela.Value = 85M; - paramAlturaArea.Value = 15M; - paramErvasOn.Value = 25M; - paramErvasOff.Value = 15M; - } - private void VincularEventos() { seletorModoAgitador.SelectedModeChanged += Controle_Alterado; @@ -47,70 +31,63 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros paramErvasOff.ValueChanged += Controle_Alterado; } + public void DefinirOperacao(OperacaoModel operacao) + { + op = operacao; + CarregarDadosTela(); + } + + private void CarregarDadosTela() + { + try + { + var parametros = op?.Parametros?.Controle; + var agitador = op?.DispAtu?.Dados?.AgitadorDeCalda?.Controle; + + seletorModoAgitador.SelectedMode = parametros?.AtuAgitadorModo ?? Enums.ModoAgitadorCalda.SemAgitacao; + + paramKp.Value = (decimal)(agitador?.Kp ?? 0); + paramKi.Value = (decimal)(agitador?.Ki ?? 0); + paramKd.Value = (decimal)(agitador?.Kd ?? 0); + + paramBicosEmUso.Value = op?.Parametros?.QtdBicos ?? 0; + paramPressaoLinha.Value = (decimal)(parametros?.AtuPressaoLinha ?? 0); + + paramInicioTela.Value = (decimal)(parametros?.AtuPercentualInicioPulverizacao ?? 0); + paramAlturaArea.Value = (decimal)(parametros?.AtuAlturaAreaPulverizacao ?? 0); + paramErvasOn.Value = (decimal)(parametros?.AtuPercentualErvasBicoOn ?? 0); + paramErvasOff.Value = (decimal)(parametros?.AtuPercentualErvasBicoOff ?? 0); + } + finally + { + _carregandoDados = false; + } + } + private void Controle_Alterado(object sender, EventArgs e) { - if (ParametrosAlterados != null) - ParametrosAlterados(this, EventArgs.Empty); - } + if (_carregandoDados) + return; - public string ModoAgitador - { - get { return seletorModoAgitador.SelectedMode; } - set { seletorModoAgitador.SelectedMode = value; } - } + var parametros = op?.Parametros?.Controle; + var agitador = op?.DispAtu?.Dados?.AgitadorDeCalda?.Controle; - public decimal KpAgitador - { - get { return paramKp.Value; } - set { paramKp.Value = value; } - } + if (parametros == null) + return; - public decimal KiAgitador - { - get { return paramKi.Value; } - set { paramKi.Value = value; } - } + parametros.AtuAgitadorModo = seletorModoAgitador.SelectedMode; - public decimal KdAgitador - { - get { return paramKd.Value; } - set { paramKd.Value = value; } - } + agitador.Kp = (double)paramKp.Value; + agitador.Ki = (double)paramKi.Value; + agitador.Kd = (double)paramKd.Value; - public int QuantidadeBicosEmUso - { - get { return Convert.ToInt32(paramBicosEmUso.Value); } - set { paramBicosEmUso.Value = value; } - } + op.Parametros.QtdBicos = (int)paramBicosEmUso.Value; + parametros.AtuPressaoLinha = (double)paramPressaoLinha.Value; - public decimal PressaoLinhaPsi - { - get { return paramPressaoLinha.Value; } - set { paramPressaoLinha.Value = value; } - } - - public int PercentualInicioTela - { - get { return Convert.ToInt32(paramInicioTela.Value); } - set { paramInicioTela.Value = value; } - } - - public int PercentualAlturaArea - { - get { return Convert.ToInt32(paramAlturaArea.Value); } - set { paramAlturaArea.Value = value; } - } - - public decimal PercentualErvasOn - { - get { return paramErvasOn.Value; } - set { paramErvasOn.Value = value; } - } - - public decimal PercentualErvasOff - { - get { return paramErvasOff.Value; } - set { paramErvasOff.Value = value; } + parametros.AtuPercentualInicioPulverizacao = (double)paramInicioTela.Value; + parametros.AtuAlturaAreaPulverizacao = (double)paramAlturaArea.Value; + parametros.AtuPercentualErvasBicoOn = (double)paramErvasOn.Value; + parametros.AtuPercentualErvasBicoOff = (double)paramErvasOff.Value; } } } diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosDirecional.Designer.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosDirecional.Designer.cs index f86d086e5..f42b05121 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosDirecional.Designer.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosDirecional.Designer.cs @@ -1,4 +1,6 @@ -namespace AgroBase.Forms.IHM.Operacao.Parametros +using AgroBase.Models; + +namespace AgroBase.Forms.IHM.Operacao.Parametros { partial class ucParametrosDirecional { @@ -180,7 +182,7 @@ this.seletorModoControle.Dock = System.Windows.Forms.DockStyle.Fill; this.seletorModoControle.Margin = new System.Windows.Forms.Padding(0, 1, 3, 0); this.seletorModoControle.MinimumSize = System.Drawing.Size.Empty; - this.seletorModoControle.SelectedMode = "MPC"; + this.seletorModoControle.SelectedMode = Enums.TiposControladorDirecional.MPC; this.parametroHorizonte.Dock = System.Windows.Forms.DockStyle.Fill; this.parametroHorizonte.Margin = new System.Windows.Forms.Padding(3, 1, 3, 0); diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosDirecional.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosDirecional.cs index 97cca2030..9f1de6c35 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosDirecional.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosDirecional.cs @@ -1,38 +1,20 @@ -using System; +using AgroBase.Models; +using System; using System.Windows.Forms; namespace AgroBase.Forms.IHM.Operacao.Parametros { public partial class ucParametrosDirecional : UserControl { - public event EventHandler ParametrosAlterados; + private OperacaoModel op; + private bool _carregandoDados; public ucParametrosDirecional() { InitializeComponent(); - ConfigurarEstadoInicial(); VincularEventos(); } - private void ConfigurarEstadoInicial() - { - checkDirecionalAutomatico.Checked = true; - checkAssistidoSonar.Checked = true; - checkAssistidoImu.Checked = true; - checkImuPrefereArco.Checked = false; - - sliderAnguloMaximo.Value = 45; - sliderAnguloMaximo.VelocidadeMaximaKmh = 0D; - - sliderVelocidadeDirecional.Value = 60; - sliderVelocidadeDirecional.VelocidadeMaximaKmh = 0D; - - seletorModoControle.SelectedMode = "MPC"; - - parametroHorizonte.Value = 4M; - parametroDistanciaSaida.Value = 5M; - } - private void VincularEventos() { checkDirecionalAutomatico.CheckedChanged += Controle_Alterado; @@ -48,64 +30,63 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros parametroDistanciaSaida.ValueChanged += Controle_Alterado; } + public void DefinirOperacao(OperacaoModel operacao) + { + op = operacao; + CarregarDadosTela(); + } + + private void CarregarDadosTela() + { + _carregandoDados = true; + + try + { + var parametros = op?.Parametros?.Controle; + + checkDirecionalAutomatico.Checked = parametros?.DirecionalAutomatico ?? false; + checkAssistidoSonar.Checked = parametros?.DirAuxilioSonar ?? false; + checkAssistidoImu.Checked = parametros?.ImuAuxilioDirecional ?? false; + checkImuPrefereArco.Checked = parametros?.ImuDirecionalPreferirArco ?? false; + + sliderAnguloMaximo.Value = parametros?.DirAnguloMaximo ?? 0; + + sliderVelocidadeDirecional.Value = (int)(parametros?.DirVelocidadeMovimento ?? 0); + + seletorModoControle.SelectedMode = parametros?.DirTipoMovimento ?? Enums.TiposControladorDirecional.MPC; + + parametroHorizonte.Value = (decimal)(parametros?.MpcHorizonte ?? 0); + parametroDistanciaSaida.Value = (decimal)(parametros?.DistanciaManobra ?? 0); + } + finally + { + _carregandoDados = false; + } + } + private void Controle_Alterado(object sender, EventArgs e) { - if (ParametrosAlterados != null) - ParametrosAlterados(this, EventArgs.Empty); - } + if (_carregandoDados) + return; - public bool DirecionalAutomatico - { - get { return checkDirecionalAutomatico.Checked; } - set { checkDirecionalAutomatico.Checked = value; } - } + var parametros = op?.Parametros?.Controle; - public bool AssistidoPorSonar - { - get { return checkAssistidoSonar.Checked; } - set { checkAssistidoSonar.Checked = value; } - } + if (parametros == null) + return; - public bool AssistidoPorImu - { - get { return checkAssistidoImu.Checked; } - set { checkAssistidoImu.Checked = value; } - } + parametros.DirecionalAutomatico = checkDirecionalAutomatico.Checked; + parametros.DirAuxilioSonar = checkAssistidoSonar.Checked; + parametros.ImuAuxilioDirecional = checkAssistidoImu.Checked; + parametros.ImuDirecionalPreferirArco = checkImuPrefereArco.Checked; - public bool ImuPrefereArco - { - get { return checkImuPrefereArco.Checked; } - set { checkImuPrefereArco.Checked = value; } - } + parametros.DirAnguloMaximo = sliderAnguloMaximo.Value; - public int AnguloMaximo - { - get { return sliderAnguloMaximo.Value; } - set { sliderAnguloMaximo.Value = value; } - } + parametros.DirVelocidadeMovimento = sliderVelocidadeDirecional.Value; - public int VelocidadeDirecionalPercentual - { - get { return sliderVelocidadeDirecional.Value; } - set { sliderVelocidadeDirecional.Value = value; } - } + parametros.DirTipoMovimento = seletorModoControle.SelectedMode; - public string ModoControle - { - get { return seletorModoControle.SelectedMode; } - set { seletorModoControle.SelectedMode = value; } - } - - public decimal HorizontePredicaoMetros - { - get { return parametroHorizonte.Value; } - set { parametroHorizonte.Value = value; } - } - - public decimal DistanciaSaidaCorredorMetros - { - get { return parametroDistanciaSaida.Value; } - set { parametroDistanciaSaida.Value = value; } + parametros.MpcHorizonte = (double)parametroHorizonte.Value; + parametros.DistanciaManobra = (double)parametroDistanciaSaida.Value; } } } diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosMapa.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosMapa.cs index 3133c47b5..414821aa3 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosMapa.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosMapa.cs @@ -1,20 +1,67 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using AgroBase.Models; +using System; using System.Windows.Forms; namespace AgroBase.Forms.IHM.Operacao.Parametros { public partial class ucParametrosMapa : UserControl { + private OperacaoModel op; + private bool _carregandoDados; + public ucParametrosMapa() { InitializeComponent(); + VincularEventos(); + } + + private void VincularEventos() + { + seletorModoAgitador.SelectedModeChanged += Controle_Alterado; + + paramKp.ValueChanged += Controle_Alterado; + paramKi.ValueChanged += Controle_Alterado; + paramKd.ValueChanged += Controle_Alterado; + + paramBicosEmUso.ValueChanged += Controle_Alterado; + paramPressaoLinha.ValueChanged += Controle_Alterado; + paramInicioTela.ValueChanged += Controle_Alterado; + paramAlturaArea.ValueChanged += Controle_Alterado; + paramErvasOn.ValueChanged += Controle_Alterado; + paramErvasOff.ValueChanged += Controle_Alterado; + } + + public void DefinirOperacao(OperacaoModel operacao) + { + op = operacao; + CarregarDadosTela(); + } + + private void CarregarDadosTela() + { + try + { + var parametros = op?.Parametros?.Controle; + + // preenchimento dos dados + } + finally + { + _carregandoDados = false; + } + } + + private void Controle_Alterado(object sender, EventArgs e) + { + if (_carregandoDados) + return; + + var parametros = op?.Parametros?.Controle; + + if (parametros == null) + return; + + // definicao dos parametros } } } diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosMovimento.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosMovimento.cs index a47e1923f..4f02f07df 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosMovimento.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/Parametros/ucParametrosMovimento.cs @@ -1,4 +1,4 @@ -using AgroBase.Forms.IHM.Operacao.Parametros.Controls; +using AgroBase.Models; using System; using System.Windows.Forms; @@ -6,31 +6,15 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros { public partial class ucParametrosMovimento : UserControl { - public event EventHandler ParametrosAlterados; + private OperacaoModel op; + private bool _carregandoDados; public ucParametrosMovimento() { InitializeComponent(); - ConfigurarEstadoInicial(); VincularEventos(); } - private void ConfigurarEstadoInicial() - { - checkMovimentoAutomatico.Checked = true; - checkAssistidoSonar.Checked = true; - checkParadaObstaculo.Checked = true; - checkAssistidoImu.Checked = true; - checkParadaInclinacao.Checked = true; - checkFrenagemParar.Checked = true; - - sliderSemErvas.Value = 68; - sliderSemErvas.VelocidadeMaximaKmh = 5D; - - sliderComErvas.Value = 45; - sliderComErvas.VelocidadeMaximaKmh = 5D; - } - private void VincularEventos() { checkMovimentoAutomatico.CheckedChanged += Controle_Alterado; @@ -44,68 +28,58 @@ namespace AgroBase.Forms.IHM.Operacao.Parametros sliderComErvas.ValueChanged += Controle_Alterado; } + public void DefinirOperacao(OperacaoModel operacao) + { + op = operacao; + CarregarDadosTela(); + } + + private void CarregarDadosTela() + { + _carregandoDados = true; + + try + { + var parametros = op?.Parametros?.Controle; + + checkMovimentoAutomatico.Checked = parametros?.MovimentoAutomatico ?? false; + checkAssistidoSonar.Checked = parametros?.MovAuxilioSonar ?? false; + checkParadaObstaculo.Checked = parametros?.OakParadaPorObstaculo ?? false; + checkAssistidoImu.Checked = parametros?.ImuAuxilioMovimento ?? false; + checkParadaInclinacao.Checked = parametros?.ImuParadaPorInclinacao ?? false; + checkFrenagemParar.Checked = parametros?.FrenagemAutomaticaAoParar ?? false; + + sliderSemErvas.VelocidadeMaximaKmh = FuncoesMatematicas.CalculaVelocidadeRPM(VariaveisEquipamento.RPM_Max_Roda); + sliderComErvas.VelocidadeMaximaKmh = FuncoesMatematicas.CalculaVelocidadeRPM(VariaveisEquipamento.RPM_Max_Roda); + + sliderSemErvas.Value = parametros?.MovVelocidadeSErvasPercent ?? 0; + sliderComErvas.Value = parametros?.MovVelocidadeCErvasPercent ?? 0; + } + finally + { + _carregandoDados = false; + } + } + private void Controle_Alterado(object sender, EventArgs e) { - if (ParametrosAlterados != null) - ParametrosAlterados(this, EventArgs.Empty); - } + if (_carregandoDados) + return; - public bool MovimentoAutomatico - { - get { return checkMovimentoAutomatico.Checked; } - set { checkMovimentoAutomatico.Checked = value; } - } + var parametros = op?.Parametros?.Controle; - public bool AssistidoPorSonar - { - get { return checkAssistidoSonar.Checked; } - set { checkAssistidoSonar.Checked = value; } - } + if (parametros == null) + return; - public bool ParadaPorObstaculo - { - get { return checkParadaObstaculo.Checked; } - set { checkParadaObstaculo.Checked = value; } - } + parametros.MovimentoAutomatico = checkMovimentoAutomatico.Checked; + parametros.MovAuxilioSonar = checkAssistidoSonar.Checked; + parametros.OakParadaPorObstaculo = checkParadaObstaculo.Checked; + parametros.ImuAuxilioMovimento = checkAssistidoImu.Checked; + parametros.ImuParadaPorInclinacao = checkParadaInclinacao.Checked; + parametros.FrenagemAutomaticaAoParar = checkFrenagemParar.Checked; - public bool AssistidoPorImu - { - get { return checkAssistidoImu.Checked; } - set { checkAssistidoImu.Checked = value; } - } - - public bool ParadaPorInclinacao - { - get { return checkParadaInclinacao.Checked; } - set { checkParadaInclinacao.Checked = value; } - } - - public bool FrenagemAoParar - { - get { return checkFrenagemParar.Checked; } - set { checkFrenagemParar.Checked = value; } - } - - public int VelocidadeSemErvasPercentual - { - get { return sliderSemErvas.Value; } - set { sliderSemErvas.Value = value; } - } - - public int VelocidadeComErvasPercentual - { - get { return sliderComErvas.Value; } - set { sliderComErvas.Value = value; } - } - - public double VelocidadeMaximaEquipamentoKmh - { - get { return sliderSemErvas.VelocidadeMaximaKmh; } - set - { - sliderSemErvas.VelocidadeMaximaKmh = value; - sliderComErvas.VelocidadeMaximaKmh = value; - } + parametros.MovVelocidadeSErvasPercent = sliderSemErvas.Value; + parametros.MovVelocidadeCErvasPercent = sliderComErvas.Value; } } } diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoMovimentacao.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoMovimentacao.cs index cbb174f91..51250bd1c 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoMovimentacao.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoMovimentacao.cs @@ -22,7 +22,7 @@ namespace AgroBase.Forms.IHM.Operacao private bool _atualizandoSlider = false; private bool _requisitandoCameraFrame; private bool _controleDescartado; - OperacaoModel op => Variaveis.OperacaoEmAndamento; + private OperacaoModel op => Variaveis.OperacaoEmAndamento; public ucOperacaoMovimentacao() { @@ -236,6 +236,8 @@ namespace AgroBase.Forms.IHM.Operacao AtualizarDadosImu(dados.IMU); AtualizarDadosTelemetria(dados); + + AtualizarSaudeModulos(); } public void AtualizarDadosControle(OperacaoControleModel controle, OperacaoParametrosControleModel parametros) @@ -246,9 +248,9 @@ namespace AgroBase.Forms.IHM.Operacao return; sliderVelocidadeMax.VelocidadeMaximaKmh = FuncoesMatematicas.CalculaVelocidadeRPM(VariaveisEquipamento.RPM_Max_Roda); - sliderVelocidadeMax.Value = (int)Limitar(controle?.PercentualVelocidadeSP ?? 0, sliderVelocidadeMax.Minimum, sliderVelocidadeMax.Maximum); - sliderAngulo.Value = (int)Limitar(controle?.Angulo ?? 0, sliderAngulo.Minimum, sliderAngulo.Maximum); - sliderVelocidadeDir.Value = (int)Limitar(parametros?.DirVelocidadeMovimento ?? 0, sliderVelocidadeDir.Minimum, sliderVelocidadeDir.Maximum); + sliderVelocidadeMax.Value = (int)FuncoesIHM.Limitar(controle?.PercentualVelocidadeSP ?? 0, sliderVelocidadeMax.Minimum, sliderVelocidadeMax.Maximum); + sliderAngulo.Value = (int)FuncoesIHM.Limitar(controle?.Angulo ?? 0, sliderAngulo.Minimum, sliderAngulo.Maximum); + sliderVelocidadeDir.Value = (int)FuncoesIHM.Limitar(parametros?.DirVelocidadeMovimento ?? 0, sliderVelocidadeDir.Minimum, sliderVelocidadeDir.Maximum); } private void AtualizarListaJoysticks() @@ -294,15 +296,20 @@ namespace AgroBase.Forms.IHM.Operacao if (_modoManualAtivado && !forcar) return; + var saude_dir = op?.Sensoriamento?.OperadorSaude?.ModulosSaude?.FirstOrDefault(x => x.modulo == T_Code.Dir)?.saude_individual?.FirstOrDefault(x => x.id == card.Tag.ToString()); + var saude_mov = op?.Sensoriamento?.OperadorSaude?.ModulosSaude?.FirstOrDefault(x => x.modulo == T_Code.Mov)?.saude_individual?.FirstOrDefault(x => x.id == card.Tag.ToString()); + var Dir = Mods.FirstOrDefault(x => x.Modulo_ID == card.Tag.ToString())?.DirMotor; var Mov = Mods.FirstOrDefault(x => x.Modulo_ID == card.Tag.ToString())?.MovMotor; card.AtualizarDados( dir_em_uso: Dir?.Comandar ?? false, + dir_status: saude_dir?.status ?? StatusModulo.Desconectado, dir_ang_sp: Dir?.Angulo_SP ?? 0, dir_ang_at: Dir?.AnguloReal ?? 0, dir_sentido: Dir?.SentidoReal ?? Sentido.Parado, mov_em_uso: Mov?.Comandar ?? false, + mov_status: saude_mov?.status ?? StatusModulo.Desconectado, mov_vel_sp: Mov?.RPM_SP ?? 0, mov_vel_at: Mov?.RPM_Roda ?? 0, mov_freio: Mov?.UltimoFreioSP ?? false @@ -438,11 +445,17 @@ namespace AgroBase.Forms.IHM.Operacao } - - private static double Limitar(double valor, double minimo, double maximo) + private void AtualizarSaudeModulos() { - return Math.Max(minimo, Math.Min(maximo, valor)); + var saude_m = op?.Sensoriamento?.OperadorSaude?.ModulosSaude; + var saudeCamera = saude_m?.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado; + var saudeImu = saude_m?.FirstOrDefault(x => x.modulo == T_Code.Imu)?.status ?? StatusModulo.Desconectado; + + FuncoesIHM.AplicarEstadoPainel(pnlCamera, FuncoesIHM.CorPorStatusModulo(saudeCamera)); + FuncoesIHM.AplicarEstadoPainel(pnlRadar, FuncoesIHM.CorPorStatusModulo(saudeCamera)); + FuncoesIHM.AplicarEstadoPainel(pnlImu, FuncoesIHM.CorPorStatusModulo(saudeImu)); } + } } diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoNavegacao.Designer.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoNavegacao.Designer.cs index 4691fe946..83e3495ca 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoNavegacao.Designer.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoNavegacao.Designer.cs @@ -30,7 +30,8 @@ namespace AgroBase.Forms.IHM.Operacao this.btnMapaWeb = new System.Windows.Forms.Button(); this.btnMapaDinamico = new System.Windows.Forms.Button(); this.pnlMapaVisual = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel(); - this.lblMapaPlaceholder = new System.Windows.Forms.Label(); + this.pnlMapaWeb = new System.Windows.Forms.Panel(); + this.pnlMapaDinamico = new System.Windows.Forms.Panel(); this.rightTopLayout = new System.Windows.Forms.TableLayoutPanel(); @@ -166,21 +167,21 @@ namespace AgroBase.Forms.IHM.Operacao SetupMapButton(this.btnMapaDinamico, "Trajetória"); this.pnlMapaVisual.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border; - this.pnlMapaVisual.Controls.Add(this.lblMapaPlaceholder); this.pnlMapaVisual.CornerRadius = 8; this.pnlMapaVisual.Dock = System.Windows.Forms.DockStyle.Fill; this.pnlMapaVisual.FillColor = System.Drawing.Color.FromArgb(18, 29, 22); + this.pnlMapaVisual.Controls.Add(this.pnlMapaWeb); + this.pnlMapaVisual.Controls.Add(this.pnlMapaDinamico); - this.lblMapaPlaceholder.Dock = System.Windows.Forms.DockStyle.Fill; - this.lblMapaPlaceholder.BackColor = System.Drawing.Color.Transparent; - this.lblMapaPlaceholder.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.Success; - this.lblMapaPlaceholder.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Bold); - this.lblMapaPlaceholder.Text = - "MAPA / TRAJETÓRIA\n\n" + - "Rua atual: 12 / 35\n\n" + - " ○ 125\n │\n ○ 126\n │\n [ROVER]\n │\n ○ 127\n\n" + - "Coordenadas: -23.5621, -46.6542\nAltitude: 812 m"; - this.lblMapaPlaceholder.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.pnlMapaWeb.Dock = DockStyle.Fill; + this.pnlMapaWeb.Margin = Padding.Empty; + this.pnlMapaWeb.Padding = Padding.Empty; + this.pnlMapaWeb.BackColor = Color.Black; + + this.pnlMapaDinamico.Dock = DockStyle.Fill; + this.pnlMapaDinamico.Margin = Padding.Empty; + this.pnlMapaDinamico.Padding = Padding.Empty; + this.pnlMapaDinamico.BackColor = HmiTheme.Text; this.rightTopLayout.ColumnCount = 2; this.rightTopLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 54F)); @@ -235,10 +236,10 @@ namespace AgroBase.Forms.IHM.Operacao this.orientationValuesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 18F)); this.orientationValuesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 32F)); - SetupHeadingTitle(this.lblRoverTitulo, "Rover", AgroBase.Forms.IHM.Controls.HmiTheme.Success); + SetupHeadingTitle(this.lblRoverTitulo, "Rover", AgroBase.Forms.IHM.Controls.HmiTheme.Text); SetupHeadingValue(this.lblRoverValor, "128°", AgroBase.Forms.IHM.Controls.HmiTheme.Success); - SetupHeadingTitle(this.lblTrajetoriaTitulo, "Trajetória", AgroBase.Forms.IHM.Controls.HmiTheme.Warning); - SetupHeadingValue(this.lblTrajetoriaValor, "136°", AgroBase.Forms.IHM.Controls.HmiTheme.Warning); + SetupHeadingTitle(this.lblTrajetoriaTitulo, "Trajetória", AgroBase.Forms.IHM.Controls.HmiTheme.Text); + SetupHeadingValue(this.lblTrajetoriaValor, "136°", AgroBase.Forms.IHM.Controls.HmiTheme.Manual); ConfigurePanel(this.pnlGnss, this.gnssLayout); this.pnlGnss.Padding = new Padding(6, 4, 6, 4); @@ -253,16 +254,16 @@ namespace AgroBase.Forms.IHM.Operacao this.gnssLayout.Dock = System.Windows.Forms.DockStyle.Fill; this.gnssLayout.RowCount = 6; this.gnssLayout.RowStyles.Clear(); - for (int i = 0; i < 6; i++) - this.gnssLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 16.6667F)); + for (int i = 0; i < this.gnssLayout.RowCount; i++) + this.gnssLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100F / this.gnssLayout.RowCount)); //SetupTitle(this.lblGnssTitulo, "GNSS"); - SetupMetric(this.metricSatelites, "Satélites", "18"); - SetupMetric(this.metricPrecisao, "Precisão", "0,8 cm"); - SetupMetric(this.metricIdadeCorrecao, "Idade correção", "1,2 s"); - SetupMetric(this.metricAltitude, "Altitude", "812 m"); - SetupMetric(this.metricVelocidade, "Velocidade", "3,4 km/h"); - SetupMetric(this.metricHeading, "Heading", "128°"); + SetupMetric(this.metricSatelites, "Satélites", "18", 65); + SetupMetric(this.metricPrecisao, "Precisão", "0,8 cm", 72); + SetupMetric(this.metricIdadeCorrecao, "Idade correção", "1,2 s", 72); + SetupMetric(this.metricAltitude, "Altitude", "812 m", 72); + SetupMetric(this.metricVelocidade, "Velocidade", "3,4 km/h", 82); + SetupMetric(this.metricHeading, "Heading", "128°", 65); ConfigurePanel(this.pnlTrajetoria, this.trajectoryLayout); this.trajectoryLayout.ColumnCount = 1; @@ -310,6 +311,7 @@ namespace AgroBase.Forms.IHM.Operacao this.progressRua.Value = 65; this.progressRua.Margin = new System.Windows.Forms.Padding(1, 1, 1, 1); this.progressRua.CornerRadius = 5; + this.progressRua.BarColor = HmiTheme.Info; SetupProgressHeader( this.progressGeralHeader, @@ -323,6 +325,7 @@ namespace AgroBase.Forms.IHM.Operacao this.progressGeral.Value = 38; this.progressGeral.Margin = new System.Windows.Forms.Padding(1, 1, 1, 1); this.progressGeral.CornerRadius = 5; + this.progressGeral.BarColor = HmiTheme.Success; this.trajectoryBottomLayout.Controls.Clear(); this.trajectoryBottomLayout.ColumnCount = 2; @@ -456,9 +459,7 @@ namespace AgroBase.Forms.IHM.Operacao this.ResumeLayout(false); } - private static void ConfigurePanel( - AgroBase.Forms.IHM.Controls.HmiRoundedPanel panel, - System.Windows.Forms.Control child) + private static void ConfigurePanel(AgroBase.Forms.IHM.Controls.HmiRoundedPanel panel, System.Windows.Forms.Control child) { panel.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border; panel.Controls.Add(child); @@ -469,9 +470,7 @@ namespace AgroBase.Forms.IHM.Operacao panel.Padding = new System.Windows.Forms.Padding(7); } - private static void SetupTitle( - System.Windows.Forms.Label label, - string text) + private static void SetupTitle(System.Windows.Forms.Label label, string text) { label.Dock = System.Windows.Forms.DockStyle.Fill; label.BackColor = System.Drawing.Color.Transparent; @@ -482,9 +481,7 @@ namespace AgroBase.Forms.IHM.Operacao label.AutoEllipsis = true; } - private static void SetupMapButton( - System.Windows.Forms.Button button, - string text) + private static void SetupMapButton(System.Windows.Forms.Button button, string text) { button.Dock = System.Windows.Forms.DockStyle.Fill; button.Text = text; @@ -496,10 +493,7 @@ namespace AgroBase.Forms.IHM.Operacao button.Margin = new System.Windows.Forms.Padding(2); } - private static void SetupHeadingTitle( - System.Windows.Forms.Label label, - string text, - System.Drawing.Color color) + private static void SetupHeadingTitle(System.Windows.Forms.Label label, string text, System.Drawing.Color color) { label.Dock = System.Windows.Forms.DockStyle.Fill; label.BackColor = System.Drawing.Color.Transparent; @@ -511,10 +505,7 @@ namespace AgroBase.Forms.IHM.Operacao label.AutoEllipsis = true; } - private static void SetupHeadingValue( - System.Windows.Forms.Label label, - string text, - System.Drawing.Color color) + private static void SetupHeadingValue(System.Windows.Forms.Label label, string text, System.Drawing.Color color) { label.Dock = System.Windows.Forms.DockStyle.Fill; label.BackColor = System.Drawing.Color.Transparent; @@ -525,14 +516,13 @@ namespace AgroBase.Forms.IHM.Operacao label.Padding = new Padding(2, 0, 0, 0); } - private static void SetupMetric( - AgroBase.Forms.IHM.Controls.Operacao.HmiNavigationMetric metric, - string title, - string value) + private static void SetupMetric(AgroBase.Forms.IHM.Controls.Operacao.HmiNavigationMetric metric, string title, string value, int largura) { metric.Dock = System.Windows.Forms.DockStyle.Fill; metric.Titulo = title; metric.Valor = value; + metric.LarguraValor = largura; + metric.CorValor = HmiTheme.Success; } private static void SetupInfoBox(Label label, string text, Color color) @@ -567,12 +557,7 @@ namespace AgroBase.Forms.IHM.Operacao label.Padding = Padding.Empty; } - private static void SetupProgressHeader( - System.Windows.Forms.TableLayoutPanel layout, - System.Windows.Forms.Label title, - System.Windows.Forms.Label value, - string titleText, - string valueText) + private static void SetupProgressHeader(System.Windows.Forms.TableLayoutPanel layout, System.Windows.Forms.Label title, System.Windows.Forms.Label value, string titleText, string valueText) { layout.ColumnCount = 2; layout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 45F)); @@ -598,11 +583,7 @@ namespace AgroBase.Forms.IHM.Operacao value.AutoEllipsis = true; } - private static void SetupAction( - AgroBase.Forms.IHM.Controls.HmiSidebarButton button, - string text, - string icon, - System.Drawing.Color accent) + private static void SetupAction(AgroBase.Forms.IHM.Controls.HmiSidebarButton button, string text, string icon, System.Drawing.Color accent) { button.Dock = System.Windows.Forms.DockStyle.Fill; button.Text = text; @@ -616,11 +597,7 @@ namespace AgroBase.Forms.IHM.Operacao } - private static void SetupStatusAutonomiaLabel( - Label label, - string text, - Color color, - bool bold) + private static void SetupStatusAutonomiaLabel(Label label, string text, Color color, bool bold) { label.Dock = DockStyle.Fill; label.AutoSize = false; @@ -628,13 +605,7 @@ namespace AgroBase.Forms.IHM.Operacao label.BackColor = HmiTheme.SurfaceRaised; label.ForeColor = color; - label.Font = new Font( - "Segoe UI", - 6.8F, - bold - ? FontStyle.Bold - : FontStyle.Regular - ); + label.Font = new Font("Segoe UI", 6.8F, bold ? FontStyle.Bold : FontStyle.Regular); label.Text = text; label.TextAlign = ContentAlignment.MiddleCenter; @@ -658,11 +629,7 @@ namespace AgroBase.Forms.IHM.Operacao label.BackColor = Color.Transparent; label.ForeColor = accent; - label.Font = new Font( - "Segoe UI", - 5.8F, - FontStyle.Bold - ); + label.Font = new Font("Segoe UI", 5.8F, FontStyle.Bold); label.TextAlign = ContentAlignment.MiddleCenter; label.Margin = Padding.Empty; @@ -683,7 +650,8 @@ namespace AgroBase.Forms.IHM.Operacao private System.Windows.Forms.Button btnMapaWeb; private System.Windows.Forms.Button btnMapaDinamico; private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlMapaVisual; - private System.Windows.Forms.Label lblMapaPlaceholder; + private System.Windows.Forms.Panel pnlMapaWeb; + private System.Windows.Forms.Panel pnlMapaDinamico; private System.Windows.Forms.TableLayoutPanel rightTopLayout; diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoNavegacao.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoNavegacao.cs index 0dc6851ce..66285af8d 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoNavegacao.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoNavegacao.cs @@ -1,5 +1,5 @@ using AgroBase.Forms.IHM.Controls; -using AgroBase.Forms.IHM.Controls.Operacao; +using AgroBase.Models; using System; using System.Drawing; using System.Windows.Forms; @@ -9,117 +9,125 @@ namespace AgroBase.Forms.IHM.Operacao public partial class ucOperacaoNavegacao : UserControl { private bool _alertaAutonomiaVisivel; + private MapaDinamicoModel _mapaDinamico; + private bool _mapasInicializados; + private bool _exibindoMapaDinamico = true; + + private OperacaoModel op => Variaveis.OperacaoEmAndamento; public ucOperacaoNavegacao() { InitializeComponent(); - ConfigurarEstadoInicial(); VincularEventos(); MostrarStatusAutonomia(); + + this.Load += ucOperacaoNavegacao_Load; } - private void ConfigurarEstadoInicial() + private void ucOperacaoNavegacao_Load(object sender, EventArgs e) { - SelecionarMapa(btnMapaDinamico); + InicializarMapas(); + MostrarMapaDinamico(); + } - compassControl.RoverHeading = 128D; - compassControl.TrajectoryHeading = 136D; + private void InicializarMapas() + { + if (_mapasInicializados) + return; - metricSatelites.CorValor = HmiTheme.Success; - metricPrecisao.CorValor = HmiTheme.Success; - metricIdadeCorrecao.CorValor = HmiTheme.Success; - metricAltitude.CorValor = HmiTheme.Success; - metricVelocidade.CorValor = HmiTheme.Success; - metricHeading.CorValor = HmiTheme.Success; + Form formPai = FindForm(); - progressRua.Value = 65; - progressRua.BarColor = HmiTheme.Info; + if (formPai == null) + return; - progressGeral.Value = 38; - progressGeral.BarColor = HmiTheme.Success; + _mapasInicializados = true; + _mapaDinamico = new MapaDinamicoModel(formPai, pnlMapaDinamico); - autonomiaBateria.AccentColor = HmiTheme.Warning; - autonomiaHerbicida.AccentColor = HmiTheme.Danger; + if (op == null) + return; + + if (op?.Mapa == null) + op.Mapa = new MapasModel(); + + op.Mapa.pnlMapa = pnlMapaWeb; + + CarregarMapaWeb(); + } + + private void CarregarMapaWeb() + { + var mapa = op?.Mapa; + + if (mapa == null) + return; + + //mapa.btnCarregar_Click(sender as Control, e); + mapa.CarregarMapaGPS(); + + MostrarMapaWeb(); + } + + private void MostrarMapaWeb() + { + _exibindoMapaDinamico = false; + pnlMapaWeb.Visible = true; + pnlMapaDinamico.Visible = true; + + pnlMapaWeb.BringToFront(); + + AtualizarEstadoBotoesMapa(mapaWebSelecionado: true); + } + + private void MostrarMapaDinamico() + { + _exibindoMapaDinamico = true; + pnlMapaWeb.Visible = true; + pnlMapaDinamico.Visible = true; + + pnlMapaDinamico.BringToFront(); + + AtualizarEstadoBotoesMapa(mapaWebSelecionado: false); } private void VincularEventos() { - btnMapaWeb.Click += delegate - { - SelecionarMapa(btnMapaWeb); - }; - - btnMapaDinamico.Click += delegate - { - SelecionarMapa(btnMapaDinamico); - }; + btnMapaWeb.Click += btnMapaWeb_Click; + btnMapaDinamico.Click += btnMapaDinamico_Click; btnAtualizarAutonomia.Click += btnAtualizarAutonomia_Click; btnLiberarSupervisao.Click += btnLiberarSupervisao_Click; } - private void SelecionarMapa(Button selecionado) + private void btnMapaWeb_Click(object sender, EventArgs e) { - AplicarEstiloMapa(btnMapaWeb, false); - AplicarEstiloMapa(btnMapaDinamico, false); - AplicarEstiloMapa(selecionado, true); + MostrarMapaWeb(); } - private static void AplicarEstiloMapa( - Button button, - bool selecionado) + private void btnMapaDinamico_Click(object sender, EventArgs e) { - if (selecionado) - { - button.BackColor = Color.FromArgb(31, 91, 43); - button.ForeColor = HmiTheme.Text; - button.FlatAppearance.BorderColor = HmiTheme.Success; - } - else - { - button.BackColor = HmiTheme.SurfaceRaised; - button.ForeColor = HmiTheme.TextMuted; - button.FlatAppearance.BorderColor = HmiTheme.Border; - } + MostrarMapaDinamico(); } - public void AtualizarOrientacao( - double headingRover, - double headingTrajetoria, - bool possuiTrajetoria) + private void AtualizarEstadoBotoesMapa(bool mapaWebSelecionado) { - compassControl.RoverHeading = headingRover; - compassControl.TrajectoryHeading = headingTrajetoria; - compassControl.ShowTrajectory = possuiTrajetoria; + AplicarEstadoBotaoMapa(btnMapaWeb, mapaWebSelecionado); - lblRoverValor.Text = - headingRover.ToString("0") + "°"; - - lblTrajetoriaValor.Text = - possuiTrajetoria - ? headingTrajetoria.ToString("0") + "°" - : "--"; + AplicarEstadoBotaoMapa(btnMapaDinamico, !mapaWebSelecionado); } - public void AtualizarProgresso( - int percentualRua, - string detalheRua, - int percentualGeral, - string detalheGeral) + private static void AplicarEstadoBotaoMapa(Button button, bool selecionado) { - progressRua.Value = percentualRua; + button.BackColor = selecionado + ? HmiTheme.SurfaceRaised + : HmiTheme.Surface; - lblProgressoRuaValor.Text = - percentualRua + - "% · " + - (detalheRua ?? string.Empty); + button.ForeColor = selecionado + ? HmiTheme.Info + : HmiTheme.TextMuted; - progressGeral.Value = percentualGeral; - - lblProgressoGeralValor.Text = - percentualGeral + - "% · " + - (detalheGeral ?? string.Empty); + button.FlatAppearance.BorderColor = selecionado + ? HmiTheme.Info + : HmiTheme.Border; } @@ -143,7 +151,6 @@ namespace AgroBase.Forms.IHM.Operacao pnlAlertaAutonomia.BringToFront(); } - private void RecalcularAutonomia() { @@ -194,31 +201,14 @@ namespace AgroBase.Forms.IHM.Operacao ); } - private void AtualizarStatusAutonomia( - string bateria, - Color corBateria, - string herbicida, - Color corHerbicida, - string corredor, - Color corCorredor) + private void AtualizarStatusAutonomia(string bateria, Color corBateria, string herbicida, Color corHerbicida, string corredor, Color corCorredor) { - lblStatusBateria.Text = - bateria; - - lblStatusBateria.ForeColor = - corBateria; - - lblStatusHerbicida.Text = - herbicida; - - lblStatusHerbicida.ForeColor = - corHerbicida; - - lblStatusCorredor.Text = - corredor; - - lblStatusCorredor.ForeColor = - corCorredor; + lblStatusBateria.Text = bateria; + lblStatusBateria.ForeColor = corBateria; + lblStatusHerbicida.Text = herbicida; + lblStatusHerbicida.ForeColor = corHerbicida; + lblStatusCorredor.Text = corredor; + lblStatusCorredor.ForeColor = corCorredor; } public void AtualizarBloqueioAutonomia(bool corredorBloqueado, bool liberadoManualmente) @@ -232,5 +222,218 @@ namespace AgroBase.Forms.IHM.Operacao MostrarStatusAutonomia(); } + + + + + public void AtualizarDadosTela() + { + var dados = op?.Sensoriamento; + + AtualizarDadosMapa(); + AtualizarDadosAutonomia(dados); + AtualizarDadosOrientacao(dados); + AtualizarDadosGnss(dados?.Gps); + AtualizarDadosCorredor(dados); + AtualizarDadosTelemetria(dados?.Trajetoria?.AutonomiaCorredor); + } + + private void AtualizarDadosMapa() + { + AtualizarMapaDinamico(); + } + + private void AtualizarMapaDinamico() + { + if (!_exibindoMapaDinamico) + return; + + var _Sensoriamento = op?.Sensoriamento; + var _Trajetoria = op?.Trajetoria; + + if (_Trajetoria != null && _Trajetoria?.CorredorAtual != null) + { + _mapaDinamico.AtualizarDados( + null, + (float)_Trajetoria.AnguloCaminho, + (float)_Sensoriamento.Gps.AnguloCarroDefinido, + _Sensoriamento.Gps, + _Trajetoria._TrajetoriaDinamica, + _Trajetoria.CorredorAtual.Pontos, + op.GPSTrajetoria, + _Trajetoria.RuasPlantacao, + op.Controle.SimulacaoMPC + ); + } + } + + private void AtualizarDadosAutonomia(OperacaoSensoriamentoConjuntoModel dados) + { + double limiar = 20.0; + double distanciaCorredor = dados?.Trajetoria?.CorredorAtual?.DistanciaTotal ?? 0; + + double distanciaBateria = dados?.Bateria?.DistanciaEstimadaRestanteMetros ?? 0; + TimeSpan tempoBateria = TimeSpan.FromMinutes(Math.Max(0, dados?.Bateria?.TempoEstimadoRestanteMinutos ?? 0)); + + double distanciaHerbicida = dados?.Atuador?.DistanciaEstimadaRestanteMetros ?? 0; + TimeSpan tempoHerbicida = TimeSpan.FromMinutes(Math.Max(0, dados?.Atuador?.TempoEstimadoRestanteMinutos ?? 0)); + + autonomiaBateria.Distancia = distanciaBateria.ToString("F2") + " m"; + autonomiaBateria.Tempo = FuncoesIHM.FormatarTempo(tempoBateria); + autonomiaBateria.AccentColor = FuncoesIHM.CorPorAutonomia(distanciaCorredor, distanciaBateria, limiar); + + autonomiaHerbicida.Distancia = distanciaHerbicida.ToString("F2") + " m"; + autonomiaHerbicida.Tempo = FuncoesIHM.FormatarTempo(tempoHerbicida); + autonomiaHerbicida.AccentColor = FuncoesIHM.CorPorAutonomia(distanciaCorredor, distanciaHerbicida, limiar); + } + + private void AtualizarDadosOrientacao(OperacaoSensoriamentoConjuntoModel dados) + { + double headingCarro = dados?.Gps?.OrientacaoReal ?? 0; + double headingCaminho = dados?.Trajetoria?.AnguloCaminho ?? 0; + bool possuiTrajetoria = dados?.Trajetoria?.QtdPontos > 0; + + lblRoverValor.Text = $"{headingCarro:F2}°"; + lblRoverValor.ForeColor = + possuiTrajetoria ? FuncoesIHM.CorPorErroAngular(headingCarro, headingCaminho, 5.0, 15.0) : + HmiTheme.Success; + compassControl.RoverHeading = headingCarro; + + compassControl.ShowTrajectory = possuiTrajetoria; + lblTrajetoriaValor.Text = possuiTrajetoria ? $"{headingCaminho:F2}°" : "--"; + compassControl.TrajectoryHeading = headingCaminho; + } + + private void AtualizarDadosGnss(GPSModel dados) + { + metricSatelites.Valor = (dados?.NumeroSatelites ?? 0).ToString(); + metricPrecisao.Valor = (dados?.PrecisaoCm ?? 0).ToString(); + metricIdadeCorrecao.Valor = ((dados?.Ntrip_ativado ?? false) ? "N" : "B") + " " + (dados?.IdadeCorrecao ?? 0).ToString("F1") + " s"; + metricAltitude.Valor = (dados?.Altitude ?? 0).ToString("F2") + " m"; + metricVelocidade.Valor = (dados?.Velocidade ?? 0).ToString("F2") + " km/h"; + metricHeading.Valor = (dados?.OrientacaoReal ?? 0).ToString("F2") + "°"; + } + + private void AtualizarDadosCorredor(OperacaoSensoriamentoConjuntoModel dados) + { + var trajetoria = dados?.Trajetoria; + lblRuaAtual.Text = $"Rua {trajetoria?.IdxRuaAtual ?? 0} / {op?.Mapa?.RuasPercorrer?.Count ?? 0}"; + lblDentroCorredor.Text = ((trajetoria?.CorredorAtual?.Dentro ?? false) ? "Dentro do Corredor" : "Fora do Corredor"); + lblProximoPonto.Text = $"Ponto {trajetoria?.PontoAtual?.idxPonto ?? 0} / {trajetoria?.QtdPontos ?? 0}"; + + double _progressoRua = trajetoria?.CorredorAtual?.Progresso ?? 0; + double _distanciaPercorridaRua = trajetoria?.CorredorAtual?.DistanciaPercorridaTotal ?? 0; + double _distanciaTotalRua = trajetoria?.CorredorAtual?.DistanciaTotal ?? 0; + lblProgressoRuaValor.Text = $"{_progressoRua:F2}% · {_distanciaPercorridaRua:F2} / {_distanciaTotalRua:F2} m"; + progressRua.Value = (int)_progressoRua; + + double _progressoGeral = trajetoria?.ProgressoTrajeto ?? 0; + double _distanciaPercorridaGeral = trajetoria?.DistanciaPercorrida ?? 0; + double _distanciaTotalGeral = trajetoria?.DistanciaTotal ?? 0; + progressGeral.Value = (int)_progressoGeral; + lblProgressoGeralValor.Text = $"{_progressoGeral:F2}% · {_distanciaPercorridaGeral:F2} / {_distanciaTotalGeral:F2} m"; + + string _tempoEstimado = string.IsNullOrEmpty(trajetoria?.TempoEstimadoOperacao) ? "00:00:00" : trajetoria?.TempoEstimadoOperacao; + lblStatusMapa.Text = (trajetoria?.StatusCarro ?? Enums.StatusCarroMapa.Parado).ToString(); + lblTempoOperacao.Text = dados?.Operacao?.TempoDecorrido.ToString("HH:mm:ss") + " / " + _tempoEstimado; + lblDistanciaEsq.Text = $"Esquerda {trajetoria?.DistanciaEsquerda ?? 0:F2} m"; + lblDistanciaDir.Text = $"Direita {trajetoria?.DistanciaDireita ?? 0:F2} m"; + } + + private void AtualizarDadosTelemetria(AutonomiaCorredorModel dados) + { + lblStatusBateria.Text = MontarStatusBateria(dados); + lblStatusHerbicida.Text = MontarStatusHerbicida(dados); + lblStatusCorredor.Text = MontarStatusCorredor(dados); + lblStatusAvaliacao.Text = MontarStatusAvaliacao(dados); + } + + private static string MontarStatusBateria(AutonomiaCorredorModel autonomia) + { + if (autonomia == null) + return "Bateria: autonomia indisponível"; + + if (!autonomia.DadosBateriaValidos) + return "Bateria: autonomia indisponível"; + + if (autonomia.BateriaOverrideAplicado) + { + return string.Format("Bateria: liberada pelo operador · folga {0:F1} m", autonomia.FolgaBateria_m); + } + + if (autonomia.BateriaSuficiente) + { + return string.Format("Bateria: suficiente · folga {0:F1} m", autonomia.FolgaBateria_m); + } + + return string.Format("Bateria: insuficiente · faltam {0:F1} m", Math.Abs(autonomia.FolgaBateria_m)); + } + + private static string MontarStatusHerbicida(AutonomiaCorredorModel autonomia) + { + if (autonomia == null) + return "Herbicida: não exigido neste corredor"; + + if (!autonomia.PulverizacaoExigida) + return "Herbicida: não exigido neste corredor"; + + if (!autonomia.DadosHerbicidaValidos) + return "Herbicida: autonomia indisponível"; + + if (autonomia.HerbicidaOverrideAplicado) + { + return string.Format("Herbicida: liberado pelo operador · folga {0:F1} m", autonomia.FolgaHerbicida_m); + } + + if (autonomia.HerbicidaSuficiente) + { + return string.Format("Herbicida: suficiente · folga {0:F1} m", autonomia.FolgaHerbicida_m); + } + + return string.Format("Herbicida: insuficiente · faltam {0:F1} m", Math.Abs(autonomia.FolgaHerbicida_m)); + } + + private static string MontarStatusCorredor(AutonomiaCorredorModel autonomia) + { + if (autonomia == null) + return "Corredor: avaliação inativa"; + + if (!autonomia.Iniciado) + return "Corredor: avaliação inativa"; + + if (autonomia.ConfirmadoParaEntrada) + return "Corredor: entrada confirmada"; + + if (autonomia.Liberado) + return "Corredor: liberado"; + + switch (autonomia.Status) + { + case AutonomiaCorredorStatus.AguardandoLiberacaoManual: + return "Corredor: aguardando liberação manual"; + + case AutonomiaCorredorStatus.Critico: + return "Corredor: bloqueado por autonomia"; + + default: + return "Corredor: não liberado"; + } + } + + private static string MontarStatusAvaliacao(AutonomiaCorredorModel autonomia) + { + if (!string.IsNullOrWhiteSpace(autonomia?.Motivo)) + return autonomia.Motivo; + + if (autonomia?.Avisos != null && autonomia?.Avisos?.Count > 0) + { + return autonomia.Avisos[0]; + } + + return "Nova avaliação na próxima troca de rua"; + } + + + } } diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoParametros.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoParametros.cs index b481958c2..f83cbfe90 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoParametros.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoParametros.cs @@ -1,5 +1,6 @@ using AgroBase.Forms.IHM.Controls; using AgroBase.Forms.IHM.Operacao.Parametros; +using AgroBase.Models; using System; using System.Collections.Generic; using System.Drawing; @@ -18,10 +19,7 @@ namespace AgroBase.Forms.IHM.Operacao private readonly ucParametrosAtuador _ucAtuador; private readonly ucParametrosMapa _ucMapa; - public event EventHandler RedefinirSolicitado; - public event EventHandler SalvarSolicitado; - public event EventHandler ModoOperacaoAlterado; - public event EventHandler RegistrarPosProcessamentoAlterado; + private OperacaoModel operacaoParametrizando; public ucOperacaoParametros() { @@ -39,8 +37,8 @@ namespace AgroBase.Forms.IHM.Operacao _abas.Add(TipoAbaParametros.Mapa, _ucMapa); ConfigurarSubControles(); - ConfigurarEstadoInicial(); VincularEventos(); + ConfigurarEstadoInicial(); } private void ConfigurarSubControles() @@ -59,11 +57,7 @@ namespace AgroBase.Forms.IHM.Operacao cmbModoOperacao.Items.Clear(); cmbModoOperacao.Items.AddRange(Enum.GetNames(typeof(ModoOperacao))); - if (cmbModoOperacao.Items.Count > 1) - cmbModoOperacao.SelectedIndex = 1; - - checkPosProcessamento.Checked = true; - AtualizarAparenciaCheck(checkPosProcessamento); + cmbModoOperacao.SelectedIndex = (int)(Variaveis.OperacaoEmAndamento?.Sensoriamento?.Operacao?.Modo ?? ModoOperacao.NaoDefinido); AbrirAba(TipoAbaParametros.Movimento); } @@ -75,33 +69,45 @@ namespace AgroBase.Forms.IHM.Operacao btnAbaAtuador.Click += delegate { AbrirAba(TipoAbaParametros.Atuador); }; btnAbaMapa.Click += delegate { AbrirAba(TipoAbaParametros.Mapa); }; - btnRedefinir.Click += delegate - { - if (RedefinirSolicitado != null) - RedefinirSolicitado(this, EventArgs.Empty); - }; - - btnSalvar.Click += delegate - { - if (SalvarSolicitado != null) - SalvarSolicitado(this, EventArgs.Empty); - }; - - cmbModoOperacao.SelectedIndexChanged += delegate - { - if (ModoOperacaoAlterado != null) - ModoOperacaoAlterado(this, EventArgs.Empty); - }; - - checkPosProcessamento.CheckedChanged += delegate - { - AtualizarAparenciaCheck(checkPosProcessamento); - - if (RegistrarPosProcessamentoAlterado != null) - RegistrarPosProcessamentoAlterado(this, EventArgs.Empty); - }; + btnRedefinir.Click += BtnRedefinir_Click; + btnSalvar.Click += BtnSalvar_Click; + cmbModoOperacao.SelectedIndexChanged += CmbModoOperacao_SelectedIndexChanged; } + + private void DefinirOperacaoParametrizando(OperacaoModel operacao) + { + operacaoParametrizando = operacao; + + _ucMovimento.DefinirOperacao(operacaoParametrizando); + _ucDirecional.DefinirOperacao(operacaoParametrizando); + _ucAtuador.DefinirOperacao(operacaoParametrizando); + _ucMapa.DefinirOperacao(operacaoParametrizando); + } + + private void CmbModoOperacao_SelectedIndexChanged(object sender, EventArgs e) + { + ModoOperacao modo = (ModoOperacao)cmbModoOperacao.SelectedIndex; + OperacaoModel novaOperacao = OperacaoModel.CarregarParametrosOperacaoPadrao(modo, true); + DefinirOperacaoParametrizando(novaOperacao); + } + + private void BtnSalvar_Click(object sender, EventArgs e) + { + if (operacaoParametrizando == null) + return; + + OperacaoModel.CarregarParamerosOperacaoBase(operacaoParametrizando.Parametros); + } + + private void BtnRedefinir_Click(object sender, EventArgs e) + { + ModoOperacao modo = (ModoOperacao)cmbModoOperacao.SelectedIndex; + OperacaoModel novaOperacao = OperacaoModel.CarregarParametrosOperacaoPadrao(modo, true); + DefinirOperacaoParametrizando(novaOperacao); + } + + private void AbrirAba(TipoAbaParametros aba) { _abaAtual = aba; @@ -162,68 +168,7 @@ namespace AgroBase.Forms.IHM.Operacao } } - private static void AtualizarAparenciaCheck(CheckBox check) - { - if (check.Checked) - { - check.Text = "✓"; - check.ForeColor = HmiTheme.Success; - check.BackColor = Color.FromArgb(30, 90, 46); - check.FlatAppearance.BorderColor = HmiTheme.Success; - } - else - { - check.Text = "×"; - check.ForeColor = HmiTheme.Danger; - check.BackColor = HmiTheme.Surface; - check.FlatAppearance.BorderColor = HmiTheme.Danger; - } - } - public string ModoOperacaoSelecionado - { - get { return Convert.ToString(cmbModoOperacao.SelectedItem); } - set - { - if (string.IsNullOrWhiteSpace(value)) - return; - - int index = cmbModoOperacao.FindStringExact(value); - if (index >= 0) - cmbModoOperacao.SelectedIndex = index; - } - } - - public bool RegistrarPosProcessamento - { - get { return checkPosProcessamento.Checked; } - set { checkPosProcessamento.Checked = value; } - } - - public TipoAbaParametros AbaAtual - { - get { return _abaAtual; } - } - - public ucParametrosMovimento Movimento - { - get { return _ucMovimento; } - } - - public ucParametrosDirecional Direcional - { - get { return _ucDirecional; } - } - - public ucParametrosAtuador Atuador - { - get { return _ucAtuador; } - } - - public ucParametrosMapa Mapa - { - get { return _ucMapa; } - } } public enum TipoAbaParametros diff --git a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoPulverizador.cs b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoPulverizador.cs index 7138d2bff..cc127950e 100644 --- a/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoPulverizador.cs +++ b/AgroBase/AgroBase/Forms/IHM/Operacao/ucOperacaoPulverizador.cs @@ -2,8 +2,8 @@ using AgroBase.Forms.IHM.Controls.Operacao; using AgroBase.Models; using AgroBase.Models.Operadores; +using AgroBase.Services; using AgroBase.Services.Operadores; -using Assimp.Unmanaged; using System; using System.Collections.Generic; using System.Drawing; @@ -19,9 +19,14 @@ namespace AgroBase.Forms.IHM.Operacao private bool _requisitandoCameraFrame; private bool _controleDescartado; - OperacaoModel op => Variaveis.OperacaoEmAndamento; + private OperacaoModel op => Variaveis.OperacaoEmAndamento; private readonly List _bicos = new List(); + public IList Bicos + { + get { return _bicos.AsReadOnly(); } + } + public ucOperacaoPulverizador() { @@ -66,44 +71,41 @@ namespace AgroBase.Forms.IHM.Operacao private void AtualizarSaudeModulos() { var saude_m = op?.Sensoriamento?.OperadorSaude?.ModulosSaude; - var saude_i = saude_m?.FirstOrDefault(x => x.modulo == Enums.T_Code.Atu)?.saude_individual; + var saude_i = saude_m?.FirstOrDefault(x => x.modulo == T_Code.Atu)?.saude_individual; var saudeBomba = saude_i?.FirstOrDefault(x => x.label == op?.DispAtu?.Dados?.BombaPressurizadora?.ID); var saudeAgitador = saude_i?.FirstOrDefault(x => x.label == op?.DispAtu?.Dados?.AgitadorDeCalda?.ID); var saudeSensores = saude_i?.Where(x => op?.DispAtu?.Dados?.Sensores?.Where(y => y.Aferir)?.Select(y => y.ID).Contains(x.label) ?? false)?.ToList(); var saudeBicos = saude_i?.Where(x => op?.DispAtu?.Dados?.BicosPulverizadores?.Where(y => y.Comandar)?.Select(y => y.ID).Contains(x.label) ?? false)?.ToList(); - var saudeCamera = saude_m?.FirstOrDefault(x => x.modulo == Enums.T_Code.Cam); + var saudeCamera = saude_m?.FirstOrDefault(x => x.modulo == T_Code.Cam); var saudeSensoresMedia = saudeSensores?.Average(x => x.saude) ?? 0; - Enums.StatusModulo saudeSensoresStatus = - saudeSensoresMedia >= 80 ? Enums.StatusModulo.Operante : - saudeSensoresMedia <= 0 ? Enums.StatusModulo.Falha : - Enums.StatusModulo.Alerta; + StatusModulo saudeSensoresStatus = + saudeSensoresMedia >= 80 ? StatusModulo.Operante : + saudeSensoresMedia <= 0 ? StatusModulo.Falha : + StatusModulo.Alerta; var saudeBicosMedia = saudeBicos?.Average(x => x.saude) ?? 0; - Enums.StatusModulo saudeBicosStatus = - saudeBicosMedia >= 80 ? Enums.StatusModulo.Operante : - saudeBicosMedia <= 0 ? Enums.StatusModulo.Falha : - Enums.StatusModulo.Alerta; + StatusModulo saudeBicosStatus = + saudeBicosMedia >= 80 ? StatusModulo.Operante : + saudeBicosMedia <= 0 ? StatusModulo.Falha : + StatusModulo.Alerta; - void DefinirSaudeModulo(HmiSprayerModuleHealthRow card, double saude, Enums.StatusModulo status) + void DefinirSaudeModulo(HmiSprayerModuleHealthRow card, HmiRoundedPanel pnl, double saude, StatusModulo status) { card.Saude = saude.ToString("F0") + "%"; card.Status = status.ToString(); - card.StatusColor = - status == Enums.StatusModulo.Operante ? HmiTheme.Success : - status == Enums.StatusModulo.Alerta ? HmiTheme.Warning : - status == Enums.StatusModulo.Falha ? HmiTheme.Danger : - status == Enums.StatusModulo.Desconectado ? HmiTheme.Disabled : - status == Enums.StatusModulo.Conectado ? HmiTheme.Info : - HmiTheme.Disabled; + card.StatusColor = FuncoesIHM.CorPorStatusModulo(status); + + if (pnl != null) + FuncoesIHM.AplicarEstadoPainel(pnl, card.StatusColor); } - DefinirSaudeModulo(healthBomba, saudeBomba?.saude ?? 0, saudeBomba?.status ?? Enums.StatusModulo.Desconectado); - DefinirSaudeModulo(healthAgitador, saudeAgitador?.saude ?? 0, saudeAgitador?.status ?? Enums.StatusModulo.Desconectado); - DefinirSaudeModulo(healthSensores, saudeSensoresMedia, saudeSensoresStatus); - DefinirSaudeModulo(healthBicos, saudeBicosMedia, saudeBicosStatus); - DefinirSaudeModulo(healthCamera, saudeCamera?.saude ?? 0, saudeCamera?.status ?? Enums.StatusModulo.Desconectado); + DefinirSaudeModulo(healthBomba, pnlBomba, saudeBomba?.saude ?? 0, saudeBomba?.status ?? StatusModulo.Desconectado); + DefinirSaudeModulo(healthAgitador, pnlAgitador, saudeAgitador?.saude ?? 0, saudeAgitador?.status ?? StatusModulo.Desconectado); + DefinirSaudeModulo(healthSensores, pnlTelemetria, saudeSensoresMedia, saudeSensoresStatus); + DefinirSaudeModulo(healthBicos, pnlBicos, saudeBicosMedia, saudeBicosStatus); + DefinirSaudeModulo(healthCamera, pnlVideo, saudeCamera?.saude ?? 0, saudeCamera?.status ?? StatusModulo.Desconectado); } public async void AtualizarDadosCamera(CameraWorkerItemModel dados, double saude) @@ -222,11 +224,11 @@ namespace AgroBase.Forms.IHM.Operacao telemetryPressaoSensor.Valor = (dados?.PressaoSensor ?? 0).ToString("F1") + " psi"; telemetryPressaoBomba.Valor = (dados?.PressaoAtualBomba ?? 0).ToString("F1") + " psi"; telemetryAutonomiaM.Valor = (dados?.DistanciaEstimadaRestanteMetros ?? 0).ToString("F1") + " m"; - telemetryAutonomiaTempo.Valor = FormatarTempo(tempoAutonomia); + telemetryAutonomiaTempo.Valor = FuncoesIHM.FormatarTempo(tempoAutonomia); telemetryVolumeAplicado.Valor = (dados?.VolumeVazaoML ?? 0).ToString("F1") + " L"; telemetryLitroMetro.Valor = (dados?.LPorMetro ?? 0).ToString("F1") + " L/m"; telemetryInfestacao.Valor = (dados?.PercentualErvasTerreno ?? 0).ToString("F1") + "% · Baixa"; - telemetryTempoLigado.Valor = FormatarTempo(tempoPulverizador); + telemetryTempoLigado.Valor = FuncoesIHM.FormatarTempo(tempoPulverizador); } @@ -256,15 +258,90 @@ namespace AgroBase.Forms.IHM.Operacao telemetryLitroMetro.CorValor = HmiTheme.Info; telemetryInfestacao.CorValor = HmiTheme.Success; telemetryTempoLigado.CorValor = HmiTheme.Manual; - - AplicarEstadoPainel(pnlBomba, HmiTheme.Warning); - AplicarEstadoPainel(pnlAgitador, HmiTheme.Success); } private void VincularEventos() { foreach (HmiNozzleCard card in _bicos) card.NozzleClick += NozzleCard_Click; + + btnDesligarAgitador.Click += BtnDesligarAgitador_Click; + btnLigarAgitador.Click += BtnLigarAgitador_Click; + btnDesligarBomba.Click += BtnDesligarBomba_Click; + btnLigarBomba.Click += BtnLigarBomba_Click; + } + + private void BtnLigarBomba_Click(object sender, EventArgs e) + { + var Bomba = op?.DispAtu?.Dados?.BombaPressurizadora; + if (Bomba != null) + { + op?.DispAtu?.Dados?.EnviarComandoFisicoBomba( + Bomba, + CanMessagePosicaoDados.Command2, + setarControle: true, + status: true + ); + + op?.DispAtu?.Dados?.EnviarComandoFisicoBomba( + Bomba, + CanMessagePosicaoDados.Command1, + setarControle: true, + status: true + ); + } + } + + private void BtnDesligarBomba_Click(object sender, EventArgs e) + { + var Bomba = op?.DispAtu?.Dados?.BombaPressurizadora; + if (Bomba != null) + op?.DispAtu?.Dados?.EnviarComandoFisicoBomba( + Bomba, + CanMessagePosicaoDados.Command1, + setarControle: true, + status: false + ); + } + + private void BtnLigarAgitador_Click(object sender, EventArgs e) + { + var Agitador = op?.DispAtu?.Dados?.AgitadorDeCalda; + if (Agitador != null) + { + op.Parametros.Controle.AtuAgitadorModo = ModoAgitadorCalda.Manual; + + op?.DispAtu?.Dados?.EnviarComandoFisicoBomba( + Agitador, + CanMessagePosicaoDados.Command2, + setarControle: true, + status: true + ); + + op?.DispAtu?.Dados?.EnviarComandoFisicoBomba( + Agitador, + CanMessagePosicaoDados.Command1, + setarControle: true, + status: true + ); + } + } + + private void BtnDesligarAgitador_Click(object sender, EventArgs e) + { + if (!(op?.Parametros?.Controle?.ControleManualAcionado ?? false)) + return; + + op.Parametros.Controle.AtuAgitadorModo = ModoAgitadorCalda.SemAgitacao; + + var Agitador = op?.DispAtu?.Dados?.AgitadorDeCalda; + if (Agitador != null) + op?.DispAtu?.Dados?.EnviarComandoFisicoBomba( + Agitador, + CanMessagePosicaoDados.Command1, + setarControle: true, + status: false + ); } private void NozzleCard_Click(object sender, EventArgs e) @@ -273,36 +350,28 @@ namespace AgroBase.Forms.IHM.Operacao if (card == null) return; + if (!(op?.Parametros?.Controle?.ControleManualAcionado ?? false)) + return; + + var bico = op?.DispAtu?.Dados?.BicosPulverizadores?.FirstOrDefault(x => x.ID == card.Codigo); + if (bico == null) + return; + card.CommandOn = !card.CommandOn; - } - private static void AplicarEstadoPainel(HmiRoundedPanel panel, Color color) - { - panel.BorderColor = color; - panel.Invalidate(); - } - - public IList Bicos - { - get { return _bicos.AsReadOnly(); } - } - - - - private static string FormatarTempo(TimeSpan tempo) - { - if (tempo < TimeSpan.Zero) - tempo = TimeSpan.Zero; - - int horasTotais = (int)tempo.TotalHours; - - return string.Format( - "{0:00}:{1:00}:{2:00}", - horasTotais, - tempo.Minutes, - tempo.Seconds + op?.DispAtu?.Dados?.EnviarComandoFisicoBico( + bico, + CanMessagePosicaoDados.Command1, + setarControle: true, + status: + card.CommandOn ); } + + + + + } } diff --git a/AgroBase/AgroBase/Forms/IHM/frmIHM.cs b/AgroBase/AgroBase/Forms/IHM/frmIHM.cs index 65031053e..8c84de8f7 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmIHM.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmIHM.cs @@ -260,31 +260,31 @@ namespace AgroBase.Forms.IHM // ========================================================= double bateria = operacao?.Sensoriamento?.Bateria?.PercentualBateria ?? 0; double bateriaSaude = ObterSaudeModulo(saudeModulos, Enums.T_Code.Bat); - Color corBateria = CorPorValorESaude(bateria, bateriaSaude); - AtualizarBateria($"{Limitar(bateria, 0, 100):0}%", corBateria); + Color corBateria = FuncoesIHM.CorPorValorESaude(bateria, bateriaSaude); + AtualizarBateria($"{FuncoesIHM.Limitar(bateria, 0, 100):0}%", corBateria); // ========================================================= // RESERVATÓRIO // ========================================================= double reservatorio = operacao?.Sensoriamento?.Atuador?.PercentualReservatorio ?? 0; double atuadorSaude = ObterSaudeModulo(saudeModulos, Enums.T_Code.Atu); - Color corReservatorio = CorPorValorESaude(reservatorio, atuadorSaude); - AtualizarReservatorio($"{Limitar(reservatorio, 0, 100):0}%", corReservatorio); + Color corReservatorio = FuncoesIHM.CorPorValorESaude(reservatorio, atuadorSaude); + AtualizarReservatorio($"{FuncoesIHM.Limitar(reservatorio, 0, 100):0}%", corReservatorio); // ========================================================= // TEMPERATURA // ========================================================= double temperatura = operacao?.Sensoriamento?.CoolerControl?.Temperatura ?? 0; double temperaturaSaude = ObterSaudeModulo(saudeModulos, Enums.T_Code.Npc); - Color corTemperatura = CorTemperatura(temperatura, temperaturaSaude); + Color corTemperatura = FuncoesIHM.CorTemperatura(temperatura, temperaturaSaude); AtualizarTemperatura($"{temperatura:0.#} °C", corTemperatura); // ========================================================= // REDE / IPB // ========================================================= double redeSaude = ObterSaudeModulo(saudeModulos, Enums.T_Code.Ipb); - Color corRede = CorPorPercentual(redeSaude); - AtualizarRede($"{Limitar(redeSaude, 0, 100):0}%", corRede); + Color corRede = FuncoesIHM.CorPorPercentual(redeSaude); + AtualizarRede($"{FuncoesIHM.Limitar(redeSaude, 0, 100):0}%", corRede); // ========================================================= // GNSS @@ -300,9 +300,9 @@ namespace AgroBase.Forms.IHM { Enums.TiposCorrecaoGPS qualidadeFix = gnss.QualidadeFix; double precisaoCm = Math.Max(0, gnss.PrecisaoCm); - double notaGnss = CalcularNotaGnss(qualidadeFix, precisaoCm, gnssSaude); - Color corGnss = CorPorPercentual(notaGnss); - string textoGnss = $"{FormatarQualidadeGnss(qualidadeFix)} " + $"{precisaoCm:0.##} cm"; + double notaGnss = FuncoesIHM.CalcularNotaGnss(qualidadeFix, precisaoCm, gnssSaude); + Color corGnss = FuncoesIHM.CorPorPercentual(notaGnss); + string textoGnss = $"{FuncoesIHM.FormatarQualidadeGnss(qualidadeFix)} " + $"{precisaoCm:0.##} cm"; AtualizarGnss(textoGnss, corGnss); } @@ -317,8 +317,8 @@ namespace AgroBase.Forms.IHM else { double distanciaBase = GPSUtils.DistanciaEntrePontos(gnss, VariaveisOperacao.PosicaoBase); - Color corBase = CorDistanciaBase(distanciaBase, 1000); - string distanciaTexto = FormatarDistancia(distanciaBase); + Color corBase = FuncoesIHM.CorDistanciaBase(distanciaBase, 1000); + string distanciaTexto = FuncoesIHM.FormatarDistancia(distanciaBase); AtualizarDistanciaBase(distanciaTexto, corBase); } @@ -392,7 +392,7 @@ namespace AgroBase.Forms.IHM lblIndicadorStatus.ForeColor = corStatus; pnlStatusOperacao.AccentColor = corStatus; - pnlStatusOperacao.BorderColor = MisturarCores(HmiTheme.BorderSoft, corStatus, 0.35F); + pnlStatusOperacao.BorderColor = FuncoesIHM.MisturarCores(HmiTheme.BorderSoft, corStatus, 0.35F); }); } @@ -511,205 +511,7 @@ namespace AgroBase.Forms.IHM acao(); } - private static Color MisturarCores(Color baseColor, Color accentColor, float pesoAccent) - { - pesoAccent = Math.Max(0F, Math.Min(1F, pesoAccent)); - - float pesoBase = 1F - pesoAccent; - - return Color.FromArgb( - (int)(baseColor.R * pesoBase + accentColor.R * pesoAccent), - (int)(baseColor.G * pesoBase + accentColor.G * pesoAccent), - (int)(baseColor.B * pesoBase + accentColor.B * pesoAccent) - ); - } - - private static Color CorPorPercentual(double percentual) - { - percentual = Limitar(percentual, 0, 100); - - if (percentual <= 50) - { - double fator = percentual / 50.0; - - return InterpolarCor(HmiTheme.Danger, HmiTheme.Warning, fator); - } - - double fatorVerde = (percentual - 50) / 50.0; - - return InterpolarCor(HmiTheme.Warning, HmiTheme.Success, fatorVerde); - } - - private static Color CorPorValorESaude(double valor, double saude) - { - double notaFinal = Math.Min(Limitar(valor, 0, 100), Limitar(saude, 0, 100)); - - return CorPorPercentual(notaFinal); - } - - private static Color CorTemperatura(double temperatura, double saudeModulo) - { - Color corTemperatura; - - if (temperatura <= 45) - { - corTemperatura = HmiTheme.Success; - } - else if (temperatura <= 60) - { - double fator = (temperatura - 45) / (60 - 45); - - corTemperatura = InterpolarCor(HmiTheme.Success, HmiTheme.Warning, fator); - } - else if (temperatura <= 75) - { - double fator = (temperatura - 60) / (75 - 60); - - corTemperatura = InterpolarCor(HmiTheme.Warning, HmiTheme.Danger, fator); - } - else - { - corTemperatura = HmiTheme.Danger; - } - - Color corSaude = CorPorPercentual(saudeModulo); - - /* - * Se a saúde estiver muito baixa, - * ela prevalece sobre a temperatura. - */ - if (saudeModulo < 40) - return corSaude; - - return corTemperatura; - } - - private static double NotaQualidadeGnss(Enums.TiposCorrecaoGPS qualidade) - { - switch (qualidade) - { - case Enums.TiposCorrecaoGPS.RTKFixo: - return 100; - - case Enums.TiposCorrecaoGPS.BaseFix: - return 100; - - case Enums.TiposCorrecaoGPS.RTKFlutuante: - return 78; - - case Enums.TiposCorrecaoGPS.PPS: - return 65; - - case Enums.TiposCorrecaoGPS.DGPS: - return 58; - - case Enums.TiposCorrecaoGPS.DeadReckoing: - return 35; - - case Enums.TiposCorrecaoGPS.Autonomo: - return 22; - - case Enums.TiposCorrecaoGPS.SemCorrecao: - default: - return 0; - } - } - - private static double NotaPrecisaoGnss(double precisaoCm) - { - if (precisaoCm <= 2) - return 100; - - if (precisaoCm <= 5) - return InterpolarValor(precisaoCm, 2, 5, 100, 90); - - if (precisaoCm <= 10) - return InterpolarValor(precisaoCm, 5, 10, 90, 75); - - if (precisaoCm <= 30) - return InterpolarValor(precisaoCm, 10, 30, 75, 50); - - if (precisaoCm <= 100) - return InterpolarValor(precisaoCm, 30, 100, 50, 20); - - return 5; - } - - private static double CalcularNotaGnss(Enums.TiposCorrecaoGPS qualidade, double precisaoCm, double saudeModulo) - { - double notaFix = NotaQualidadeGnss(qualidade); - - double notaPrecisao = NotaPrecisaoGnss(precisaoCm); - - /* - * O pior dos três critérios define a cor. - * - * RTK Fixo com saúde ruim não fica verde. - * Saúde boa com modo autônomo também não. - */ - return Math.Min(notaFix, Math.Min(notaPrecisao, Limitar(saudeModulo, 0, 100))); - } - - private static string FormatarQualidadeGnss(Enums.TiposCorrecaoGPS qualidade) - { - switch (qualidade) - { - case Enums.TiposCorrecaoGPS.SemCorrecao: - return "Sem correção"; - - case Enums.TiposCorrecaoGPS.Autonomo: - return "Autônomo"; - - case Enums.TiposCorrecaoGPS.DGPS: - return "DGPS"; - - case Enums.TiposCorrecaoGPS.PPS: - return "PPS"; - - case Enums.TiposCorrecaoGPS.RTKFixo: - return "RTK Fixo"; - - case Enums.TiposCorrecaoGPS.RTKFlutuante: - return "RTK Flutuante"; - - case Enums.TiposCorrecaoGPS.DeadReckoing: - return "Dead Reckoning"; - - case Enums.TiposCorrecaoGPS.BaseFix: - return "Base Fix"; - - default: - return "Desconhecido"; - } - } - - private static Color CorDistanciaBase(double distanciaMetros, double distanciaMaximaMetros) - { - if (double.IsNaN(distanciaMetros) || double.IsInfinity(distanciaMetros) || distanciaMetros < 0) - { - return HmiTheme.Danger; - } - - double percentualSaudavel = 100 - (distanciaMetros / distanciaMaximaMetros * 100); - - return CorPorPercentual(percentualSaudavel); - } - - private static string FormatarDistancia(double distanciaMetros) - { - if (double.IsNaN(distanciaMetros) || double.IsInfinity(distanciaMetros) || distanciaMetros < 0) - { - return "Indisponível"; - } - - if (distanciaMetros >= 1000) - { - return $"{distanciaMetros / 1000.0:0.00} km"; - } - - return $"{distanciaMetros:0.0} m"; - } - + private void AtualizarStatusOperacao(Enums.StatusOperacao status, bool pausada, bool emergencia, int? inicio_em = null) { string titulo; @@ -843,39 +645,10 @@ namespace AgroBase.Forms.IHM if (item == null) return 0; - return Limitar(Convert.ToDouble(item.saude), 0, 100); - } - - private static Color InterpolarCor(Color inicial, Color final, double fator) - { - fator = Limitar(fator, 0, 1); - - int r = (int)Math.Round(inicial.R + (final.R - inicial.R) * fator); - - int g = (int)Math.Round(inicial.G + (final.G - inicial.G) * fator); - - int b = (int)Math.Round(inicial.B + (final.B - inicial.B) * fator); - - return Color.FromArgb(r, g, b); - } - - private static double InterpolarValor(double valor, double origemMinima, double origemMaxima, double destinoInicial, double destinoFinal) - { - if (origemMaxima <= origemMinima) - return destinoInicial; - - double fator = (valor - origemMinima) / (origemMaxima - origemMinima); - - fator = Limitar(fator, 0, 1); - - return destinoInicial + (destinoFinal - destinoInicial) * fator; - } - - private static double Limitar(double valor, double minimo, double maximo) - { - return Math.Max(minimo, Math.Min(maximo, valor)); + return FuncoesIHM.Limitar(Convert.ToDouble(item.saude), 0, 100); } + } diff --git a/AgroBase/AgroBase/Forms/IHM/frmOperacao.cs b/AgroBase/AgroBase/Forms/IHM/frmOperacao.cs index d98520ba6..b2142c6da 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmOperacao.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmOperacao.cs @@ -56,6 +56,7 @@ namespace AgroBase.Forms.IHM _ucPulverizador.AtualizarDadosTela(); break; case AbaOperacaoIHM.Navegacao: + _ucNavegacao.AtualizarDadosTela(); break; case AbaOperacaoIHM.Parametros: break; diff --git a/AgroBase/AgroBase/Forms/frmPrincipal.cs b/AgroBase/AgroBase/Forms/frmPrincipal.cs index 93843c3c8..168b93124 100644 --- a/AgroBase/AgroBase/Forms/frmPrincipal.cs +++ b/AgroBase/AgroBase/Forms/frmPrincipal.cs @@ -258,7 +258,7 @@ namespace AgroBase GeneralJoystick.AtualizaDispositivo(); cmbJoysticks.Items.Clear(); cmbJoysticks.Items.AddRange(GeneralJoystick.JoysticksConectados.ToArray()); - cmbJoysticks.SelectedIndex = GeneralJoystick.JoysticksConectados.IndexOf(GeneralJoystick.JoystickConectado.Information.InstanceName); + cmbJoysticks.SelectedIndex = GeneralJoystick.JoysticksConectados.IndexOf(GeneralJoystick.JoystickConectado?.Information?.InstanceName); } private void btnJoyEdt_Click(object sender, EventArgs e) diff --git a/AgroBase/AgroBase/Models/Enums.cs b/AgroBase/AgroBase/Models/Enums.cs index 2e5f2d7a5..161b4a9f8 100644 --- a/AgroBase/AgroBase/Models/Enums.cs +++ b/AgroBase/AgroBase/Models/Enums.cs @@ -381,6 +381,7 @@ SemAgitacao = 0, Continuo = 1, Intermitente = 2, + Manual = 3, } public enum ModoControleBomba diff --git a/AgroBase/AgroBase/Models/MapaDinamicoModel.cs b/AgroBase/AgroBase/Models/MapaDinamicoModel.cs index 9719d1dd6..e83e51581 100644 --- a/AgroBase/AgroBase/Models/MapaDinamicoModel.cs +++ b/AgroBase/AgroBase/Models/MapaDinamicoModel.cs @@ -45,7 +45,7 @@ namespace AgroBase.Models private RenderState _state = RenderState.Empty; private readonly Panel _painel; - private readonly Form _parent; + private readonly Control _parent; private double _zoom = ZoomInicial; @@ -137,7 +137,7 @@ namespace AgroBase.Models #endregion - public MapaDinamicoModel(Form parent, Panel painel) + public MapaDinamicoModel(Control parent, Panel painel) { if (parent == null) throw new ArgumentNullException(nameof(parent)); diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 3d416ced2..a0bbbc607 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -1093,7 +1093,6 @@ namespace AgroBase.Models if (CarregarModulos) { op.DefinirComponentesEmUso(); - RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); op.AtualizarSensoriamentoSeguro(); } @@ -4909,7 +4908,7 @@ namespace AgroBase.Models DistanciaErroMapaCana = _Trajetoria?.DistanciaErroMapaPlantacao ?? 0, PrimeiroPontoDentroMapa = _Trajetoria?.PrimeiroPontoDentroMapa?.Clone() ?? new GPSModel(), PrimeiroPontoDentroCana = _Trajetoria?.PrimeiroPontoDentroCana?.Clone() ?? new GPSModel(), - AutonomiaCooredor = _Trajetoria?.AutonomiaCorredor?.Clone(), + AutonomiaCorredor = _Trajetoria?.AutonomiaCorredor?.Clone(), }; } @@ -5307,7 +5306,7 @@ namespace AgroBase.Models public GPSModel PrimeiroPontoDentroCana { get; set; } public double DistanciaErroMapaCana { get; set; } - public AutonomiaCorredorModel AutonomiaCooredor { get; set; } + public AutonomiaCorredorModel AutonomiaCorredor { get; set; } public OperacaoSensoriamentoLogTrajetoriaModel Clone() { @@ -5345,7 +5344,7 @@ namespace AgroBase.Models PrimeiroPontoDentroCana = PrimeiroPontoDentroCana?.Clone(), PrimeiroPontoDentroMapa = PrimeiroPontoDentroMapa?.Clone(), DistanciaErroMapaCana = DistanciaErroMapaCana, - AutonomiaCooredor = AutonomiaCooredor?.Clone() + AutonomiaCorredor = AutonomiaCorredor?.Clone() }; } } diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs index a2d65c14c..421c964af 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoParametrosModel.cs @@ -591,6 +591,20 @@ namespace AgroBase.Models.Operacoes } } + private double _distanciaManobra = 3.0; + public double DistanciaManobra + { + get => _distanciaManobra; + set + { + if (_distanciaManobra != value) + { + _distanciaManobra = value; + OnPropertyChanged(nameof(DistanciaManobra)); + } + } + } + public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string nome) @@ -696,7 +710,7 @@ namespace AgroBase.Models.Operacoes return; } - var autonomia = t.AutonomiaCooredor; + var autonomia = t.AutonomiaCorredor; var corredorAtual = t.CorredorAtual; var pontoAtual = t.PontoAtual; var proximoPonto = t.ProximoPonto; diff --git a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs index efb3d2cfe..e739c9cfd 100644 --- a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs +++ b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs @@ -133,7 +133,7 @@ namespace AgroBase.Models public List _Corredores { get; set; } public List TrajetoriaFixa => _TrajetoriaFixa?.ConvertAll(x => x.Posicao); public List _TrajetoriaDinamica { get; private set; } - public List TrajetoriaDinamica => _TrajetoriaDinamica.ConvertAll(x => x.Posicao); + public List TrajetoriaDinamica => _TrajetoriaDinamica?.ConvertAll(x => x.Posicao); public void AtualizarTrajetoriaDinamica() { // Cria a lista com a última leitura do robô diff --git a/AgroBase/AgroBase/Models/Variaveis.cs b/AgroBase/AgroBase/Models/Variaveis.cs index 6693e475b..d0bdd480b 100644 --- a/AgroBase/AgroBase/Models/Variaveis.cs +++ b/AgroBase/AgroBase/Models/Variaveis.cs @@ -84,6 +84,8 @@ namespace AgroBase.Models _op = value; _op?.IniciarTimersSistema(); + + RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false)); } } } @@ -2355,4 +2357,23 @@ namespace AgroBase.Models } + public static class CloneHelper + { + public static T DeepClone(T origem) + { + if (object.ReferenceEquals(origem, null)) + return default(T); + + JsonSerializerSettings settings = + new JsonSerializerSettings + { + ObjectCreationHandling = ObjectCreationHandling.Replace, + ReferenceLoopHandling = ReferenceLoopHandling.Ignore + }; + + string json = JsonConvert.SerializeObject(origem, settings); + + return JsonConvert.DeserializeObject(json, settings); + } + } } diff --git a/AgroBase/AgroBase/Services/HerbicideCounterService.cs b/AgroBase/AgroBase/Services/HerbicideCounterService.cs index 07af46566..3e138c32b 100644 --- a/AgroBase/AgroBase/Services/HerbicideCounterService.cs +++ b/AgroBase/AgroBase/Services/HerbicideCounterService.cs @@ -1616,8 +1616,7 @@ namespace AgroBase.Services private int AtuAgitadorTempoDesligadoMs = 30000; private int AtuAgitadorBoostRetomadaMs = 15000; - private double PotenciaLimitePorNivel( - double nivelPct) + private double PotenciaLimitePorNivel(double nivelPct) { if (nivelPct <= 5) return 0; @@ -1634,33 +1633,21 @@ namespace AgroBase.Services return 100; } - public void AtualizarAgitadorCalda( - ModoAgitadorCalda modo) + public void AtualizarAgitadorCalda(ModoAgitadorCalda modo) { - var op = - Variaveis.OperacaoEmAndamento; + var op = Variaveis.OperacaoEmAndamento; - if ( - op? - .Sensoriamento? - .Operacao? - .Calibrando == true - ) + if (op?.Sensoriamento?.Operacao?.Calibrando == true) { return; } - var agitador = - op? - .DispAtu? - .Dados? - .AgitadorDeCalda; + var agitador = op?.DispAtu?.Dados?.AgitadorDeCalda; if (!(agitador?.Inicializado ?? false)) return; - var controle = - op.Parametros?.Controle; + var controle = op.Parametros?.Controle; if (controle == null) { @@ -1670,12 +1657,10 @@ namespace AgroBase.Services return; } - bool operacaoConcluida = - op - .Sensoriamento? - .Operacao? - .StatusOperacaoAtual == - StatusOperacao.Concluido; + if (controle.AtuAgitadorModo == ModoAgitadorCalda.Manual) + return; + + bool operacaoConcluida = op.Sensoriamento?.Operacao?.StatusOperacaoAtual == StatusOperacao.Concluido; bool operacaoAtiva = op.Sensoriamento.Operacao.OperacaoIniciada && @@ -1683,37 +1668,20 @@ namespace AgroBase.Services !operacaoConcluida && PulverizadorLiberado; - bool bicosAtuando = - op - .DispAtu? - .Dados? - .BicosPulverizadores? - .Any( - x => - x.Comandar && - x.ComandoAtuar - ) - ?? false; + bool bicosAtuando = op.DispAtu?.Dados?.BicosPulverizadores?.Any(x => x.Comandar && x.ComandoAtuar) ?? false; double potenciaFinal = 0; DateTime agora = DateTime.Now; - if ( - operacaoAtiva && - !_agitadorOperacaoAtivaAnterior - ) + if (operacaoAtiva && !_agitadorOperacaoAtivaAnterior) { - _agitadorBoostAte = - agora.AddMilliseconds( - AtuAgitadorBoostRetomadaMs - ); + _agitadorBoostAte = agora.AddMilliseconds(AtuAgitadorBoostRetomadaMs); _agitadorUltimaTroca = agora; _agitadorIntermitenteLigado = true; } - bool emBoost = - agora < _agitadorBoostAte; + bool emBoost = agora < _agitadorBoostAte; switch (modo) { @@ -1726,18 +1694,15 @@ namespace AgroBase.Services { if (emBoost) { - potenciaFinal = - AtuAgitadorPotenciaBoost; + potenciaFinal = AtuAgitadorPotenciaBoost; } else if (bicosAtuando) { - potenciaFinal = - AtuAgitadorPotenciaContinua; + potenciaFinal = AtuAgitadorPotenciaContinua; } else { - potenciaFinal = - AtuAgitadorPotenciaManutencao; + potenciaFinal = AtuAgitadorPotenciaManutencao; } } break; @@ -1751,65 +1716,35 @@ namespace AgroBase.Services } else if (emBoost) { - potenciaFinal = - AtuAgitadorPotenciaBoost; + potenciaFinal = AtuAgitadorPotenciaBoost; } else { - int tempoAtualMs = - _agitadorIntermitenteLigado - ? AtuAgitadorTempoLigadoMs - : AtuAgitadorTempoDesligadoMs; + int tempoAtualMs = _agitadorIntermitenteLigado ? AtuAgitadorTempoLigadoMs : AtuAgitadorTempoDesligadoMs; - if ( - ( - agora - - _agitadorUltimaTroca - ).TotalMilliseconds >= - tempoAtualMs - ) + if ((agora - _agitadorUltimaTroca).TotalMilliseconds >= tempoAtualMs) { - _agitadorIntermitenteLigado = - !_agitadorIntermitenteLigado; + _agitadorIntermitenteLigado = !_agitadorIntermitenteLigado; - _agitadorUltimaTroca = - agora; + _agitadorUltimaTroca = agora; } - potenciaFinal = - _agitadorIntermitenteLigado - ? AtuAgitadorPotenciaIntermitente - : 0; + potenciaFinal = _agitadorIntermitenteLigado ? AtuAgitadorPotenciaIntermitente : 0; } break; } - potenciaFinal = - Math.Min( - potenciaFinal, - PotenciaLimitePorNivel( - PercentualAtual - ) - ); + potenciaFinal = Math.Min(potenciaFinal, PotenciaLimitePorNivel(PercentualAtual)); - potenciaFinal = - Clamp( - potenciaFinal, - 0, - 100 - ); + potenciaFinal = Clamp(potenciaFinal, 0, 100); - agitador.PotenciaSP = - potenciaFinal; + agitador.PotenciaSP = potenciaFinal; agitador.PressaoSP = -1; - agitador.ComandoAtuar = - agitador.Comandar && - potenciaFinal > 0; + agitador.ComandoAtuar = agitador.Comandar && potenciaFinal > 0; - _agitadorOperacaoAtivaAnterior = - operacaoAtiva; + _agitadorOperacaoAtivaAnterior = operacaoAtiva; } } } \ No newline at end of file diff --git a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs index 615840f9b..32b191680 100644 --- a/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs +++ b/AgroBase/AgroBase/Services/Operadores/HealthWorkerService.cs @@ -181,15 +181,15 @@ namespace AgroBase.Services.Operadores dist_dir = _t.DistanciaDireita, angulo = _t.AnguloMedioCorredor, pontos_restantes = _t.CorredorAtual.QtdPontos - pontoComparar.idxPontoCorredor, - liberado = _t.AutonomiaCooredor?.Liberado ?? false, - motivo_bat = _t.AutonomiaCooredor?.Motivos?.FirstOrDefault(x => x.Contains("Bateria")) ?? "", - bateria_ok = _t.AutonomiaCooredor?.BateriaSuficiente ?? false, - motivo_hrb = _t.AutonomiaCooredor?.Motivos?.FirstOrDefault(x => x.Contains("Herbicida")) ?? "", - herbicida_ok = _t.AutonomiaCooredor?.HerbicidaSuficiente ?? false, - autonomia_liberada = _t.AutonomiaCooredor?.Liberado ?? false, - autonomia_status = (int)(_t.AutonomiaCooredor?.Status ?? AutonomiaCorredorStatus.Desconhecido), - autonomia_motivo = _t.AutonomiaCooredor?.Motivo ?? "", - autonomia_ok_supervisionado = _t.AutonomiaCooredor?.Status == AutonomiaCorredorStatus.OkSupervisionado, + liberado = _t.AutonomiaCorredor?.Liberado ?? false, + motivo_bat = _t.AutonomiaCorredor?.Motivos?.FirstOrDefault(x => x.Contains("Bateria")) ?? "", + bateria_ok = _t.AutonomiaCorredor?.BateriaSuficiente ?? false, + motivo_hrb = _t.AutonomiaCorredor?.Motivos?.FirstOrDefault(x => x.Contains("Herbicida")) ?? "", + herbicida_ok = _t.AutonomiaCorredor?.HerbicidaSuficiente ?? false, + autonomia_liberada = _t.AutonomiaCorredor?.Liberado ?? false, + autonomia_status = (int)(_t.AutonomiaCorredor?.Status ?? AutonomiaCorredorStatus.Desconhecido), + autonomia_motivo = _t.AutonomiaCorredor?.Motivo ?? "", + autonomia_ok_supervisionado = _t.AutonomiaCorredor?.Status == AutonomiaCorredorStatus.OkSupervisionado, }, } : null ), @@ -1290,11 +1290,11 @@ namespace AgroBase.Services.Operadores var DadosTrj = _Sensoriamento?.Trajetoria; RedisService.AtualizarCampos(RedisService.ModKey(Enums.T_Code.Trj), ("timestamp", agora), - ("iniciado", DadosTrj?.AutonomiaCooredor?.Iniciado ?? false), - ("liberado", DadosTrj?.AutonomiaCooredor?.Liberado ?? false), - ("bateria_ok", DadosTrj?.AutonomiaCooredor?.BateriaSuficiente ?? false), - ("herbicida_ok", DadosTrj?.AutonomiaCooredor?.HerbicidaSuficiente ?? false), - ("motivos", DadosTrj?.AutonomiaCooredor?.Motivos ?? new List()) + ("iniciado", DadosTrj?.AutonomiaCorredor?.Iniciado ?? false), + ("liberado", DadosTrj?.AutonomiaCorredor?.Liberado ?? false), + ("bateria_ok", DadosTrj?.AutonomiaCorredor?.BateriaSuficiente ?? false), + ("herbicida_ok", DadosTrj?.AutonomiaCorredor?.HerbicidaSuficiente ?? false), + ("motivos", DadosTrj?.AutonomiaCorredor?.Motivos ?? new List()) ); double distanciaBase = -1;