using AgroBase.Models; using AgroBase.Services; using OperationControl.ViewModels; using OperationControl.Windows; using static AgroBase.Models.Enums; namespace OperationControl.Models { public class AppShell { public static readonly bool Mock = true; private static readonly bool AddRover = false; 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; } public void Inicializar() { Show(); APIService.IniciarRotinas(); Variaveis.IniciarMQTT(); Variaveis.IniciarUDP(); tmrComunicacao.Elapsed += (_, __) => tmrComunicacao_Elapsed(); tmrComunicacao.Start(); } private void Show() { // Aqui você decide qual janela é a inicial de fato Main = new MainWindow(); Dock = new DockWindow(); if (Mock && AddRover) { 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() { StatusRover = StatusModulo.Operante, Operacao = new AgroBase.Models.Operacoes.OperacaoParametrosDadosOperacaoModel() { Modo = AgroBase.Models.Enums.ModoOperacao.MapaGPS, Status = StatusOperacao.Parametrizando, }, Atuador = new AgroBase.Models.Operacoes.OperacaoParametrosDadosAtuadorModel() { Bombas = new List() { new AgroBase.Models.Operacoes.OperacaoParametrosDadosBombaModel() { ComandoEstado = true, LeituraEstado = true, ID = "BOMBA", ID_Num = 10, Inicializado = true, Potencia = 50, TempoAtuado = 3000 } }, Bicos = new List() { 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, 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() { 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, }, } }; 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 }; }); } } private void tmrComunicacao_Elapsed() { if (tmrComunicacaoTicking) return; tmrComunicacaoTicking = true; try { if (tmrComunicacaoTicks % (VariaveisEquipamento.TempoEntrePingsConexao / 1000) == 0 && Variaveis.GpsService != null) { VariaveisControleOperacao.EnviarDadosPosicao(Variaveis.GpsService.UltimaLeitura); } VariaveisControleOperacao.EnviarDadosHeartbeat(); VariaveisControleOperacao.AtualizarListaRoversNaRede(); } finally { tmrComunicacaoTicks++; tmrComunicacaoTicking = false; } } 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); })); } } }