ligado tela Operacao Movimento e Pulverizador

This commit is contained in:
Diego Freitas 2026-07-20 17:36:52 -03:00
parent f74e93f978
commit 6337847fce
34 changed files with 3912 additions and 1174 deletions

View File

@ -384,6 +384,9 @@
<Compile Include="Forms\frmPinout.Designer.cs"> <Compile Include="Forms\frmPinout.Designer.cs">
<DependentUpon>frmPinout.cs</DependentUpon> <DependentUpon>frmPinout.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Forms\IHM\Controls\HmiAgitatorModeSelector.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Controls\HmiAttitudeIndicator.cs"> <Compile Include="Forms\IHM\Controls\HmiAttitudeIndicator.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
@ -396,6 +399,12 @@
<Compile Include="Forms\IHM\Controls\HmiCameraSelector.cs"> <Compile Include="Forms\IHM\Controls\HmiCameraSelector.cs">
<SubType>UserControl</SubType> <SubType>UserControl</SubType>
</Compile> </Compile>
<Compile Include="Forms\IHM\Controls\HmiCompactCheckRow.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Controls\HmiCompactNumericField.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Controls\HmiCompassControl.cs"> <Compile Include="Forms\IHM\Controls\HmiCompassControl.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
@ -408,6 +417,9 @@
<Compile Include="Forms\IHM\Controls\HmiMetricTile.cs"> <Compile Include="Forms\IHM\Controls\HmiMetricTile.cs">
<SubType>UserControl</SubType> <SubType>UserControl</SubType>
</Compile> </Compile>
<Compile Include="Forms\IHM\Controls\HmiModeSelector.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Controls\HmiModuleBadge.cs"> <Compile Include="Forms\IHM\Controls\HmiModuleBadge.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
@ -432,9 +444,15 @@
<Compile Include="Forms\IHM\Controls\HmiNumericField.cs"> <Compile Include="Forms\IHM\Controls\HmiNumericField.cs">
<SubType>UserControl</SubType> <SubType>UserControl</SubType>
</Compile> </Compile>
<Compile Include="Forms\IHM\Controls\HmiNumericParameterCard.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Controls\HmiOperationTabButton.cs"> <Compile Include="Forms\IHM\Controls\HmiOperationTabButton.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
<Compile Include="Forms\IHM\Controls\HmiParameterSliderRow.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Controls\HmiParameterToggleRow.cs"> <Compile Include="Forms\IHM\Controls\HmiParameterToggleRow.cs">
<SubType>UserControl</SubType> <SubType>UserControl</SubType>
</Compile> </Compile>
@ -501,6 +519,30 @@
<Compile Include="Forms\IHM\Operacao\HmiCompactMetricCard.Designer.cs"> <Compile Include="Forms\IHM\Operacao\HmiCompactMetricCard.Designer.cs">
<DependentUpon>HmiCompactMetricCard.cs</DependentUpon> <DependentUpon>HmiCompactMetricCard.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Forms\IHM\Operacao\Parametros\ucParametrosAtuador.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Operacao\Parametros\ucParametrosAtuador.Designer.cs">
<DependentUpon>ucParametrosAtuador.cs</DependentUpon>
</Compile>
<Compile Include="Forms\IHM\Operacao\Parametros\ucParametrosDirecional.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Operacao\Parametros\ucParametrosDirecional.Designer.cs">
<DependentUpon>ucParametrosDirecional.cs</DependentUpon>
</Compile>
<Compile Include="Forms\IHM\Operacao\Parametros\ucParametrosMapa.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Operacao\Parametros\ucParametrosMapa.Designer.cs">
<DependentUpon>ucParametrosMapa.cs</DependentUpon>
</Compile>
<Compile Include="Forms\IHM\Operacao\Parametros\ucParametrosMovimento.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\IHM\Operacao\Parametros\ucParametrosMovimento.Designer.cs">
<DependentUpon>ucParametrosMovimento.cs</DependentUpon>
</Compile>
<Compile Include="Forms\IHM\Operacao\ucOperacaoMovimentacao.cs"> <Compile Include="Forms\IHM\Operacao\ucOperacaoMovimentacao.cs">
<SubType>UserControl</SubType> <SubType>UserControl</SubType>
</Compile> </Compile>

View File

@ -0,0 +1,131 @@
using AgroBase.Forms.IHM.Controls;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls
{
[DefaultEvent("SelectedModeChanged")]
public class HmiAgitatorModeSelector : UserControl
{
private readonly Button _btnSemAgitacao;
private readonly Button _btnContinuo;
private readonly Button _btnIntermitente;
private string _selectedMode = "Continuo";
public event EventHandler SelectedModeChanged;
public HmiAgitatorModeSelector()
{
DoubleBuffered = true;
BackColor = Color.Transparent;
Margin = Padding.Empty;
Padding = Padding.Empty;
MinimumSize = new Size(260, 44);
TableLayoutPanel layout = new TableLayoutPanel
{
Dock = DockStyle.Fill,
BackColor = Color.Transparent,
ColumnCount = 3,
RowCount = 1,
Margin = Padding.Empty,
Padding = Padding.Empty
};
layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.33F));
layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.33F));
layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.34F));
layout.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
_btnSemAgitacao = CriarBotao("Sem agitação");
_btnContinuo = CriarBotao("Contínuo");
_btnIntermitente = CriarBotao("Intermitente");
layout.Controls.Add(_btnSemAgitacao, 0, 0);
layout.Controls.Add(_btnContinuo, 1, 0);
layout.Controls.Add(_btnIntermitente, 2, 0);
Controls.Add(layout);
_btnSemAgitacao.Click += delegate { SelectedMode = "SemAgitacao"; };
_btnContinuo.Click += delegate { SelectedMode = "Continuo"; };
_btnIntermitente.Click += delegate { SelectedMode = "Intermitente"; };
AtualizarAparencia();
}
private static Button CriarBotao(string texto)
{
Button button = new Button
{
Dock = DockStyle.Fill,
BackColor = HmiTheme.SurfaceRaised,
ForeColor = HmiTheme.TextMuted,
FlatStyle = FlatStyle.Flat,
Font = new Font("Segoe UI", 7.6F, FontStyle.Bold),
Text = texto,
TextAlign = ContentAlignment.MiddleCenter,
Cursor = Cursors.Hand,
Margin = new Padding(2),
UseVisualStyleBackColor = false
};
button.FlatAppearance.BorderSize = 1;
button.FlatAppearance.BorderColor = HmiTheme.Border;
return button;
}
private void AtualizarAparencia()
{
AplicarEstado(_btnSemAgitacao, _selectedMode == "SemAgitacao");
AplicarEstado(_btnContinuo, _selectedMode == "Continuo");
AplicarEstado(_btnIntermitente, _selectedMode == "Intermitente");
}
private static void AplicarEstado(Button button, bool selecionado)
{
if (selecionado)
{
button.BackColor = Color.FromArgb(31, 91, 43);
button.ForeColor = HmiTheme.Success;
button.FlatAppearance.BorderColor = HmiTheme.Success;
}
else
{
button.BackColor = HmiTheme.SurfaceRaised;
button.ForeColor = HmiTheme.TextMuted;
button.FlatAppearance.BorderColor = HmiTheme.Border;
}
}
[Category("Dados")]
[DefaultValue("Continuo")]
public string 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)
return;
_selectedMode = novo;
AtualizarAparencia();
if (SelectedModeChanged != null)
SelectedModeChanged(this, EventArgs.Empty);
}
}
}
}

View File

@ -0,0 +1,201 @@
using AgroBase.Forms.IHM.Controls;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls
{
[DefaultEvent("CheckedChanged")]
public class HmiCompactCheckRow : UserControl
{
private readonly TableLayoutPanel _layout;
private readonly Label _lblTitulo;
private readonly CheckBox _check;
public event EventHandler CheckedChanged;
public HmiCompactCheckRow()
{
SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.UserPaint,
true
);
DoubleBuffered = true;
BackColor = HmiTheme.SurfaceRaised;
Cursor = Cursors.Hand;
Height = 54;
MinimumSize = new Size(150, 44);
Margin = new Padding(3);
Padding = new Padding(9, 5, 7, 5);
_layout = new TableLayoutPanel
{
BackColor = Color.Transparent,
ColumnCount = 2,
RowCount = 1,
Dock = DockStyle.Fill,
Margin = Padding.Empty,
Padding = Padding.Empty
};
_layout.ColumnStyles.Add(
new ColumnStyle(SizeType.Percent, 100F)
);
_layout.ColumnStyles.Add(
new ColumnStyle(SizeType.Absolute, 42F)
);
_layout.RowStyles.Add(
new RowStyle(SizeType.Percent, 100F)
);
_lblTitulo = new Label
{
AutoEllipsis = true,
AutoSize = false,
BackColor = Color.Transparent,
Cursor = Cursors.Hand,
Dock = DockStyle.Fill,
Font = new Font(
"Segoe UI",
8F,
FontStyle.Bold
),
ForeColor = HmiTheme.Text,
Margin = Padding.Empty,
Padding = new Padding(2, 0, 4, 0),
Text = "Parâmetro",
TextAlign = ContentAlignment.MiddleLeft
};
_check = CriarCheck();
_layout.Controls.Add(_lblTitulo, 0, 0);
_layout.Controls.Add(_check, 1, 0);
Controls.Add(_layout);
_check.CheckedChanged += Check_CheckedChanged;
_lblTitulo.Click += AlternarPorClique;
_layout.Click += AlternarPorClique;
Click += AlternarPorClique;
AtualizarAparencia();
}
private static CheckBox CriarCheck()
{
CheckBox check = new CheckBox
{
Anchor = AnchorStyles.None,
Appearance = Appearance.Button,
AutoSize = false,
BackColor = Color.FromArgb(30, 90, 46),
Checked = true,
Cursor = Cursors.Hand,
Dock = DockStyle.None,
FlatStyle = FlatStyle.Flat,
Font = new Font(
"Segoe UI Symbol",
9F,
FontStyle.Bold
),
ForeColor = HmiTheme.Success,
Height = 30,
Margin = Padding.Empty,
Padding = Padding.Empty,
Text = "✓",
TextAlign = ContentAlignment.MiddleCenter,
UseVisualStyleBackColor = false,
Width = 34
};
check.FlatAppearance.BorderSize = 1;
check.FlatAppearance.BorderColor = HmiTheme.Success;
check.FlatAppearance.CheckedBackColor =
Color.FromArgb(30, 90, 46);
check.FlatAppearance.MouseDownBackColor =
Color.FromArgb(37, 108, 55);
check.FlatAppearance.MouseOverBackColor =
Color.FromArgb(34, 100, 51);
return check;
}
private void AlternarPorClique(object sender, EventArgs e)
{
_check.Checked = !_check.Checked;
}
private void Check_CheckedChanged(object sender, EventArgs e)
{
AtualizarAparencia();
if (CheckedChanged != null)
CheckedChanged(this, EventArgs.Empty);
}
private void AtualizarAparencia()
{
if (_check.Checked)
{
_check.Text = "✓";
_check.ForeColor = HmiTheme.Success;
_check.BackColor = Color.FromArgb(30, 90, 46);
_check.FlatAppearance.BorderColor = HmiTheme.Success;
_lblTitulo.ForeColor = HmiTheme.Text;
}
else
{
_check.Text = "×";
_check.ForeColor = HmiTheme.Danger;
_check.BackColor = HmiTheme.Surface;
_check.FlatAppearance.BorderColor = HmiTheme.Danger;
_lblTitulo.ForeColor = HmiTheme.TextMuted;
}
Invalidate();
}
[Category("Conteúdo")]
public string Titulo
{
get { return _lblTitulo.Text; }
set { _lblTitulo.Text = value ?? string.Empty; }
}
[Category("Dados")]
[DefaultValue(true)]
public bool Checked
{
get { return _check.Checked; }
set
{
if (_check.Checked == value)
{
AtualizarAparencia();
return;
}
_check.Checked = value;
}
}
[Browsable(false)]
public CheckBox CheckBox
{
get { return _check; }
}
}
}

View File

@ -0,0 +1,381 @@
using AgroBase.Forms.IHM.Controls;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls
{
[DefaultEvent("ValueChanged")]
public class HmiCompactNumericField : UserControl
{
private readonly TableLayoutPanel _root;
private readonly Label _lblTitulo;
private readonly TableLayoutPanel _valueLayout;
private readonly Button _btnDiminuir;
private readonly TextBox _txtValor;
private readonly Button _btnAumentar;
private readonly Label _lblUnidade;
private decimal _value;
private decimal _minimum;
private decimal _maximum = 100M;
private decimal _increment = 1M;
private int _decimalPlaces;
public event EventHandler ValueChanged;
public HmiCompactNumericField()
{
SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.UserPaint,
true);
DoubleBuffered = true;
BackColor = HmiTheme.SurfaceRaised;
Margin = new Padding(3);
Padding = new Padding(7, 5, 7, 5);
MinimumSize = new Size(105, 62);
_root = new TableLayoutPanel
{
Dock = DockStyle.Fill,
BackColor = Color.Transparent,
ColumnCount = 1,
RowCount = 2,
Margin = Padding.Empty,
Padding = Padding.Empty
};
_root.ColumnStyles.Add(
new ColumnStyle(SizeType.Percent, 100F));
_root.RowStyles.Add(
new RowStyle(SizeType.Absolute, 22F));
_root.RowStyles.Add(
new RowStyle(SizeType.Percent, 100F));
_lblTitulo = new Label
{
Dock = DockStyle.Fill,
AutoSize = false,
AutoEllipsis = true,
BackColor = Color.Transparent,
ForeColor = HmiTheme.TextMuted,
Font = new Font("Segoe UI", 6.8F, FontStyle.Bold),
Text = "Parâmetro",
TextAlign = ContentAlignment.MiddleLeft,
Margin = Padding.Empty,
Padding = Padding.Empty
};
_valueLayout = new TableLayoutPanel
{
Dock = DockStyle.Fill,
BackColor = Color.Transparent,
ColumnCount = 4,
RowCount = 1,
Margin = Padding.Empty,
Padding = Padding.Empty
};
_valueLayout.ColumnStyles.Add(
new ColumnStyle(SizeType.Absolute, 34F));
_valueLayout.ColumnStyles.Add(
new ColumnStyle(SizeType.Percent, 100F));
_valueLayout.ColumnStyles.Add(
new ColumnStyle(SizeType.Absolute, 34F));
_valueLayout.ColumnStyles.Add(
new ColumnStyle(SizeType.Absolute, 34F));
_valueLayout.RowStyles.Add(
new RowStyle(SizeType.Percent, 100F));
_btnDiminuir = CriarBotaoValor("");
_btnAumentar = CriarBotaoValor("+");
_txtValor = new TextBox
{
Dock = DockStyle.Fill,
BackColor = HmiTheme.Surface,
ForeColor = HmiTheme.Text,
BorderStyle = BorderStyle.FixedSingle,
Font = new Font("Segoe UI", 9F, FontStyle.Bold),
TextAlign = HorizontalAlignment.Center,
ReadOnly = true,
ShortcutsEnabled = false,
TabStop = false,
Margin = new Padding(3, 1, 3, 1)
};
_lblUnidade = new Label
{
Dock = DockStyle.Fill,
AutoSize = false,
BackColor = Color.Transparent,
ForeColor = HmiTheme.TextMuted,
Font = new Font("Segoe UI", 7F, FontStyle.Bold),
Text = "%",
TextAlign = ContentAlignment.MiddleCenter,
Margin = Padding.Empty,
Padding = Padding.Empty
};
_valueLayout.Controls.Add(_btnDiminuir, 0, 0);
_valueLayout.Controls.Add(_txtValor, 1, 0);
_valueLayout.Controls.Add(_btnAumentar, 2, 0);
_valueLayout.Controls.Add(_lblUnidade, 3, 0);
_root.Controls.Add(_lblTitulo, 0, 0);
_root.Controls.Add(_valueLayout, 0, 1);
Controls.Add(_root);
_btnDiminuir.Click += delegate
{
Value -= Increment;
};
_btnAumentar.Click += delegate
{
Value += Increment;
};
AtualizarTexto();
AtualizarBotoes();
}
private static Button CriarBotaoValor(string texto)
{
Button button = new Button
{
Dock = DockStyle.Fill,
BackColor = HmiTheme.Surface,
ForeColor = HmiTheme.Info,
FlatStyle = FlatStyle.Flat,
Font = new Font("Segoe UI", 12F, FontStyle.Bold),
Text = texto,
TextAlign = ContentAlignment.MiddleCenter,
Cursor = Cursors.Hand,
Margin = new Padding(1),
Padding = Padding.Empty,
TabStop = false,
UseVisualStyleBackColor = false
};
button.FlatAppearance.BorderSize = 1;
button.FlatAppearance.BorderColor = HmiTheme.Border;
button.FlatAppearance.MouseOverBackColor =
Color.FromArgb(35, 52, 61);
button.FlatAppearance.MouseDownBackColor =
Color.FromArgb(42, 67, 78);
return button;
}
private void DefinirValor(decimal value)
{
decimal novo = Math.Max(
Minimum,
Math.Min(Maximum, value));
novo = decimal.Round(
novo,
DecimalPlaces,
MidpointRounding.AwayFromZero);
if (_value == novo)
{
AtualizarTexto();
AtualizarBotoes();
return;
}
_value = novo;
AtualizarTexto();
AtualizarBotoes();
if (ValueChanged != null)
ValueChanged(this, EventArgs.Empty);
}
private void AtualizarTexto()
{
string formato = DecimalPlaces > 0
? "F" + DecimalPlaces
: "F0";
_txtValor.Text = _value.ToString(
formato,
CultureInfo.CurrentCulture);
}
private void AtualizarBotoes()
{
bool podeDiminuir = _value > Minimum;
bool podeAumentar = _value < Maximum;
AplicarEstadoBotao(
_btnDiminuir,
podeDiminuir);
AplicarEstadoBotao(
_btnAumentar,
podeAumentar);
}
private static void AplicarEstadoBotao(
Button button,
bool habilitado)
{
button.Enabled = habilitado;
if (habilitado)
{
button.ForeColor = HmiTheme.Info;
button.BackColor = HmiTheme.Surface;
button.FlatAppearance.BorderColor =
HmiTheme.Border;
}
else
{
button.ForeColor = HmiTheme.TextMuted;
button.BackColor = HmiTheme.SurfaceRaised;
button.FlatAppearance.BorderColor =
HmiTheme.SurfaceRaised;
}
}
[Category("Conteúdo")]
public string Titulo
{
get { return _lblTitulo.Text; }
set { _lblTitulo.Text = value ?? string.Empty; }
}
[Category("Conteúdo")]
public string Unidade
{
get { return _lblUnidade.Text; }
set
{
_lblUnidade.Text = value ?? string.Empty;
AtualizarLarguraUnidade();
}
}
private void AtualizarLarguraUnidade()
{
int largura;
if (string.IsNullOrWhiteSpace(_lblUnidade.Text))
largura = 4;
else if (_lblUnidade.Text.Length <= 1)
largura = 25;
else
largura = 35;
_valueLayout.ColumnStyles[3].SizeType =
SizeType.Absolute;
_valueLayout.ColumnStyles[3].Width =
largura;
}
[Category("Dados")]
[DefaultValue(typeof(decimal), "0")]
public decimal Value
{
get { return _value; }
set { DefinirValor(value); }
}
[Category("Dados")]
[DefaultValue(typeof(decimal), "0")]
public decimal Minimum
{
get { return _minimum; }
set
{
_minimum = value;
if (_maximum < _minimum)
_maximum = _minimum;
DefinirValor(_value);
}
}
[Category("Dados")]
[DefaultValue(typeof(decimal), "100")]
public decimal Maximum
{
get { return _maximum; }
set
{
_maximum = value;
if (_maximum < _minimum)
_minimum = _maximum;
DefinirValor(_value);
}
}
[Category("Dados")]
[DefaultValue(typeof(decimal), "1")]
public decimal Increment
{
get { return _increment; }
set
{
_increment = value > 0M
? value
: 1M;
}
}
[Category("Dados")]
[DefaultValue(0)]
public int DecimalPlaces
{
get { return _decimalPlaces; }
set
{
_decimalPlaces = Math.Max(
0,
Math.Min(4, value));
DefinirValor(_value);
}
}
[Browsable(false)]
public Button BotaoDiminuir
{
get { return _btnDiminuir; }
}
[Browsable(false)]
public Button BotaoAumentar
{
get { return _btnAumentar; }
}
[Browsable(false)]
public TextBox CampoValor
{
get { return _txtValor; }
}
}
}

View File

@ -0,0 +1,135 @@
using AgroBase.Forms.IHM.Controls;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls
{
[DefaultEvent("SelectedModeChanged")]
public class HmiModeSelector : UserControl
{
private readonly Button _btnMpc;
private readonly Button _btnPid;
private string _selectedMode = "MPC";
public event EventHandler SelectedModeChanged;
public HmiModeSelector()
{
DoubleBuffered = true;
BackColor = HmiTheme.SurfaceRaised;
Padding = new Padding(8);
Margin = new Padding(3);
MinimumSize = new Size(180, 88);
TableLayoutPanel root = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 2,
RowCount = 2,
BackColor = Color.Transparent,
Margin = Padding.Empty,
Padding = Padding.Empty
};
root.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
root.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
root.RowStyles.Add(new RowStyle(SizeType.Absolute, 26F));
root.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
Label title = new Label
{
Dock = DockStyle.Fill,
AutoSize = false,
BackColor = Color.Transparent,
ForeColor = HmiTheme.Text,
Font = new Font("Segoe UI", 8.2F, FontStyle.Bold),
Text = "Modo de controle",
TextAlign = ContentAlignment.MiddleLeft,
Margin = Padding.Empty
};
_btnMpc = CriarBotao("MPC");
_btnPid = CriarBotao("PID");
root.Controls.Add(title, 0, 0);
root.SetColumnSpan(title, 2);
root.Controls.Add(_btnMpc, 0, 1);
root.Controls.Add(_btnPid, 1, 1);
Controls.Add(root);
_btnMpc.Click += delegate { SelectedMode = "MPC"; };
_btnPid.Click += delegate { SelectedMode = "PID"; };
AtualizarAparencia();
}
private static Button CriarBotao(string text)
{
Button button = new Button
{
Dock = DockStyle.Fill,
BackColor = HmiTheme.Surface,
ForeColor = HmiTheme.TextMuted,
FlatStyle = FlatStyle.Flat,
Font = new Font("Segoe UI", 9F, FontStyle.Bold),
Text = text,
TextAlign = ContentAlignment.MiddleCenter,
Cursor = Cursors.Hand,
Margin = new Padding(2),
UseVisualStyleBackColor = false
};
button.FlatAppearance.BorderSize = 1;
button.FlatAppearance.BorderColor = HmiTheme.Border;
return button;
}
private void AtualizarAparencia()
{
AplicarEstado(_btnMpc, _selectedMode == "MPC");
AplicarEstado(_btnPid, _selectedMode == "PID");
}
private static void AplicarEstado(Button button, bool selected)
{
if (selected)
{
button.BackColor = Color.FromArgb(31, 91, 43);
button.ForeColor = HmiTheme.Success;
button.FlatAppearance.BorderColor = HmiTheme.Success;
}
else
{
button.BackColor = HmiTheme.Surface;
button.ForeColor = HmiTheme.TextMuted;
button.FlatAppearance.BorderColor = HmiTheme.Border;
}
}
[Category("Dados")]
[DefaultValue("MPC")]
public string SelectedMode
{
get { return _selectedMode; }
set
{
string novo = string.Equals(value, "PID", StringComparison.OrdinalIgnoreCase)
? "PID"
: "MPC";
if (_selectedMode == novo)
return;
_selectedMode = novo;
AtualizarAparencia();
if (SelectedModeChanged != null)
SelectedModeChanged(this, EventArgs.Empty);
}
}
}
}

View File

@ -3,17 +3,10 @@ using System.ComponentModel;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Windows.Forms; using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Forms.IHM.Controls.Operacao namespace AgroBase.Forms.IHM.Controls.Operacao
{ {
public enum HmiNozzleState
{
Desconectado = 0,
Conectado = 1,
Falha = 2,
Alerta = 3,
Operante = 4
}
[DefaultEvent("NozzleClick")] [DefaultEvent("NozzleClick")]
public class HmiNozzleCard : UserControl public class HmiNozzleCard : UserControl
@ -27,7 +20,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao
private bool _commandOn; private bool _commandOn;
private bool _readOn; private bool _readOn;
private HmiNozzleState _state = HmiNozzleState.Operante; private StatusModulo _state = StatusModulo.Desconectado;
private bool _allowCommand = true; private bool _allowCommand = true;
public event EventHandler NozzleClick; public event EventHandler NozzleClick;
@ -178,23 +171,23 @@ namespace AgroBase.Forms.IHM.Controls.Operacao
} }
} }
private static Color GetStateColor(HmiNozzleState state) private static Color GetStateColor(StatusModulo state)
{ {
switch (state) switch (state)
{ {
case HmiNozzleState.Desconectado: case StatusModulo.Desconectado:
return HmiTheme.TextMuted; return HmiTheme.TextMuted;
case HmiNozzleState.Conectado: case StatusModulo.Conectado:
return HmiTheme.Info; return HmiTheme.Info;
case HmiNozzleState.Falha: case StatusModulo.Falha:
return HmiTheme.Danger; return HmiTheme.Danger;
case HmiNozzleState.Alerta: case StatusModulo.Alerta:
return HmiTheme.Warning; return HmiTheme.Warning;
case HmiNozzleState.Operante: case StatusModulo.Operante:
default: default:
return HmiTheme.Success; return HmiTheme.Success;
} }
@ -208,7 +201,7 @@ namespace AgroBase.Forms.IHM.Controls.Operacao
} }
[Category("Estado")] [Category("Estado")]
public HmiNozzleState State public StatusModulo State
{ {
get { return _state; } get { return _state; }
set set
@ -292,8 +285,8 @@ namespace AgroBase.Forms.IHM.Controls.Operacao
[Category("Conteúdo")] [Category("Conteúdo")]
public string TempoLigado public string TempoLigado
{ {
get { return _lblTempo.Text.Replace("Tempo ", ""); } get { return _lblTempo.Text; }
set { _lblTempo.Text = "Tempo " + (value ?? "00:00"); } set { _lblTempo.Text = (value ?? "00:00"); }
} }
} }
} }

View File

