agrobot_base/AgroBase/AgroBase/Services/Operadores/CameraWorkerService.cs

124 lines
3.9 KiB
C#

using AgroBase.Models.Operadores;
using AgroBase.Models;
using Newtonsoft.Json;
using System;
using System.Threading.Tasks;
using static AgroBase.Models.Operadores.OperadoresModels;
using System.Collections.Generic;
using static AgroBase.Models.Enums;
using System.Linq;
namespace AgroBase.Services.Operadores
{
public class CameraWorkerService : IWorkerModel
{
public CameraWorkerModel DadosLeitura = new CameraWorkerModel();
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
private static List<OAKCameraModel> CamerasConectadas = new List<OAKCameraModel>();
private bool DebugMode = true;
public void MostrarLog(string message, int limite = 500)
{
if (DebugMode)
{
Console.WriteLine($"[CameraWorker] {message.Substring(0, Math.Min(limite, message.Length))}{(message.Length > limite ? "..." : "")}");
}
}
public async Task<bool> IniciarProcessamento()
{
RedisService.Subscribe(CmdKey.CameraWorkerTx, RedisCallback);
DadosLeitura.IniciadoEm = DateTime.Now;
DadosLeitura.Iniciado = true;
bool pronto() => DadosLeitura.Pronto;
await FuncoesGlobais.AguardarCondicaoAsync(pronto, 5000);
if (pronto())
{
MostrarLog("Processamento iniciado com sucesso");
return true;
}
MostrarLog("Timeout ao iniciar script");
DadosLeitura.ReiniciarEstado();
return false;
}
public void RedisCallback(string mensagem)
{
try
{
var comando = JsonConvert.DeserializeObject<ComandoRedis>(mensagem);
var cmd = (CameraWorkerCommandType)comando.cmd;
//MostrarLog($"Comando recebido: cmd = {cmd.ToString()}");
switch (cmd)
{
case CameraWorkerCommandType.ScriptCarregado:
DadosLeitura.Pronto = true;
DadosLeitura.ProntoEm = DateTime.Now;
MostrarLog($"Comando recebido: cmd = {cmd.ToString()}");
break;
default:
MostrarLog($"Comando não reconhecido: {comando.cmd}");
break;
}
}
catch (Exception ex)
{
MostrarLog($"Erro ao deserializar resposta: {ex.Message}");
}
finally
{
DadosLeitura.UltimaMensagem = DateTime.Now;
}
}
public void AtualizarSaude()
{
Saude = OperadoresModels.AtualizarSaude(CtxKey.DadosCameraWorker);
}
public static List<OAKCameraModel> GetListaCameras()
{
CamerasConectadas = new List<OAKCameraModel>()
{
new OAKCameraModel()
{
Dispositivo = T_Code.Vzo,
Index = -1,
Name = "Sem Video"
}
};
var cameras_str = RedisService.Get(CtxKey.DadosCameras);
var cameras = JsonConvert.DeserializeObject<Dictionary<string, CameraWorkerItemModel>>(cameras_str);
if (cameras.Any())
{
foreach (var cam in cameras)
{
var camera_str = RedisService.Get(RedisService.CamKey(cam.Key));
var camera = JsonConvert.DeserializeObject<CameraWorkerItemModel>(camera_str);
CamerasConectadas.Add(new OAKCameraModel()
{
Dispositivo = camera.dispositivo,
Version = camera.versao,
Name = camera.modelo,
Id = camera.mx_id,
});
}
}
return CamerasConectadas;
}
}
}