118 lines
3.5 KiB
C#
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();
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|