@ -0,0 +1,185 @@
using AgroBase.Forms.IHM.Controls;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls
{
[DefaultEvent("ValueChanged")]
public class HmiNumericParameterCard : UserControl
{
private readonly Label _lblTitulo;
private readonly Label _lblDescricao;
private readonly NumericUpDown _numeric;
private readonly Label _lblUnidade;
private readonly ToolTip _toolTip;
public event EventHandler ValueChanged;
public HmiNumericParameterCard()
{
DoubleBuffered = true;
BackColor = HmiTheme.SurfaceRaised;
Margin = new Padding(3);
Padding = new Padding(10, 7, 10, 7);
MinimumSize = new Size(180, 88);
TableLayoutPanel root = new TableLayoutPanel
{
Dock = DockStyle.Fill,
BackColor = Color.Transparent,
ColumnCount = 2,
RowCount = 3,
Margin = Padding.Empty,
Padding = Padding.Empty
};
root.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
root.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 42F));
root.RowStyles.Add(new RowStyle(SizeType.Absolute, 28F));
root.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
_lblTitulo = new Label
{
Dock = DockStyle.Fill,
AutoSize = false,
BackColor = Color.Transparent,
ForeColor = HmiTheme.Text,
Font = new Font("Segoe UI", 8.2F, FontStyle.Bold),
Text = "Parâmetro",
TextAlign = ContentAlignment.MiddleLeft,
AutoEllipsis = true,
Margin = Padding.Empty
};
_lblDescricao = new Label
{
Dock = DockStyle.Fill,
AutoSize = false,
BackColor = Color.Transparent,
ForeColor = HmiTheme.TextMuted,
Font = new Font("Segoe UI", 6.5F),
Text = "Descrição",
TextAlign = ContentAlignment.TopLeft,
AutoEllipsis = true,
Margin = Padding.Empty
};
_toolTip = new ToolTip();
_numeric = new NumericUpDown
{
Dock = DockStyle.Fill,
BackColor = HmiTheme.Surface,
ForeColor = HmiTheme.Text,
BorderStyle = BorderStyle.FixedSingle,
Font = new Font("Segoe UI", 9.5F, FontStyle.Bold),
TextAlign = HorizontalAlignment.Center,
Minimum = 0,
Maximum = 100,
DecimalPlaces = 1,
Increment = 0.5M,
Margin = new Padding(0, 3, 5, 3)
};
_lblUnidade = new Label
{
Dock = DockStyle.Fill,
AutoSize = false,
BackColor = Color.Transparent,
ForeColor = HmiTheme.TextMuted,
Font = new Font("Segoe UI", 8F, FontStyle.Bold),
Text = "m",
TextAlign = ContentAlignment.MiddleCenter,
Margin = new Padding(0, 3, 0, 3)
};
root.Controls.Add(_lblTitulo, 0, 0);
root.SetColumnSpan(_lblTitulo, 2);
root.Controls.Add(_numeric, 0, 1);
root.Controls.Add(_lblUnidade, 1, 1);
Controls.Add(root);
_numeric.ValueChanged += delegate
{
if (ValueChanged != null)
ValueChanged(this, EventArgs.Empty);
};
}
[Category("Conteúdo")]
public string Titulo
{
get { return _lblTitulo.Text; }
set { _lblTitulo.Text = value ?? string.Empty; }
}
[Category("Conteúdo")]
public string Descricao
{
get { return _lblDescricao.Text; }
set
{
_lblDescricao.Text = value ?? string.Empty;
_toolTip.SetToolTip(this, _lblDescricao.Text);
_toolTip.SetToolTip(_lblTitulo, _lblDescricao.Text);
_toolTip.SetToolTip(_numeric, _lblDescricao.Text);
}
}
[Category("Conteúdo")]
public string Unidade
{
get { return _lblUnidade.Text; }
set { _lblUnidade.Text = value ?? string.Empty; }
}
[Category("Dados")]
public decimal Value
{
get { return _numeric.Value; }
set
{
decimal novo = Math.Max(_numeric.Minimum, Math.Min(_numeric.Maximum, value));
_numeric.Value = novo;
}
}
[Category("Dados")]
public decimal Minimum
{
get { return _numeric.Minimum; }
set { _numeric.Minimum = value; }
}
[Category("Dados")]
public decimal Maximum
{
get { return _numeric.Maximum; }
set { _numeric.Maximum = value; }
}
[Category("Dados")]
public decimal Increment
{
get { return _numeric.Increment; }
set { _numeric.Increment = value; }
}
[Category("Dados")]
public int DecimalPlaces
{
get { return _numeric.DecimalPlaces; }
set { _numeric.DecimalPlaces = Math.Max(0, value); }
}
[Browsable(false)]
public NumericUpDown Numeric
{
get { return _numeric; }
}
}
}

View File

@ -0,0 +1,299 @@
using AgroBase.Forms.IHM.Controls;
using AgroBase.Forms.IHM.Controls.Operacao;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros.Controls
{
public enum HmiSliderValueFormat
{
PercentAndSpeed = 0,
PercentOnly = 1,
Degrees = 2
}
[DefaultEvent("ValueChanged")]
public class HmiParameterSliderRow : UserControl
{
private readonly Label _lblTitulo;
private readonly Label _lblValor;
private readonly Label _lblLimiteMin;
private readonly Label _lblLimiteMax;
private readonly HmiSlider _slider;
private double _velocidadeMaximaKmh = 1.0D;
private HmiSliderValueFormat _valueFormat = HmiSliderValueFormat.PercentAndSpeed;
private readonly TableLayoutPanel _root;
private bool _compactMode;
public event EventHandler ValueChanged;
public HmiParameterSliderRow()
{
DoubleBuffered = true;
BackColor = HmiTheme.SurfaceRaised;
Margin = new Padding(3);
Padding = new Padding(10, 6, 10, 5);
MinimumSize = new Size(250, 86);
_root = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 2,
RowCount = 3,
BackColor = Color.Transparent,
Margin = Padding.Empty,
Padding = Padding.Empty
};
_root.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 58F));
_root.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 42F));
_root.RowStyles.Add(new RowStyle(SizeType.Absolute, 26F));
_root.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
_root.RowStyles.Add(new RowStyle(SizeType.Absolute, 18F));
_lblTitulo = new Label
{
Dock = DockStyle.Fill,
BackColor = Color.Transparent,
ForeColor = HmiTheme.Text,
Font = new Font("Segoe UI", 8.5F, FontStyle.Bold),
Text = "Valor",
TextAlign = ContentAlignment.MiddleLeft,
AutoEllipsis = true,
Margin = Padding.Empty
};
_lblValor = new Label
{
Dock = DockStyle.Fill,
BackColor = Color.Transparent,
ForeColor = HmiTheme.Success,
Font = new Font("Segoe UI", 9.5F, FontStyle.Bold),
Text = "50%",
TextAlign = ContentAlignment.MiddleRight,
AutoEllipsis = true,
Margin = Padding.Empty
};
_slider = new HmiSlider
{
Dock = DockStyle.Fill,
Margin = new Padding(0, 3, 0, 2),
Minimum = 0,
Maximum = 100,
Value = 50,
AccentColor = HmiTheme.Success
};
_lblLimiteMin = new Label
{
Dock = DockStyle.Fill,
BackColor = Color.Transparent,
ForeColor = HmiTheme.TextMuted,
Font = new Font("Segoe UI", 6.5F),
Text = "0%",
TextAlign = ContentAlignment.MiddleLeft,
Margin = Padding.Empty
};
_lblLimiteMax = new Label
{
Dock = DockStyle.Fill,
BackColor = Color.Transparent,
ForeColor = HmiTheme.TextMuted,
Font = new Font("Segoe UI", 6.5F),
Text = "100%",
TextAlign = ContentAlignment.MiddleRight,
Margin = Padding.Empty
};
_root.Controls.Add(_lblTitulo, 0, 0);
_root.Controls.Add(_lblValor, 1, 0);
_root.Controls.Add(_slider, 0, 1);
_root.SetColumnSpan(_slider, 2);
_root.Controls.Add(_lblLimiteMin, 0, 2);
_root.Controls.Add(_lblLimiteMax, 1, 2);
Controls.Add(_root);
_slider.ValueChanged += Slider_ValueChanged;
AtualizarTextoValor();
}
private void Slider_ValueChanged(object sender, EventArgs e)
{
AtualizarTextoValor();
if (ValueChanged != null)
ValueChanged(this, EventArgs.Empty);
}
private void AtualizarTextoValor()
{
if (_valueFormat == HmiSliderValueFormat.Degrees)
{
_lblValor.Text = _slider.Value + "°";
_lblLimiteMin.Text = _slider.Minimum + "°";
_lblLimiteMax.Text = _slider.Maximum + "°";
return;
}
if (_valueFormat == HmiSliderValueFormat.PercentOnly)
{
_lblValor.Text = _slider.Value + "%";
_lblLimiteMin.Text = _slider.Minimum + "%";
_lblLimiteMax.Text = _slider.Maximum + "%";
return;
}
double kmh = _velocidadeMaximaKmh * _slider.Value / 100D;
_lblValor.Text = string.Format("{0}% · {1:0.0} km/h", _slider.Value, kmh);
_lblLimiteMin.Text = _slider.Minimum + "%";
_lblLimiteMax.Text = _slider.Maximum + "%";
}
[Category("Conteúdo")]
public string Titulo
{
get { return _lblTitulo.Text; }
set { _lblTitulo.Text = value ?? string.Empty; }
}
[Category("Dados")]
public int Minimum
{
get { return _slider.Minimum; }
set
{
_slider.Minimum = value;
AtualizarTextoValor();
}
}
[Category("Dados")]
public int Maximum
{
get { return _slider.Maximum; }
set
{
_slider.Maximum = value;
AtualizarTextoValor();
}
}
[Category("Dados")]
public int Value
{
get { return _slider.Value; }
set { _slider.Value = value; }
}
[Category("Dados")]
public double VelocidadeMaximaKmh
{
get { return _velocidadeMaximaKmh; }
set
{
_velocidadeMaximaKmh = Math.Max(0D, value);
AtualizarTextoValor();
}
}
[Category("Aparência")]
[DefaultValue(HmiSliderValueFormat.PercentAndSpeed)]
public HmiSliderValueFormat ValueFormat
{
get { return _valueFormat; }
set
{
_valueFormat = value;
AtualizarTextoValor();
}
}
[Category("Aparência")]
public Color AccentColor
{
get { return _slider.AccentColor; }
set
{
_slider.AccentColor = value;
_lblValor.ForeColor = value;
}
}
[Category("Aparência")]
[DefaultValue(false)]
public bool CompactMode
{
get { return _compactMode; }
set
{
if (_compactMode == value)
return;
_compactMode = value;
AtualizarModoCompacto();
}
}
[Browsable(false)]
public HmiSlider Slider
{
get { return _slider; }
}
private void AtualizarModoCompacto()
{
if (_compactMode)
{
MinimumSize = new Size(80, 44);
Padding = new Padding(8, 3, 8, 3);
_root.RowStyles[0].Height = 20F;
_root.RowStyles[1].SizeType = SizeType.Percent;
_root.RowStyles[1].Height = 100F;
_root.RowStyles[2].Height = 0F;
_lblLimiteMin.Visible = false;
_lblLimiteMax.Visible = false;
_lblTitulo.Font = new Font("Segoe UI", 7.4F, FontStyle.Bold);
_lblValor.Font = new Font("Segoe UI", 7.8F, FontStyle.Bold);
_slider.Margin = new Padding(0);
_slider.ThumbRadius = 6;
_slider.TrackHeight = 4;
}
else
{
MinimumSize = new Size(250, 86);
Padding = new Padding(10, 6, 10, 5);
_root.RowStyles[0].Height = 26F;
_root.RowStyles[1].SizeType = SizeType.Percent;
_root.RowStyles[1].Height = 100F;
_root.RowStyles[2].Height = 18F;
_lblLimiteMin.Visible = true;
_lblLimiteMax.Visible = true;
_lblTitulo.Font = new Font("Segoe UI", 8.5F, FontStyle.Bold);
_lblValor.Font = new Font("Segoe UI", 9.5F, FontStyle.Bold);
_slider.Margin = new Padding(0, 3, 0, 2);
_slider.ThumbRadius = 8;
_slider.TrackHeight = 5;
}
PerformLayout();
Invalidate();
}
}
}

View File

@ -3,6 +3,7 @@ using System.ComponentModel;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Windows.Forms; using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Forms.IHM.Controls.Operacao namespace AgroBase.Forms.IHM.Controls.Operacao
{ {
@ -330,6 +331,28 @@ namespace AgroBase.Forms.IHM.Controls.Operacao
return check; return check;
} }
public void AtualizarDados(
bool dir_em_uso,
double dir_ang_sp,
double dir_ang_at,
Sentido dir_sentido,
bool mov_em_uso,
double mov_vel_sp,
double mov_vel_at,
bool mov_freio
)
{
CheckDir.Checked = dir_em_uso;
DirecionalSp = $"{dir_ang_sp}";
DirecionalAtual = $"{dir_ang_at}";
StatusDirecional = $"{dir_sentido}";
CheckMov.Checked = mov_em_uso;
MovimentoSp = $"{mov_vel_sp}";
MovimentoAtual = $"{mov_vel_at}";
StatusMovimento = mov_freio ? "Freado" : "Livre";
}
protected override void OnPaint(PaintEventArgs e) protected override void OnPaint(PaintEventArgs e)
{ {
base.OnPaint(e); base.OnPaint(e);

View File

@ -0,0 +1,336 @@
namespace AgroBase.Forms.IHM.Operacao.Parametros
{
partial class ucParametrosAtuador
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && components != null) components.Dispose();
base.Dispose(disposing);
}
#region Component Designer generated code
private void InitializeComponent()
{
this.rootLayout = new System.Windows.Forms.TableLayoutPanel();
this.pnlAgitador = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.agitadorLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblAgitadorTitulo = new System.Windows.Forms.Label();
this.lblAgitadorDescricao = new System.Windows.Forms.Label();
this.seletorModoAgitador = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiAgitatorModeSelector();
this.pidLayout = new System.Windows.Forms.TableLayoutPanel();
this.paramKp = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField();
this.paramKi = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField();
this.paramKd = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField();
this.pnlPulverizacao = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.pulverizacaoLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblPulverizacaoTitulo = new System.Windows.Forms.Label();
this.lblPulverizacaoDescricao = new System.Windows.Forms.Label();
this.parametrosLayout = new System.Windows.Forms.TableLayoutPanel();
this.paramBicosEmUso = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField();
this.paramPressaoLinha = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField();
this.paramInicioTela = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField();
this.paramAlturaArea = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField();
this.paramErvasOn = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField();
this.paramErvasOff = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField();
this.rootLayout.SuspendLayout();
this.pnlAgitador.SuspendLayout();
this.agitadorLayout.SuspendLayout();
this.pidLayout.SuspendLayout();
this.pnlPulverizacao.SuspendLayout();
this.pulverizacaoLayout.SuspendLayout();
this.parametrosLayout.SuspendLayout();
this.SuspendLayout();
//
// rootLayout
//
this.rootLayout.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Background;
this.rootLayout.ColumnCount = 2;
this.rootLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 40F));
this.rootLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 60F));
this.rootLayout.Controls.Add(this.pnlAgitador, 0, 0);
this.rootLayout.Controls.Add(this.pnlPulverizacao, 1, 0);
this.rootLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.rootLayout.Location = new System.Drawing.Point(0, 0);
this.rootLayout.Margin = System.Windows.Forms.Padding.Empty;
this.rootLayout.Name = "rootLayout";
this.rootLayout.Padding = System.Windows.Forms.Padding.Empty;
this.rootLayout.RowCount = 1;
this.rootLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.rootLayout.Size = new System.Drawing.Size(760, 286);
this.rootLayout.TabIndex = 0;
//
// pnlAgitador
//
ConfigurePanel(this.pnlAgitador, this.agitadorLayout);
this.pnlAgitador.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
this.pnlAgitador.Name = "pnlAgitador";
//
// agitadorLayout
//
this.agitadorLayout.ColumnCount = 1;
this.agitadorLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.agitadorLayout.Controls.Add(this.lblAgitadorTitulo, 0, 0);
this.agitadorLayout.Controls.Add(this.lblAgitadorDescricao, 0, 1);
this.agitadorLayout.Controls.Add(this.seletorModoAgitador, 0, 2);
this.agitadorLayout.Controls.Add(this.pidLayout, 0, 3);
this.agitadorLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.agitadorLayout.Location = new System.Drawing.Point(8, 8);
this.agitadorLayout.Margin = new System.Windows.Forms.Padding(0);
this.agitadorLayout.Name = "agitadorLayout";
this.agitadorLayout.Padding = System.Windows.Forms.Padding.Empty;
this.agitadorLayout.RowCount = 4;
this.agitadorLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));
this.agitadorLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 34F));
this.agitadorLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F));
this.agitadorLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.agitadorLayout.Size = new System.Drawing.Size(282, 270);
this.agitadorLayout.TabIndex = 0;
//
// lblAgitadorTitulo
//
SetupSectionTitle(this.lblAgitadorTitulo, "AGITADOR DE CALDA");
this.lblAgitadorTitulo.Name = "lblAgitadorTitulo";
//
// lblAgitadorDescricao
//
SetupSectionDescription(this.lblAgitadorDescricao, "Selecione o modo e ajuste os ganhos PID usados no controle do agitador.");
this.lblAgitadorDescricao.Name = "lblAgitadorDescricao";
//
// seletorModoAgitador
//
this.seletorModoAgitador.Dock = System.Windows.Forms.DockStyle.Fill;
this.seletorModoAgitador.Location = new System.Drawing.Point(0, 63);
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.Size = new System.Drawing.Size(282, 42);
this.seletorModoAgitador.TabIndex = 2;
//
// pidLayout
//
this.pidLayout.BackColor = System.Drawing.Color.Transparent;
this.pidLayout.ColumnCount = 1;
this.pidLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.pidLayout.Controls.Add(this.paramKp, 0, 0);
this.pidLayout.Controls.Add(this.paramKi, 0, 1);
this.pidLayout.Controls.Add(this.paramKd, 0, 2);
this.pidLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.pidLayout.Location = new System.Drawing.Point(0, 110);
this.pidLayout.Margin = new System.Windows.Forms.Padding(0);
this.pidLayout.Name = "pidLayout";
this.pidLayout.Padding = System.Windows.Forms.Padding.Empty;
this.pidLayout.RowCount = 3;
this.pidLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.pidLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.pidLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.34F));
this.pidLayout.Size = new System.Drawing.Size(282, 160);
this.pidLayout.TabIndex = 3;
//
// paramKp
//
SetupNumeric(this.paramKp, "Kp", "", 1.10M, 0M, 20M, 0.05M, 2);
this.paramKp.Margin = new System.Windows.Forms.Padding(0, 2, 0, 4);
this.paramKp.Name = "paramKp";
//
// paramKi
//
SetupNumeric(this.paramKi, "Ki", "", 0.12M, 0M, 20M, 0.01M, 2);
this.paramKi.Margin = new System.Windows.Forms.Padding(0, 2, 0, 4);
this.paramKi.Name = "paramKi";
//
// paramKd
//
SetupNumeric(this.paramKd, "Kd", "", 0.03M, 0M, 20M, 0.01M, 2);
this.paramKd.Margin = new System.Windows.Forms.Padding(0, 2, 0, 0);
this.paramKd.Name = "paramKd";
//
// pnlPulverizacao
//
ConfigurePanel(this.pnlPulverizacao, this.pulverizacaoLayout);
this.pnlPulverizacao.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.pnlPulverizacao.Name = "pnlPulverizacao";
//
// pulverizacaoLayout
//
this.pulverizacaoLayout.ColumnCount = 1;
this.pulverizacaoLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.pulverizacaoLayout.Controls.Add(this.lblPulverizacaoTitulo, 0, 0);
this.pulverizacaoLayout.Controls.Add(this.lblPulverizacaoDescricao, 0, 1);
this.pulverizacaoLayout.Controls.Add(this.parametrosLayout, 0, 2);
this.pulverizacaoLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.pulverizacaoLayout.Location = new System.Drawing.Point(8, 8);
this.pulverizacaoLayout.Margin = new System.Windows.Forms.Padding(0);
this.pulverizacaoLayout.Name = "pulverizacaoLayout";
this.pulverizacaoLayout.Padding = System.Windows.Forms.Padding.Empty;
this.pulverizacaoLayout.RowCount = 3;
this.pulverizacaoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));
this.pulverizacaoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 34F));
this.pulverizacaoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.pulverizacaoLayout.Size = new System.Drawing.Size(434, 270);
this.pulverizacaoLayout.TabIndex = 0;
//
// lblPulverizacaoTitulo
//
SetupSectionTitle(this.lblPulverizacaoTitulo, "PULVERIZAÇÃO E WEED WORKER");
this.lblPulverizacaoTitulo.Name = "lblPulverizacaoTitulo";
//
// lblPulverizacaoDescricao
//
SetupSectionDescription(this.lblPulverizacaoDescricao, "Defina os recursos da operação e os limites da região de atuação de cada bico.");
this.lblPulverizacaoDescricao.Name = "lblPulverizacaoDescricao";
//
// parametrosLayout
//
this.parametrosLayout.BackColor = System.Drawing.Color.Transparent;
this.parametrosLayout.ColumnCount = 2;
this.parametrosLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.parametrosLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.parametrosLayout.Controls.Add(this.paramBicosEmUso, 0, 0);
this.parametrosLayout.Controls.Add(this.paramPressaoLinha, 1, 0);
this.parametrosLayout.Controls.Add(this.paramInicioTela, 0, 1);
this.parametrosLayout.Controls.Add(this.paramAlturaArea, 1, 1);
this.parametrosLayout.Controls.Add(this.paramErvasOn, 0, 2);
this.parametrosLayout.Controls.Add(this.paramErvasOff, 1, 2);
this.parametrosLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.parametrosLayout.Location = new System.Drawing.Point(0, 60);
this.parametrosLayout.Margin = new System.Windows.Forms.Padding(0);
this.parametrosLayout.Name = "parametrosLayout";
this.parametrosLayout.Padding = System.Windows.Forms.Padding.Empty;
this.parametrosLayout.RowCount = 3;
this.parametrosLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.parametrosLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.parametrosLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.34F));
this.parametrosLayout.Size = new System.Drawing.Size(434, 210);
this.parametrosLayout.TabIndex = 2;
//
// paramBicosEmUso
//
SetupNumeric(this.paramBicosEmUso, "Bicos em uso", "", 7M, 1M, 12M, 1M, 0);
this.paramBicosEmUso.Margin = new System.Windows.Forms.Padding(2, 2, 4, 4);
this.paramBicosEmUso.Name = "paramBicosEmUso";
//
// paramPressaoLinha
//
SetupNumeric(this.paramPressaoLinha, "Pressão da linha", "psi", 18M, 0M, 120M, 1M, 0);
this.paramPressaoLinha.Margin = new System.Windows.Forms.Padding(4, 2, 2, 4);
this.paramPressaoLinha.Name = "paramPressaoLinha";
//
// paramInicioTela
//
SetupNumeric(this.paramInicioTela, "Início da atuação", "%", 85M, 0M, 100M, 1M, 0);
this.paramInicioTela.Margin = new System.Windows.Forms.Padding(2, 2, 4, 4);
this.paramInicioTela.Name = "paramInicioTela";
//
// paramAlturaArea
//
SetupNumeric(this.paramAlturaArea, "Altura da área", "%", 15M, 1M, 100M, 1M, 0);
this.paramAlturaArea.Margin = new System.Windows.Forms.Padding(4, 2, 2, 4);
this.paramAlturaArea.Name = "paramAlturaArea";
//
// paramErvasOn
//
SetupNumeric(this.paramErvasOn, "Ervas para ligar", "%", 25.0M, 0M, 100M, 0.5M, 1);
this.paramErvasOn.Margin = new System.Windows.Forms.Padding(2, 2, 4, 0);
this.paramErvasOn.Name = "paramErvasOn";
//
// paramErvasOff
//
SetupNumeric(this.paramErvasOff, "Ervas para desligar", "%", 15.0M, 0M, 100M, 0.5M, 1);
this.paramErvasOff.Margin = new System.Windows.Forms.Padding(4, 2, 2, 0);
this.paramErvasOff.Name = "paramErvasOff";
//
// ucParametrosAtuador
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Background;
this.Controls.Add(this.rootLayout);
this.DoubleBuffered = true;
this.Margin = new System.Windows.Forms.Padding(0);
this.Name = "ucParametrosAtuador";
this.Size = new System.Drawing.Size(760, 286);
this.rootLayout.ResumeLayout(false);
this.pnlAgitador.ResumeLayout(false);
this.agitadorLayout.ResumeLayout(false);
this.pidLayout.ResumeLayout(false);
this.pnlPulverizacao.ResumeLayout(false);
this.pulverizacaoLayout.ResumeLayout(false);
this.parametrosLayout.ResumeLayout(false);
this.ResumeLayout(false);
}
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);
panel.CornerRadius = 9;
panel.Dock = System.Windows.Forms.DockStyle.Fill;
panel.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.Surface;
panel.Padding = new System.Windows.Forms.Padding(8);
}
private static void SetupSectionTitle(System.Windows.Forms.Label label, string text)
{
label.AutoEllipsis = true;
label.BackColor = System.Drawing.Color.Transparent;
label.Dock = System.Windows.Forms.DockStyle.Fill;
label.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold);
label.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.Text;
label.Margin = System.Windows.Forms.Padding.Empty;
label.Text = text;
label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
}
private static void SetupSectionDescription(System.Windows.Forms.Label label, string text)
{
label.AutoEllipsis = true;
label.BackColor = System.Drawing.Color.Transparent;
label.Dock = System.Windows.Forms.DockStyle.Fill;
label.Font = new System.Drawing.Font("Segoe UI", 7F);
label.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
label.Margin = System.Windows.Forms.Padding.Empty;
label.Text = text;
label.TextAlign = System.Drawing.ContentAlignment.TopLeft;
}
private static void SetupNumeric(AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField field, string title, string unit, decimal value, decimal minimum, decimal maximum, decimal increment, int decimalPlaces)
{
field.Dock = System.Windows.Forms.DockStyle.Fill;
field.MinimumSize = new System.Drawing.Size(0, 60);
field.Titulo = title;
field.Unidade = unit;
field.Minimum = minimum;
field.Maximum = maximum;
field.Increment = increment;
field.DecimalPlaces = decimalPlaces;
field.Value = value;
}
#endregion
private System.Windows.Forms.TableLayoutPanel rootLayout;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlAgitador;
private System.Windows.Forms.TableLayoutPanel agitadorLayout;
private System.Windows.Forms.Label lblAgitadorTitulo;
private System.Windows.Forms.Label lblAgitadorDescricao;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiAgitatorModeSelector seletorModoAgitador;
private System.Windows.Forms.TableLayoutPanel pidLayout;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField paramKp;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField paramKi;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField paramKd;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlPulverizacao;
private System.Windows.Forms.TableLayoutPanel pulverizacaoLayout;
private System.Windows.Forms.Label lblPulverizacaoTitulo;
private System.Windows.Forms.Label lblPulverizacaoDescricao;
private System.Windows.Forms.TableLayoutPanel parametrosLayout;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField paramBicosEmUso;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField paramPressaoLinha;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField paramInicioTela;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField paramAlturaArea;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField paramErvasOn;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactNumericField paramErvasOff;
}
}

View File

@ -0,0 +1,116 @@
using System;
using System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros
{
public partial class ucParametrosAtuador : UserControl
{
public event EventHandler ParametrosAlterados;
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;
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;
}
private void Controle_Alterado(object sender, EventArgs e)
{
if (ParametrosAlterados != null)
ParametrosAlterados(this, EventArgs.Empty);
}
public string ModoAgitador
{
get { return seletorModoAgitador.SelectedMode; }
set { seletorModoAgitador.SelectedMode = value; }
}
public decimal KpAgitador
{
get { return paramKp.Value; }
set { paramKp.Value = value; }
}
public decimal KiAgitador
{
get { return paramKi.Value; }
set { paramKi.Value = value; }
}
public decimal KdAgitador
{
get { return paramKd.Value; }
set { paramKd.Value = value; }
}
public int QuantidadeBicosEmUso
{
get { return Convert.ToInt32(paramBicosEmUso.Value); }
set { paramBicosEmUso.Value = 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; }
}
}
}

View File

