Adicionado controle do CoolerControl

This commit is contained in:
Diego Freitas 2025-12-11 15:27:19 -03:00
parent 2fddd47b02
commit df915acae5
6 changed files with 406 additions and 29 deletions

View File

@ -2562,6 +2562,7 @@ namespace AgroBase.Models.Modules
}
public bool AtuacaoNivelAlto { get; set; }
public Estado StatusControle { get; set; }
public Estado StatusLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado;
public bool Inicializado { get; set; }
public DateTime UltimaLeitura
{
@ -2620,6 +2621,7 @@ namespace AgroBase.Models.Modules
}
}
public int _AnguloControle { get; set; }
public int _AnguloLeiutra => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraAngulo)?.atual?.valor ?? -1;
public bool Inicializado { get; set; }
public DateTime UltimaLeitura
{

View File

@ -1576,10 +1576,12 @@ namespace AgroBase.Models
if (controleBase.Dispositivo == T_Code.Gps)
{
VariaveisEquipamento.LeverArmFrontal = controleBase.LeverArmFrontal;
VariaveisEquipamento.LeverArmLateral = controleBase.LeverArmLateral;
var (la_frontal, la_lateral) = ((JObject)controleBase._comp_value).ToObject<(double?, double?)>();
if (la_frontal != null) VariaveisEquipamento.LeverArmFrontal = (double)la_frontal;
if (la_lateral != null) VariaveisEquipamento.LeverArmLateral = (double)la_lateral;
GPSService.UltimaLeitura.LeverArmFrontal = VariaveisEquipamento.LeverArmFrontal;
GPSService.UltimaLeitura.LeverArmLateral = VariaveisEquipamento.LeverArmLateral;
if (la_lateral != null || la_frontal != null)
GPSService.LeverArm = new GeoLeverArm(VariaveisEquipamento.LeverArmFrontal, VariaveisEquipamento.LeverArmLateral);
return;
}
@ -1665,6 +1667,13 @@ namespace AgroBase.Models
return;
}
if (controleBase.Dispositivo == T_Code.Npc)
{
var (modo, e_entrada, e_saida, t_ligar, t_turbo) = ((JObject)controleBase._comp_value).ToObject<(CoolerControlService.CoolerMode, Estado?, Estado?, double?, double?)>();
Variaveis.OperacaoEmAndamento.DispSen?.Dados?.CoolerControl?.AlterarControle(modo, entrada: e_entrada, saida: e_saida, tempOn: t_ligar, tempTurbo: t_turbo);
return;
}
Variaveis.OperacaoEmAndamento.Emergencia = controleBase.Emergencia;
if (Variaveis.OperacaoEmAndamento.Emergencia) return;
@ -2220,8 +2229,6 @@ namespace AgroBase.Models
public bool Pausa { get; set; }
public string _comp_id { get; set; }
public dynamic _comp_value { get; set; }
public double LeverArmFrontal { get; set; }
public double LeverArmLateral { get; set; }
public OperacaoParametrosModel Parametros { get; set; }
public OperacaoComandoBaseControleModel Controle { get; set; }
}
@ -2288,10 +2295,13 @@ namespace AgroBase.Models
public List<ManagerWorkerMessageResponseModulosPendentesModel> ModulosSaude { get; set; }
public List<DispositivoDetalhesModel> DispositivosMapeados { get; set; }
public Dictionary<string, double> Temperaturas { get; set; }
public Dictionary<string, (bool, bool)> Reles { get; set; }
public Dictionary<string, (int, int)> Servos { get; set; }
public Dictionary<T_Code, Dictionary<string, bool>> ModsCalibragem { get; set; }
public bool CanSerialAtivado { get; set; }
public Dictionary<string, bool> Iniciados { get; set; }
public List<OperacaoSensoriamentoLogErrosModel> Logs { get; set; }
public CoolerControlDataModel CoolerControl { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
public void InserirLog(T_Code dispositivo, StatusModulo status, double saude, string mensagem, string id = null, string condicoes = null)
@ -2329,10 +2339,11 @@ namespace AgroBase.Models
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
var _Bateria = _DispSen?.Dados?.ContadorCarga;
var _Reservatorio = _DispAtu?.Dados?.ContadorCarga;
var _Cooler = _DispSen?.Dados?.CoolerControl;
double tmp_max = Math.Max(Variaveis.OperacaoEmAndamento.DadosPerformance?.GPU_temp ?? 0, Variaveis.OperacaoEmAndamento.DadosPerformance?.CPU_temp ?? 0);
_DispSen?.Dados?.CoolerControl?.Atualizar(tmp_max);
_DispMvd?.Dados?.AtualizarDadosFreio();
_Cooler?.Atualizar(tmp_max, DateTime.Now);
_Bateria?.AtualizarConsumo(_DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0);
_Reservatorio?.AtualizarConsumo(_DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0, Variaveis.OperacaoEmAndamento.TempoDecorridoSegs);
_Trajetoria.AtualizarDadosAutonomiaCorredor();
@ -2521,6 +2532,8 @@ namespace AgroBase.Models
var dadosLivox = LivoxManagerProcess.DadosLeitura.Clone();
var dadosCooler = _Cooler?.GetResumo();
OperacaoSensoriamentoLogModel dadosAtualizados = new OperacaoSensoriamentoLogModel()
{
Momento = DateTime.Now,
@ -2556,8 +2569,11 @@ namespace AgroBase.Models
DispositivosMapeados = new List<DispositivoDetalhesModel>(SerialService.DispositivosMapeados),
ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>(Variaveis.OperacaoEmAndamento.ModsCalibragem),
Temperaturas = _DispSen?.Dados?.Sensores?.Where(x => x.Componente == S_Code.sNTC)?.ToDictionary(x => x.ID, y => (double?)(y.ValoresLeituras?.FirstOrDefault(v => v.funcao == FuncoesPinout.Temperatura)?.atual?.valor) ?? -1),
Reles = _DispSen?.Dados?.Reles?.ToDictionary(x => x.ID, y => (y.StatusControle == Estado.Ligado, y.StatusLeitura == Estado.Ligado)),
Servos = _DispSen?.Dados?.Servos?.ToDictionary(x => x.ID, y => (y._AnguloControle, y._AnguloLeiutra)),
Iniciados = _DispSen?.Dados?.Servos?.Select(s => new { s.ID, s.Inicializado }).Union(_DispSen?.Dados?.Reles?.Select(r => new { r.ID, r.Inicializado })).Union(_DispSen?.Dados?.Sinaleiros?.Select(s => new { s.ID, s.Inicializado })).Union(_DispSen?.Dados?.Sensores?.Select(s => new { s.ID, s.Inicializado })).ToDictionary(s => s.ID, s => s.Inicializado),
Logs = new List<OperacaoSensoriamentoLogErrosModel>(Logs ?? new List<OperacaoSensoriamentoLogErrosModel>()),
CoolerControl = dadosCooler,
UltimoComandoRespondido = _DispSen?.Dados?.DadosLeitura?.UltimoComandoRespondido ?? DateTime.MinValue
};
@ -2608,8 +2624,11 @@ namespace AgroBase.Models
DispositivosMapeados = new List<DispositivoDetalhesModel>(DispositivosMapeados),
ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>(ModsCalibragem),
Temperaturas = new Dictionary<string, double>(Temperaturas ?? new Dictionary<string, double>()),
Reles = new Dictionary<string, (bool, bool)>(Reles ?? new Dictionary<string, (bool, bool)>()),
Servos = new Dictionary<string, (int, int)>(Servos ?? new Dictionary<string, (int, int)>()),
Iniciados = new Dictionary<string, bool>(Iniciados ?? new Dictionary<string, bool>()),
Logs = new List<OperacaoSensoriamentoLogErrosModel>(Logs ?? new List<OperacaoSensoriamentoLogErrosModel>()),
CoolerControl = CoolerControl?.Clone(),
UltimoComandoRespondido = UltimoComandoRespondido
};
}

