124 lines
3.9 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|