@ -0,0 +1,299 @@
namespace AgroBase.Forms.IHM.Operacao.Parametros
{
partial class ucParametrosDirecional
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && components != null)
components.Dispose();
base.Dispose(disposing);
}
#region Component Designer generated code
private void InitializeComponent()
{
this.rootLayout = new System.Windows.Forms.TableLayoutPanel();
this.pnlAssistencias = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.assistenciasLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblAssistenciasTitulo = new System.Windows.Forms.Label();
this.lblAssistenciasDescricao = new System.Windows.Forms.Label();
this.checksLayout = new System.Windows.Forms.TableLayoutPanel();
this.checkDirecionalAutomatico = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.checkAssistidoSonar = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.checkAssistidoImu = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.checkImuPrefereArco = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.pnlControle = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.controleLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblControleTitulo = new System.Windows.Forms.Label();
this.lblControleDescricao = new System.Windows.Forms.Label();
this.sliderAnguloMaximo = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow();
this.sliderVelocidadeDirecional = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow();
this.pnlNavegacao = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.navegacaoLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblNavegacaoTitulo = new System.Windows.Forms.Label();
this.seletorModoControle = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiModeSelector();
this.parametroHorizonte = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiNumericParameterCard();
this.parametroDistanciaSaida = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiNumericParameterCard();
this.rootLayout.SuspendLayout();
this.pnlAssistencias.SuspendLayout();
this.assistenciasLayout.SuspendLayout();
this.checksLayout.SuspendLayout();
this.pnlControle.SuspendLayout();
this.controleLayout.SuspendLayout();
this.pnlNavegacao.SuspendLayout();
this.navegacaoLayout.SuspendLayout();
this.SuspendLayout();
// rootLayout
this.rootLayout.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Background;
this.rootLayout.ColumnCount = 2;
this.rootLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 42F));
this.rootLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 58F));
this.rootLayout.Controls.Add(this.pnlAssistencias, 0, 0);
this.rootLayout.Controls.Add(this.pnlControle, 1, 0);
this.rootLayout.Controls.Add(this.pnlNavegacao, 0, 1);
this.rootLayout.SetColumnSpan(this.pnlNavegacao, 2);
this.rootLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.rootLayout.Margin = System.Windows.Forms.Padding.Empty;
this.rootLayout.Padding = System.Windows.Forms.Padding.Empty;
this.rootLayout.RowCount = 2;
this.rootLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 58F));
this.rootLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 42F));
// Assistências
ConfigurePanel(this.pnlAssistencias, this.assistenciasLayout);
this.pnlAssistencias.Margin = new System.Windows.Forms.Padding(0, 0, 3, 3);
this.pnlAssistencias.Padding = new System.Windows.Forms.Padding(8);
this.assistenciasLayout.ColumnCount = 1;
this.assistenciasLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.assistenciasLayout.Controls.Add(this.lblAssistenciasTitulo, 0, 0);
this.assistenciasLayout.Controls.Add(this.lblAssistenciasDescricao, 0, 1);
this.assistenciasLayout.Controls.Add(this.checksLayout, 0, 2);
this.assistenciasLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.assistenciasLayout.Margin = System.Windows.Forms.Padding.Empty;
this.assistenciasLayout.Padding = System.Windows.Forms.Padding.Empty;
this.assistenciasLayout.RowCount = 3;
this.assistenciasLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F));
this.assistenciasLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
this.assistenciasLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
SetupSectionTitle(this.lblAssistenciasTitulo, "AUTOMAÇÃO E ASSISTÊNCIAS");
SetupSectionDescription(this.lblAssistenciasDescricao, "Defina quais recursos podem interferir no controle direcional.");
this.checksLayout.BackColor = System.Drawing.Color.Transparent;
this.checksLayout.ColumnCount = 2;
this.checksLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.checksLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.checksLayout.Controls.Add(this.checkDirecionalAutomatico, 0, 0);
this.checksLayout.Controls.Add(this.checkAssistidoSonar, 1, 0);
this.checksLayout.Controls.Add(this.checkAssistidoImu, 0, 1);
this.checksLayout.Controls.Add(this.checkImuPrefereArco, 1, 1);
this.checksLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.checksLayout.Margin = System.Windows.Forms.Padding.Empty;
this.checksLayout.Padding = System.Windows.Forms.Padding.Empty;
this.checksLayout.RowCount = 2;
this.checksLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.checksLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
SetupCheck(this.checkDirecionalAutomatico, "Direcional automático");
SetupCheck(this.checkAssistidoSonar, "Assistido por sonar");
SetupCheck(this.checkAssistidoImu, "Assistido por IMU");
SetupCheck(this.checkImuPrefereArco, "IMU prefere arco");
// Controle direcional
ConfigurePanel(this.pnlControle, this.controleLayout);
this.pnlControle.Margin = new System.Windows.Forms.Padding(3, 0, 0, 3);
this.pnlControle.Padding = new System.Windows.Forms.Padding(8);
this.controleLayout.ColumnCount = 2;
this.controleLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.controleLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.controleLayout.Controls.Add(this.lblControleTitulo, 0, 0);
this.controleLayout.SetColumnSpan(this.lblControleTitulo, 2);
this.controleLayout.Controls.Add(this.lblControleDescricao, 0, 1);
this.controleLayout.SetColumnSpan(this.lblControleDescricao, 2);
this.controleLayout.Controls.Add(this.sliderAnguloMaximo, 0, 2);
this.controleLayout.Controls.Add(this.sliderVelocidadeDirecional, 1, 2);
this.controleLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.controleLayout.Margin = System.Windows.Forms.Padding.Empty;
this.controleLayout.Padding = System.Windows.Forms.Padding.Empty;
this.controleLayout.RowCount = 3;
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 24F));
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
SetupSectionTitle(this.lblControleTitulo, "LIMITES DO DIRECIONAL");
SetupSectionDescription(this.lblControleDescricao, "Ajuste o ângulo máximo e a velocidade usada pelos motores de passo.");
this.sliderAnguloMaximo.Dock = System.Windows.Forms.DockStyle.Fill;
this.sliderAnguloMaximo.Margin = new System.Windows.Forms.Padding(0, 2, 3, 0);
this.sliderAnguloMaximo.MinimumSize = System.Drawing.Size.Empty;
this.sliderAnguloMaximo.Titulo = "Ângulo máximo";
this.sliderAnguloMaximo.Minimum = 0;
this.sliderAnguloMaximo.Maximum = 90;
this.sliderAnguloMaximo.ValueFormat = AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiSliderValueFormat.Degrees;
this.sliderAnguloMaximo.Value = 45;
this.sliderAnguloMaximo.AccentColor = AgroBase.Forms.IHM.Controls.HmiTheme.Warning;
this.sliderVelocidadeDirecional.Dock = System.Windows.Forms.DockStyle.Fill;
this.sliderVelocidadeDirecional.Margin = new System.Windows.Forms.Padding(3, 2, 0, 0);
this.sliderVelocidadeDirecional.MinimumSize = System.Drawing.Size.Empty;
this.sliderVelocidadeDirecional.Titulo = "Velocidade direcional";
this.sliderVelocidadeDirecional.Minimum = 0;
this.sliderVelocidadeDirecional.Maximum = 100;
this.sliderVelocidadeDirecional.ValueFormat = AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiSliderValueFormat.PercentOnly;
this.sliderVelocidadeDirecional.Value = 60;
this.sliderVelocidadeDirecional.AccentColor = AgroBase.Forms.IHM.Controls.HmiTheme.Info;
// Controle e navegação
ConfigurePanel(this.pnlNavegacao, this.navegacaoLayout);
this.pnlNavegacao.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0);
this.pnlNavegacao.Padding = new System.Windows.Forms.Padding(8);
this.navegacaoLayout.ColumnCount = 3;
this.navegacaoLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F));
this.navegacaoLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));
this.navegacaoLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));
this.navegacaoLayout.Controls.Add(this.lblNavegacaoTitulo, 0, 0);
this.navegacaoLayout.SetColumnSpan(this.lblNavegacaoTitulo, 3);
this.navegacaoLayout.Controls.Add(this.seletorModoControle, 0, 1);
this.navegacaoLayout.Controls.Add(this.parametroHorizonte, 1, 1);
this.navegacaoLayout.Controls.Add(this.parametroDistanciaSaida, 2, 1);
this.navegacaoLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.navegacaoLayout.Margin = System.Windows.Forms.Padding.Empty;
this.navegacaoLayout.Padding = System.Windows.Forms.Padding.Empty;
this.navegacaoLayout.RowCount = 2;
this.navegacaoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 22F));
this.navegacaoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
SetupSectionTitle(this.lblNavegacaoTitulo, "CONTROLE E NAVEGAÇÃO");
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.parametroHorizonte.Dock = System.Windows.Forms.DockStyle.Fill;
this.parametroHorizonte.Margin = new System.Windows.Forms.Padding(3, 1, 3, 0);
this.parametroHorizonte.MinimumSize = System.Drawing.Size.Empty;
this.parametroHorizonte.Titulo = "Horizonte de predição";
this.parametroHorizonte.Descricao = "Distância analisada pelo controlador";
this.parametroHorizonte.Unidade = "m";
this.parametroHorizonte.Minimum = 1M;
this.parametroHorizonte.Maximum = 30M;
this.parametroHorizonte.Increment = 0.5M;
this.parametroHorizonte.DecimalPlaces = 1;
this.parametroHorizonte.Value = 4M;
this.parametroDistanciaSaida.Dock = System.Windows.Forms.DockStyle.Fill;
this.parametroDistanciaSaida.Margin = new System.Windows.Forms.Padding(3, 1, 0, 0);
this.parametroDistanciaSaida.MinimumSize = System.Drawing.Size.Empty;
this.parametroDistanciaSaida.Titulo = "Distância saída para manobra";
this.parametroDistanciaSaida.Descricao = "Distância para iniciar a manobra entre ruas";
this.parametroDistanciaSaida.Unidade = "m";
this.parametroDistanciaSaida.Minimum = 0M;
this.parametroDistanciaSaida.Maximum = 20M;
this.parametroDistanciaSaida.Increment = 0.5M;
this.parametroDistanciaSaida.DecimalPlaces = 1;
this.parametroDistanciaSaida.Value = 5M;
// ucParametrosDirecional
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Background;
this.Controls.Add(this.rootLayout);
this.DoubleBuffered = true;
this.Name = "ucParametrosDirecional";
this.Size = new System.Drawing.Size(760, 286);
this.rootLayout.ResumeLayout(false);
this.pnlAssistencias.ResumeLayout(false);
this.assistenciasLayout.ResumeLayout(false);
this.checksLayout.ResumeLayout(false);
this.pnlControle.ResumeLayout(false);
this.controleLayout.ResumeLayout(false);
this.pnlNavegacao.ResumeLayout(false);
this.navegacaoLayout.ResumeLayout(false);
this.ResumeLayout(false);
}
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);
panel.CornerRadius = 9;
panel.Dock = System.Windows.Forms.DockStyle.Fill;
panel.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.Surface;
panel.Padding = new System.Windows.Forms.Padding(8);
}
private static void SetupSectionTitle(System.Windows.Forms.Label label, string text)
{
label.AutoEllipsis = true;
label.BackColor = System.Drawing.Color.Transparent;
label.Dock = System.Windows.Forms.DockStyle.Fill;
label.Font = new System.Drawing.Font("Segoe UI", 8.5F, System.Drawing.FontStyle.Bold);
label.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.Text;
label.Margin = System.Windows.Forms.Padding.Empty;
label.Text = text;
label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
}
private static void SetupSectionDescription(System.Windows.Forms.Label label, string text)
{
label.AutoEllipsis = true;
label.BackColor = System.Drawing.Color.Transparent;
label.Dock = System.Windows.Forms.DockStyle.Fill;
label.Font = new System.Drawing.Font("Segoe UI", 6.7F);
label.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
label.Margin = System.Windows.Forms.Padding.Empty;
label.Text = text;
label.TextAlign = System.Drawing.ContentAlignment.TopLeft;
}
private static void SetupCheck(AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow check, string title)
{
check.Dock = System.Windows.Forms.DockStyle.Fill;
check.Titulo = title;
check.Checked = true;
check.Margin = new System.Windows.Forms.Padding(3);
check.MinimumSize = System.Drawing.Size.Empty;
}
#endregion
private System.Windows.Forms.TableLayoutPanel rootLayout;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlAssistencias;
private System.Windows.Forms.TableLayoutPanel assistenciasLayout;
private System.Windows.Forms.Label lblAssistenciasTitulo;
private System.Windows.Forms.Label lblAssistenciasDescricao;
private System.Windows.Forms.TableLayoutPanel checksLayout;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkDirecionalAutomatico;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkAssistidoSonar;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkAssistidoImu;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkImuPrefereArco;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlControle;
private System.Windows.Forms.TableLayoutPanel controleLayout;
private System.Windows.Forms.Label lblControleTitulo;
private System.Windows.Forms.Label lblControleDescricao;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow sliderAnguloMaximo;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow sliderVelocidadeDirecional;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlNavegacao;
private System.Windows.Forms.TableLayoutPanel navegacaoLayout;
private System.Windows.Forms.Label lblNavegacaoTitulo;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiModeSelector seletorModoControle;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiNumericParameterCard parametroHorizonte;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiNumericParameterCard parametroDistanciaSaida;
}
}

View File

@ -0,0 +1,111 @@
using System;
using System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros
{
public partial class ucParametrosDirecional : UserControl
{
public event EventHandler ParametrosAlterados;
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;
checkAssistidoSonar.CheckedChanged += Controle_Alterado;
checkAssistidoImu.CheckedChanged += Controle_Alterado;
checkImuPrefereArco.CheckedChanged += Controle_Alterado;
sliderAnguloMaximo.ValueChanged += Controle_Alterado;
sliderVelocidadeDirecional.ValueChanged += Controle_Alterado;
seletorModoControle.SelectedModeChanged += Controle_Alterado;
parametroHorizonte.ValueChanged += Controle_Alterado;
parametroDistanciaSaida.ValueChanged += Controle_Alterado;
}
private void Controle_Alterado(object sender, EventArgs e)
{
if (ParametrosAlterados != null)
ParametrosAlterados(this, EventArgs.Empty);
}
public bool DirecionalAutomatico
{
get { return checkDirecionalAutomatico.Checked; }
set { checkDirecionalAutomatico.Checked = value; }
}
public bool AssistidoPorSonar
{
get { return checkAssistidoSonar.Checked; }
set { checkAssistidoSonar.Checked = value; }
}
public bool AssistidoPorImu
{
get { return checkAssistidoImu.Checked; }
set { checkAssistidoImu.Checked = value; }
}
public bool ImuPrefereArco
{
get { return checkImuPrefereArco.Checked; }
set { checkImuPrefereArco.Checked = value; }
}
public int AnguloMaximo
{
get { return sliderAnguloMaximo.Value; }
set { sliderAnguloMaximo.Value = value; }
}
public int VelocidadeDirecionalPercentual
{
get { return sliderVelocidadeDirecional.Value; }
set { sliderVelocidadeDirecional.Value = value; }
}
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; }
}
}
}

View File

@ -0,0 +1,37 @@
namespace AgroBase.Forms.IHM.Operacao.Parametros
{
partial class ucParametrosMapa
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
}
#endregion
}
}

View File

@ -0,0 +1,20 @@
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 System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros
{
public partial class ucParametrosMapa : UserControl
{
public ucParametrosMapa()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,217 @@
namespace AgroBase.Forms.IHM.Operacao.Parametros
{
partial class ucParametrosMovimento
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && components != null)
components.Dispose();
base.Dispose(disposing);
}
#region Component Designer generated code
private void InitializeComponent()
{
this.rootLayout = new System.Windows.Forms.TableLayoutPanel();
this.pnlAutomacao = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.automacaoLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblAutomacaoTitulo = new System.Windows.Forms.Label();
this.lblAutomacaoDescricao = new System.Windows.Forms.Label();
this.checksLayout = new System.Windows.Forms.TableLayoutPanel();
this.checkMovimentoAutomatico = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.checkAssistidoSonar = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.checkParadaObstaculo = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.checkAssistidoImu = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.checkParadaInclinacao = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.checkFrenagemParar = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow();
this.pnlVelocidades = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.velocidadesLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblVelocidadesTitulo = new System.Windows.Forms.Label();
this.lblVelocidadesDescricao = new System.Windows.Forms.Label();
this.sliderSemErvas = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow();
this.sliderComErvas = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow();
this.rootLayout.SuspendLayout();
this.pnlAutomacao.SuspendLayout();
this.automacaoLayout.SuspendLayout();
this.checksLayout.SuspendLayout();
this.pnlVelocidades.SuspendLayout();
this.velocidadesLayout.SuspendLayout();
this.SuspendLayout();
this.rootLayout.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Background;
this.rootLayout.ColumnCount = 2;
this.rootLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 45F));
this.rootLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 55F));
this.rootLayout.Controls.Add(this.pnlAutomacao, 0, 0);
this.rootLayout.Controls.Add(this.pnlVelocidades, 1, 0);
this.rootLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.rootLayout.Margin = System.Windows.Forms.Padding.Empty;
this.rootLayout.Padding = System.Windows.Forms.Padding.Empty;
this.rootLayout.RowCount = 1;
this.rootLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
ConfigurePanel(this.pnlAutomacao, this.automacaoLayout);
this.pnlAutomacao.Margin = new System.Windows.Forms.Padding(0, 0, 3, 0);
this.automacaoLayout.ColumnCount = 1;
this.automacaoLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.automacaoLayout.Controls.Add(this.lblAutomacaoTitulo, 0, 0);
this.automacaoLayout.Controls.Add(this.lblAutomacaoDescricao, 0, 1);
this.automacaoLayout.Controls.Add(this.checksLayout, 0, 2);
this.automacaoLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.automacaoLayout.Margin = System.Windows.Forms.Padding.Empty;
this.automacaoLayout.Padding = System.Windows.Forms.Padding.Empty;
this.automacaoLayout.RowCount = 3;
this.automacaoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F));
this.automacaoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));
this.automacaoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
SetupSectionTitle(this.lblAutomacaoTitulo, "AUTOMAÇÃO E ASSISTÊNCIAS");
SetupSectionDescription(this.lblAutomacaoDescricao, "Ative somente os recursos que devem participar do controle de movimento.");
this.checksLayout.BackColor = System.Drawing.Color.Transparent;
this.checksLayout.ColumnCount = 2;
this.checksLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.checksLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.checksLayout.Controls.Add(this.checkMovimentoAutomatico, 0, 0);
this.checksLayout.Controls.Add(this.checkAssistidoSonar, 1, 0);
this.checksLayout.Controls.Add(this.checkParadaObstaculo, 0, 1);
this.checksLayout.Controls.Add(this.checkAssistidoImu, 1, 1);
this.checksLayout.Controls.Add(this.checkParadaInclinacao, 0, 2);
this.checksLayout.Controls.Add(this.checkFrenagemParar, 1, 2);
this.checksLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.checksLayout.Margin = System.Windows.Forms.Padding.Empty;
this.checksLayout.Padding = System.Windows.Forms.Padding.Empty;
this.checksLayout.RowCount = 3;
this.checksLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.checksLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.checksLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.34F));
SetupCheck(this.checkMovimentoAutomatico, "Movimento automático");
SetupCheck(this.checkAssistidoSonar, "Assistido por sonar");
SetupCheck(this.checkParadaObstaculo, "Parada por obstáculo");
SetupCheck(this.checkAssistidoImu, "Assistido por IMU");
SetupCheck(this.checkParadaInclinacao, "Parada por inclinação");
SetupCheck(this.checkFrenagemParar, "Frenagem ao parar");
ConfigurePanel(this.pnlVelocidades, this.velocidadesLayout);
this.pnlVelocidades.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.velocidadesLayout.ColumnCount = 1;
this.velocidadesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.velocidadesLayout.Controls.Add(this.lblVelocidadesTitulo, 0, 0);
this.velocidadesLayout.Controls.Add(this.lblVelocidadesDescricao, 0, 1);
this.velocidadesLayout.Controls.Add(this.sliderSemErvas, 0, 2);
this.velocidadesLayout.Controls.Add(this.sliderComErvas, 0, 3);
this.velocidadesLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.velocidadesLayout.Margin = System.Windows.Forms.Padding.Empty;
this.velocidadesLayout.Padding = System.Windows.Forms.Padding.Empty;
this.velocidadesLayout.RowCount = 4;
this.velocidadesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F));
this.velocidadesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));
this.velocidadesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.velocidadesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
SetupSectionTitle(this.lblVelocidadesTitulo, "LIMITES DE VELOCIDADE");
SetupSectionDescription(this.lblVelocidadesDescricao, "A velocidade em km/h é calculada pelo percentual da velocidade máxima do equipamento.");
this.sliderSemErvas.Dock = System.Windows.Forms.DockStyle.Fill;
this.sliderSemErvas.Margin = new System.Windows.Forms.Padding(0, 2, 0, 3);
this.sliderSemErvas.Titulo = "Sem ervas no radar";
this.sliderSemErvas.Value = 68;
this.sliderSemErvas.VelocidadeMaximaKmh = 5D;
this.sliderSemErvas.AccentColor = AgroBase.Forms.IHM.Controls.HmiTheme.Success;
this.sliderComErvas.Dock = System.Windows.Forms.DockStyle.Fill;
this.sliderComErvas.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0);
this.sliderComErvas.Titulo = "Com ervas no radar";
this.sliderComErvas.Value = 45;
this.sliderComErvas.VelocidadeMaximaKmh = 5D;
this.sliderComErvas.AccentColor = AgroBase.Forms.IHM.Controls.HmiTheme.Info;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Background;
this.Controls.Add(this.rootLayout);
this.DoubleBuffered = true;
this.Name = "ucParametrosMovimento";
this.Size = new System.Drawing.Size(760, 286);
this.rootLayout.ResumeLayout(false);
this.pnlAutomacao.ResumeLayout(false);
this.automacaoLayout.ResumeLayout(false);
this.checksLayout.ResumeLayout(false);
this.pnlVelocidades.ResumeLayout(false);
this.velocidadesLayout.ResumeLayout(false);
this.ResumeLayout(false);
}
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);
panel.CornerRadius = 9;
panel.Dock = System.Windows.Forms.DockStyle.Fill;
panel.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.Surface;
panel.Padding = new System.Windows.Forms.Padding(10);
}
private static void SetupSectionTitle(System.Windows.Forms.Label label, string text)
{
label.AutoEllipsis = true;
label.BackColor = System.Drawing.Color.Transparent;
label.Dock = System.Windows.Forms.DockStyle.Fill;
label.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold);
label.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.Text;
label.Margin = System.Windows.Forms.Padding.Empty;
label.Text = text;
label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
}
private static void SetupSectionDescription(System.Windows.Forms.Label label, string text)
{
label.AutoEllipsis = true;
label.BackColor = System.Drawing.Color.Transparent;
label.Dock = System.Windows.Forms.DockStyle.Fill;
label.Font = new System.Drawing.Font("Segoe UI", 7F);
label.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
label.Margin = System.Windows.Forms.Padding.Empty;
label.Text = text;
label.TextAlign = System.Drawing.ContentAlignment.TopLeft;
}
private static void SetupCheck(AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow check, string title)
{
check.Dock = System.Windows.Forms.DockStyle.Fill;
check.Titulo = title;
check.Checked = true;
check.Margin = new System.Windows.Forms.Padding(3);
check.MinimumSize = System.Drawing.Size.Empty;
}
#endregion
private System.Windows.Forms.TableLayoutPanel rootLayout;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlAutomacao;
private System.Windows.Forms.TableLayoutPanel automacaoLayout;
private System.Windows.Forms.Label lblAutomacaoTitulo;
private System.Windows.Forms.Label lblAutomacaoDescricao;
private System.Windows.Forms.TableLayoutPanel checksLayout;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkMovimentoAutomatico;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkAssistidoSonar;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkParadaObstaculo;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkAssistidoImu;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkParadaInclinacao;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiCompactCheckRow checkFrenagemParar;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlVelocidades;
private System.Windows.Forms.TableLayoutPanel velocidadesLayout;
private System.Windows.Forms.Label lblVelocidadesTitulo;
private System.Windows.Forms.Label lblVelocidadesDescricao;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow sliderSemErvas;
private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow sliderComErvas;
}
}

View File

@ -0,0 +1,111 @@
using AgroBase.Forms.IHM.Operacao.Parametros.Controls;
using System;
using System.Windows.Forms;
namespace AgroBase.Forms.IHM.Operacao.Parametros
{
public partial class ucParametrosMovimento : UserControl
{
public event EventHandler ParametrosAlterados;
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;
checkAssistidoSonar.CheckedChanged += Controle_Alterado;
checkParadaObstaculo.CheckedChanged += Controle_Alterado;
checkAssistidoImu.CheckedChanged += Controle_Alterado;
checkParadaInclinacao.CheckedChanged += Controle_Alterado;
checkFrenagemParar.CheckedChanged += Controle_Alterado;
sliderSemErvas.ValueChanged += Controle_Alterado;
sliderComErvas.ValueChanged += Controle_Alterado;
}
private void Controle_Alterado(object sender, EventArgs e)
{
if (ParametrosAlterados != null)
ParametrosAlterados(this, EventArgs.Empty);
}
public bool MovimentoAutomatico
{
get { return checkMovimentoAutomatico.Checked; }
set { checkMovimentoAutomatico.Checked = value; }
}
public bool AssistidoPorSonar
{
get { return checkAssistidoSonar.Checked; }
set { checkAssistidoSonar.Checked = value; }
}
public bool ParadaPorObstaculo
{
get { return checkParadaObstaculo.Checked; }
set { checkParadaObstaculo.Checked = value; }
}
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;
}
}
}
}

View File