View File

@ -2,15 +2,17 @@
using AgroBase.Models.Modules;
using System;
using System.Linq;
using static AgroBase.Models.Enums;
using static AgroBase.Services.CoolerControlService;
namespace AgroBase.Services
{
public class CoolerControlService
{
// Config
public double TempOn { get; set; } = 30.0; // Liga ventilação básica
public double TempTurbo { get; set; } = 35.0; // Liga entrada+saída
public double TempCritical { get; set; } = 45.0; // Acima disso, alerta
public double TempOn { get; set; } = 55.0; // Liga ventilação básica
public double TempTurbo { get; set; } = 65.0; // Liga entrada+saída
public double TempCritical { get; set; } = 75.0; // Acima disso, alerta
public double Histerese { get; set; } = 1.5; // Para evitar chattering
public TimeSpan MinOnTime { get; set; } = TimeSpan.FromSeconds(30);
@ -21,8 +23,10 @@ namespace AgroBase.Services
// Estado interno
public CoolerMode ModoAtual { get; private set; } = CoolerMode.Off;
public Enums.Estado CoolerEntradaEstado => ModoAtual == CoolerMode.IntakeAndExhaust ? Enums.Estado.Ligado : Enums.Estado.Desligado;
public Enums.Estado CoolerSaidaEstado => ModoAtual == CoolerMode.ExhaustOnly || ModoAtual == CoolerMode.IntakeAndExhaust ? Enums.Estado.Ligado : Enums.Estado.Desligado;
public Estado CoolerEntradaEstado { get; private set; } = Estado.Desligado;
public Estado CoolerSaidaEstado { get; private set; } = Estado.Desligado;
public Estado CoolerEntradaLeitura => ReleCoolerEntrada?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado;
public Estado CoolerSaidaLeitura => ReleCoolerSaida?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado;
public double? TemperaturaFiltrada { get; private set; }
public DateTime UltimaMudancaModo { get; private set; } = DateTime.MinValue;
@ -57,15 +61,29 @@ namespace AgroBase.Services
TemperaturaFiltrada = null;
UltimaMudancaModo = DateTime.MinValue;
AlertaTemperaturaCritica = false;
CoolerEntradaEstado = Estado.Desligado;
CoolerSaidaEstado = Estado.Desligado;
EnviarComando();
}
public void AlterarControle(CoolerMode modo, Estado? entrada = null, Estado? saida = null, double? tempOn = null, double? tempTurbo = null)
{
ModoAtual = modo;
if (entrada != null) CoolerEntradaEstado = (Estado)entrada;
if (saida != null) CoolerSaidaEstado = (Estado)saida;
if (tempOn != null) TempOn = (double)tempOn;
if (tempTurbo != null) TempTurbo = (double)tempTurbo;
EnviarComando();
}
/// <summary>
/// Chamar a cada tick de atualização com a temperatura interna atual
/// </summary>
public void Atualizar(double temperaturaAtual_C)
public void Atualizar(double temperaturaAtual_C, DateTime agora)
{
DateTime agora = DateTime.Now;
// 1) Filtrar temperatura (EMA)
if (TemperaturaFiltrada == null)
{
@ -79,13 +97,22 @@ namespace AgroBase.Services
var temp = TemperaturaFiltrada.Value;
// 2) Verificar limite crítico (para health_worker)
bool _alertaAnterior = AlertaTemperaturaCritica;
AlertaTemperaturaCritica = temp >= TempCritical;
if (!_alertaAnterior && AlertaTemperaturaCritica)
{
Variaveis.OperacaoEmAndamento.Parametros?.DadosLeitura?.InserirLog(T_Code.Npc, StatusModulo.Alerta, 50, "Temperatura limite excedida no NPC");
}
if (ModoAtual == CoolerMode.Manual)
return;
// 3) Respeitar permanência mínima de estado
var tempoNoModoAtual = agora - UltimaMudancaModo;
bool podeMudar =
(ModoAtual == CoolerMode.Off && tempoNoModoAtual >= MinOffTime) ||
(ModoAtual != CoolerMode.Off && tempoNoModoAtual >= MinOnTime);
(ModoAtual != CoolerMode.Off && tempoNoModoAtual >= MinOnTime) ||
Variaveis.Fechando;
if (!podeMudar)
return;
@ -113,23 +140,78 @@ namespace AgroBase.Services
break;
}
if (Variaveis.Fechando)
novoModo = CoolerMode.Off;
CoolerEntradaEstado = novoModo == CoolerMode.IntakeAndExhaust ? Estado.Ligado : Estado.Desligado;
CoolerSaidaEstado = novoModo == CoolerMode.ExhaustOnly || novoModo == CoolerMode.IntakeAndExhaust ? Estado.Ligado : Estado.Desligado;
if (novoModo != ModoAtual)
{
ModoAtual = novoModo;
UltimaMudancaModo = agora;
EnviarComando();
}
}
private void EnviarComando()
{
if (ReleCoolerEntrada != null)
GeneralJoystick.EnviarComandoSensoriamento(ReleCoolerEntrada.Componente, ReleCoolerEntrada.ID, CoolerEntradaEstado);
if (ReleCoolerSaida != null)
GeneralJoystick.EnviarComandoSensoriamento(ReleCoolerSaida.Componente, ReleCoolerSaida.ID, CoolerSaidaEstado);
}
public CoolerControlDataModel GetResumo()
{
return new CoolerControlDataModel()
{
Modo = ModoAtual,
UltimaMudanca = UltimaMudancaModo,
EstadoEntrada = CoolerEntradaEstado,
EstadoSaida = CoolerSaidaEstado,
LeituraEntrada = CoolerEntradaLeitura,
LeituraSaida = CoolerSaidaLeitura,
Temperatura = TemperaturaFiltrada ?? 0,
Alerta = AlertaTemperaturaCritica
};
}
public enum CoolerMode
{
Off,
Manual,
ExhaustOnly,
IntakeAndExhaust
}
}
public class CoolerControlDataModel
{
public CoolerMode Modo { get; set; }
public DateTime UltimaMudanca { get; set; }
public Estado EstadoEntrada { get; set; }
public Estado EstadoSaida { get; set; }
public Estado LeituraEntrada { get; set; }
public Estado LeituraSaida { get; set; }
public double Temperatura { get; set; }
public bool Alerta { get; set; }
public CoolerControlDataModel Clone()
{
return new CoolerControlDataModel()
{
Modo = Modo,
UltimaMudanca = UltimaMudanca,
EstadoEntrada = EstadoEntrada,
EstadoSaida = EstadoSaida,
LeituraEntrada = LeituraEntrada,
LeituraSaida = LeituraSaida,
Temperatura = Temperatura,
Alerta = Alerta,
};
}
}
}

