agrobot_base/AgroBase/AgroBase/Services/Operadores/OperadoresService.cs

118 lines
3.5 KiB
C#

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<IWorkerModel> Workers = new List<IWorkerModel>()
{
new ManagerWorkerService(),
new VisualWorkerService(),
new HealthWorkerService(),
new CameraWorkerService(),
};
private bool iniciarScript = false;
private int TimeoutDesconexao = 3;
private double TempoDesconectado = 0;
private AsyncTaskTimerModel tmrHearthbeat;
public bool Conectado = false;
public async Task<bool> 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)
{
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.AtualizarDadosControle(false);
}
RedisService.DefinirEquipamentoDesconectado();
// A cada 10 segundos desconectado, tenta reiniciar o nucleo de processamento
if (TempoDesconectado > 0 && TempoDesconectado % 10 == 0)
{
IniciarOperadores();
}
}
else if (!Variaveis.OperacaoEmAndamento.OperacaoConfigurada)
{
HealthWorkerService.AtualizarDadosOperacao();
}
}
}
}