@ -1,7 +1,12 @@
using AgroBase.Forms.IHM.Controls; using AgroBase.Forms.IHM.Controls;
using AgroBase.Forms.IHM.Controls.Operacao; using AgroBase.Forms.IHM.Controls.Operacao;
using AgroBase.Forms.IHM.Operacao.Parametros.Controls;
using AgroBase.Models;
using AgroBase.Models.Modules;
using System;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Forms.IHM.Operacao namespace AgroBase.Forms.IHM.Operacao
{ {
@ -11,6 +16,15 @@ namespace AgroBase.Forms.IHM.Operacao
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
_controleDescartado = true;
if (picCamera != null)
{
System.Drawing.Image imagemAtual = picCamera.Image;
picCamera.Image = null;
imagemAtual?.Dispose();
}
if (disposing && components != null) if (disposing && components != null)
components.Dispose(); components.Dispose();
@ -29,15 +43,9 @@ namespace AgroBase.Forms.IHM.Operacao
this.lblControleTitulo = new System.Windows.Forms.Label(); this.lblControleTitulo = new System.Windows.Forms.Label();
this.lblJoystick = new System.Windows.Forms.Label(); this.lblJoystick = new System.Windows.Forms.Label();
this.cmbJoystick = new System.Windows.Forms.ComboBox(); this.cmbJoystick = new System.Windows.Forms.ComboBox();
this.lblVelocidadeMax = new System.Windows.Forms.Label(); this.sliderVelocidadeMax = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow();
this.lblVelocidadeMaxValor = new System.Windows.Forms.Label(); this.sliderAngulo = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow();
this.sliderVelocidadeMax = new AgroBase.Forms.IHM.Controls.Operacao.HmiSlider(); this.sliderVelocidadeDir = new AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow();
this.lblAngulo = new System.Windows.Forms.Label();
this.lblAnguloValor = new System.Windows.Forms.Label();
this.sliderAngulo = new AgroBase.Forms.IHM.Controls.Operacao.HmiSlider();
this.lblVelocidadeDir = new System.Windows.Forms.Label();
this.lblVelocidadeDirValor = new System.Windows.Forms.Label();
this.sliderVelocidadeDir = new AgroBase.Forms.IHM.Controls.Operacao.HmiSlider();
this.lblTipoMovimento = new System.Windows.Forms.Label(); this.lblTipoMovimento = new System.Windows.Forms.Label();
this.cmbTipoMovimento = new System.Windows.Forms.ComboBox(); this.cmbTipoMovimento = new System.Windows.Forms.ComboBox();
this.acoesLayout = new System.Windows.Forms.TableLayoutPanel(); this.acoesLayout = new System.Windows.Forms.TableLayoutPanel();
@ -135,25 +143,16 @@ namespace AgroBase.Forms.IHM.Operacao
this.controleLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 36F)); this.controleLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 36F));
this.controleLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 34F)); this.controleLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 34F));
this.controleLayout.Dock = System.Windows.Forms.DockStyle.Fill; this.controleLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.controleLayout.RowCount = 11; this.controleLayout.RowCount = 8;
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 22F)); this.controleLayout.RowStyles.Clear();
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); this.controleLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 22F)); // título
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 18F)); this.controleLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 27F)); // joystick
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29F)); this.controleLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 33.33F)); // vel máxima
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 18F)); this.controleLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 33.33F)); // ângulo
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29F)); this.controleLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 33.34F)); // vel dir
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 18F)); this.controleLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 17F)); // tipo
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29F)); this.controleLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 28F)); // combo
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 18F)); this.controleLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 40F)); // ações
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));
this.controleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
// Joystick
this.controleLayout.RowStyles[1] = new RowStyle(SizeType.Absolute, 27F);
// Combo de tipo de movimento
this.controleLayout.RowStyles[9] = new RowStyle(SizeType.Absolute, 28F);
// Botões
this.controleLayout.RowStyles[10] = new RowStyle(SizeType.Absolute, 40F);
SetupTitle(this.lblControleTitulo, "CONTROLE DE MOVIMENTO"); SetupTitle(this.lblControleTitulo, "CONTROLE DE MOVIMENTO");
this.controleLayout.Controls.Add(this.lblControleTitulo, 0, 0); this.controleLayout.Controls.Add(this.lblControleTitulo, 0, 0);
@ -168,51 +167,31 @@ namespace AgroBase.Forms.IHM.Operacao
this.controleLayout.Controls.Add(this.cmbJoystick, 1, 1); this.controleLayout.Controls.Add(this.cmbJoystick, 1, 1);
this.controleLayout.SetColumnSpan(this.cmbJoystick, 2); this.controleLayout.SetColumnSpan(this.cmbJoystick, 2);
SetupCaption(this.lblVelocidadeMax, "Velocidade máx."); SetupParameterSlider(this.sliderVelocidadeMax, "Velocidade máxima", HmiTheme.Success, 0, 100, 30, HmiSliderValueFormat.PercentAndSpeed);
SetupValue(this.lblVelocidadeMaxValor, "68% · 3,4 km/h", AgroBase.Forms.IHM.Controls.HmiTheme.Success); this.sliderVelocidadeMax.VelocidadeMaximaKmh = FuncoesMatematicas.CalculaVelocidadeRPM(VariaveisEquipamento.RPM_Max_Roda);
this.controleLayout.Controls.Add(this.lblVelocidadeMax, 0, 2); this.controleLayout.Controls.Add(this.sliderVelocidadeMax, 0, 2);
this.controleLayout.SetColumnSpan(this.lblVelocidadeMax, 2);
this.controleLayout.Controls.Add(this.lblVelocidadeMaxValor, 2, 2);
SetupSlider(this.sliderVelocidadeMax, AgroBase.Forms.IHM.Controls.HmiTheme.Success, 0, 100, 68);
this.controleLayout.Controls.Add(this.sliderVelocidadeMax, 0, 3);
this.controleLayout.SetColumnSpan(this.sliderVelocidadeMax, 3); this.controleLayout.SetColumnSpan(this.sliderVelocidadeMax, 3);
SetupCaption(this.lblAngulo, "Ângulo direcional"); SetupParameterSlider(this.sliderAngulo, "Ângulo direcional", HmiTheme.Manual, 0, 90, 12, HmiSliderValueFormat.Degrees);
SetupValue(this.lblAnguloValor, "+12°", AgroBase.Forms.IHM.Controls.HmiTheme.Manual); this.controleLayout.Controls.Add(this.sliderAngulo, 0, 3);
this.controleLayout.Controls.Add(this.lblAngulo, 0, 4);
this.controleLayout.SetColumnSpan(this.lblAngulo, 2);
this.controleLayout.Controls.Add(this.lblAnguloValor, 2, 4);
SetupSlider(this.sliderAngulo, AgroBase.Forms.IHM.Controls.HmiTheme.Manual, 0, 90, 12);
this.controleLayout.Controls.Add(this.sliderAngulo, 0, 5);
this.controleLayout.SetColumnSpan(this.sliderAngulo, 3); this.controleLayout.SetColumnSpan(this.sliderAngulo, 3);
SetupCaption(this.lblVelocidadeDir, "Velocidade direcional"); SetupParameterSlider(this.sliderVelocidadeDir, "Velocidade direcional", HmiTheme.Info, 0, 100, 55, HmiSliderValueFormat.PercentOnly);
SetupValue(this.lblVelocidadeDirValor, "55%", AgroBase.Forms.IHM.Controls.HmiTheme.Info); this.controleLayout.Controls.Add(this.sliderVelocidadeDir, 0, 4);
this.controleLayout.Controls.Add(this.lblVelocidadeDir, 0, 6);
this.controleLayout.SetColumnSpan(this.lblVelocidadeDir, 2);
this.controleLayout.Controls.Add(this.lblVelocidadeDirValor, 2, 6);
SetupSlider(this.sliderVelocidadeDir, AgroBase.Forms.IHM.Controls.HmiTheme.Info, 0, 100, 55);
this.controleLayout.Controls.Add(this.sliderVelocidadeDir, 0, 7);
this.controleLayout.SetColumnSpan(this.sliderVelocidadeDir, 3); this.controleLayout.SetColumnSpan(this.sliderVelocidadeDir, 3);
SetupCaption(this.lblTipoMovimento, "Tipo de movimento"); SetupCaption(this.lblTipoMovimento, "Tipo de movimento");
this.controleLayout.Controls.Add(this.lblTipoMovimento, 0, 8); this.controleLayout.Controls.Add(this.lblTipoMovimento, 0, 5);
this.controleLayout.SetColumnSpan(this.lblTipoMovimento, 3); this.controleLayout.SetColumnSpan(this.lblTipoMovimento, 3);
SetupCombo(this.cmbTipoMovimento); SetupCombo(this.cmbTipoMovimento);
this.cmbTipoMovimento.Items.AddRange(new object[] this.cmbTipoMovimento.Items.AddRange(Enum.GetNames(typeof(TipoMovimentoDirecional)));
{ this.controleLayout.Controls.Add(this.cmbTipoMovimento, 0, 6);
"Rodas dianteiras",
"Rodas traseiras",
"Rotacionar no eixo",
"Movimento arco",
"Movimento lateral",
"Movimento diagonal",
"Diagnóstico"
});
this.controleLayout.Controls.Add(this.cmbTipoMovimento, 0, 9);
this.controleLayout.SetColumnSpan(this.cmbTipoMovimento, 3); this.controleLayout.SetColumnSpan(this.cmbTipoMovimento, 3);
this.controleLayout.Controls.Add(this.acoesLayout, 0, 7);
this.controleLayout.SetColumnSpan(this.acoesLayout, 3);
this.acoesLayout.ColumnCount = 3; this.acoesLayout.ColumnCount = 3;
this.acoesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 34F)); this.acoesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 34F));
this.acoesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); this.acoesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
@ -225,12 +204,9 @@ namespace AgroBase.Forms.IHM.Operacao
this.acoesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.acoesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.acoesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 1F)); this.acoesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 1F));
SetupAction(this.btnControleManual, "MANUAL", AgroBase.Forms.IHM.Controls.HmiTheme.Success); SetupAction(this.btnControleManual, "MANUAL", AgroBase.Forms.IHM.Controls.HmiTheme.Info);
SetupAction(this.btnReferenciar, "ZERAR", AgroBase.Forms.IHM.Controls.HmiTheme.Info); SetupAction(this.btnReferenciar, "ZERAR", AgroBase.Forms.IHM.Controls.HmiTheme.Disabled);
SetupAction(this.btnFreio, "FREIO", AgroBase.Forms.IHM.Controls.HmiTheme.Danger); SetupAction(this.btnFreio, "FREIO", AgroBase.Forms.IHM.Controls.HmiTheme.Disabled);
this.controleLayout.Controls.Add(this.acoesLayout, 0, 10);
this.controleLayout.SetColumnSpan(this.acoesLayout, 3);
// wheels // wheels
this.rodasLayout.Dock = DockStyle.Fill; this.rodasLayout.Dock = DockStyle.Fill;
@ -448,9 +424,7 @@ namespace AgroBase.Forms.IHM.Operacao
this.ResumeLayout(false); this.ResumeLayout(false);
} }
private static void ConfigurePanel( private static void ConfigurePanel(AgroBase.Forms.IHM.Controls.HmiRoundedPanel panel, System.Windows.Forms.Control child)
AgroBase.Forms.IHM.Controls.HmiRoundedPanel panel,
System.Windows.Forms.Control child)
{ {
panel.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border; panel.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border;
panel.Controls.Add(child); panel.Controls.Add(child);
@ -461,9 +435,7 @@ namespace AgroBase.Forms.IHM.Operacao
panel.Padding = new System.Windows.Forms.Padding(7); panel.Padding = new System.Windows.Forms.Padding(7);
} }
private static void SetupTitle( private static void SetupTitle(System.Windows.Forms.Label label, string text)
System.Windows.Forms.Label label,
string text)
{ {
label.Dock = System.Windows.Forms.DockStyle.Fill; label.Dock = System.Windows.Forms.DockStyle.Fill;
label.BackColor = System.Drawing.Color.Transparent; label.BackColor = System.Drawing.Color.Transparent;
@ -474,9 +446,7 @@ namespace AgroBase.Forms.IHM.Operacao
label.AutoEllipsis = true; label.AutoEllipsis = true;
} }
private static void SetupCaption( private static void SetupCaption(System.Windows.Forms.Label label, string text)
System.Windows.Forms.Label label,
string text)
{ {
label.Dock = System.Windows.Forms.DockStyle.Fill; label.Dock = System.Windows.Forms.DockStyle.Fill;
label.BackColor = System.Drawing.Color.Transparent; label.BackColor = System.Drawing.Color.Transparent;
@ -502,8 +472,7 @@ namespace AgroBase.Forms.IHM.Operacao
label.Padding = Padding.Empty; label.Padding = Padding.Empty;
} }
private static void SetupCombo( private static void SetupCombo(System.Windows.Forms.ComboBox combo)
System.Windows.Forms.ComboBox combo)
{ {
combo.Dock = System.Windows.Forms.DockStyle.Fill; combo.Dock = System.Windows.Forms.DockStyle.Fill;
combo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; combo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
@ -514,27 +483,25 @@ namespace AgroBase.Forms.IHM.Operacao
combo.Margin = new System.Windows.Forms.Padding(0, 1, 0, 1); combo.Margin = new System.Windows.Forms.Padding(0, 1, 0, 1);
} }
private static void SetupSlider( private static void SetupParameterSlider(HmiParameterSliderRow slider, string titulo, Color accent, int minimum, int maximum, int value, HmiSliderValueFormat format)
AgroBase.Forms.IHM.Controls.Operacao.HmiSlider slider,
System.Drawing.Color accent,
int min,
int max,
int value)
{ {
slider.Dock = System.Windows.Forms.DockStyle.Fill; slider.CompactMode = true;
slider.Minimum = min;
slider.Maximum = max; slider.Dock = DockStyle.Fill;
slider.Value = value; slider.Margin = Padding.Empty;
slider.Padding = Padding.Empty;
slider.MinimumSize = Size.Empty;
slider.BackColor = Color.Transparent;
slider.Titulo = titulo;
slider.Minimum = minimum;
slider.Maximum = maximum;
slider.ValueFormat = format;
slider.AccentColor = accent; slider.AccentColor = accent;
slider.TrackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border; slider.Value = value;
slider.ThumbColor = AgroBase.Forms.IHM.Controls.HmiTheme.Text;
slider.Margin = System.Windows.Forms.Padding.Empty;
} }
private static void SetupAction( private static void SetupAction(HmiSidebarButton button, string text, Color accent)
HmiSidebarButton button,
string text,
Color accent)
{ {
button.Dock = DockStyle.Fill; button.Dock = DockStyle.Fill;
@ -550,14 +517,13 @@ namespace AgroBase.Forms.IHM.Operacao
button.MaximumSize = Size.Empty; button.MaximumSize = Size.Empty;
} }
private static void SetupWheel( private static void SetupWheel(HmiWheelStatusCard card, string titulo)
HmiWheelStatusCard card,
string titulo)
{ {
card.Dock = DockStyle.Fill; card.Dock = DockStyle.Fill;
card.Margin = new Padding(2, 0, 2, 0); card.Margin = new Padding(2, 0, 2, 0);
card.MinimumSize = Size.Empty; card.MinimumSize = Size.Empty;
card.Tag = titulo;
card.Titulo = titulo; card.Titulo = titulo;
card.DirecionalSp = "+0,0°"; card.DirecionalSp = "+0,0°";
@ -568,7 +534,9 @@ namespace AgroBase.Forms.IHM.Operacao
card.MovimentoAtual = "0 rpm"; card.MovimentoAtual = "0 rpm";
card.StatusMovimento = "Sem freio"; card.StatusMovimento = "Sem freio";
card.CheckDir.Tag = titulo;
card.CheckDir.Checked = true; card.CheckDir.Checked = true;
card.CheckMov.Tag = titulo;
card.CheckMov.Checked = true; card.CheckMov.Checked = true;
card.CorStatusDirecional = HmiTheme.Success; card.CorStatusDirecional = HmiTheme.Success;
@ -577,11 +545,7 @@ namespace AgroBase.Forms.IHM.Operacao
card.BringToFront(); card.BringToFront();
} }
private static void SetupCompactCard( private static void SetupCompactCard(HmiCompactMetricCard card, string titulo, string valor, Color cor)
HmiCompactMetricCard card,
string titulo,
string valor,
Color cor)
{ {
card.Dock = DockStyle.Fill; card.Dock = DockStyle.Fill;
card.Titulo = titulo; card.Titulo = titulo;
@ -591,11 +555,7 @@ namespace AgroBase.Forms.IHM.Operacao
card.MinimumSize = Size.Empty; card.MinimumSize = Size.Empty;
} }
private static void SetupTelemetry( private static void SetupTelemetry(AgroBase.Forms.IHM.Controls.Operacao.HmiTelemetryRow row, string icon, string title, string value)
AgroBase.Forms.IHM.Controls.Operacao.HmiTelemetryRow row,
string icon,
string title,
string value)
{ {
row.Dock = System.Windows.Forms.DockStyle.Fill; row.Dock = System.Windows.Forms.DockStyle.Fill;
row.IconText = icon; row.IconText = icon;
@ -603,6 +563,7 @@ namespace AgroBase.Forms.IHM.Operacao
row.Valor = value; row.Valor = value;
} }
#endregion #endregion
private System.Windows.Forms.TableLayoutPanel rootLayout; private System.Windows.Forms.TableLayoutPanel rootLayout;
@ -613,15 +574,9 @@ namespace AgroBase.Forms.IHM.Operacao
private System.Windows.Forms.Label lblControleTitulo; private System.Windows.Forms.Label lblControleTitulo;
private System.Windows.Forms.Label lblJoystick; private System.Windows.Forms.Label lblJoystick;
private System.Windows.Forms.ComboBox cmbJoystick; private System.Windows.Forms.ComboBox cmbJoystick;
private System.Windows.Forms.Label lblVelocidadeMax; private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow sliderVelocidadeMax;
private System.Windows.Forms.Label lblVelocidadeMaxValor; private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow sliderAngulo;
private AgroBase.Forms.IHM.Controls.Operacao.HmiSlider sliderVelocidadeMax; private AgroBase.Forms.IHM.Operacao.Parametros.Controls.HmiParameterSliderRow sliderVelocidadeDir;
private System.Windows.Forms.Label lblAngulo;
private System.Windows.Forms.Label lblAnguloValor;
private AgroBase.Forms.IHM.Controls.Operacao.HmiSlider sliderAngulo;
private System.Windows.Forms.Label lblVelocidadeDir;
private System.Windows.Forms.Label lblVelocidadeDirValor;
private AgroBase.Forms.IHM.Controls.Operacao.HmiSlider sliderVelocidadeDir;
private System.Windows.Forms.Label lblTipoMovimento; private System.Windows.Forms.Label lblTipoMovimento;
private System.Windows.Forms.ComboBox cmbTipoMovimento; private System.Windows.Forms.ComboBox cmbTipoMovimento;
private System.Windows.Forms.TableLayoutPanel acoesLayout; private System.Windows.Forms.TableLayoutPanel acoesLayout;

View File

@ -1,10 +1,29 @@
using AgroBase.Forms.IHM.Controls; using AgroBase.Forms.IHM.Controls;
using AgroBase.Forms.IHM.Controls.Operacao;
using AgroBase.Models;
using AgroBase.Models.Modules;
using AgroBase.Models.Operacoes;
using AgroBase.Models.Operadores;
using AgroBase.Services.Operadores;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Forms.IHM.Operacao namespace AgroBase.Forms.IHM.Operacao
{ {
public partial class ucOperacaoMovimentacao : UserControl public partial class ucOperacaoMovimentacao : UserControl
{ {
private bool _modoManualAtivado = false;
private bool _freioAtivado = false;
private bool _atualizandoSlider = false;
private bool _requisitandoCameraFrame;
private bool _controleDescartado;
OperacaoModel op => Variaveis.OperacaoEmAndamento;
public ucOperacaoMovimentacao() public ucOperacaoMovimentacao()
{ {
InitializeComponent(); InitializeComponent();
@ -21,8 +40,6 @@ namespace AgroBase.Forms.IHM.Operacao
sliderAngulo.Value = 12; sliderAngulo.Value = 12;
sliderVelocidadeDir.Value = 55; sliderVelocidadeDir.Value = 55;
AtualizarLabelsSliders();
telemetryVelocidade.CorValor = HmiTheme.Info; telemetryVelocidade.CorValor = HmiTheme.Info;
telemetryTensao.CorValor = HmiTheme.Success; telemetryTensao.CorValor = HmiTheme.Success;
telemetryCorrente.CorValor = HmiTheme.Warning; telemetryCorrente.CorValor = HmiTheme.Warning;
@ -55,39 +72,377 @@ namespace AgroBase.Forms.IHM.Operacao
{ {
sliderVelocidadeMax.ValueChanged += delegate sliderVelocidadeMax.ValueChanged += delegate
{ {
AtualizarLabelsSliders(); if (!_modoManualAtivado)
return;
if (op?.Controle == null)
return;
op.Controle.PercentualVelocidadeSP = sliderVelocidadeMax.Value;
}; };
sliderVelocidadeMax.KeyDown += delegate { _atualizandoSlider = true; };
sliderVelocidadeMax.KeyUp += delegate { _atualizandoSlider = false; };
sliderAngulo.ValueChanged += delegate sliderAngulo.ValueChanged += delegate
{ {
AtualizarLabelsSliders(); if (!_modoManualAtivado)
return;
if (op?.Controle == null)
return;
op.Controle.Angulo = sliderAngulo.Value;
}; };
sliderAngulo.KeyDown += delegate { _atualizandoSlider = true; };
sliderAngulo.KeyUp += delegate { _atualizandoSlider = false; };
sliderVelocidadeDir.ValueChanged += delegate sliderVelocidadeDir.ValueChanged += delegate
{ {
AtualizarLabelsSliders(); if (!_modoManualAtivado)
return;
if (op?.Parametros?.Controle == null)
return;
op.Parametros.Controle.DirVelocidadeMovimento = sliderVelocidadeDir.Value;
}; };
sliderVelocidadeDir.KeyDown += delegate { _atualizandoSlider = true; };
sliderVelocidadeDir.KeyUp += delegate { _atualizandoSlider = false; };
btnControleManual.Click += BtnControleManual_Click;
btnReferenciar.Click += BtnReferenciar_Click;
btnFreio.Click += BtnFreio_Click;
cmbTipoMovimento.SelectedIndexChanged += CmbTipoMovimento_SelectedIndexChanged;
cardET.CheckDir.CheckedChanged += CheckDir_CheckedChanged;
cardET.CheckMov.CheckedChanged += CheckMov_CheckedChanged;
cardDT.CheckDir.CheckedChanged += CheckDir_CheckedChanged;
cardDT.CheckMov.CheckedChanged += CheckMov_CheckedChanged;
cardEF.CheckDir.CheckedChanged += CheckDir_CheckedChanged;
cardEF.CheckMov.CheckedChanged += CheckMov_CheckedChanged;
cardDF.CheckDir.CheckedChanged += CheckDir_CheckedChanged;
cardDF.CheckMov.CheckedChanged += CheckMov_CheckedChanged;
} }
private void AtualizarLabelsSliders() private void CheckMov_CheckedChanged(object sender, EventArgs e)
{ {
double velocidadeKmh = if (!_modoManualAtivado)
sliderVelocidadeMax.Value * 0.05; return;
lblVelocidadeMaxValor.Text = if (!(op?.DispMvd?.Dados?.Modulos?.Any() ?? false))
sliderVelocidadeMax.Value + return;
"% · " +
velocidadeKmh.ToString("0.0") +
" km/h";
lblAnguloValor.Text = var chb = sender as CheckBox;
"+" +
sliderAngulo.Value +
"°";
lblVelocidadeDirValor.Text = var mod = op?.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x.Modulo_ID == chb.Tag.ToString())?.MovMotor;
sliderVelocidadeDir.Value + if (mod == null)
"%"; return;
mod.Comandar = chb.Checked;
}
private void CheckDir_CheckedChanged(object sender, EventArgs e)
{
if (!_modoManualAtivado)
return;
if (!(op?.DispMvd?.Dados?.Modulos?.Any() ?? false))
return;
var chb = sender as CheckBox;
var mod = op?.DispMvd?.Dados?.Modulos?.FirstOrDefault(x => x.Modulo_ID == chb.Tag.ToString())?.DirMotor;
if (mod == null)
return;
mod.Comandar = chb.Checked;
}
private void CmbTipoMovimento_SelectedIndexChanged(object sender, EventArgs e)
{
if (!_modoManualAtivado)
return;
if (op?.Controle == null)
return;
var mods = op?.DispMvd?.Dados?.Modulos;
op.Controle.DefinirTipoMovimento((TipoMovimentoDirecional)cmbTipoMovimento.SelectedIndex, mods);
AtualizarDadosRodas(cardET, mods, forcar: true);
AtualizarDadosRodas(cardDT, mods, forcar: true);
AtualizarDadosRodas(cardEF, mods, forcar: true);
AtualizarDadosRodas(cardDF, mods, forcar: true);
}
private void BtnFreio_Click(object sender, EventArgs e)
{
if (!_modoManualAtivado)
return;
if (op?.Controle == null)
return;
_freioAtivado = !_freioAtivado;
btnFreio.AccentColor = _freioAtivado ? HmiTheme.Danger : HmiTheme.Info;
btnFreio.BorderColor = _freioAtivado ? HmiTheme.Danger : HmiTheme.Info;
GeneralJoystick.ProcessarDadosControle(BotoesJoystick.Bolinha, !_freioAtivado, ForcarComando: true);
}
private void BtnReferenciar_Click(object sender, EventArgs e)
{
if (!_modoManualAtivado)
return;
if (op?.DispMvd == null)
return;
GeneralJoystick.ProcessarDadosControle(BotoesJoystick.R3, false, ForcarComando: true);
}
private void BtnControleManual_Click(object sender, EventArgs e)
{
_modoManualAtivado = !_modoManualAtivado;
btnControleManual.AccentColor = _modoManualAtivado ? HmiTheme.Danger : HmiTheme.Info;
btnControleManual.BorderColor = _modoManualAtivado ? HmiTheme.Danger : HmiTheme.Info;
btnReferenciar.AccentColor = _modoManualAtivado ? HmiTheme.Info : HmiTheme.Disabled;
btnReferenciar.BackColor = _modoManualAtivado ? HmiTheme.Info : HmiTheme.Disabled;
btnFreio.AccentColor = _modoManualAtivado ? HmiTheme.Info : HmiTheme.Disabled;
btnFreio.BackColor = _modoManualAtivado ? HmiTheme.Info : HmiTheme.Disabled;
op.Parametros.Controle.ControleManualAcionado = _modoManualAtivado;
}
public void AtualizarDadosTela()
{
var dados = op?.Sensoriamento;
var mods = op?.DispMvd?.Dados?.Modulos;
AtualizarDadosControle(op?.Controle, op?.Parametros?.Controle);
AtualizarDadosRodas(cardET, mods);
AtualizarDadosRodas(cardDT, mods);
AtualizarDadosRodas(cardEF, mods);
AtualizarDadosRodas(cardDF, mods);
AtualizarDadosCamera(dados?.Cameras?.FirstOrDefault(x => x.dispositivo == Enums.T_Code.Snr), dados?.OperadorSaude?.ModulosSaude?.FirstOrDefault(x => x.modulo == T_Code.Snr)?.saude ?? 0);
AtualizarDadosSonar(dados.OperadorVisual);
AtualizarDadosImu(dados.IMU);
AtualizarDadosTelemetria(dados);
}
public void AtualizarDadosControle(OperacaoControleModel controle, OperacaoParametrosControleModel parametros)
{
AtualizarListaJoysticks();
if (_atualizandoSlider)
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);
}
private void AtualizarListaJoysticks()
{
string joystickSelecionado = cmbJoystick.SelectedItem as string;
string[] itemsAntigos = cmbJoystick.Items.Cast<string>().ToArray();
GeneralJoystick.AtualizaDispositivo();
string[] itemsNovos = GeneralJoystick.JoysticksConectados.ToArray();
if (itemsAntigos.SequenceEqual(itemsNovos))
return;
cmbJoystick.BeginUpdate();
try
{
cmbJoystick.Items.Clear();
cmbJoystick.Items.AddRange(itemsNovos);
string joystickConectado = GeneralJoystick.JoystickConectado?.Information?.InstanceName;
int indice = -1;
if (!string.IsNullOrWhiteSpace(joystickConectado))
indice = cmbJoystick.Items.IndexOf(joystickConectado);
if (indice < 0 && !string.IsNullOrWhiteSpace(joystickSelecionado))
indice = cmbJoystick.Items.IndexOf(joystickSelecionado);
if (indice < 0 && cmbJoystick.Items.Count > 0)
indice = 0;
cmbJoystick.SelectedIndex = indice;
}
finally
{
cmbJoystick.EndUpdate();
} }
} }
private void AtualizarDadosRodas(HmiWheelStatusCard card, List<ModuloMvdModel> Mods, bool forcar = false)
{
if (_modoManualAtivado && !forcar)
return;
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_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_vel_sp: Mov?.RPM_SP ?? 0,
mov_vel_at: Mov?.RPM_Roda ?? 0,
mov_freio: Mov?.UltimoFreioSP ?? false
);
}
public async void AtualizarDadosCamera(CameraWorkerItemModel dados, double saude)
{
lblCameraStatus.Text = $"FPS {dados?.fps ?? 0:F0} · {dados?.stream_kbps ?? 0:F1} MB/s · Saúde {saude:F0}%";
if (!_requisitandoCameraFrame)
_ = RequisitarCameraFrameAsync();
}
private async Task RequisitarCameraFrameAsync()
{
if (_requisitandoCameraFrame || _controleDescartado)
return;
_requisitandoCameraFrame = true;
try
{
TipoFrameCamera tipoFrame = (TipoFrameCamera)cmbTipoFrame.SelectedIndex;
var frame = await VisualWorkerService.GetCameraFrame(tipoFrame);
if (_controleDescartado || frame == null)
return;
Image imagemRecebida = frame.image();
if (imagemRecebida == null)
return;
// Garante que o PictureBox receba uma imagem independente
// de streams ou buffers internos do frame.
Image imagemSegura;
using (imagemRecebida)
{
imagemSegura = new Bitmap(imagemRecebida);
}
AtualizarImagemPainel(picCamera, imagemSegura);
}
catch (OutOfMemoryException ex)
{
// Em System.Drawing isso também pode significar
// imagem ou stream inválido, não só falta real de RAM.
Variaveis.MostrarLog("[IHM][Câmera] Frame inválido ou erro de memória: " + ex.Message);
}
catch (Exception ex)
{
Variaveis.MostrarLog("[IHM][Câmera] Erro ao obter frame: " + ex.Message);
}
finally
{
_requisitandoCameraFrame = false;
}
}
private void AtualizarImagemPainel(PictureBox pictureBox, Image novaImagem)
{
if (pictureBox == null)
{
novaImagem?.Dispose();
return;
}
if (pictureBox.IsDisposed || pictureBox.Disposing || _controleDescartado)
{
novaImagem?.Dispose();
return;
}
if (pictureBox.InvokeRequired)
{
try
{
pictureBox.BeginInvoke(new Action<PictureBox, Image>(AtualizarImagemPainel), pictureBox, novaImagem);
}
catch
{
novaImagem?.Dispose();
}
return;
}
Image imagemAnterior = pictureBox.Image;
pictureBox.Image = novaImagem;
imagemAnterior?.Dispose();
}
private void AtualizarDadosSonar(VisualWorkerModel dados)
{
cardSonarModo.Valor = dados?.Analises?.matriz_confianca?.block?.decision?.mode ?? "N/A";
cardSonarFator.Valor = (dados?.Analises?.matriz_confianca?.block?.decision?.v_max_sugerida_mps ?? 0f).ToString("F2") + "%";
cardSonarProximo.Valor = (dados?.Analises?.matriz_confianca?.block?.decision?.dist_necessaria ?? 0f).ToString("F2") + " m";
cardSonarLivreEsq.Valor = "0,00 m";
cardSonarLivreDir.Valor = "0,00 m";
cardSonarCorredor.Valor = (dados?.Analises?.segmentacao?.status_corredor ?? StatusCarroMapa.Indefinido).ToString();
}
private void AtualizarDadosImu(ModuloIMUModel dados)
{
cardImuModo.Valor = dados?.risk_level ?? "N/A";
cardImuFator.Valor = (dados?.velocidade_factor ?? 0f).ToString("F2");
cardImuMotivo.Valor = string.Join(", ", (dados?.motivos_risco ?? new System.Collections.Generic.List<string>()));
attitudeIndicator.FrontalDeg = dados.RollSeguro;
attitudeIndicator.LateralDeg = dados.PitchSeguro;
}
private void AtualizarDadosTelemetria(OperacaoSensoriamentoConjuntoModel dados)
{
double velocidadeKmh = FuncoesMatematicas.ConverteMsParaKmh(dados?.Movimentacao?.VelocidadeMediaMs ?? 0);
TimeSpan tempoMovimento = dados?.Movimentacao?.TempoMovimento ?? TimeSpan.Zero;
double autonomiaMinutos = dados?.Bateria?.TempoEstimadoRestanteMinutos ?? 0;
TimeSpan tempoAutonomia = TimeSpan.FromMinutes(Math.Max(0, autonomiaMinutos));
telemetryVelocidade.Valor = $"{velocidadeKmh:F2} km/h";
telemetryTensao.Valor = $"{dados?.Bateria?.TensaoInstantanea ?? 0:F2} V";
telemetryCorrente.Valor = $"{dados?.Bateria?.CorrenteInstantanea ?? 0:F2} A";
telemetryPotencia.Valor = $"{dados?.Bateria?.PotenciaInstantanea ?? 0:F2} W";
telemetryRpm.Valor = $"{dados?.Movimentacao?.RPMRodaMedio ?? 0:F0} rpm";
telemetryDistancia.Valor = $"{dados?.Movimentacao?.DistanciaPercorridaTotal ?? 0:F2} m";
telemetryTempo.Valor = tempoMovimento.ToString(@"hh\:mm\:ss");
telemetryVelMedia.Valor = $"{velocidadeKmh:F2} km/h";
telemetryAutonomiaM.Valor = $"{dados?.Bateria?.DistanciaEstimadaRestanteMetros ?? 0:F0} m";
telemetryAutonomiaTempo.Valor = tempoAutonomia.ToString(@"hh\:mm\:ss");
}
private static double Limitar(double valor, double minimo, double maximo)
{
return Math.Max(minimo, Math.Min(maximo, valor));
}
}
} }