View File

@ -308,12 +308,9 @@ namespace OperationControl.Models
var cmd = new OperacaoComandoBaseModel()
{
Momento = DateTime.Now,
Dispositivo = AgroBase.Models.Enums.T_Code.Gps
Dispositivo = AgroBase.Models.Enums.T_Code.Gps,
_comp_value = (lateral, frontal)
};
if (lateral != null)
cmd.LeverArmLateral = Math.Round((double)lateral, 0);
if (frontal != null)
cmd.LeverArmFrontal = Math.Round((double)frontal, 0);
EnviarDadosControle(SelectedRoverId, cmd);
}
@ -342,6 +339,16 @@ namespace OperationControl.Models
});
}
public static void EnviarComandoCoolerControl(AgroBase.Services.CoolerControlService.CoolerMode modo, AgroBase.Models.Enums.Estado? entrada = null, AgroBase.Models.Enums.Estado? saida = null, double? temp_on = null, double? temp_turbo = null)
{
EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel()
{
Momento = DateTime.Now,
Dispositivo = AgroBase.Models.Enums.T_Code.Npc,
_comp_value = (modo, entrada, saida, temp_on, temp_turbo)
});
}
public static void RequisitarParametrosOperacao()
{
EnviarDadosControle(SelectedRoverId, new OperacaoComandoBaseModel()

View File

@ -151,6 +151,8 @@
<Label x:Name="lblDiagnosticos_GPS" Content="🔒GPS" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="202" Canvas.Top="192" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN" Tag="sMOD" Content="🔒SEN" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="202" Canvas.Top="218" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_NPC" Content="🔒NCP" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="202" Canvas.Top="244" HorizontalAlignment="Center" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_RLCIN" Tag="sRLE" Content="🔒CLE" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="112" Canvas.Top="218" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_SEN_RLCOUT" Tag="sRLE" Content="🔒CLS" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="287" Canvas.Top="218" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<Label x:Name="lblDiagnosticos_CAN" Content="🔒CAN" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="398" Canvas.Top="192" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<Label x:Name="lblDiagnosticos_IPB" Content="🔒LAN" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="398" Canvas.Top="218" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<Label x:Name="lblDiagnosticos_TRJ" Content="🔒TRAJ" Style="{StaticResource RoundedLabel}" Height="21" Width="40" Canvas.Left="398" Canvas.Top="244" HorizontalAlignment="Center" VerticalAlignment="Top"/>
@ -580,6 +582,106 @@
</StackPanel>
<!-- Painel específico de Rele (SEN) -->
<StackPanel x:Name="panelOpcoes_Rele" Grid.Row="0" Visibility="Collapsed">
<!-- Título / identificação -->
<StackPanel Orientation="Horizontal">
<Label Content="Controle"/>
<Button x:Name="btnRele_Ligar" Content="Ligar" Width="80" Margin="0,0,5,0" Click="btnRele_Ligar_Click"/>
<Button x:Name="btnRele_Desligar" Content="Desligar" Width="80" Margin="0,0,5,0" Click="btnRele_Desligar_Click"/>
</StackPanel>
<!-- Título / identificação -->
<TextBlock x:Name="txtRele_Titulo" FontWeight="Bold" FontSize="11" Text="Relé X - Testes" Margin="0,0,0,5"/>
<!-- “Cartõezinhos” de status -->
<UniformGrid Grid.Row="2" Rows="1" Columns="2" Margin="0,0,0,0">
<!-- Comando enviado -->
<Border BorderBrush="Gray" BorderThickness="1" Margin="2" Padding="3">
<StackPanel>
<TextBlock Text="Comando enviado" FontSize="9" FontWeight="Bold"/>
<TextBlock x:Name="txtRele_Comando" FontSize="10" Text="—"/>
</StackPanel>
</Border>
<!-- Status real -->
<Border BorderBrush="Gray" BorderThickness="1" Margin="2" Padding="3">
<StackPanel>
<TextBlock Text="Status real" FontSize="9" FontWeight="Bold"/>
<TextBlock x:Name="txtRele_StatusReal" FontSize="10" Text="—"/>
</StackPanel>
</Border>
</UniformGrid>
</StackPanel>
<!-- Painel específico de NPC -->
<StackPanel x:Name="panelOpcoes_NPC" Grid.Row="0" Visibility="Collapsed">
<!-- Título / identificação -->
<StackPanel Orientation="Horizontal">
<Label Content="Modo de Controle" Margin="0 5 0 0"/>
<ComboBox x:Name="cmbNpc_CoolerModo" Width="80" Margin="5" SelectionChanged="cmbNpc_CoolerModo_SelectionChanged"/>
<CheckBox x:Name="chbNpc_CoolerEntrada" Content="Entrada" Margin="10"/>
<CheckBox x:Name="chbNpc_CoolerSaida" Content="Saida" Margin="10"/>
</StackPanel>
<!-- Título / identificação -->
<StackPanel Orientation="Horizontal">
<Label Content="Temperatura Ligar"/>
<TextBox x:Name="txtNpc_CoolerTempOn" Width="30" Margin="5"/>
<Label Content="Temperatura Turbo"/>
<TextBox x:Name="txtNpc_CoolerTempTurbo" Width="30" Margin="5"/>
<Button x:Name="btnNpc_CoolerEnviar" Content="Enviar" Width="80" Margin="5" Click="btnNpc_CoolerEnviar_Click"/>
</StackPanel>
<!-- “Cartõezinhos” de status -->
<UniformGrid Grid.Row="2" Rows="2" Columns="2" Margin="0,0,0,0">
<!-- Modo Controle -->
<Border BorderBrush="Gray" BorderThickness="1" Margin="2" Padding="3">
<StackPanel>
<TextBlock Text="Modo Controle" FontSize="9" FontWeight="Bold"/>
<TextBlock x:Name="txtNpc_CoolerModo" FontSize="10" Text="—"/>
</StackPanel>
</Border>
<!-- Temperatura -->
<Border BorderBrush="Gray" BorderThickness="1" Margin="2" Padding="3">
<StackPanel>
<TextBlock Text="Temperatura" FontSize="9" FontWeight="Bold"/>
<TextBlock x:Name="txtNpc_CoolerTemperatura" FontSize="10" Text="—"/>
</StackPanel>
</Border>
<!-- Cooler Entrada -->
<Border BorderBrush="Gray" BorderThickness="1" Margin="2" Padding="3">
<StackPanel>
<TextBlock Text="Cooler Entrada" FontSize="9" FontWeight="Bold"/>
<TextBlock x:Name="txtNpc_CoolerEntrada" FontSize="10" Text="—"/>
</StackPanel>
</Border>
<!-- Cooler Saida -->
<Border BorderBrush="Gray" BorderThickness="1" Margin="2" Padding="3">
<StackPanel>
<TextBlock Text="Cooler Saída" FontSize="9" FontWeight="Bold"/>
<TextBlock x:Name="txtNpc_CoolerSaida" FontSize="10" Text="—"/>
</StackPanel>
</Border>
</UniformGrid>
</StackPanel>
</Grid>
</TabItem>

View File

@ -19,7 +19,6 @@ using AgroBase.Models.Operadores;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Threading;
using AgroBase.Models.Operacoes;
namespace OperationControl.Windows
{
@ -49,6 +48,11 @@ namespace OperationControl.Windows
cmbDir_Movimento.Items.Add(m);
cmbDir_Movimento.SelectedIndex = 0;
cmbNpc_CoolerModo.Items.Clear();
foreach (var m in Enum.GetNames(typeof(AgroBase.Services.CoolerControlService.CoolerMode)))
cmbNpc_CoolerModo.Items.Add(m);
cmbNpc_CoolerModo.SelectedIndex = 0;
AtualizarListaDispositivos(new List<string>() { VariaveisControleOperacao.SelectedRoverId });
@ -741,6 +745,43 @@ namespace OperationControl.Windows
},
});
break;
case AgroBase.Models.Enums.S_Code.sRLE:
//var (cmd, leitura) = ((JObject)controleBase._comp_value).ToObject<(double?, double?)>();
var rle = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Reles?.FirstOrDefault(x => x.Key == label).Value;
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
{
Label = "Comando",
Unidade = "",
Valor = rle.Value.Item1 == true ? 1 : 0,
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Leitura",
Unidade = "",
Valor = rle.Value.Item2 == true ? 1 : 0,
},
});
break;
case AgroBase.Models.Enums.S_Code.sFRO:
var fro = VariaveisControleOperacao.RoverEmFoco?.DadosLeitura?.Servos?.FirstOrDefault(x => x.Key == label).Value;
graficoAcompanhamento.Atualizar(inicial, momento, new List<GraficoModel.GraficoParametrosModel>()
{
new GraficoModel.GraficoParametrosModel()
{
Label = "Comando",
Unidade = "°",
Valor = fro.Value.Item1,
},
new GraficoModel.GraficoParametrosModel()
{
Label = "Leitura",
Unidade = "°",
Valor = fro.Value.Item2,
},
});
break;
}
break;
case AgroBase.Models.Enums.T_Code.Atu:
@ -1008,6 +1049,8 @@ namespace OperationControl.Windows
panelOpcoes_Direcional.Visibility = Visibility.Collapsed;
panelOpcoes_GPS.Visibility = Visibility.Collapsed;
panelOpcoes_Trajetoria.Visibility = Visibility.Collapsed;
panelOpcoes_Rele.Visibility = Visibility.Collapsed;
panelOpcoes_NPC.Visibility = Visibility.Collapsed;
}
switch (modulo)
@ -1067,6 +1110,29 @@ namespace OperationControl.Windows
break;
}
break;
}
case AgroBase.Models.Enums.T_Code.Sen:
{
switch (s_code)
{
case AgroBase.Models.Enums.S_Code.sRLE:
{
panelOpcoes_Rele.Visibility = Visibility.Visible;
var rele = rover?.Reles?.FirstOrDefault(x => x.Key == label).Value;
bool comando = rele?.Item1 ?? false;
bool leitura = rele?.Item2 ?? false;
txtRele_Titulo.Text = $"Relé {label} - Testes";
txtRele_Comando.Text = comando ? "Ligado" : "Desligado";
txtRele_StatusReal.Text = leitura ? "Ligado" : "Desligado";
break;
}
default:
txtOpcoes_SemDados.Visibility = Visibility.Visible;
break;
}
break;
}
case AgroBase.Models.Enums.T_Code.Dir:
@ -1123,6 +1189,30 @@ namespace OperationControl.Windows
btnTrajetoria_Confirmar.IsEnabled = !(dados?.Liberado ?? false);
break;
}
case AgroBase.Models.Enums.T_Code.Npc:
{
panelOpcoes_NPC.Visibility = Visibility.Visible;
var dados = rover?.CoolerControl;
var modo = dados?.Modo ?? AgroBase.Services.CoolerControlService.CoolerMode.Off;
double tmp = dados?.Temperatura ?? 0;
var entrada = dados?.LeituraEntrada ?? AgroBase.Models.Enums.Estado.Desligado;
var saida = dados?.LeituraSaida ?? AgroBase.Models.Enums.Estado.Desligado;
txtNpc_CoolerModo.Text = $"{modo}";
txtNpc_CoolerTemperatura.Text = $"{tmp:0.00} °C";
txtNpc_CoolerEntrada.Text = $"{entrada}";
txtNpc_CoolerSaida.Text = $"{saida}";
if (inicial)
{
cmbNpc_CoolerModo.SelectedIndex = (int)modo;
chbNpc_CoolerEntrada.IsChecked = entrada == AgroBase.Models.Enums.Estado.Ligado;
chbNpc_CoolerSaida.IsChecked = saida == AgroBase.Models.Enums.Estado.Ligado;
}
break;
}
default:
txtOpcoes_SemDados.Visibility = Visibility.Visible;
break;
@ -1303,6 +1393,79 @@ namespace OperationControl.Windows
#endregion
#region Rele
private void btnRele_Ligar_Click(object sender, RoutedEventArgs e)
{
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
if (modulo != AgroBase.Models.Enums.T_Code.Sen && s_code != AgroBase.Models.Enums.S_Code.sRLE)
return;
VariaveisControleOperacao.EnviarComandoSensoriamento(label, status: AgroBase.Models.Enums.Estado.Ligado);
}
private void btnRele_Desligar_Click(object sender, RoutedEventArgs e)
{
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
if (modulo != AgroBase.Models.Enums.T_Code.Sen && s_code != AgroBase.Models.Enums.S_Code.sRLE)
return;
VariaveisControleOperacao.EnviarComandoSensoriamento(label, status: AgroBase.Models.Enums.Estado.Desligado);
}
#endregion
#region Cooler Control
private void btnNpc_CoolerEnviar_Click(object sender, RoutedEventArgs e)
{
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
if (modulo != AgroBase.Models.Enums.T_Code.Npc)
return;
AgroBase.Services.CoolerControlService.CoolerMode Modo = (AgroBase.Services.CoolerControlService.CoolerMode)cmbNpc_CoolerModo.SelectedIndex;
AgroBase.Models.Enums.Estado Entrada = chbNpc_CoolerEntrada.IsChecked == true ? AgroBase.Models.Enums.Estado.Ligado : AgroBase.Models.Enums.Estado.Desligado;
AgroBase.Models.Enums.Estado Saida = chbNpc_CoolerSaida.IsChecked == true ? AgroBase.Models.Enums.Estado.Ligado : AgroBase.Models.Enums.Estado.Desligado;
double TemperaturaLigar = double.Parse(txtNpc_CoolerTempOn.Text);
double TemperaturaTurbo = double.Parse(txtNpc_CoolerTempTurbo.Text);
VariaveisControleOperacao.EnviarComandoCoolerControl(Modo, entrada: Entrada, saida: Saida, temp_on: TemperaturaLigar, temp_turbo: TemperaturaTurbo);
}
private void cmbNpc_CoolerModo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var cmb = sender as ComboBox;
switch ((AgroBase.Services.CoolerControlService.CoolerMode)cmb.SelectedIndex)
{
case AgroBase.Services.CoolerControlService.CoolerMode.Off:
chbNpc_CoolerEntrada.IsEnabled = false;
chbNpc_CoolerSaida.IsEnabled = false;
chbNpc_CoolerEntrada.IsChecked = false;
chbNpc_CoolerSaida.IsChecked = false;
break;
case AgroBase.Services.CoolerControlService.CoolerMode.Manual:
chbNpc_CoolerEntrada.IsEnabled = true;
chbNpc_CoolerSaida.IsEnabled = true;
chbNpc_CoolerEntrada.IsChecked = false;
chbNpc_CoolerSaida.IsChecked = false;
break;
case AgroBase.Services.CoolerControlService.CoolerMode.ExhaustOnly:
chbNpc_CoolerEntrada.IsEnabled = false;
chbNpc_CoolerSaida.IsEnabled = false;
chbNpc_CoolerEntrada.IsChecked = false;
chbNpc_CoolerSaida.IsChecked = true;
break;
case AgroBase.Services.CoolerControlService.CoolerMode.IntakeAndExhaust:
chbNpc_CoolerEntrada.IsEnabled = false;
chbNpc_CoolerSaida.IsEnabled = false;
chbNpc_CoolerEntrada.IsChecked = true;
chbNpc_CoolerSaida.IsChecked = true;
break;
}
}
#endregion
private void btnSaude_Salvar_Click(object sender, RoutedEventArgs e)
{
(var modulo, var label, var s_code, var iniciado) = GetModuleData(_labelModuloSelecionado);
@ -1936,6 +2099,8 @@ namespace OperationControl.Windows
}
#endregion