using AgroBase.Models; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Threading.Tasks; using static AgroBase.Models.Enums; using static AgroBase.Models.Operadores.OperadoresModels; namespace AgroBase.Services.Operadores { public class OperadoresService { private Process pythonProcess; public List Workers = new List() { new ManagerWorkerService(), new VisualWorkerService(), new HealthWorkerService(), new CameraWorkerService(), new WeedWorkerService(), }; private bool iniciarScript = false; private int TimeoutDesconexao = 3; private double TempoDesconectado = 0; private AsyncTaskTimerModel tmrHearthbeat; public bool Conectado = false; public async Task IniciarProcessamento(bool _iniciarScript = true) { iniciarScript = _iniciarScript; tmrHearthbeat?.Dispose(); tmrHearthbeat = new AsyncTaskTimerModel("tmrHearthbeatOperadores", tmrHearthbeat_Tick, 1000); tmrHearthbeat.Start(); IniciarOperadores(); return true; } private void IniciarOperadores() { foreach (var worker in Workers) { worker.IniciarProcessamento(); } if (iniciarScript) { Encerrar(); pythonProcess = PythonService.RunScript(Path.Combine("workers", "main_async.py"), new string[] { }); } } public bool Encerrar() { if (pythonProcess != null && !pythonProcess.HasExited) { pythonProcess.Kill(); } pythonProcess = null; return true; } private async Task tmrHearthbeat_Tick() { Conectado = true; foreach (var worker in Workers) { worker.AtualizarSaude(); Conectado &= worker.Saude.conectado; } if (!Conectado) { TempoDesconectado++; if (Variaveis.OperacaoEmAndamento.Iniciado && Variaveis.OperacaoEmAndamento.Modo == Enums.ModoOperacao.MapaGPS) { RedisService.AtualizarCampos( CtxKey.DadosOperacao, ("status", StatusOperacao.Parado), ("liberado", false), ("configurado", false) ); var _Controle = Variaveis.OperacaoEmAndamento.Controle; _Controle.Angulo = 0; _Controle.PercentualVelocidadeSP = 0; RedisService.AtualizarCampos( CtxKey.DadosControle, ("angulo_sp", _Controle.Angulo), ("velocidade_sp", _Controle.PercentualVelocidadeSP) ); Variaveis.OperacaoEmAndamento.AtualizaInformacoesControleOperacao(); } RedisService.DefinirEquipamentoDesconectado(); // A cada 10 segundos desconectado, tenta reiniciar o nucleo de processamento if (TempoDesconectado > 0 && TempoDesconectado % 10 == 0) { IniciarOperadores(); } } else { TempoDesconectado = 0; if (!Variaveis.OperacaoEmAndamento.OperacaoConfigurada) { HealthWorkerService.AtualizarDadosOperacao(); } } } } }