View File

@ -6,11 +6,8 @@
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
if (disposing && if (disposing && components != null)
components != null)
{
components.Dispose(); components.Dispose();
}
base.Dispose(disposing); base.Dispose(disposing);
} }
@ -20,514 +17,199 @@
private void InitializeComponent() private void InitializeComponent()
{ {
this.rootLayout = new System.Windows.Forms.TableLayoutPanel(); this.rootLayout = new System.Windows.Forms.TableLayoutPanel();
this.leftLayout = new System.Windows.Forms.TableLayoutPanel(); this.tabsLayout = new System.Windows.Forms.TableLayoutPanel();
this.btnAbaMovimento = new System.Windows.Forms.Button();
this.btnAbaDirecional = new System.Windows.Forms.Button();
this.btnAbaAtuador = new System.Windows.Forms.Button();
this.btnAbaMapa = new System.Windows.Forms.Button();
this.pnlGeral = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel(); this.pnlDescricaoAba = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.geralLayout = new System.Windows.Forms.TableLayoutPanel(); this.lblDescricaoAba = new System.Windows.Forms.Label();
this.lblGeralTitulo = new System.Windows.Forms.Label();
this.lblModoOperacao = new System.Windows.Forms.Label();
this.btnModoManual = new System.Windows.Forms.Button();
this.btnModoMapaGps = new System.Windows.Forms.Button();
this.toggleRegistrarDados = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.pnlMovimento = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel(); this.pnlConteudo = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.movimentoLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblMovimentoTitulo = new System.Windows.Forms.Label();
this.movTogglesLayout = new System.Windows.Forms.TableLayoutPanel();
this.toggleMovAutomatico = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.toggleMovSonar = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.toggleParadaObstaculo = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.toggleMovImu = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.toggleParadaInclinacao = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.toggleFrenagemParar = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.movValuesLayout = new System.Windows.Forms.TableLayoutPanel();
this.paramVelSemErvas = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.paramVelComErvas = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.pnlDirecional = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.direcionalLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblDirecionalTitulo = new System.Windows.Forms.Label();
this.dirTogglesLayout = new System.Windows.Forms.TableLayoutPanel();
this.toggleDirAutomatico = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.toggleDirSonar = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.toggleDirImu = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.toggleImuPrefereArco = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.dirValuesLayout = new System.Windows.Forms.TableLayoutPanel();
this.paramAnguloMaximo = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.paramVelMovimentoDir = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.pnlTipoControle = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.tipoControleLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblTipoControle = new System.Windows.Forms.Label();
this.btnControleMpc = new System.Windows.Forms.Button();
this.btnControlePid = new System.Windows.Forms.Button();
this.pnlAtuador = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.atuadorLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblAtuadorTitulo = new System.Windows.Forms.Label();
this.togglePulverizadorAutomatico = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow();
this.cmbModoAgitador = new System.Windows.Forms.ComboBox();
this.atuadorValuesLayout = new System.Windows.Forms.TableLayoutPanel();
this.paramBicosEmUso = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.paramCapacidadeReservatorio = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.paramPressaoLinha = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.paramTelaIniciar = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.paramAlturaArea = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.paramErvasOn = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.paramErvasOff = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.pnlMpc = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.mpcLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblMpcTitulo = new System.Windows.Forms.Label();
this.paramHorizonte = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.paramAnteciparFim = new AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox();
this.rightLayout = new System.Windows.Forms.TableLayoutPanel();
this.pnlMapa = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.mapLayout = new System.Windows.Forms.TableLayoutPanel();
this.mapHeaderLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblMapaTitulo = new System.Windows.Forms.Label();
this.btnMapaBonito = 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.lblMapaAjuda = new System.Windows.Forms.Label();
this.footerPanel = new AgroBase.Forms.IHM.Controls.HmiRoundedPanel();
this.footerLayout = new System.Windows.Forms.TableLayoutPanel(); this.footerLayout = new System.Windows.Forms.TableLayoutPanel();
this.btnAplicarAtual = new AgroBase.Forms.IHM.Controls.HmiSidebarButton();
this.btnSalvarParametros = new AgroBase.Forms.IHM.Controls.HmiSidebarButton(); this.lblModoOperacao = new System.Windows.Forms.Label();
this.cmbModoOperacao = new System.Windows.Forms.ComboBox();
this.posProcessamentoLayout = new System.Windows.Forms.TableLayoutPanel();
this.lblPosProcessamento = new System.Windows.Forms.Label();
this.checkPosProcessamento = new System.Windows.Forms.CheckBox();
this.btnRedefinir = new AgroBase.Forms.IHM.Controls.HmiSidebarButton();
this.btnSalvar = new AgroBase.Forms.IHM.Controls.HmiSidebarButton();
this.rootLayout.SuspendLayout(); this.rootLayout.SuspendLayout();
this.leftLayout.SuspendLayout(); this.tabsLayout.SuspendLayout();
this.pnlGeral.SuspendLayout(); this.pnlDescricaoAba.SuspendLayout();
this.geralLayout.SuspendLayout(); this.footerPanel.SuspendLayout();
this.pnlMovimento.SuspendLayout();
this.movimentoLayout.SuspendLayout();
this.movTogglesLayout.SuspendLayout();
this.movValuesLayout.SuspendLayout();
this.pnlDirecional.SuspendLayout();
this.direcionalLayout.SuspendLayout();
this.dirTogglesLayout.SuspendLayout();
this.dirValuesLayout.SuspendLayout();
this.pnlTipoControle.SuspendLayout();
this.tipoControleLayout.SuspendLayout();
this.pnlAtuador.SuspendLayout();
this.atuadorLayout.SuspendLayout();
this.atuadorValuesLayout.SuspendLayout();
this.pnlMpc.SuspendLayout();
this.mpcLayout.SuspendLayout();
this.rightLayout.SuspendLayout();
this.pnlMapa.SuspendLayout();
this.mapLayout.SuspendLayout();
this.mapHeaderLayout.SuspendLayout();
this.pnlMapaVisual.SuspendLayout();
this.footerLayout.SuspendLayout(); this.footerLayout.SuspendLayout();
this.posProcessamentoLayout.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// root // rootLayout
this.rootLayout.BackColor = this.rootLayout.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Background;
AgroBase.Forms.IHM.Controls.HmiTheme.Background; this.rootLayout.ColumnCount = 1;
this.rootLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.rootLayout.Controls.Add(this.tabsLayout, 0, 0);
this.rootLayout.Controls.Add(this.pnlDescricaoAba, 0, 1);
this.rootLayout.Controls.Add(this.pnlConteudo, 0, 2);
this.rootLayout.Controls.Add(this.footerPanel, 0, 3);
this.rootLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.rootLayout.Margin = System.Windows.Forms.Padding.Empty;
this.rootLayout.Padding = System.Windows.Forms.Padding.Empty;
this.rootLayout.RowCount = 4;
this.rootLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 45F));
this.rootLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F));
this.rootLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.rootLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 62F));
this.rootLayout.ColumnCount = 2; // tabsLayout
this.tabsLayout.BackColor = System.Drawing.Color.Transparent;
this.tabsLayout.ColumnCount = 4;
this.tabsLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tabsLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tabsLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tabsLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tabsLayout.Controls.Add(this.btnAbaMovimento, 0, 0);
this.tabsLayout.Controls.Add(this.btnAbaDirecional, 1, 0);
this.tabsLayout.Controls.Add(this.btnAbaAtuador, 2, 0);
this.tabsLayout.Controls.Add(this.btnAbaMapa, 3, 0);
this.tabsLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabsLayout.Margin = new System.Windows.Forms.Padding(0, 0, 0, 3);
this.tabsLayout.Padding = System.Windows.Forms.Padding.Empty;
this.tabsLayout.RowCount = 1;
this.tabsLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.rootLayout.ColumnStyles.Add( SetupTabButton(this.btnAbaMovimento, "↔ Movimento");
new System.Windows.Forms.ColumnStyle( SetupTabButton(this.btnAbaDirecional, "◉ Direcional");
System.Windows.Forms.SizeType.Percent, SetupTabButton(this.btnAbaAtuador, "♨ Atuador");
52F)); SetupTabButton(this.btnAbaMapa, "⌖ Mapa e Navegação");
this.rootLayout.ColumnStyles.Add( // pnlDescricaoAba
new System.Windows.Forms.ColumnStyle( this.pnlDescricaoAba.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border;
System.Windows.Forms.SizeType.Percent, this.pnlDescricaoAba.Controls.Add(this.lblDescricaoAba);
48F)); this.pnlDescricaoAba.CornerRadius = 7;
this.pnlDescricaoAba.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlDescricaoAba.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.SurfaceRaised;
this.pnlDescricaoAba.Margin = new System.Windows.Forms.Padding(0, 0, 0, 3);
this.pnlDescricaoAba.Padding = new System.Windows.Forms.Padding(10, 0, 10, 0);
this.rootLayout.Controls.Add( // lblDescricaoAba
this.leftLayout, this.lblDescricaoAba.AutoEllipsis = true;
0, this.lblDescricaoAba.BackColor = System.Drawing.Color.Transparent;
0); this.lblDescricaoAba.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblDescricaoAba.Font = new System.Drawing.Font("Segoe UI", 7.2F);
this.lblDescricaoAba.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
this.lblDescricaoAba.Margin = System.Windows.Forms.Padding.Empty;
this.lblDescricaoAba.Text = "Automação, assistências e velocidades de deslocamento";
this.lblDescricaoAba.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.rootLayout.Controls.Add( // pnlConteudo
this.rightLayout, this.pnlConteudo.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border;
1, this.pnlConteudo.CornerRadius = 9;
0); this.pnlConteudo.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlConteudo.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.Surface;
this.pnlConteudo.Margin = new System.Windows.Forms.Padding(0, 0, 0, 3);
this.pnlConteudo.Padding = new System.Windows.Forms.Padding(6);
this.rootLayout.Dock = // footerPanel
System.Windows.Forms.DockStyle.Fill; this.footerPanel.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border;
this.footerPanel.Controls.Add(this.footerLayout);
this.footerPanel.CornerRadius = 9;
this.footerPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.footerPanel.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.Surface;
this.footerPanel.Margin = System.Windows.Forms.Padding.Empty;
this.footerPanel.Padding = new System.Windows.Forms.Padding(8, 6, 8, 6);
this.rootLayout.Margin = // footerLayout
new System.Windows.Forms.Padding(0); this.footerLayout.BackColor = System.Drawing.Color.Transparent;
this.footerLayout.ColumnCount = 5;
this.rootLayout.Padding = this.footerLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 55F));
new System.Windows.Forms.Padding(0); this.footerLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 128F));
this.footerLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
// left this.footerLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 135F));
this.leftLayout.BackColor = this.footerLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 145F));
System.Drawing.Color.Transparent; this.footerLayout.Controls.Add(this.lblModoOperacao, 0, 0);
this.footerLayout.Controls.Add(this.cmbModoOperacao, 1, 0);
this.leftLayout.ColumnCount = 1; this.footerLayout.Controls.Add(this.posProcessamentoLayout, 2, 0);
this.footerLayout.Controls.Add(this.btnRedefinir, 3, 0);
this.leftLayout.ColumnStyles.Add( this.footerLayout.Controls.Add(this.btnSalvar, 4, 0);
new System.Windows.Forms.ColumnStyle(
System.Windows.Forms.SizeType.Percent,
100F));
this.leftLayout.Controls.Add(
this.pnlGeral,
0,
0);
this.leftLayout.Controls.Add(
this.pnlMovimento,
0,
1);
this.leftLayout.Controls.Add(
this.pnlDirecional,
0,
2);
this.leftLayout.Controls.Add(
this.pnlAtuador,
0,
3);
this.leftLayout.Controls.Add(
this.pnlMpc,
0,
4);
this.leftLayout.Dock =
System.Windows.Forms.DockStyle.Fill;
this.leftLayout.Margin =
new System.Windows.Forms.Padding(
0,
0,
3,
0);
this.leftLayout.RowCount = 5;
this.leftLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 14F));
this.leftLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.leftLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 22F));
this.leftLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 27F));
this.leftLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 12F));
ConfigurePanel(this.pnlGeral, this.geralLayout);
ConfigurePanel(this.pnlMovimento, this.movimentoLayout);
ConfigurePanel(this.pnlDirecional, this.direcionalLayout);
ConfigurePanel(this.pnlAtuador, this.atuadorLayout);
ConfigurePanel(this.pnlMpc, this.mpcLayout);
// geral
this.geralLayout.ColumnCount = 4;
this.geralLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 23F));
this.geralLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 19F));
this.geralLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 19F));
this.geralLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 39F));
this.geralLayout.Controls.Add(this.lblGeralTitulo, 0, 0);
this.geralLayout.Controls.Add(this.lblModoOperacao, 0, 1);
this.geralLayout.Controls.Add(this.btnModoManual, 1, 1);
this.geralLayout.Controls.Add(this.btnModoMapaGps, 2, 1);
this.geralLayout.Controls.Add(this.toggleRegistrarDados, 3, 1);
this.geralLayout.SetColumnSpan(this.lblGeralTitulo, 4);
this.geralLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.geralLayout.RowCount = 2;
this.geralLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.geralLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
SetupTitle(this.lblGeralTitulo, "1 GERAL DA OPERAÇÃO");
this.lblModoOperacao.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblModoOperacao.Text = "Modo de operação";
this.lblModoOperacao.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
this.lblModoOperacao.Font = new System.Drawing.Font("Segoe UI", 7F);
this.lblModoOperacao.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
SetupChoiceButton(this.btnModoManual, "Manual");
SetupChoiceButton(this.btnModoMapaGps, "MapaGPS");
this.toggleRegistrarDados.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleRegistrarDados.Titulo = "Registrar dados para pós-processamento";
// movimento
this.movimentoLayout.ColumnCount = 2;
this.movimentoLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 58F));
this.movimentoLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 42F));
this.movimentoLayout.Controls.Add(this.lblMovimentoTitulo, 0, 0);
this.movimentoLayout.Controls.Add(this.movTogglesLayout, 0, 1);
this.movimentoLayout.Controls.Add(this.movValuesLayout, 1, 1);
this.movimentoLayout.SetColumnSpan(this.lblMovimentoTitulo, 2);
this.movimentoLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.movimentoLayout.RowCount = 2;
this.movimentoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.movimentoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
SetupTitle(this.lblMovimentoTitulo, "2 MOVIMENTO");
this.movTogglesLayout.ColumnCount = 2;
this.movTogglesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.movTogglesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.movTogglesLayout.Controls.Add(this.toggleMovAutomatico, 0, 0);
this.movTogglesLayout.Controls.Add(this.toggleMovImu, 1, 0);
this.movTogglesLayout.Controls.Add(this.toggleMovSonar, 0, 1);
this.movTogglesLayout.Controls.Add(this.toggleParadaInclinacao, 1, 1);
this.movTogglesLayout.Controls.Add(this.toggleParadaObstaculo, 0, 2);
this.movTogglesLayout.Controls.Add(this.toggleFrenagemParar, 1, 2);
this.movTogglesLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.movTogglesLayout.RowCount = 3;
this.movTogglesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.movTogglesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.movTogglesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.34F));
this.toggleMovAutomatico.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleMovAutomatico.Titulo = "Movimento automático";
this.toggleMovSonar.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleMovSonar.Titulo = "Assistido por sonar";
this.toggleParadaObstaculo.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleParadaObstaculo.Titulo = "Parada por obstáculo";
this.toggleMovImu.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleMovImu.Titulo = "Assistido por IMU";
this.toggleParadaInclinacao.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleParadaInclinacao.Titulo = "Parada por inclinação";
this.toggleFrenagemParar.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleFrenagemParar.Titulo = "Frenagem ao parar";
this.movValuesLayout.ColumnCount = 1;
this.movValuesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.movValuesLayout.Controls.Add(this.paramVelSemErvas, 0, 0);
this.movValuesLayout.Controls.Add(this.paramVelComErvas, 0, 1);
this.movValuesLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.movValuesLayout.RowCount = 2;
this.movValuesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.movValuesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
SetupValueBox(this.paramVelSemErvas, "Vel. sem ervas", "%", 50, 0, 100, 0);
SetupValueBox(this.paramVelComErvas, "Vel. com ervas", "%", 35, 0, 100, 0);
// direcional
this.direcionalLayout.ColumnCount = 2;
this.direcionalLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 45F));
this.direcionalLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 55F));
this.direcionalLayout.Controls.Add(this.lblDirecionalTitulo, 0, 0);
this.direcionalLayout.Controls.Add(this.dirTogglesLayout, 0, 1);
this.direcionalLayout.Controls.Add(this.dirValuesLayout, 1, 1);
this.direcionalLayout.SetColumnSpan(this.lblDirecionalTitulo, 2);
this.direcionalLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.direcionalLayout.RowCount = 2;
this.direcionalLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.direcionalLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
SetupTitle(this.lblDirecionalTitulo, "3 DIRECIONAL");
this.dirTogglesLayout.ColumnCount = 1;
this.dirTogglesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.dirTogglesLayout.Controls.Add(this.toggleDirAutomatico, 0, 0);
this.dirTogglesLayout.Controls.Add(this.toggleDirSonar, 0, 1);
this.dirTogglesLayout.Controls.Add(this.toggleDirImu, 0, 2);
this.dirTogglesLayout.Controls.Add(this.toggleImuPrefereArco, 0, 3);
this.dirTogglesLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.dirTogglesLayout.RowCount = 4;
for (int i = 0; i < 4; i++)
this.dirTogglesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.toggleDirAutomatico.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleDirAutomatico.Titulo = "Direcional automático";
this.toggleDirSonar.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleDirSonar.Titulo = "Assistido por sonar";
this.toggleDirImu.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleDirImu.Titulo = "Assistido por IMU";
this.toggleImuPrefereArco.Dock = System.Windows.Forms.DockStyle.Fill;
this.toggleImuPrefereArco.Titulo = "IMU prefere arco";
this.toggleImuPrefereArco.Checked = false;
this.dirValuesLayout.ColumnCount = 3;
this.dirValuesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.dirValuesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33F));
this.dirValuesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.34F));
this.dirValuesLayout.Controls.Add(this.paramAnguloMaximo, 0, 0);
this.dirValuesLayout.Controls.Add(this.paramVelMovimentoDir, 1, 0);
this.dirValuesLayout.Controls.Add(this.pnlTipoControle, 2, 0);
this.dirValuesLayout.Dock = System.Windows.Forms.DockStyle.Fill;
SetupValueBox(this.paramAnguloMaximo, "Ângulo máximo", "°", 45, 0, 90, 0);
SetupValueBox(this.paramVelMovimentoDir, "Vel. movimento", "%", 60, 0, 100, 0);
this.pnlTipoControle.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border;
this.pnlTipoControle.Controls.Add(this.tipoControleLayout);
this.pnlTipoControle.CornerRadius = 7;
this.pnlTipoControle.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlTipoControle.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.SurfaceRaised;
this.pnlTipoControle.Margin = new System.Windows.Forms.Padding(2);
this.pnlTipoControle.Padding = new System.Windows.Forms.Padding(5);
this.tipoControleLayout.ColumnCount = 2;
this.tipoControleLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tipoControleLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tipoControleLayout.Controls.Add(this.lblTipoControle, 0, 0);
this.tipoControleLayout.Controls.Add(this.btnControleMpc, 0, 1);
this.tipoControleLayout.Controls.Add(this.btnControlePid, 1, 1);
this.tipoControleLayout.SetColumnSpan(this.lblTipoControle, 2);
this.tipoControleLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.tipoControleLayout.RowCount = 2;
this.tipoControleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 23F));
this.tipoControleLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.lblTipoControle.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblTipoControle.Text = "Tipo de controle";
this.lblTipoControle.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
this.lblTipoControle.Font = new System.Drawing.Font("Segoe UI", 7F);
this.lblTipoControle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
SetupChoiceButton(this.btnControleMpc, "MPC");
SetupChoiceButton(this.btnControlePid, "PID");
// atuador
this.atuadorLayout.ColumnCount = 2;
this.atuadorLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 42F));
this.atuadorLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 58F));
this.atuadorLayout.Controls.Add(this.lblAtuadorTitulo, 0, 0);
this.atuadorLayout.Controls.Add(this.togglePulverizadorAutomatico, 1, 0);
this.atuadorLayout.Controls.Add(this.cmbModoAgitador, 0, 1);
this.atuadorLayout.Controls.Add(this.atuadorValuesLayout, 0, 2);
this.atuadorLayout.SetColumnSpan(this.atuadorValuesLayout, 2);
this.atuadorLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.atuadorLayout.RowCount = 3;
this.atuadorLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F));
this.atuadorLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 34F));
this.atuadorLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
SetupTitle(this.lblAtuadorTitulo, "4 ATUADOR");
this.togglePulverizadorAutomatico.Dock = System.Windows.Forms.DockStyle.Fill;
this.togglePulverizadorAutomatico.Titulo = "Pulverizador automático";
this.cmbModoAgitador.Dock = System.Windows.Forms.DockStyle.Fill;
this.cmbModoAgitador.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbModoAgitador.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.cmbModoAgitador.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.SurfaceRaised;
this.cmbModoAgitador.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.Text;
this.cmbModoAgitador.Items.AddRange(new object[] { "Sem agitação", "Contínuo", "Intermitente" });
this.cmbModoAgitador.SelectedIndex = 1;
this.atuadorLayout.SetColumnSpan(this.cmbModoAgitador, 2);
this.atuadorValuesLayout.ColumnCount = 4;
this.atuadorValuesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.atuadorValuesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.atuadorValuesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.atuadorValuesLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.atuadorValuesLayout.Controls.Add(this.paramBicosEmUso, 0, 0);
this.atuadorValuesLayout.Controls.Add(this.paramCapacidadeReservatorio, 1, 0);
this.atuadorValuesLayout.Controls.Add(this.paramPressaoLinha, 2, 0);
this.atuadorValuesLayout.Controls.Add(this.paramTelaIniciar, 3, 0);
this.atuadorValuesLayout.Controls.Add(this.paramAlturaArea, 0, 1);
this.atuadorValuesLayout.Controls.Add(this.paramErvasOn, 1, 1);
this.atuadorValuesLayout.Controls.Add(this.paramErvasOff, 2, 1);
this.atuadorValuesLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.atuadorValuesLayout.RowCount = 2;
this.atuadorValuesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.atuadorValuesLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
SetupValueBox(this.paramBicosEmUso, "Bicos em uso", "", 6, 1, 12, 0);
SetupValueBox(this.paramCapacidadeReservatorio, "Capacidade reservatório", "L", 200, 50, 500, 0);
SetupValueBox(this.paramPressaoLinha, "Pressão da linha", "psi", 45, 0, 120, 0);
SetupValueBox(this.paramTelaIniciar, "% tela para iniciar", "%", 40, 0, 100, 0);
SetupValueBox(this.paramAlturaArea, "Altura da área", "%", 60, 0, 100, 0);
SetupValueBox(this.paramErvasOn, "% ervas ON", "%", 25, 0, 100, 0);
SetupValueBox(this.paramErvasOff, "% ervas OFF", "%", 15, 0, 100, 0);
// MPC
this.mpcLayout.ColumnCount = 3;
this.mpcLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F));
this.mpcLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));
this.mpcLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 35F));
this.mpcLayout.Controls.Add(this.lblMpcTitulo, 0, 0);
this.mpcLayout.Controls.Add(this.paramHorizonte, 1, 0);
this.mpcLayout.Controls.Add(this.paramAnteciparFim, 2, 0);
this.mpcLayout.Dock = System.Windows.Forms.DockStyle.Fill;
SetupTitle(this.lblMpcTitulo, "5 MPC E NAVEGAÇÃO");
SetupValueBox(this.paramHorizonte, "Horizonte de predição", "m", 12, 0, 30, 1);
SetupValueBox(this.paramAnteciparFim, "Antecipar fim corredor", "m", 5, 0, 15, 1);
// right
this.rightLayout.BackColor = System.Drawing.Color.Transparent;
this.rightLayout.ColumnCount = 1;
this.rightLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.rightLayout.Controls.Add(this.pnlMapa, 0, 0);
this.rightLayout.Controls.Add(this.footerLayout, 0, 1);
this.rightLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.rightLayout.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);
this.rightLayout.RowCount = 2;
this.rightLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 80F));
this.rightLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
ConfigurePanel(this.pnlMapa, this.mapLayout);
this.mapLayout.ColumnCount = 1;
this.mapLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.mapLayout.Controls.Add(this.mapHeaderLayout, 0, 0);
this.mapLayout.Controls.Add(this.pnlMapaVisual, 0, 1);
this.mapLayout.Controls.Add(this.lblMapaAjuda, 0, 2);
this.mapLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.mapLayout.RowCount = 3;
this.mapLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F));
this.mapLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.mapLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F));
this.mapHeaderLayout.ColumnCount = 3;
this.mapHeaderLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.mapHeaderLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 82F));
this.mapHeaderLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 90F));
this.mapHeaderLayout.Controls.Add(this.lblMapaTitulo, 0, 0);
this.mapHeaderLayout.Controls.Add(this.btnMapaBonito, 1, 0);
this.mapHeaderLayout.Controls.Add(this.btnMapaDinamico, 2, 0);
this.mapHeaderLayout.Dock = System.Windows.Forms.DockStyle.Fill;
SetupTitle(this.lblMapaTitulo, "6 MAPA DA OPERAÇÃO");
SetupChoiceButton(this.btnMapaBonito, "Mapa bonito");
SetupChoiceButton(this.btnMapaDinamico, "Mapa dinâmico");
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.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", 8.5F, System.Drawing.FontStyle.Bold);
this.lblMapaPlaceholder.Text =
"MAPA DA OPERAÇÃO\n\n" +
"01 02 03 04 05\n" +
"│ │ │ │ │\n" +
"│ │ │ │ │\n" +
"│ │ [ROVER] │ │\n" +
"│ │ │ │ │\n" +
"09 10 11 12\n\n" +
"8 ruas selecionadas";
this.lblMapaPlaceholder.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblMapaAjuda.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblMapaAjuda.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.SurfaceRaised;
this.lblMapaAjuda.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
this.lblMapaAjuda.Font = new System.Drawing.Font("Segoe UI", 7F, System.Drawing.FontStyle.Italic);
this.lblMapaAjuda.Text = "Toque nas ruas para selecionar ou desmarcar.";
this.lblMapaAjuda.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
// footer
this.footerLayout.ColumnCount = 2;
this.footerLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 48F));
this.footerLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 52F));
this.footerLayout.Controls.Add(this.btnAplicarAtual, 0, 0);
this.footerLayout.Controls.Add(this.btnSalvarParametros, 1, 0);
this.footerLayout.Dock = System.Windows.Forms.DockStyle.Fill; this.footerLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.footerLayout.Margin = new System.Windows.Forms.Padding(0); this.footerLayout.Margin = System.Windows.Forms.Padding.Empty;
this.footerLayout.Padding = System.Windows.Forms.Padding.Empty;
this.footerLayout.RowCount = 1;
this.footerLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
SetupAction(this.btnAplicarAtual, "APLICAR À OPERAÇÃO ATUAL", "▤", AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted); // lblModoOperacao
SetupAction(this.btnSalvarParametros, "SALVAR PARÂMETROS", "▣", AgroBase.Forms.IHM.Controls.HmiTheme.Success); SetupFooterLabel(this.lblModoOperacao, "Modo");
this.lblModoOperacao.Padding = new System.Windows.Forms.Padding(2, 0, 0, 0);
// user control // cmbModoOperacao
this.cmbModoOperacao.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.cmbModoOperacao.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.SurfaceRaised;
this.cmbModoOperacao.Dock = System.Windows.Forms.DockStyle.None;
this.cmbModoOperacao.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbModoOperacao.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.cmbModoOperacao.Font = new System.Drawing.Font("Segoe UI", 8F, System.Drawing.FontStyle.Bold);
this.cmbModoOperacao.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.Text;
this.cmbModoOperacao.Margin = System.Windows.Forms.Padding.Empty;
this.cmbModoOperacao.Size = new System.Drawing.Size(120, 25);
// posProcessamentoLayout
this.posProcessamentoLayout.BackColor = System.Drawing.Color.Transparent;
this.posProcessamentoLayout.ColumnCount = 2;
this.posProcessamentoLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.posProcessamentoLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.posProcessamentoLayout.Controls.Add(this.lblPosProcessamento, 0, 0);
this.posProcessamentoLayout.Controls.Add(this.checkPosProcessamento, 1, 0);
this.posProcessamentoLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.posProcessamentoLayout.Margin = new System.Windows.Forms.Padding(6, 0, 8, 0);
this.posProcessamentoLayout.Padding = System.Windows.Forms.Padding.Empty;
this.posProcessamentoLayout.RowCount = 1;
this.posProcessamentoLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
// lblPosProcessamento
this.lblPosProcessamento.AutoEllipsis = true;
this.lblPosProcessamento.BackColor = System.Drawing.Color.Transparent;
this.lblPosProcessamento.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblPosProcessamento.Font = new System.Drawing.Font("Segoe UI", 7F, System.Drawing.FontStyle.Bold);
this.lblPosProcessamento.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
this.lblPosProcessamento.Margin = new System.Windows.Forms.Padding(0, 0, 5, 0);
this.lblPosProcessamento.Text = "Registrar pós-processamento";
this.lblPosProcessamento.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
// checkPosProcessamento
this.checkPosProcessamento.Anchor = System.Windows.Forms.AnchorStyles.None;
this.checkPosProcessamento.Appearance = System.Windows.Forms.Appearance.Button;
this.checkPosProcessamento.AutoSize = false;
this.checkPosProcessamento.BackColor = System.Drawing.Color.FromArgb(30, 90, 46);
this.checkPosProcessamento.Checked = true;
this.checkPosProcessamento.CheckState = System.Windows.Forms.CheckState.Checked;
this.checkPosProcessamento.Cursor = System.Windows.Forms.Cursors.Hand;
this.checkPosProcessamento.Dock = System.Windows.Forms.DockStyle.None;
this.checkPosProcessamento.FlatAppearance.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Success;
this.checkPosProcessamento.FlatAppearance.BorderSize = 1;
this.checkPosProcessamento.FlatAppearance.CheckedBackColor = System.Drawing.Color.FromArgb(30, 90, 46);
this.checkPosProcessamento.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.checkPosProcessamento.Font = new System.Drawing.Font("Segoe UI Symbol", 8F, System.Drawing.FontStyle.Bold);
this.checkPosProcessamento.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.Success;
this.checkPosProcessamento.Margin = System.Windows.Forms.Padding.Empty;
this.checkPosProcessamento.Padding = System.Windows.Forms.Padding.Empty;
this.checkPosProcessamento.Size = new System.Drawing.Size(22, 22);
this.checkPosProcessamento.Text = "✓";
this.checkPosProcessamento.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.checkPosProcessamento.UseVisualStyleBackColor = false;
// btnRedefinir
SetupFooterAction(this.btnRedefinir, "REDEFINIR", "↻", AgroBase.Forms.IHM.Controls.HmiTheme.Warning);
// btnSalvar
SetupFooterAction(this.btnSalvar, "SALVAR", "▣", AgroBase.Forms.IHM.Controls.HmiTheme.Success);
// ucOperacaoParametros
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Background; this.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Background;
this.Controls.Add(this.rootLayout); this.Controls.Add(this.rootLayout);
@ -536,183 +218,81 @@
this.Size = new System.Drawing.Size(784, 435); this.Size = new System.Drawing.Size(784, 435);
this.rootLayout.ResumeLayout(false); this.rootLayout.ResumeLayout(false);
this.leftLayout.ResumeLayout(false); this.tabsLayout.ResumeLayout(false);
this.pnlGeral.ResumeLayout(false); this.pnlDescricaoAba.ResumeLayout(false);
this.geralLayout.ResumeLayout(false); this.footerPanel.ResumeLayout(false);
this.pnlMovimento.ResumeLayout(false);
this.movimentoLayout.ResumeLayout(false);
this.movTogglesLayout.ResumeLayout(false);
this.movValuesLayout.ResumeLayout(false);
this.pnlDirecional.ResumeLayout(false);
this.direcionalLayout.ResumeLayout(false);
this.dirTogglesLayout.ResumeLayout(false);
this.dirValuesLayout.ResumeLayout(false);
this.pnlTipoControle.ResumeLayout(false);
this.tipoControleLayout.ResumeLayout(false);
this.pnlAtuador.ResumeLayout(false);
this.atuadorLayout.ResumeLayout(false);
this.atuadorValuesLayout.ResumeLayout(false);
this.pnlMpc.ResumeLayout(false);
this.mpcLayout.ResumeLayout(false);
this.rightLayout.ResumeLayout(false);
this.pnlMapa.ResumeLayout(false);
this.mapLayout.ResumeLayout(false);
this.mapHeaderLayout.ResumeLayout(false);
this.pnlMapaVisual.ResumeLayout(false);
this.footerLayout.ResumeLayout(false); this.footerLayout.ResumeLayout(false);
this.posProcessamentoLayout.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
} }
private static void ConfigurePanel( private static void SetupTabButton(System.Windows.Forms.Button button, string text)
AgroBase.Forms.IHM.Controls.HmiRoundedPanel panel,
System.Windows.Forms.Control child)
{ {
panel.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border; button.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.Surface;
panel.Controls.Add(child); button.Cursor = System.Windows.Forms.Cursors.Hand;
panel.CornerRadius = 9; button.Dock = System.Windows.Forms.DockStyle.Fill;
panel.Dock = System.Windows.Forms.DockStyle.Fill; button.FlatAppearance.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border;
panel.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.Surface; button.FlatAppearance.BorderSize = 1;
panel.Margin = new System.Windows.Forms.Padding(0, 0, 0, 3); button.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
panel.Padding = new System.Windows.Forms.Padding(7); button.Font = new System.Drawing.Font("Segoe UI", 8.5F, System.Drawing.FontStyle.Bold);
button.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
button.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
button.Text = text;
button.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
button.UseVisualStyleBackColor = false;
} }
private static void SetupTitle( private static void SetupFooterLabel(System.Windows.Forms.Label label, string text)
System.Windows.Forms.Label label,
string text)
{ {
label.Dock = System.Windows.Forms.DockStyle.Fill; label.AutoEllipsis = true;
label.BackColor = System.Drawing.Color.Transparent; label.BackColor = System.Drawing.Color.Transparent;
label.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.Text; label.Dock = System.Windows.Forms.DockStyle.Fill;
label.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); label.Font = new System.Drawing.Font("Segoe UI", 7.2F, System.Drawing.FontStyle.Bold);
label.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
label.Margin = System.Windows.Forms.Padding.Empty;
label.Text = text; label.Text = text;
label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
label.AutoEllipsis = true;
} }
private static void SetupChoiceButton( private static void SetupFooterAction(AgroBase.Forms.IHM.Controls.HmiSidebarButton button, string text, string icon, System.Drawing.Color accent)
System.Windows.Forms.Button button,
string text)
{ {
button.Dock = System.Windows.Forms.DockStyle.Fill;
button.Text = text;
button.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
button.FlatAppearance.BorderColor = AgroBase.Forms.IHM.Controls.HmiTheme.Border;
button.BackColor = AgroBase.Forms.IHM.Controls.HmiTheme.SurfaceRaised;
button.ForeColor = AgroBase.Forms.IHM.Controls.HmiTheme.TextMuted;
button.Font = new System.Drawing.Font("Segoe UI", 7F, System.Drawing.FontStyle.Bold);
button.Margin = new System.Windows.Forms.Padding(2);
}
private static void SetupValueBox(
AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox control,
string title,
string unit,
decimal value,
decimal min,
decimal max,
int decimals)
{
control.Dock = System.Windows.Forms.DockStyle.Fill;
control.Titulo = title;
control.Unidade = unit;
control.Minimo = min;
control.Maximo = max;
control.CasasDecimais = decimals;
control.Valor = value;
}
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;
button.IconText = icon;
button.AccentColor = accent; button.AccentColor = accent;
button.BorderColor = accent; button.BorderColor = accent;
button.Cursor = System.Windows.Forms.Cursors.Hand;
button.Dock = System.Windows.Forms.DockStyle.Fill;
button.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.SurfaceRaised; button.FillColor = AgroBase.Forms.IHM.Controls.HmiTheme.SurfaceRaised;
button.Margin = new System.Windows.Forms.Padding(3); button.IconText = icon;
button.Margin = new System.Windows.Forms.Padding(3, 0, 0, 0);
button.MaximumSize = System.Drawing.Size.Empty;
button.MinimumSize = System.Drawing.Size.Empty;
button.Text = text;
} }
#endregion #endregion
private System.Windows.Forms.TableLayoutPanel rootLayout; private System.Windows.Forms.TableLayoutPanel rootLayout;
private System.Windows.Forms.TableLayoutPanel leftLayout; private System.Windows.Forms.TableLayoutPanel tabsLayout;
private System.Windows.Forms.Button btnAbaMovimento;
private System.Windows.Forms.Button btnAbaDirecional;
private System.Windows.Forms.Button btnAbaAtuador;
private System.Windows.Forms.Button btnAbaMapa;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlGeral; private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlDescricaoAba;
private System.Windows.Forms.TableLayoutPanel geralLayout; private System.Windows.Forms.Label lblDescricaoAba;
private System.Windows.Forms.Label lblGeralTitulo;
private System.Windows.Forms.Label lblModoOperacao;
private System.Windows.Forms.Button btnModoManual;
private System.Windows.Forms.Button btnModoMapaGps;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleRegistrarDados;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlMovimento; private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlConteudo;
private System.Windows.Forms.TableLayoutPanel movimentoLayout;
private System.Windows.Forms.Label lblMovimentoTitulo;
private System.Windows.Forms.TableLayoutPanel movTogglesLayout;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleMovAutomatico;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleMovSonar;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleParadaObstaculo;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleMovImu;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleParadaInclinacao;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleFrenagemParar;
private System.Windows.Forms.TableLayoutPanel movValuesLayout;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramVelSemErvas;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramVelComErvas;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlDirecional;
private System.Windows.Forms.TableLayoutPanel direcionalLayout;
private System.Windows.Forms.Label lblDirecionalTitulo;
private System.Windows.Forms.TableLayoutPanel dirTogglesLayout;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleDirAutomatico;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleDirSonar;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleDirImu;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow toggleImuPrefereArco;
private System.Windows.Forms.TableLayoutPanel dirValuesLayout;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramAnguloMaximo;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramVelMovimentoDir;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlTipoControle;
private System.Windows.Forms.TableLayoutPanel tipoControleLayout;
private System.Windows.Forms.Label lblTipoControle;
private System.Windows.Forms.Button btnControleMpc;
private System.Windows.Forms.Button btnControlePid;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlAtuador;
private System.Windows.Forms.TableLayoutPanel atuadorLayout;
private System.Windows.Forms.Label lblAtuadorTitulo;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterToggleRow togglePulverizadorAutomatico;
private System.Windows.Forms.ComboBox cmbModoAgitador;
private System.Windows.Forms.TableLayoutPanel atuadorValuesLayout;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramBicosEmUso;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramCapacidadeReservatorio;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramPressaoLinha;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramTelaIniciar;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramAlturaArea;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramErvasOn;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramErvasOff;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlMpc;
private System.Windows.Forms.TableLayoutPanel mpcLayout;
private System.Windows.Forms.Label lblMpcTitulo;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramHorizonte;
private AgroBase.Forms.IHM.Controls.Operacao.HmiParameterValueBox paramAnteciparFim;
private System.Windows.Forms.TableLayoutPanel rightLayout;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlMapa;
private System.Windows.Forms.TableLayoutPanel mapLayout;
private System.Windows.Forms.TableLayoutPanel mapHeaderLayout;
private System.Windows.Forms.Label lblMapaTitulo;
private System.Windows.Forms.Button btnMapaBonito;
private System.Windows.Forms.Button btnMapaDinamico;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel pnlMapaVisual;
private System.Windows.Forms.Label lblMapaPlaceholder;
private System.Windows.Forms.Label lblMapaAjuda;
private AgroBase.Forms.IHM.Controls.HmiRoundedPanel footerPanel;
private System.Windows.Forms.TableLayoutPanel footerLayout; private System.Windows.Forms.TableLayoutPanel footerLayout;
private AgroBase.Forms.IHM.Controls.HmiSidebarButton btnAplicarAtual;
private AgroBase.Forms.IHM.Controls.HmiSidebarButton btnSalvarParametros; private System.Windows.Forms.Label lblModoOperacao;
private System.Windows.Forms.ComboBox cmbModoOperacao;
private System.Windows.Forms.TableLayoutPanel posProcessamentoLayout;
private System.Windows.Forms.Label lblPosProcessamento;
private System.Windows.Forms.CheckBox checkPosProcessamento;
private AgroBase.Forms.IHM.Controls.HmiSidebarButton btnRedefinir;
private AgroBase.Forms.IHM.Controls.HmiSidebarButton btnSalvar;
} }
} }

