agrobot_base/AgroBase/OperationControl/Models/AppShell.cs

221 lines
10 KiB
C#
Raw Normal View History

2025-11-14 17:11:58 +00:00
using AgroBase.Models;
using AgroBase.Services;
using OperationControl.ViewModels;
2025-11-14 17:11:58 +00:00
using OperationControl.Windows;
using static AgroBase.Models.Enums;
2025-11-14 17:11:58 +00:00
namespace OperationControl.Models
{
public class AppShell
{
2026-03-12 01:00:21 +00:00
public static readonly bool Mock = true;
private static readonly bool AddRover = false;
2026-03-12 01:00:21 +00:00
2025-11-14 17:11:58 +00:00
private readonly System.Timers.Timer tmrComunicacao = new(1000) { AutoReset = true };
private int tmrComunicacaoTicks = 0;
private bool tmrComunicacaoTicking = false;
public MainWindow Main { get; private set; }
public DockWindow Dock { get; private set; }
2025-11-14 17:11:58 +00:00
public void Inicializar()
{
2025-11-24 16:05:50 +00:00
Show();
2025-11-14 17:11:58 +00:00
APIService.IniciarRotinas();
Variaveis.IniciarMQTT();
2026-03-05 02:03:31 +00:00
Variaveis.IniciarUDP();
2025-11-14 17:11:58 +00:00
tmrComunicacao.Elapsed += (_, __) => tmrComunicacao_Elapsed();
tmrComunicacao.Start();
}
private void Show()
{
// Aqui você decide qual janela é a inicial de fato
Main = new MainWindow();
Dock = new DockWindow();
2026-03-12 01:00:21 +00:00
if (Mock && AddRover)
2026-03-12 01:00:21 +00:00
{
Task.Run(async () =>
{
await Task.Delay(1000);
VariaveisControleOperacao.AdicionarNovoRoverNaRede("01", "192.168.1.100");
var r = VariaveisControleOperacao.RoversNaRede.FirstOrDefault();
r.Modo = AgroBase.Models.Enums.ModoOperacao.MapaGPS;
r.Descricao = "Operacao Mockada";
r.DadosLeitura = new AgroBase.Models.Operacoes.OperacaoParametrosDadosModel()
2026-03-12 01:00:21 +00:00
{
StatusRover = StatusModulo.Operante,
Operacao = new AgroBase.Models.Operacoes.OperacaoParametrosDadosOperacaoModel()
{
2026-03-18 10:40:59 +00:00
Modo = AgroBase.Models.Enums.ModoOperacao.MapaGPS,
Status = StatusOperacao.Parametrizando,
2026-03-12 01:00:21 +00:00
},
Atuador = new AgroBase.Models.Operacoes.OperacaoParametrosDadosAtuadorModel()
{
Bombas = new List<AgroBase.Models.Operacoes.OperacaoParametrosDadosBombaModel>()
{
new AgroBase.Models.Operacoes.OperacaoParametrosDadosBombaModel()
{
ComandoEstado = true,
LeituraEstado = true,
ID = "BOMBA",
ID_Num = 10,
Inicializado = true,
Potencia = 50,
TempoAtuado = 3000
}
},
Bicos = new List<AgroBase.Models.Operacoes.OperacaoParametrosDadosBicoModel>()
{
new AgroBase.Models.Operacoes.OperacaoParametrosDadosBicoModel()
{
AnguloAbertura = 30,
ComandoAngulo = 0,
ComandoEstado = true,
ID = "B01",
ID_Num = 1,
Inicializado = true,
LeituraAngulo = 0,
LeituraEstado = true,
Posicao = 1,
QtdAtuacoes = 5,
TempoAtuado = 300,
VazaoInstantaneaMLs = 15,
VazaoMediaMLs = 30,
2026-03-12 01:00:21 +00:00
VolumeVazadoML = 325
},
new AgroBase.Models.Operacoes.OperacaoParametrosDadosBicoModel()
{
AnguloAbertura = 30,
ComandoAngulo = 0,
ComandoEstado = true,
ID = "B02",
ID_Num = 2,
Inicializado = true,
LeituraAngulo = 0,
LeituraEstado = false,
Posicao = 1,
QtdAtuacoes = 5,
TempoAtuado = 300,
VazaoInstantaneaMLs = 15,
VazaoMediaMLs = 30,
VolumeVazadoML = 325
},
new AgroBase.Models.Operacoes.OperacaoParametrosDadosBicoModel()
{
AnguloAbertura = 30,
ComandoAngulo = 0,
ComandoEstado = false,
ID = "B03",
ID_Num = 3,
Inicializado = true,
LeituraAngulo = 0,
LeituraEstado = true,
Posicao = 2,
QtdAtuacoes = 5,
TempoAtuado = 300,
VazaoInstantaneaMLs = 15,
VazaoMediaMLs = 30,
VolumeVazadoML = 325
},
}
},
Controle = new AgroBase.Models.Operacoes.OperacaoParametrosDadosControleModel()
{
AlturaBarra = 50,
Angulo = 0,
PercentualVelocidadeSPKmh = 0,
TipoMovimento = TipoMovimentoDirecional.RodasDianteiras
},
Gnss = new AgroBase.Models.Operacoes.OperacaoParametrosDadosGNSSModel()
{
Latitude = -22.17254631649402,
Longitude = -47.395203906184044,
OrientacaoReal = 187
},
ModulosSaude = new List<AgroBase.Models.Operadores.ManagerWorkerMessageResponseModulosPendentesModel>()
{
new AgroBase.Models.Operadores.ManagerWorkerMessageResponseModulosPendentesModel()
{
modulo = T_Code.Gps,
saude = 0,
status = StatusModulo.Desconectado,
},
new AgroBase.Models.Operadores.ManagerWorkerMessageResponseModulosPendentesModel()
{
modulo = T_Code.Can,
saude = 70,
status = StatusModulo.Alerta,
},
2026-03-12 01:00:21 +00:00
}
};
r.Controle = new AgroBase.Models.Operacoes.OperacaoParametrosControleModel()
{
AtuAlturaAreaPulverizacao = 10,
AtuDuracaoAtuacao = 200,
AtuPercentualErvasBicoOff = 1,
AtuPercentualErvasBicoOn = 2,
AtuPercentualInicioPulverizacao = 70,
AtuPressaoLinha = 80,
DirAnguloMaximo = 30,
DirecionalAutomatico = true,
MovimentoAutomatico = true,
PulverizadorAutomatico = true,
DirTipoMovimento = TiposControladorDirecional.MPC,
DirVelocidadeMovimento = 40,
FrenagemAutomaticaAoParar = false,
ImuParadaPorInclinacao = false,
MovVelocidadeCErvasPercent = 20,
MovVelocidadeSErvasPercent = 50,
MpcHorizonte = 4,
MpcMatrizCusto = false,
OakParadaPorObstaculo = false,
RegistrarDadosPosProcessamento = false,
SonarAtivado = false
};
2026-03-12 01:00:21 +00:00
});
}
2025-11-14 17:11:58 +00:00
}
private void tmrComunicacao_Elapsed()
{
if (tmrComunicacaoTicking) return;
tmrComunicacaoTicking = true;
2025-11-24 16:05:50 +00:00
try
{
if (tmrComunicacaoTicks % (VariaveisEquipamento.TempoEntrePingsConexao / 1000) == 0 && Variaveis.GpsService != null)
{
VariaveisControleOperacao.EnviarDadosPosicao(Variaveis.GpsService.UltimaLeitura);
}
VariaveisControleOperacao.EnviarDadosHeartbeat();
VariaveisControleOperacao.AtualizarListaRoversNaRede();
}
finally
2025-11-14 17:11:58 +00:00
{
2025-11-24 16:05:50 +00:00
tmrComunicacaoTicks++;
tmrComunicacaoTicking = false;
2025-11-14 17:11:58 +00:00
}
}
public void AdicionarAlertaDock(string roverId, T_Code modulo, SeveridadeAlerta severidade, string mensagem, string modId = null)
{
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
(Dock?.DataContext as DockWindowViewModel)?.AdicionarAlerta(roverId, modulo, severidade, mensagem, modId);
}));
}
public void RemoverAlertaDock(string roverId, T_Code modulo, SeveridadeAlerta? severidade = null, string modId = null)
{
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
(Dock?.DataContext as DockWindowViewModel)?.RemoverAlerta(roverId, modulo, severidade, modId);
}));
}
2025-11-14 17:11:58 +00:00
}
}