View File

@ -1,133 +1,236 @@
using AgroBase.Forms.IHM.Controls; using AgroBase.Forms.IHM.Controls;
using AgroBase.Forms.IHM.Operacao.Parametros;
using System; using System;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Forms.IHM.Operacao namespace AgroBase.Forms.IHM.Operacao
{ {
public partial class ucOperacaoParametros : UserControl public partial class ucOperacaoParametros : UserControl
{ {
private readonly Dictionary<TipoAbaParametros, UserControl> _abas;
private TipoAbaParametros _abaAtual;
private readonly ucParametrosMovimento _ucMovimento;
private readonly ucParametrosDirecional _ucDirecional;
private readonly ucParametrosAtuador _ucAtuador;
private readonly ucParametrosMapa _ucMapa;
public event EventHandler RedefinirSolicitado;
public event EventHandler SalvarSolicitado;
public event EventHandler ModoOperacaoAlterado;
public event EventHandler RegistrarPosProcessamentoAlterado;
public ucOperacaoParametros() public ucOperacaoParametros()
{ {
InitializeComponent(); InitializeComponent();
_ucMovimento = new ucParametrosMovimento();
_ucDirecional = new ucParametrosDirecional();
_ucAtuador = new ucParametrosAtuador();
_ucMapa = new ucParametrosMapa();
_abas = new Dictionary<TipoAbaParametros, UserControl>();
_abas.Add(TipoAbaParametros.Movimento, _ucMovimento);
_abas.Add(TipoAbaParametros.Direcional, _ucDirecional);
_abas.Add(TipoAbaParametros.Atuador, _ucAtuador);
_abas.Add(TipoAbaParametros.Mapa, _ucMapa);
ConfigurarSubControles();
ConfigurarEstadoInicial(); ConfigurarEstadoInicial();
VincularEventos(); VincularEventos();
} }
private void ConfigurarSubControles()
{
foreach (KeyValuePair<TipoAbaParametros, UserControl> item in _abas)
{
item.Value.Dock = DockStyle.Fill;
item.Value.Margin = Padding.Empty;
item.Value.Visible = false;
pnlConteudo.Controls.Add(item.Value);
}
}
private void ConfigurarEstadoInicial() private void ConfigurarEstadoInicial()
{ {
btnMapaBonito.BackColor = cmbModoOperacao.Items.Clear();
Color.FromArgb(31, 91, 43); cmbModoOperacao.Items.AddRange(Enum.GetNames(typeof(ModoOperacao)));
btnMapaBonito.ForeColor = if (cmbModoOperacao.Items.Count > 1)
HmiTheme.Text; cmbModoOperacao.SelectedIndex = 1;
btnMapaBonito.FlatAppearance.BorderColor = checkPosProcessamento.Checked = true;
HmiTheme.Success; AtualizarAparenciaCheck(checkPosProcessamento);
btnModoMapaGps.BackColor = AbrirAba(TipoAbaParametros.Movimento);
Color.FromArgb(31, 91, 43);
btnModoMapaGps.ForeColor =
HmiTheme.Text;
btnModoMapaGps.FlatAppearance.BorderColor =
HmiTheme.Success;
btnControleMpc.BackColor =
Color.FromArgb(31, 91, 43);
btnControleMpc.ForeColor =
HmiTheme.Text;
btnControleMpc.FlatAppearance.BorderColor =
HmiTheme.Success;
} }
private void VincularEventos() private void VincularEventos()
{ {
btnModoManual.Click += delegate btnAbaMovimento.Click += delegate { AbrirAba(TipoAbaParametros.Movimento); };
btnAbaDirecional.Click += delegate { AbrirAba(TipoAbaParametros.Direcional); };
btnAbaAtuador.Click += delegate { AbrirAba(TipoAbaParametros.Atuador); };
btnAbaMapa.Click += delegate { AbrirAba(TipoAbaParametros.Mapa); };
btnRedefinir.Click += delegate
{ {
SelecionarBotaoDuplo( if (RedefinirSolicitado != null)
btnModoManual, RedefinirSolicitado(this, EventArgs.Empty);
btnModoMapaGps);
}; };
btnModoMapaGps.Click += delegate btnSalvar.Click += delegate
{ {
SelecionarBotaoDuplo( if (SalvarSolicitado != null)
btnModoMapaGps, SalvarSolicitado(this, EventArgs.Empty);
btnModoManual);
}; };
btnControleMpc.Click += delegate cmbModoOperacao.SelectedIndexChanged += delegate
{ {
SelecionarBotaoDuplo( if (ModoOperacaoAlterado != null)
btnControleMpc, ModoOperacaoAlterado(this, EventArgs.Empty);
btnControlePid);
}; };
btnControlePid.Click += delegate checkPosProcessamento.CheckedChanged += delegate
{ {
SelecionarBotaoDuplo( AtualizarAparenciaCheck(checkPosProcessamento);
btnControlePid,
btnControleMpc);
};
btnMapaBonito.Click += delegate if (RegistrarPosProcessamentoAlterado != null)
{ RegistrarPosProcessamentoAlterado(this, EventArgs.Empty);
SelecionarBotaoDuplo(
btnMapaBonito,
btnMapaDinamico);
};
btnMapaDinamico.Click += delegate
{
SelecionarBotaoDuplo(
btnMapaDinamico,
btnMapaBonito);
}; };
} }
private static void SelecionarBotaoDuplo( private void AbrirAba(TipoAbaParametros aba)
Button selecionado,
Button outro)
{ {
AplicarEstadoBotao( _abaAtual = aba;
selecionado,
true);
AplicarEstadoBotao( foreach (KeyValuePair<TipoAbaParametros, UserControl> item in _abas)
outro, item.Value.Visible = item.Key == aba;
false);
UserControl controleAtual;
if (_abas.TryGetValue(aba, out controleAtual))
{
controleAtual.BringToFront();
controleAtual.Visible = true;
} }
private static void AplicarEstadoBotao( AplicarEstadoBotaoAba(btnAbaMovimento, aba == TipoAbaParametros.Movimento);
Button button, AplicarEstadoBotaoAba(btnAbaDirecional, aba == TipoAbaParametros.Direcional);
bool selecionado) AplicarEstadoBotaoAba(btnAbaAtuador, aba == TipoAbaParametros.Atuador);
AplicarEstadoBotaoAba(btnAbaMapa, aba == TipoAbaParametros.Mapa);
AtualizarDescricaoAba(aba);
}
private void AtualizarDescricaoAba(TipoAbaParametros aba)
{
switch (aba)
{
case TipoAbaParametros.Movimento:
lblDescricaoAba.Text = "Automação, assistências e velocidades de deslocamento";
break;
case TipoAbaParametros.Direcional:
lblDescricaoAba.Text = "Controle direcional, assistências, ângulo e velocidade";
break;
case TipoAbaParametros.Atuador:
lblDescricaoAba.Text = "Pulverizador, agitador, reservatório e critérios de atuação";
break;
case TipoAbaParametros.Mapa:
lblDescricaoAba.Text = "Mapa da operação, seleção de ruas e parâmetros de navegação";
break;
default:
lblDescricaoAba.Text = string.Empty;
break;
}
}
private static void AplicarEstadoBotaoAba(Button button, bool selecionado)
{ {
if (selecionado) if (selecionado)
{ {
button.BackColor = button.BackColor = Color.FromArgb(46, 31, 63);
Color.FromArgb(31, 91, 43); button.ForeColor = Color.FromArgb(190, 121, 255);
button.FlatAppearance.BorderColor = Color.FromArgb(170, 90, 240);
button.ForeColor =
HmiTheme.Text;
button.FlatAppearance.BorderColor =
HmiTheme.Success;
} }
else else
{ {
button.BackColor = button.BackColor = HmiTheme.Surface;
HmiTheme.SurfaceRaised; button.ForeColor = HmiTheme.TextMuted;
button.FlatAppearance.BorderColor = HmiTheme.Border;
}
}
button.ForeColor = private static void AtualizarAparenciaCheck(CheckBox check)
HmiTheme.TextMuted; {
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;
}
}
button.FlatAppearance.BorderColor = public string ModoOperacaoSelecionado
HmiTheme.Border; {
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
{
Movimento = 0,
Direcional = 1,
Atuador = 2,
Mapa = 3
} }
} }

View File

@ -402,13 +402,7 @@
button.MaximumSize = System.Drawing.Size.Empty; button.MaximumSize = System.Drawing.Size.Empty;
} }
private static void SetupHealth( private static void SetupHealth(AgroBase.Forms.IHM.Controls.Operacao.HmiSprayerModuleHealthRow row, string icon, string title, string health, string status, System.Drawing.Color color)
AgroBase.Forms.IHM.Controls.Operacao.HmiSprayerModuleHealthRow row,
string icon,
string title,
string health,
string status,
System.Drawing.Color color)
{ {
row.Dock = System.Windows.Forms.DockStyle.Fill; row.Dock = System.Windows.Forms.DockStyle.Fill;
row.IconText = icon; row.IconText = icon;
@ -430,9 +424,7 @@
combo.Margin = new System.Windows.Forms.Padding(0, 1, 0, 1); combo.Margin = new System.Windows.Forms.Padding(0, 1, 0, 1);
} }
private static void SetupNozzle( private static void SetupNozzle(AgroBase.Forms.IHM.Controls.Operacao.HmiNozzleCard card, string code)
AgroBase.Forms.IHM.Controls.Operacao.HmiNozzleCard card,
string code)
{ {
card.Dock = System.Windows.Forms.DockStyle.Fill; card.Dock = System.Windows.Forms.DockStyle.Fill;
card.Codigo = code; card.Codigo = code;

View File

@ -1,16 +1,27 @@
using AgroBase.Forms.IHM.Controls; using AgroBase.Forms.IHM.Controls;
using AgroBase.Forms.IHM.Controls.Operacao; using AgroBase.Forms.IHM.Controls.Operacao;
using AgroBase.Models;
using AgroBase.Models.Operadores;
using AgroBase.Services.Operadores;
using Assimp.Unmanaged;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Forms.IHM.Operacao namespace AgroBase.Forms.IHM.Operacao
{ {
public partial class ucOperacaoPulverizador : UserControl public partial class ucOperacaoPulverizador : UserControl
{ {
private readonly List<HmiNozzleCard> _bicos = private bool _requisitandoCameraFrame;
new List<HmiNozzleCard>(); private bool _controleDescartado;
OperacaoModel op => Variaveis.OperacaoEmAndamento;
private readonly List<HmiNozzleCard> _bicos = new List<HmiNozzleCard>();
public ucOperacaoPulverizador() public ucOperacaoPulverizador()
{ {
@ -20,6 +31,205 @@ namespace AgroBase.Forms.IHM.Operacao
VincularEventos(); VincularEventos();
} }
public void AtualizarDadosTela()
{
var dados = op?.Sensoriamento;
AtualizarDadosBomba();
AtualizarDadosAgitador();
AtualizarSaudeModulos();
AtualizarDadosCamera(dados?.Cameras?.FirstOrDefault(x => x.dispositivo == Enums.T_Code.Cam), dados?.OperadorSaude?.ModulosSaude?.FirstOrDefault(x => x.modulo == T_Code.Cam)?.saude ?? 0);
AtualizarDadosBicos(dados?.Atuador?.Bicos, dados?.OperadorSaude?.ModulosSaude?.FirstOrDefault(x => x.modulo == T_Code.Atu));
AtualizarDadosTelemetria(dados?.Atuador);
}
private void AtualizarDadosBomba()
{
double pressaoSP = op?.Parametros?.Controle?.AtuPressaoLinha ?? 0;
bool bombaLigada = op?.Sensoriamento?.Atuador?.BombaLigada ?? false;
cardPressaoSp.Valor = pressaoSP.ToString("F1");
cardStatusBomba.Valor = bombaLigada ? "Ligada" : "Desligada";
cardStatusBomba.CorValor = bombaLigada ? HmiTheme.Success : HmiTheme.Danger;
}
private void AtualizarDadosAgitador()
{
Enums.ModoAgitadorCalda modo = op?.Parametros?.Controle?.AtuAgitadorModo ?? Enums.ModoAgitadorCalda.SemAgitacao;
bool agitadorLigado = (op?.Sensoriamento?.Atuador?.PotenciaAgitador ?? 0) > 0;
cardModoAgitador.Valor = modo.ToString();
cardStatusAgitador.Valor = agitadorLigado ? "Ligado" : "Desligado";
cardStatusAgitador.CorValor = agitadorLigado ? HmiTheme.Success : HmiTheme.Danger;
}
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 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 saudeSensoresMedia = saudeSensores?.Average(x => x.saude) ?? 0;
Enums.StatusModulo saudeSensoresStatus =
saudeSensoresMedia >= 80 ? Enums.StatusModulo.Operante :
saudeSensoresMedia <= 0 ? Enums.StatusModulo.Falha :
Enums.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;
void DefinirSaudeModulo(HmiSprayerModuleHealthRow card, double saude, Enums.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;
}
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);
}
public async void AtualizarDadosCamera(CameraWorkerItemModel dados, double saude)
{
lblVideoStatus.Text = $"FPS {dados?.fps ?? 0:F0} · {dados?.stream_kbps ?? 0:F1} MB/s · Saúde {saude:F0}%";
if (!_requisitandoCameraFrame)
_ = RequisitarCameraFrameAsync();
}
private async Task RequisitarCameraFrameAsync()
{
if (_requisitandoCameraFrame || _controleDescartado)
return;
_requisitandoCameraFrame = true;
try
{
TipoFrameCamera tipoFrame = (TipoFrameCamera)cmbTipoFrame.SelectedIndex;
var frame = await WeedWorkerService.GetCameraFrame(tipoFrame);
if (_controleDescartado || frame == null)
return;
Image imagemRecebida = frame.image();
if (imagemRecebida == null)
return;
// Garante que o PictureBox receba uma imagem independente
// de streams ou buffers internos do frame.
Image imagemSegura;
using (imagemRecebida)
{
imagemSegura = new Bitmap(imagemRecebida);
}
AtualizarImagemPainel(picVideo, imagemSegura);
}
catch (OutOfMemoryException ex)
{
// Em System.Drawing isso também pode significar
// imagem ou stream inválido, não só falta real de RAM.
Variaveis.MostrarLog("[IHM][Câmera] Frame inválido ou erro de memória: " + ex.Message);
}
catch (Exception ex)
{
Variaveis.MostrarLog("[IHM][Câmera] Erro ao obter frame: " + ex.Message);
}
finally
{
_requisitandoCameraFrame = false;
}
}
private void AtualizarImagemPainel(PictureBox pictureBox, Image novaImagem)
{
if (pictureBox == null)
{
novaImagem?.Dispose();
return;
}
if (pictureBox.IsDisposed || pictureBox.Disposing || _controleDescartado)
{
novaImagem?.Dispose();
return;
}
if (pictureBox.InvokeRequired)
{
try
{
pictureBox.BeginInvoke(new Action<PictureBox, Image>(AtualizarImagemPainel), pictureBox, novaImagem);
}
catch
{
novaImagem?.Dispose();
}
return;
}
Image imagemAnterior = pictureBox.Image;
pictureBox.Image = novaImagem;
imagemAnterior?.Dispose();
}
private void AtualizarDadosBicos(List<AtuadorBicoLogModel> dados, ManagerWorkerMessageResponseModulosPendentesModel saude)
{
foreach (var bico in dados)
{
var card = Bicos.FirstOrDefault(x => x.Codigo == bico.ID);
card.Atuacoes = bico.Atuacoes;
card.VazaoInstantanea = 0;
card.VazaoMedia = bico.MediaNivelFluxo;
card.TempoLigado = bico.TempoAtuado.ToString();
card.CommandOn = bico.Atuado;
card.ReadOn = bico.StatusBico;
card.State = saude?.saude_individual?.FirstOrDefault(x => x.label == bico.ID)?.status ?? StatusModulo.Desconectado;
}
}
private void AtualizarDadosTelemetria(AtuadorLogModel dados)
{
TimeSpan tempoAutonomia = TimeSpan.FromMinutes(Math.Max(0, dados?.TempoEstimadoRestanteMinutos ?? 0));
TimeSpan tempoPulverizador = TimeSpan.FromSeconds(Math.Max(0, dados?.TempoPulverizadorAtuado ?? 0));
telemetryReservatorio.Valor = (dados?.VolumeReservatorio ?? 0).ToString("F1") + " L";
telemetryVazaoInstantanea.Valor = (dados?.VazaoFluxoMLpSInstantaneaCorrigida ?? 0).ToString("F0") + " mL/s";
telemetryVazaoMedia.Valor = (dados?.VazaoFluxoMLpSMedia ?? 0).ToString("F0") + " mL/s";
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);
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);
}
private void RegistrarBicos() private void RegistrarBicos()
{ {
_bicos.Add(nozzleB01); _bicos.Add(nozzleB01);
@ -35,61 +245,6 @@ namespace AgroBase.Forms.IHM.Operacao
{ {
cmbTipoFrame.SelectedIndex = 0; cmbTipoFrame.SelectedIndex = 0;
nozzleB01.State = HmiNozzleState.Operante;
nozzleB02.State = HmiNozzleState.Conectado;
nozzleB03.State = HmiNozzleState.Falha;
nozzleB04.State = HmiNozzleState.Alerta;
nozzleB05.State = HmiNozzleState.Operante;
nozzleB06.State = HmiNozzleState.Desconectado;
nozzleB07.State = HmiNozzleState.Operante;
nozzleB01.CommandOn = true;
nozzleB01.ReadOn = true;
nozzleB02.CommandOn = true;
nozzleB02.ReadOn = true;
nozzleB03.CommandOn = true;
nozzleB03.ReadOn = false;
nozzleB04.CommandOn = true;
nozzleB04.ReadOn = true;
nozzleB05.CommandOn = true;
nozzleB05.ReadOn = true;
nozzleB06.CommandOn = false;
nozzleB06.ReadOn = false;
nozzleB07.CommandOn = true;
nozzleB07.ReadOn = true;
nozzleB01.Atuacoes = 1258;
nozzleB02.Atuacoes = 1187;
nozzleB03.Atuacoes = 892;
nozzleB04.Atuacoes = 1023;
nozzleB05.Atuacoes = 1290;
nozzleB06.Atuacoes = 0;
nozzleB07.Atuacoes = 1211;
nozzleB01.VazaoInstantanea = 980;
nozzleB02.VazaoInstantanea = 1011;
nozzleB03.VazaoInstantanea = 421;
nozzleB04.VazaoInstantanea = 727;
nozzleB05.VazaoInstantanea = 951;
nozzleB06.VazaoInstantanea = 0;
nozzleB07.VazaoInstantanea = 972;
nozzleB01.VazaoMedia = 960;
nozzleB02.VazaoMedia = 990;
nozzleB03.VazaoMedia = 631;
nozzleB04.VazaoMedia = 701;
nozzleB05.VazaoMedia = 940;
nozzleB06.VazaoMedia = 0;
nozzleB07.VazaoMedia = 959;
nozzleB01.TempoLigado = "12:34";
nozzleB02.TempoLigado = "12:31";
nozzleB03.TempoLigado = "08:47";
nozzleB04.TempoLigado = "10:55";
nozzleB05.TempoLigado = "12:39";
nozzleB06.TempoLigado = "00:00";
nozzleB07.TempoLigado = "12:17";
telemetryReservatorio.CorValor = HmiTheme.Info; telemetryReservatorio.CorValor = HmiTheme.Info;
telemetryVazaoInstantanea.CorValor = HmiTheme.Success; telemetryVazaoInstantanea.CorValor = HmiTheme.Success;
telemetryVazaoMedia.CorValor = HmiTheme.Success; telemetryVazaoMedia.CorValor = HmiTheme.Success;
@ -121,9 +276,7 @@ namespace AgroBase.Forms.IHM.Operacao
card.CommandOn = !card.CommandOn; card.CommandOn = !card.CommandOn;
} }
private static void AplicarEstadoPainel( private static void AplicarEstadoPainel(HmiRoundedPanel panel, Color color)
HmiRoundedPanel panel,
Color color)
{ {
panel.BorderColor = color; panel.BorderColor = color;
panel.Invalidate(); panel.Invalidate();
@ -133,5 +286,23 @@ namespace AgroBase.Forms.IHM.Operacao
{ {
get { return _bicos.AsReadOnly(); } 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
);
}
} }
} }

View File

@ -162,7 +162,7 @@
this.btnVoltar.Margin = new System.Windows.Forms.Padding(0, 2, 8, 2); this.btnVoltar.Margin = new System.Windows.Forms.Padding(0, 2, 8, 2);
this.btnVoltar.MinimumSize = new System.Drawing.Size(102, 36); this.btnVoltar.MinimumSize = new System.Drawing.Size(102, 36);
this.btnVoltar.Name = "btnVoltar"; this.btnVoltar.Name = "btnVoltar";
this.btnVoltar.Size = new System.Drawing.Size(102, 36); this.btnVoltar.Size = new System.Drawing.Size(102, 42);
this.btnVoltar.TabIndex = 0; this.btnVoltar.TabIndex = 0;
this.btnVoltar.Text = "VOLTAR"; this.btnVoltar.Text = "VOLTAR";
// //
@ -180,7 +180,7 @@
this.headerTextLayout.RowCount = 2; this.headerTextLayout.RowCount = 2;
this.headerTextLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 60F)); this.headerTextLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 60F));
this.headerTextLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F)); this.headerTextLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F));
this.headerTextLayout.Size = new System.Drawing.Size(500, 46); this.headerTextLayout.Size = new System.Drawing.Size(486, 46);
this.headerTextLayout.TabIndex = 1; this.headerTextLayout.TabIndex = 1;
// //
// lblTitulo // lblTitulo
@ -192,7 +192,7 @@
this.lblTitulo.Location = new System.Drawing.Point(0, 0); this.lblTitulo.Location = new System.Drawing.Point(0, 0);
this.lblTitulo.Margin = new System.Windows.Forms.Padding(0); this.lblTitulo.Margin = new System.Windows.Forms.Padding(0);
this.lblTitulo.Name = "lblTitulo"; this.lblTitulo.Name = "lblTitulo";
this.lblTitulo.Size = new System.Drawing.Size(500, 27); this.lblTitulo.Size = new System.Drawing.Size(486, 27);
this.lblTitulo.TabIndex = 0; this.lblTitulo.TabIndex = 0;
this.lblTitulo.Text = "AJUSTES DO EQUIPAMENTO"; this.lblTitulo.Text = "AJUSTES DO EQUIPAMENTO";
this.lblTitulo.TextAlign = System.Drawing.ContentAlignment.BottomLeft; this.lblTitulo.TextAlign = System.Drawing.ContentAlignment.BottomLeft;
@ -206,7 +206,7 @@
this.lblSubtitulo.Location = new System.Drawing.Point(0, 27); this.lblSubtitulo.Location = new System.Drawing.Point(0, 27);
this.lblSubtitulo.Margin = new System.Windows.Forms.Padding(0); this.lblSubtitulo.Margin = new System.Windows.Forms.Padding(0);
this.lblSubtitulo.Name = "lblSubtitulo"; this.lblSubtitulo.Name = "lblSubtitulo";
this.lblSubtitulo.Size = new System.Drawing.Size(500, 19); this.lblSubtitulo.Size = new System.Drawing.Size(486, 19);
this.lblSubtitulo.TabIndex = 1; this.lblSubtitulo.TabIndex = 1;
this.lblSubtitulo.Text = "Configurações físicas, câmeras e comunicação do rover"; this.lblSubtitulo.Text = "Configurações físicas, câmeras e comunicação do rover";
// //
@ -219,12 +219,12 @@
this.pnlRover.CornerRadius = 9; this.pnlRover.CornerRadius = 9;
this.pnlRover.Dock = System.Windows.Forms.DockStyle.Fill; this.pnlRover.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlRover.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(58)))), ((int)(((byte)(46))))); this.pnlRover.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(58)))), ((int)(((byte)(46)))));
this.pnlRover.Location = new System.Drawing.Point(607, 0); this.pnlRover.Location = new System.Drawing.Point(593, 0);
this.pnlRover.Margin = new System.Windows.Forms.Padding(5, 0, 0, 0); this.pnlRover.Margin = new System.Windows.Forms.Padding(5, 0, 0, 0);
this.pnlRover.MinimumSize = new System.Drawing.Size(30, 30); this.pnlRover.MinimumSize = new System.Drawing.Size(30, 30);
this.pnlRover.Name = "pnlRover"; this.pnlRover.Name = "pnlRover";
this.pnlRover.Padding = new System.Windows.Forms.Padding(8); this.pnlRover.Padding = new System.Windows.Forms.Padding(8);
this.pnlRover.Size = new System.Drawing.Size(157, 46); this.pnlRover.Size = new System.Drawing.Size(171, 46);
this.pnlRover.TabIndex = 2; this.pnlRover.TabIndex = 2;
// //
// lblRover // lblRover
@ -235,7 +235,7 @@
this.lblRover.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(210)))), ((int)(((byte)(122))))); this.lblRover.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(72)))), ((int)(((byte)(210)))), ((int)(((byte)(122)))));
this.lblRover.Location = new System.Drawing.Point(8, 8); this.lblRover.Location = new System.Drawing.Point(8, 8);
this.lblRover.Name = "lblRover"; this.lblRover.Name = "lblRover";
this.lblRover.Size = new System.Drawing.Size(141, 30); this.lblRover.Size = new System.Drawing.Size(155, 30);
this.lblRover.TabIndex = 0; this.lblRover.TabIndex = 0;
this.lblRover.Text = "ROVER 01\r\nConfiguração local"; this.lblRover.Text = "ROVER 01\r\nConfiguração local";
this.lblRover.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.lblRover.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
@ -577,6 +577,7 @@
this.btnRestaurar.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69))))); this.btnRestaurar.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69)))));
this.btnRestaurar.Cursor = System.Windows.Forms.Cursors.Hand; this.btnRestaurar.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnRestaurar.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41))))); this.btnRestaurar.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41)))));
this.btnRestaurar.IconText = "●";
this.btnRestaurar.Location = new System.Drawing.Point(334, 2); this.btnRestaurar.Location = new System.Drawing.Point(334, 2);
this.btnRestaurar.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2); this.btnRestaurar.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2);
this.btnRestaurar.MinimumSize = new System.Drawing.Size(130, 36); this.btnRestaurar.MinimumSize = new System.Drawing.Size(130, 36);
@ -592,6 +593,7 @@
this.btnSalvar.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69))))); this.btnSalvar.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69)))));
this.btnSalvar.Cursor = System.Windows.Forms.Cursors.Hand; this.btnSalvar.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnSalvar.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41))))); this.btnSalvar.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41)))));
this.btnSalvar.IconText = "●";
this.btnSalvar.Location = new System.Drawing.Point(464, 2); this.btnSalvar.Location = new System.Drawing.Point(464, 2);
this.btnSalvar.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2); this.btnSalvar.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2);
this.btnSalvar.MinimumSize = new System.Drawing.Size(130, 36); this.btnSalvar.MinimumSize = new System.Drawing.Size(130, 36);
@ -607,6 +609,7 @@
this.btnTestarComunicacao.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69))))); this.btnTestarComunicacao.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69)))));
this.btnTestarComunicacao.Cursor = System.Windows.Forms.Cursors.Hand; this.btnTestarComunicacao.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnTestarComunicacao.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41))))); this.btnTestarComunicacao.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41)))));
this.btnTestarComunicacao.IconText = "●";
this.btnTestarComunicacao.Location = new System.Drawing.Point(609, 2); this.btnTestarComunicacao.Location = new System.Drawing.Point(609, 2);
this.btnTestarComunicacao.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2); this.btnTestarComunicacao.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2);
this.btnTestarComunicacao.MinimumSize = new System.Drawing.Size(130, 36); this.btnTestarComunicacao.MinimumSize = new System.Drawing.Size(130, 36);

View File

@ -15,6 +15,8 @@ namespace AgroBase.Forms.IHM
{ {
public partial class frmAjustes : Form, ITelaNavegavel public partial class frmAjustes : Form, ITelaNavegavel
{ {
public event EventHandler VoltarSolicitado;
private List<OAKCameraModel> ListaCameras = new List<OAKCameraModel>(); private List<OAKCameraModel> ListaCameras = new List<OAKCameraModel>();
private OAKCameraModel CameraCaminho = new OAKCameraModel(); private OAKCameraModel CameraCaminho = new OAKCameraModel();
private List<OAKCameraModel> CamerasSolo = new List<OAKCameraModel>(); private List<OAKCameraModel> CamerasSolo = new List<OAKCameraModel>();
@ -22,8 +24,6 @@ namespace AgroBase.Forms.IHM
private bool _carregando; private bool _carregando;
private bool _alteracoesPendentes; private bool _alteracoesPendentes;
public event EventHandler VoltarSolicitado;
public frmAjustes() public frmAjustes()
{ {
InitializeComponent(); InitializeComponent();
@ -56,6 +56,11 @@ namespace AgroBase.Forms.IHM
} }
} }
public void AtualizarDadosTela()
{
}
private void ConfigurarAparencia() private void ConfigurarAparencia()
{ {
@ -1330,5 +1335,7 @@ namespace AgroBase.Forms.IHM
{ ("OK", null), delegate { } } { ("OK", null), delegate { } }
}); });
} }
} }
} }

View File

@ -219,7 +219,7 @@
this.btnVoltar.Margin = new System.Windows.Forms.Padding(0, 3, 8, 3); this.btnVoltar.Margin = new System.Windows.Forms.Padding(0, 3, 8, 3);
this.btnVoltar.MinimumSize = new System.Drawing.Size(102, 36); this.btnVoltar.MinimumSize = new System.Drawing.Size(102, 36);
this.btnVoltar.Name = "btnVoltar"; this.btnVoltar.Name = "btnVoltar";
this.btnVoltar.Size = new System.Drawing.Size(102, 36); this.btnVoltar.Size = new System.Drawing.Size(102, 40);
this.btnVoltar.TabIndex = 0; this.btnVoltar.TabIndex = 0;
this.btnVoltar.Text = "VOLTAR"; this.btnVoltar.Text = "VOLTAR";
// //
@ -231,7 +231,7 @@
this.headerTextLayout.Controls.Add(this.lblTitulo, 0, 0); this.headerTextLayout.Controls.Add(this.lblTitulo, 0, 0);
this.headerTextLayout.Controls.Add(this.lblSubtitulo, 0, 1); this.headerTextLayout.Controls.Add(this.lblSubtitulo, 0, 1);
this.headerTextLayout.Dock = System.Windows.Forms.DockStyle.Fill; this.headerTextLayout.Dock = System.Windows.Forms.DockStyle.Fill;
this.headerTextLayout.Location = new System.Drawing.Point(111, 0); this.headerTextLayout.Location = new System.Drawing.Point(109, 0);
this.headerTextLayout.Margin = new System.Windows.Forms.Padding(7, 0, 5, 0); this.headerTextLayout.Margin = new System.Windows.Forms.Padding(7, 0, 5, 0);
this.headerTextLayout.Name = "headerTextLayout"; this.headerTextLayout.Name = "headerTextLayout";
this.headerTextLayout.RowCount = 2; this.headerTextLayout.RowCount = 2;
@ -278,12 +278,12 @@
this.pnlHeaderImpedimento.CornerRadius = 8; this.pnlHeaderImpedimento.CornerRadius = 8;
this.pnlHeaderImpedimento.Dock = System.Windows.Forms.DockStyle.Fill; this.pnlHeaderImpedimento.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlHeaderImpedimento.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(35)))), ((int)(((byte)(14))))); this.pnlHeaderImpedimento.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(40)))), ((int)(((byte)(35)))), ((int)(((byte)(14)))));
this.pnlHeaderImpedimento.Location = new System.Drawing.Point(471, 3); this.pnlHeaderImpedimento.Location = new System.Drawing.Point(469, 3);
this.pnlHeaderImpedimento.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); this.pnlHeaderImpedimento.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.pnlHeaderImpedimento.MinimumSize = new System.Drawing.Size(30, 30); this.pnlHeaderImpedimento.MinimumSize = new System.Drawing.Size(30, 30);
this.pnlHeaderImpedimento.Name = "pnlHeaderImpedimento"; this.pnlHeaderImpedimento.Name = "pnlHeaderImpedimento";
this.pnlHeaderImpedimento.Padding = new System.Windows.Forms.Padding(7); this.pnlHeaderImpedimento.Padding = new System.Windows.Forms.Padding(7);
this.pnlHeaderImpedimento.Size = new System.Drawing.Size(177, 40); this.pnlHeaderImpedimento.Size = new System.Drawing.Size(179, 40);
this.pnlHeaderImpedimento.TabIndex = 2; this.pnlHeaderImpedimento.TabIndex = 2;
// //
// lblImpedimentoGeral // lblImpedimentoGeral
@ -295,7 +295,7 @@
this.lblImpedimentoGeral.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(181)))), ((int)(((byte)(68))))); this.lblImpedimentoGeral.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(181)))), ((int)(((byte)(68)))));
this.lblImpedimentoGeral.Location = new System.Drawing.Point(7, 7); this.lblImpedimentoGeral.Location = new System.Drawing.Point(7, 7);
this.lblImpedimentoGeral.Name = "lblImpedimentoGeral"; this.lblImpedimentoGeral.Name = "lblImpedimentoGeral";
this.lblImpedimentoGeral.Size = new System.Drawing.Size(163, 26); this.lblImpedimentoGeral.Size = new System.Drawing.Size(165, 26);
this.lblImpedimentoGeral.TabIndex = 0; this.lblImpedimentoGeral.TabIndex = 0;
this.lblImpedimentoGeral.Text = "⚠ Impedimento: IMU instável"; this.lblImpedimentoGeral.Text = "⚠ Impedimento: IMU instável";
this.lblImpedimentoGeral.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.lblImpedimentoGeral.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
@ -1114,6 +1114,7 @@
this.btnSalvarModulo.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69))))); this.btnSalvarModulo.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69)))));
this.btnSalvarModulo.Cursor = System.Windows.Forms.Cursors.Hand; this.btnSalvarModulo.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnSalvarModulo.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41))))); this.btnSalvarModulo.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41)))));
this.btnSalvarModulo.IconText = "●";
this.btnSalvarModulo.Location = new System.Drawing.Point(178, 2); this.btnSalvarModulo.Location = new System.Drawing.Point(178, 2);
this.btnSalvarModulo.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2); this.btnSalvarModulo.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2);
this.btnSalvarModulo.MinimumSize = new System.Drawing.Size(130, 36); this.btnSalvarModulo.MinimumSize = new System.Drawing.Size(130, 36);
@ -1129,6 +1130,7 @@
this.actionsLayout.SetColumnSpan(this.btnIgnorarFalha, 3); this.actionsLayout.SetColumnSpan(this.btnIgnorarFalha, 3);
this.btnIgnorarFalha.Cursor = System.Windows.Forms.Cursors.Hand; this.btnIgnorarFalha.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnIgnorarFalha.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41))))); this.btnIgnorarFalha.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41)))));
this.btnIgnorarFalha.IconText = "●";
this.btnIgnorarFalha.Location = new System.Drawing.Point(0, 38); this.btnIgnorarFalha.Location = new System.Drawing.Point(0, 38);
this.btnIgnorarFalha.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2); this.btnIgnorarFalha.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2);
this.btnIgnorarFalha.MinimumSize = new System.Drawing.Size(130, 36); this.btnIgnorarFalha.MinimumSize = new System.Drawing.Size(130, 36);
@ -1472,6 +1474,7 @@
this.btnAcao1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69))))); this.btnAcao1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69)))));
this.btnAcao1.Cursor = System.Windows.Forms.Cursors.Hand; this.btnAcao1.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnAcao1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41))))); this.btnAcao1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41)))));
this.btnAcao1.IconText = "●";
this.btnAcao1.Location = new System.Drawing.Point(0, 2); this.btnAcao1.Location = new System.Drawing.Point(0, 2);
this.btnAcao1.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2); this.btnAcao1.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2);
this.btnAcao1.MinimumSize = new System.Drawing.Size(130, 36); this.btnAcao1.MinimumSize = new System.Drawing.Size(130, 36);
@ -1486,6 +1489,7 @@
this.btnAcao2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69))))); this.btnAcao2.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69)))));
this.btnAcao2.Cursor = System.Windows.Forms.Cursors.Hand; this.btnAcao2.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnAcao2.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41))))); this.btnAcao2.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41)))));
this.btnAcao2.IconText = "●";
this.btnAcao2.Location = new System.Drawing.Point(114, 2); this.btnAcao2.Location = new System.Drawing.Point(114, 2);
this.btnAcao2.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2); this.btnAcao2.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2);
this.btnAcao2.MinimumSize = new System.Drawing.Size(130, 36); this.btnAcao2.MinimumSize = new System.Drawing.Size(130, 36);
@ -1500,6 +1504,7 @@
this.btnAcao3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69))))); this.btnAcao3.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(53)))), ((int)(((byte)(63)))), ((int)(((byte)(69)))));
this.btnAcao3.Cursor = System.Windows.Forms.Cursors.Hand; this.btnAcao3.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnAcao3.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41))))); this.btnAcao3.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(36)))), ((int)(((byte)(41)))));
this.btnAcao3.IconText = "●";
this.btnAcao3.Location = new System.Drawing.Point(228, 2); this.btnAcao3.Location = new System.Drawing.Point(228, 2);
this.btnAcao3.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2); this.btnAcao3.Margin = new System.Windows.Forms.Padding(0, 2, 0, 2);
this.btnAcao3.MinimumSize = new System.Drawing.Size(130, 36); this.btnAcao3.MinimumSize = new System.Drawing.Size(130, 36);

View File

@ -1,4 +1,5 @@
using AgroBase.Forms.IHM.Controls; using AgroBase.Forms.IHM.Controls;
using AgroBase.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
@ -8,10 +9,11 @@ namespace AgroBase.Forms.IHM
{ {
public partial class frmDiagnosticos : Form, ITelaNavegavel public partial class frmDiagnosticos : Form, ITelaNavegavel
{ {
public event EventHandler VoltarSolicitado;
private readonly List<HmiModuleBadge> _badges = new List<HmiModuleBadge>(); private readonly List<HmiModuleBadge> _badges = new List<HmiModuleBadge>();
private readonly Dictionary<HmiModuleBadge, HmiModuleState> _estadoOriginalBadges = new Dictionary<HmiModuleBadge, HmiModuleState>(); private readonly Dictionary<HmiModuleBadge, HmiModuleState> _estadoOriginalBadges = new Dictionary<HmiModuleBadge, HmiModuleState>();
public event EventHandler VoltarSolicitado;
public frmDiagnosticos() public frmDiagnosticos()
{ {
@ -23,6 +25,11 @@ namespace AgroBase.Forms.IHM
VincularEventos(); VincularEventos();
} }
public void AtualizarDadosTela()
{
}
private void OrganizarCamadasMapa() private void OrganizarCamadasMapa()
{ {
picRover.SendToBack(); picRover.SendToBack();

View File

@ -239,8 +239,7 @@ namespace AgroBase.Forms.IHM
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine( Variaveis.MostrarLog("Erro no tmrDispositivos_Tick: " + ex.Message);
"Erro no tmrDispositivos_Tick: " + ex.Message);
} }
return Task.CompletedTask; return Task.CompletedTask;
@ -259,239 +258,84 @@ namespace AgroBase.Forms.IHM
// ========================================================= // =========================================================
// BATERIA // BATERIA
// ========================================================= // =========================================================
double bateria = operacao?.Sensoriamento?.Bateria?.PercentualBateria ?? 0;
double bateria = double bateriaSaude = ObterSaudeModulo(saudeModulos, Enums.T_Code.Bat);
operacao? Color corBateria = CorPorValorESaude(bateria, bateriaSaude);
.Sensoriamento? AtualizarBateria($"{Limitar(bateria, 0, 100):0}%", corBateria);
.Bateria?
.PercentualBateria ?? 0;
double bateriaSaude =
ObterSaudeModulo(
saudeModulos,
Enums.T_Code.Bat
);
Color corBateria =
CorPorValorESaude(
bateria,
bateriaSaude
);
AtualizarBateria(
$"{Limitar(bateria, 0, 100):0}%",
corBateria
);
// ========================================================= // =========================================================
// RESERVATÓRIO // RESERVATÓRIO
// ========================================================= // =========================================================
double reservatorio = operacao?.Sensoriamento?.Atuador?.PercentualReservatorio ?? 0;
double reservatorio = double atuadorSaude = ObterSaudeModulo(saudeModulos, Enums.T_Code.Atu);
operacao? Color corReservatorio = CorPorValorESaude(reservatorio, atuadorSaude);
.Sensoriamento? AtualizarReservatorio($"{Limitar(reservatorio, 0, 100):0}%", corReservatorio);
.Atuador?
.VolumeReservatorio ?? 0;
double atuadorSaude =
ObterSaudeModulo(
saudeModulos,
Enums.T_Code.Atu
);
/*
* Estou considerando VolumeReservatorio como percentual.
*
* Se ele estiver em litros, converta antes:
*
* reservatorio =
* capacidadeLitros > 0
* ? volumeAtualLitros / capacidadeLitros * 100
* : 0;
*/
Color corReservatorio =
CorPorValorESaude(
reservatorio,
atuadorSaude
);
AtualizarReservatorio(
$"{Limitar(reservatorio, 0, 100):0}%",
corReservatorio
);
// ========================================================= // =========================================================
// TEMPERATURA // TEMPERATURA
// ========================================================= // =========================================================
double temperatura = operacao?.Sensoriamento?.CoolerControl?.Temperatura ?? 0;
double temperatura = double temperaturaSaude = ObterSaudeModulo(saudeModulos, Enums.T_Code.Npc);
operacao? Color corTemperatura = CorTemperatura(temperatura, temperaturaSaude);
.Sensoriamento? AtualizarTemperatura($"{temperatura:0.#} °C", corTemperatura);
.CoolerControl?
.Temperatura ?? 0;
double temperaturaSaude =
ObterSaudeModulo(
saudeModulos,
Enums.T_Code.Npc
);
Color corTemperatura =
CorTemperatura(
temperatura,
temperaturaSaude
);
AtualizarTemperatura(
$"{temperatura:0.#} °C",
corTemperatura
);
// ========================================================= // =========================================================
// REDE / IPB // REDE / IPB
// ========================================================= // =========================================================
double redeSaude = ObterSaudeModulo(saudeModulos, Enums.T_Code.Ipb);
double redeSaude = Color corRede = CorPorPercentual(redeSaude);
ObterSaudeModulo( AtualizarRede($"{Limitar(redeSaude, 0, 100):0}%", corRede);
saudeModulos,
Enums.T_Code.Ipb
);
Color corRede =
CorPorPercentual(redeSaude);
AtualizarRede(
$"{Limitar(redeSaude, 0, 100):0}%",
corRede
);
// ========================================================= // =========================================================
// GNSS // GNSS
// ========================================================= // =========================================================
var gnss = operacao?.Sensoriamento?.Gps;
var gnss = double gnssSaude = ObterSaudeModulo(saudeModulos, Enums.T_Code.Gps);
operacao? bool gnssConectado = gnss != null && gnssSaude > 0;
.Sensoriamento?
.Gps;
double gnssSaude =
ObterSaudeModulo(
saudeModulos,
Enums.T_Code.Gps
);
bool gnssConectado =
gnss != null &&
gnssSaude > 0;
if (!gnssConectado) if (!gnssConectado)
{ {
AtualizarGnss( AtualizarGnss("Desconectado", HmiTheme.Danger);
"Desconectado",
HmiTheme.Danger
);
} }
else else
{ {
Enums.TiposCorrecaoGPS qualidadeFix = Enums.TiposCorrecaoGPS qualidadeFix = gnss.QualidadeFix;
gnss.QualidadeFix; double precisaoCm = Math.Max(0, gnss.PrecisaoCm);
double notaGnss = CalcularNotaGnss(qualidadeFix, precisaoCm, gnssSaude);
double precisaoCm = Color corGnss = CorPorPercentual(notaGnss);
Math.Max( string textoGnss = $"{FormatarQualidadeGnss(qualidadeFix)} " + $"{precisaoCm:0.##} cm";
0, AtualizarGnss(textoGnss, corGnss);
gnss.PrecisaoCm
);
double notaGnss =
CalcularNotaGnss(
qualidadeFix,
precisaoCm,
gnssSaude
);
Color corGnss =
CorPorPercentual(notaGnss);
string textoGnss =
$"{FormatarQualidadeGnss(qualidadeFix)} " +
$"{precisaoCm:0.##} cm";
AtualizarGnss(
textoGnss,
corGnss
);
} }
// ========================================================= // =========================================================
// BASE // BASE
// ========================================================= // =========================================================
bool baseConectada = VariaveisOperacao.PosicaoBase?.Inicializado ?? false;
bool baseConectada =
VariaveisOperacao
.PosicaoBase
.Inicializado;
if (!baseConectada || gnss == null) if (!baseConectada || gnss == null)
{ {
AtualizarDistanciaBase( AtualizarDistanciaBase("Desconectada", HmiTheme.Danger);
"Desconectada",
HmiTheme.Danger
);
} }
else else
{ {
double distanciaBase = double distanciaBase = GPSUtils.DistanciaEntrePontos(gnss, VariaveisOperacao.PosicaoBase);
GPSUtils.DistanciaEntrePontos( Color corBase = CorDistanciaBase(distanciaBase, 1000);
gnss, string distanciaTexto = FormatarDistancia(distanciaBase);
VariaveisOperacao.PosicaoBase AtualizarDistanciaBase(distanciaTexto, corBase);
);
Color corBase =
CorDistanciaBase(
distanciaBase,
1000
);
string distanciaTexto =
FormatarDistancia(distanciaBase);
AtualizarDistanciaBase(
distanciaTexto,
corBase
);
} }
// ========================================================= // =========================================================
// BOTÕES DA OPERAÇÃO // BOTÕES DA OPERAÇÃO
// ========================================================= // =========================================================
bool operacaoPausada = dadosOperacao?.Pausa ?? false;
bool operacaoPausada = bool operacaoEmergencia = dadosOperacao?.Emergencia ?? false;
dadosOperacao?.Pausa ?? false; bool operacaoIniciada = dadosOperacao?.OperacaoIniciada ?? false;
AtualizarAcoesOperacao(statusOperacao, operacaoIniciada, operacaoPausada, operacaoEmergencia);
bool operacaoEmergencia =
dadosOperacao?.Emergencia ?? false;
bool operacaoIniciada =
dadosOperacao?.OperacaoIniciada ?? false;
AtualizarAcoesOperacao(
statusOperacao,
operacaoIniciada,
operacaoPausada,
operacaoEmergencia
);
// ========================================================= // =========================================================
// FORMULÁRIO FILHO ATIVO // FORMULÁRIO FILHO ATIVO
// ========================================================= // =========================================================
if (_telaAtual != null && !_telaAtual.IsDisposed)
if (
_telaAtual != null &&
!_telaAtual.IsDisposed &&
_telaAtual.Name == frmMenu.Name)
{ {
frmMenu.AtualizarControlesUI(); (_telaAtual as ITelaNavegavel).AtualizarDadosTela();
} }
} }
@ -1040,6 +884,7 @@ namespace AgroBase.Forms.IHM
public interface ITelaNavegavel public interface ITelaNavegavel
{ {
event EventHandler VoltarSolicitado; event EventHandler VoltarSolicitado;
void AtualizarDadosTela();
} }
} }

View File

@ -13,7 +13,7 @@ using static AgroBase.Models.Enums;
namespace AgroBase.Forms.IHM namespace AgroBase.Forms.IHM
{ {
public partial class frmMenu : Form public partial class frmMenu : Form, ITelaNavegavel
{ {
private bool _sincronizando; private bool _sincronizando;
@ -24,6 +24,7 @@ namespace AgroBase.Forms.IHM
public event EventHandler AjustarLeverArmSolicitado; public event EventHandler AjustarLeverArmSolicitado;
public event EventHandler<TelaSolicitadaEventArgs> TelaSolicitada; public event EventHandler<TelaSolicitadaEventArgs> TelaSolicitada;
public event EventHandler VoltarSolicitado;
public frmMenu() public frmMenu()
{ {
@ -72,6 +73,11 @@ namespace AgroBase.Forms.IHM
} }
public void AtualizarDadosTela()
{
AtualizarControlesUI();
}
public void AtualizarControlesUI() public void AtualizarControlesUI()
{ {
bool mqttConectado = Variaveis.MqttServiceLocal != null && Variaveis.MqttServiceLocal.StatusConexao(); bool mqttConectado = Variaveis.MqttServiceLocal != null && Variaveis.MqttServiceLocal.StatusConexao();
@ -383,6 +389,7 @@ namespace AgroBase.Forms.IHM
} }
} }
} }

View File

@ -1,5 +1,6 @@
 
using AgroBase.Forms.IHM.Operacao; using AgroBase.Forms.IHM.Operacao;
using AgroBase.Models;
using System; using System;
using System.Windows.Forms; using System.Windows.Forms;
@ -25,16 +26,18 @@ namespace AgroBase.Forms.IHM
public partial class frmOperacao : Form, ITelaNavegavel public partial class frmOperacao : Form, ITelaNavegavel
{ {
private AbaOperacaoIHM _abaAtual;
public event EventHandler VoltarSolicitado; public event EventHandler VoltarSolicitado;
public event EventHandler<AbaOperacaoAlteradaEventArgs> AbaAlterada;
private AbaOperacaoIHM _abaAtual;
public event EventHandler<AbaOperacaoAlteradaEventArgs> AbaAlterada;
private readonly ucOperacaoMovimentacao _ucMovimentacao = new ucOperacaoMovimentacao { Dock = DockStyle.Fill }; private readonly ucOperacaoMovimentacao _ucMovimentacao = new ucOperacaoMovimentacao { Dock = DockStyle.Fill };
private readonly ucOperacaoPulverizador _ucPulverizador = new ucOperacaoPulverizador { Dock = DockStyle.Fill }; private readonly ucOperacaoPulverizador _ucPulverizador = new ucOperacaoPulverizador { Dock = DockStyle.Fill };
private readonly ucOperacaoNavegacao _ucNavegacao = new ucOperacaoNavegacao { Dock = DockStyle.Fill }; private readonly ucOperacaoNavegacao _ucNavegacao = new ucOperacaoNavegacao { Dock = DockStyle.Fill };
private readonly ucOperacaoParametros _ucParametros = new ucOperacaoParametros { Dock = DockStyle.Fill }; private readonly ucOperacaoParametros _ucParametros = new ucOperacaoParametros { Dock = DockStyle.Fill };
public Panel PainelConteudo { get { return pnlConteudoAba; } }
public AbaOperacaoIHM AbaAtual { get { return _abaAtual; } }
public frmOperacao() public frmOperacao()
{ {
InitializeComponent(); InitializeComponent();
@ -42,8 +45,25 @@ namespace AgroBase.Forms.IHM
SelecionarAba(AbaOperacaoIHM.Movimentacao, false); SelecionarAba(AbaOperacaoIHM.Movimentacao, false);
} }
public Panel PainelConteudo { get { return pnlConteudoAba; } } public void AtualizarDadosTela()
public AbaOperacaoIHM AbaAtual { get { return _abaAtual; } } {
switch (_abaAtual)
{
case AbaOperacaoIHM.Movimentacao:
_ucMovimentacao.AtualizarDadosTela();
break;
case AbaOperacaoIHM.Pulverizador:
_ucPulverizador.AtualizarDadosTela();
break;
case AbaOperacaoIHM.Navegacao:
break;
case AbaOperacaoIHM.Parametros:
break;
}
}
private void VincularEventos() private void VincularEventos()
{ {
@ -59,6 +79,7 @@ namespace AgroBase.Forms.IHM
tabParametros.Click += delegate { SelecionarAba(AbaOperacaoIHM.Parametros, true); }; tabParametros.Click += delegate { SelecionarAba(AbaOperacaoIHM.Parametros, true); };
} }
public void SelecionarAba(AbaOperacaoIHM aba) public void SelecionarAba(AbaOperacaoIHM aba)
{ {
SelecionarAba(aba, true); SelecionarAba(aba, true);

View File

@ -256,6 +256,9 @@ namespace AgroBase
private void btnJoyAtt_Click(object sender, EventArgs e) private void btnJoyAtt_Click(object sender, EventArgs e)
{ {
GeneralJoystick.AtualizaDispositivo(); GeneralJoystick.AtualizaDispositivo();
cmbJoysticks.Items.Clear();
cmbJoysticks.Items.AddRange(GeneralJoystick.JoysticksConectados.ToArray());
cmbJoysticks.SelectedIndex = GeneralJoystick.JoysticksConectados.IndexOf(GeneralJoystick.JoystickConectado.Information.InstanceName);
} }
private void btnJoyEdt_Click(object sender, EventArgs e) private void btnJoyEdt_Click(object sender, EventArgs e)

View File

@ -15,6 +15,7 @@ namespace AgroBase
{ {
public class GeneralJoystick public class GeneralJoystick
{ {
public static List<string> JoysticksConectados = new List<string>();
public static Joystick JoystickConectado = null; public static Joystick JoystickConectado = null;
public static int MargemAnalogico = 100; public static int MargemAnalogico = 100;
public static int MaximoAnalogico = 65534; public static int MaximoAnalogico = 65534;
@ -66,17 +67,18 @@ namespace AgroBase
{ {
DispCon = Variaveis.DispositivosConectados.Where(x => x.Dados.ConexaoAtiva).ToList(); DispCon = Variaveis.DispositivosConectados.Where(x => x.Dados.ConexaoAtiva).ToList();
frmInstancial.frmJoystick.lblDispositivo.Text = "Dispositivos: " + (DispCon.Count == 0 ? "N/A" : string.Join(", ", DispCon.Select(x => x._Descricao + " (" + Enum.GetName(typeof(T_Code), x.Dispositivo) + ")").ToArray())); frmInstancial.frmJoystick.lblDispositivo.Text = "Dispositivos: " + (DispCon.Count == 0 ? "N/A" : string.Join(", ", DispCon.Select(x => x._Descricao + " (" + Enum.GetName(typeof(T_Code), x.Dispositivo) + ")").ToArray()));
frmInstancial.frmPrincipal.cmbJoysticks.Items.Clear();
InicializarJoysticksConectados(); InicializarJoysticksConectados();
return true; return true;
}); });
FuncoesGlobais.ExecutarMetodoComVerificacaoCrossThread(frmInstancial.frmPrincipal.cmbJoysticks, funcAtt); FuncoesGlobais.ExecutarMetodoComVerificacaoCrossThread(frmInstancial.frmJoystick.lblDispositivo, funcAtt);
} }
public static void InicializarJoysticksConectados() public static void InicializarJoysticksConectados()
{ {
JoysticksConectados = new List<string>();
var directInput = new DirectInput(); var directInput = new DirectInput();
// Find a Joystick Guid // Find a Joystick Guid
@ -85,7 +87,7 @@ namespace AgroBase
foreach (var deviceInstance in directInput.GetDevices(DeviceType.Gamepad, DeviceEnumerationFlags.AllDevices)) foreach (var deviceInstance in directInput.GetDevices(DeviceType.Gamepad, DeviceEnumerationFlags.AllDevices))
{ {
joystickGuid = deviceInstance.InstanceGuid; joystickGuid = deviceInstance.InstanceGuid;
frmInstancial.frmPrincipal.cmbJoysticks.Items.Add(deviceInstance.InstanceName); JoysticksConectados.Add(deviceInstance.InstanceName);
} }
// If Gamepad not found, look for a Joystick // If Gamepad not found, look for a Joystick
@ -94,7 +96,7 @@ namespace AgroBase
foreach (var deviceInstance in directInput.GetDevices(DeviceType.Joystick, DeviceEnumerationFlags.AllDevices)) foreach (var deviceInstance in directInput.GetDevices(DeviceType.Joystick, DeviceEnumerationFlags.AllDevices))
{ {
joystickGuid = deviceInstance.InstanceGuid; joystickGuid = deviceInstance.InstanceGuid;
frmInstancial.frmPrincipal.cmbJoysticks.Items.Add(deviceInstance.InstanceName); JoysticksConectados.Add(deviceInstance.InstanceName);
} }
} }
@ -127,7 +129,6 @@ namespace AgroBase
if (JoystickConectado != null) if (JoystickConectado != null)
{ {
tmrJoystick.Start(); tmrJoystick.Start();
frmInstancial.frmPrincipal.cmbJoysticks.SelectedIndex = 0;
} }
} }
@ -553,13 +554,16 @@ namespace AgroBase
(op.Parametros.Controle.MovimentoAutomatico && Comando.Dispositivo == T_Code.Mov) || (op.Parametros.Controle.MovimentoAutomatico && Comando.Dispositivo == T_Code.Mov) ||
(op.Parametros.Controle.DirecionalAutomatico && Comando.Dispositivo == T_Code.Dir); (op.Parametros.Controle.DirecionalAutomatico && Comando.Dispositivo == T_Code.Dir);
bool bloqueioCalibragem =
op.Sensoriamento.Operacao.Calibrando;
bool bloqueioOperacional = bool bloqueioOperacional =
op.Sensoriamento.Operacao.Calibrando ||
!op.Sensoriamento.Operacao.OperacaoLiberada || !op.Sensoriamento.Operacao.OperacaoLiberada ||
!op.Sensoriamento.Operacao.OperacaoIniciada; !op.Sensoriamento.Operacao.OperacaoIniciada;
bool deveInterromper = bool deveInterromper =
bloqueioAutomatico || bloqueioAutomatico ||
bloqueioCalibragem ||
!VerificaComandoValidoSonar(Comando.key) || !VerificaComandoValidoSonar(Comando.key) ||
(!ForcarComando && bloqueioOperacional); (!ForcarComando && bloqueioOperacional);

View File

@ -4938,6 +4938,14 @@ namespace AgroBase.Models
public List<OperacaoSensoriamentoLogErrosModel> Logs { get; set; } = new List<OperacaoSensoriamentoLogErrosModel>(); public List<OperacaoSensoriamentoLogErrosModel> Logs { get; set; } = new List<OperacaoSensoriamentoLogErrosModel>();
// CoolerControl // CoolerControl
public CoolerControlDataModel CoolerControl { get; set; } = new CoolerControlDataModel(); public CoolerControlDataModel CoolerControl { get; set; } = new CoolerControlDataModel();
// Cameras
public List<CameraWorkerItemModel> Cameras { get; set; } = new List<CameraWorkerItemModel>();
public void AtualizarCameras()
{
Cameras = CameraWorkerService.ListaCameras != null
? new List<CameraWorkerItemModel>(CameraWorkerService.ListaCameras)
: new List<CameraWorkerItemModel>();
}
public DateTime UltimoRegistroLog { get; set; } = DateTime.MinValue; public DateTime UltimoRegistroLog { get; set; } = DateTime.MinValue;
@ -4988,6 +4996,7 @@ namespace AgroBase.Models
AtualizarTrajetoria(agora); AtualizarTrajetoria(agora);
AtualizarGps(agora); AtualizarGps(agora);
AtualizarLivox(agora); AtualizarLivox(agora);
AtualizarCameras();
DadosPerformance.AtualizarDadosPerformance(); DadosPerformance.AtualizarDadosPerformance();
@ -5031,6 +5040,7 @@ namespace AgroBase.Models
var dadosHealthWorker = OperadorSaude?.Clone(); var dadosHealthWorker = OperadorSaude?.Clone();
var dadosLivox = LivoxLidar?.Clone(); var dadosLivox = LivoxLidar?.Clone();
var dadosCooler = _Cooler?.GetResumo(agora); var dadosCooler = _Cooler?.GetResumo(agora);
var dadosCameras = new List<CameraWorkerItemModel>(Cameras ?? new List<CameraWorkerItemModel>());
op.Controle.Momento = agora; op.Controle.Momento = agora;
OperacaoSensoriamentoConjuntoModel dadosAtualizados = new OperacaoSensoriamentoConjuntoModel(op) OperacaoSensoriamentoConjuntoModel dadosAtualizados = new OperacaoSensoriamentoConjuntoModel(op)
@ -5051,6 +5061,7 @@ namespace AgroBase.Models
DadosPerformance = dadosPerformance, DadosPerformance = dadosPerformance,
LivoxLidar = dadosLivox, LivoxLidar = dadosLivox,
CoolerControl = dadosCooler, CoolerControl = dadosCooler,
Cameras = dadosCameras,
Logs = op.ListarEventosPendentes(), Logs = op.ListarEventosPendentes(),
UltimoRegistroLog = UltimoRegistroLog, UltimoRegistroLog = UltimoRegistroLog,
}; };
@ -5078,6 +5089,7 @@ namespace AgroBase.Models
IMU = IMU?.Clone(), IMU = IMU?.Clone(),
LivoxLidar = LivoxLidar?.Clone(), LivoxLidar = LivoxLidar?.Clone(),
CoolerControl = CoolerControl?.Clone(), CoolerControl = CoolerControl?.Clone(),
Cameras = new List<CameraWorkerItemModel>(Cameras ?? new List<CameraWorkerItemModel>()),
Logs = new List<OperacaoSensoriamentoLogErrosModel>(Logs ?? new List<OperacaoSensoriamentoLogErrosModel>()), Logs = new List<OperacaoSensoriamentoLogErrosModel>(Logs ?? new List<OperacaoSensoriamentoLogErrosModel>()),
UltimoRegistroLog = UltimoRegistroLog, UltimoRegistroLog = UltimoRegistroLog,
}; };

View File

@ -176,6 +176,36 @@ namespace AgroBase.Models.Operacoes
public class OperacaoParametrosControleModel : INotifyPropertyChanged public class OperacaoParametrosControleModel : INotifyPropertyChanged
{ {
private bool _controleManualAcionado;
public bool ControleManualAcionado
{
get => _controleManualAcionado;
set
{
if (_controleManualAcionado != value)
{
_controleManualAcionado = value;
OnPropertyChanged(nameof(ControleManualAcionado));
if (_controleManualAcionado)
{
_movimentoAutomaticoAnterior = _movimentoAutomatico;
_direcionalAutomaticoAnterior = _direcionalAutomatico;
_movimentoAutomatico = false;
_direcionalAutomatico = false;
}
else
{
if (_movimentoAutomatico != _movimentoAutomaticoAnterior)
_movimentoAutomatico = _movimentoAutomaticoAnterior;
if (_direcionalAutomatico != _direcionalAutomaticoAnterior)
_direcionalAutomatico = _direcionalAutomaticoAnterior;
}
}
}
}
private bool _movimentoAutomaticoAnterior;
private bool _movimentoAutomatico; private bool _movimentoAutomatico;
public bool MovimentoAutomatico public bool MovimentoAutomatico
{ {
@ -190,6 +220,7 @@ namespace AgroBase.Models.Operacoes
} }
} }
private bool _direcionalAutomaticoAnterior;
private bool _direcionalAutomatico; private bool _direcionalAutomatico;
public bool DirecionalAutomatico public bool DirecionalAutomatico
{ {