agrobot_base/AgroBase/AgroBase/Models/Operadores/VisualWorkerModel.cs

723 lines
28 KiB
C#

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using static AgroBase.Models.Enums;
namespace AgroBase.Models.Operadores
{
public class VisualWorkerModel
{
public DateTime Momento { get; set; }
public bool Iniciado { get; set; }
public DateTime IniciadoEm { get; set; }
public bool Pronto { get; set; }
public DateTime ProntoEm { get; set; }
public DateTime UltimaMensagem { get; set; }
[JsonIgnore]
public Dictionary<TipoFrameCamera, OAKCameraFrameModel> CameraFrames { get; set; } = new Dictionary<TipoFrameCamera, OAKCameraFrameModel>();
public VisualWorkerMessageAnaliseModel Analises { get; set; } = new VisualWorkerMessageAnaliseModel();
public OAKImuModel Imu { get; set; } = new OAKImuModel();
public StatusModulo Status { get; set; }
public bool StatusValido => new List<StatusModulo>() { StatusModulo.Operante, StatusModulo.Alerta }.Contains(Status);
public VisualWorkerResumoModel Resumo { get; set; }
public VisualWorkerPerformanceModel Performance { get; set; } = new VisualWorkerPerformanceModel();
public VisualWorkerRedisTimestampsModel Timestamps { get; set; } = new VisualWorkerRedisTimestampsModel();
public VisualWorkerModel Clone()
{
return new VisualWorkerModel()
{
Momento = Momento,
Iniciado = Iniciado,
IniciadoEm = IniciadoEm,
Pronto = Pronto,
ProntoEm = ProntoEm,
CameraFrames = new Dictionary<TipoFrameCamera, OAKCameraFrameModel>(CameraFrames ?? new Dictionary<TipoFrameCamera, OAKCameraFrameModel>()),
Analises = Analises?.Clone(),
Imu = Imu?.Clone(),
UltimaMensagem = UltimaMensagem,
Status = Status,
Resumo = Resumo?.Clone(),
Performance = Performance?.Clone() ?? new VisualWorkerPerformanceModel(),
Timestamps = Timestamps?.Clone() ?? new VisualWorkerRedisTimestampsModel(),
};
}
public void ReiniciarEstado()
{
Iniciado = false;
IniciadoEm = DateTime.MinValue;
Pronto = false;
ProntoEm = DateTime.MinValue;
CameraFrames = new Dictionary<TipoFrameCamera, OAKCameraFrameModel>();
Analises = new VisualWorkerMessageAnaliseModel();
Imu = new OAKImuModel();
Resumo = new VisualWorkerResumoModel();
Status = StatusModulo.Desconectado;
Performance = new VisualWorkerPerformanceModel();
Timestamps = new VisualWorkerRedisTimestampsModel();
}
}
public class VisualWorkerRedisTimestampsModel
{
public double analise { get; set; }
public double segmentacao { get; set; }
public double deteccao { get; set; }
public double matriz_confianca { get; set; }
public double performance_visual { get; set; }
public VisualWorkerRedisTimestampsModel Clone()
{
return (VisualWorkerRedisTimestampsModel)MemberwiseClone();
}
}
public class VisualWorkerResumoModel
{
// Operacional
public StatusCarroMapa StatusCarro { get; set; }
public double ErroLateral { get; set; }
public double ErroAngular { get; set; }
public string Modo { get; set; }
// Segurança / bloqueio
public bool ParadaDetectada { get; set; } = false;
public bool DeveParar { get; set; } = false;
public bool EnviarComandoParada { get; set; } = false;
public bool EnviarComandoRetomada { get; set; } = false;
// Novo: operador + técnico enxuto
public VisualWorkerResumoOperacionalModel Operacional { get; set; } = new VisualWorkerResumoOperacionalModel();
public VisualWorkerResumoTecnicoModel Tecnico { get; set; } = new VisualWorkerResumoTecnicoModel();
private bool _comandoParadaEnviado { get; set; } = false;
public void AtualizarDados(VisualWorkerModel Sonar)
{
Modo = Sonar?.Analises?.matriz_confianca?.block?.decision?.mode ?? "free";
ParadaDetectada = (Sonar?.Analises?.matriz_confianca?.block?.decision?.parar ?? false);
StatusCarro = Sonar?.Analises?.segmentacao?.status_corredor ?? StatusCarroMapa.Indefinido;
ErroLateral = Sonar?.Analises?.segmentacao?.erro_lateral_pct ?? 0;
ErroAngular = Sonar?.Analises?.segmentacao?.erro_angular ?? 0;
AtualizarResumoOperacional(Sonar);
AtualizarResumoTecnico(Sonar);
}
private void AtualizarResumoOperacional(VisualWorkerModel visual)
{
var block = visual?.Analises?.matriz_confianca?.block;
var decision = block?.decision;
var trend = block?.trend;
var debug = visual?.Analises?.segmentacao?.status_corredor_debug;
Operacional.DistanciaObstaculoM = block?.d_block_line_m;
Operacional.VelocidadeMaxSugeridaMps = decision?.v_max_sugerida_mps;
Operacional.RiscoObstaculo = decision?.risk_ema ?? trend?.risk_ema ?? 0;
Operacional.MotivoBloqueio = block?.reason;
Operacional.DetalheBloqueio = block?.reason_detail;
Operacional.OrigemStatusCorredor = debug?.origem_status;
Operacional.ConfiancaStatusCorredor = debug?.status_modelo_conf ?? 0;
}
private void AtualizarResumoTecnico(VisualWorkerModel visual)
{
var perf = visual?.Performance;
var ts = visual?.Timestamps;
Tecnico.FpsModeloIA = GetFps(perf, "segmentacao");
Tecnico.FpsDeteccao = GetFps(perf, "deteccao");
Tecnico.FpsMatrizConfianca = GetFps(perf, "matriz_confianca");
Tecnico.FpsAnalise = GetFps(perf, "analise");
Tecnico.LatenciaModeloMs = GetLatenciaMediaMs(perf, "segmentacao");
Tecnico.LatenciaDeteccaoMs = GetLatenciaMediaMs(perf, "deteccao");
var nowUnix = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() / 1000.0;
Tecnico.IdadeAnaliseMs = AgeMs(nowUnix, ts?.analise ?? 0);
Tecnico.IdadeSegmentacaoMs = AgeMs(nowUnix, ts?.segmentacao ?? 0);
Tecnico.IdadeDeteccaoMs = AgeMs(nowUnix, ts?.deteccao ?? 0);
Tecnico.IdadeMatrizConfiancaMs = AgeMs(nowUnix, ts?.matriz_confianca ?? 0);
Tecnico.TemSegmentacao = perf?.visual_cache?.tem_seg ?? false;
Tecnico.TemGrid = perf?.visual_cache?.tem_grid ?? false;
Tecnico.ModeloTravado =
Tecnico.IdadeSegmentacaoMs > 1500 ||
Tecnico.FpsModeloIA <= 0.2;
Tecnico.VisualAtrasado =
Tecnico.IdadeAnaliseMs > 1500 ||
Tecnico.IdadeMatrizConfiancaMs > 1500;
Tecnico.SaudeVisual = CalcularSaudeVisual();
}
private static double GetFps(VisualWorkerPerformanceModel perf, string loopName)
{
if (perf?.loops == null)
return 0;
return perf.loops.TryGetValue(loopName, out var loop)
? loop?.fps_real ?? 0
: 0;
}
private static double GetLatenciaMediaMs(VisualWorkerPerformanceModel perf, string loopName)
{
if (perf?.loops == null)
return 0;
if (!perf.loops.TryGetValue(loopName, out var loop) || loop?.latencia_ms == null)
return 0;
// Ajusta o nome conforme o JSON real: "avg", "mean", "media", etc.
return loop.latencia_ms["avg"]?.Value<double>()
?? loop.latencia_ms["mean"]?.Value<double>()
?? loop.latencia_ms["media"]?.Value<double>()
?? 0;
}
private static double AgeMs(double nowUnix, double tsUnix)
{
if (tsUnix <= 0)
return 999999;
return Math.Max(0, (nowUnix - tsUnix) * 1000.0);
}
private string CalcularSaudeVisual()
{
if (Tecnico.ModeloTravado)
return "travado";
if (Tecnico.VisualAtrasado)
return "atrasado";
if (Tecnico.FpsModeloIA < 2)
return "lento";
return "ok";
}
public void AtualizarStatusBloqueioManual(VisualWorkerModel Sonar, bool consideraEmMovimento)
{
var op = Variaveis.OperacaoEmAndamento;
if (!(op.Parametros?.Controle?.OakParadaPorObstaculo ?? false))
{
_comandoParadaEnviado = false;
DeveParar = false;
EnviarComandoParada = false;
EnviarComandoRetomada = false;
}
else
{
List<Direcao> _direcoesInterromperMovimento = new List<Direcao> { Direcao.Frente }; //, Direcao.Tras
Direcao _ultimaDirecaoControle = op.Controle?.TiposControle?.FirstOrDefault(x => x?.Tipo == T_Code.Mov)?.UltimaDirecao ?? Direcao.Parado;
bool _carroEmMovimento = _direcoesInterromperMovimento.Contains(_ultimaDirecaoControle);
bool emMovimento = consideraEmMovimento ? _carroEmMovimento : true;
DeveParar = Sonar?.StatusValido == true && (ParadaDetectada || Modo == "stop");
EnviarComandoParada = DeveParar && emMovimento;
if (EnviarComandoParada)
{
_comandoParadaEnviado = true;
}
EnviarComandoRetomada = !ParadaDetectada && _comandoParadaEnviado;
if (EnviarComandoRetomada)
{
_comandoParadaEnviado = false;
}
}
}
public VisualWorkerResumoModel Clone()
{
return new VisualWorkerResumoModel()
{
StatusCarro = StatusCarro,
ErroLateral = ErroLateral,
ErroAngular = ErroAngular,
Modo = Modo,
ParadaDetectada = ParadaDetectada,
DeveParar = DeveParar,
EnviarComandoParada = EnviarComandoParada,
EnviarComandoRetomada = EnviarComandoRetomada,
_comandoParadaEnviado = _comandoParadaEnviado,
Operacional = Operacional?.Clone() ?? new VisualWorkerResumoOperacionalModel(),
Tecnico = Tecnico?.Clone() ?? new VisualWorkerResumoTecnicoModel(),
};
}
}
public class VisualWorkerResumoTecnicoModel
{
public double FpsModeloIA { get; set; }
public double FpsDeteccao { get; set; }
public double FpsMatrizConfianca { get; set; }
public double FpsAnalise { get; set; }
public double LatenciaModeloMs { get; set; }
public double LatenciaDeteccaoMs { get; set; }
public double IdadeAnaliseMs { get; set; }
public double IdadeSegmentacaoMs { get; set; }
public double IdadeDeteccaoMs { get; set; }
public double IdadeMatrizConfiancaMs { get; set; }
public bool TemSegmentacao { get; set; }
public bool TemGrid { get; set; }
public bool ModeloTravado { get; set; }
public bool VisualAtrasado { get; set; }
public string SaudeVisual { get; set; } = "desconhecida";
public VisualWorkerResumoTecnicoModel Clone()
{
return new VisualWorkerResumoTecnicoModel()
{
FpsAnalise = FpsAnalise,
FpsDeteccao = FpsDeteccao,
FpsMatrizConfianca = FpsMatrizConfianca,
FpsModeloIA = FpsModeloIA,
IdadeAnaliseMs = IdadeAnaliseMs,
IdadeDeteccaoMs = IdadeDeteccaoMs,
IdadeMatrizConfiancaMs = IdadeMatrizConfiancaMs,
IdadeSegmentacaoMs = IdadeSegmentacaoMs,
LatenciaDeteccaoMs = LatenciaDeteccaoMs,
LatenciaModeloMs = LatenciaModeloMs,
ModeloTravado = ModeloTravado,
SaudeVisual = SaudeVisual,
TemGrid = TemGrid,
TemSegmentacao = TemSegmentacao,
VisualAtrasado = VisualAtrasado
};
}
}
public class VisualWorkerResumoOperacionalModel
{
public double? DistanciaObstaculoM { get; set; }
public double? VelocidadeMaxSugeridaMps { get; set; }
public double RiscoObstaculo { get; set; }
public string MotivoBloqueio { get; set; }
public string DetalheBloqueio { get; set; }
public string OrigemStatusCorredor { get; set; }
public double ConfiancaStatusCorredor { get; set; }
public VisualWorkerResumoOperacionalModel Clone()
{
return new VisualWorkerResumoOperacionalModel()
{
ConfiancaStatusCorredor = ConfiancaStatusCorredor,
DetalheBloqueio = DetalheBloqueio,
DistanciaObstaculoM = DistanciaObstaculoM,
MotivoBloqueio = MotivoBloqueio,
OrigemStatusCorredor = OrigemStatusCorredor,
RiscoObstaculo = RiscoObstaculo,
VelocidadeMaxSugeridaMps = VelocidadeMaxSugeridaMps
};
}
}
public class VisualWorkerMessageAnaliseModel
{
public DateTime timestamp { get; set; }
public VisualWorkerMessageSegmentacaoSemanticaModel segmentacao { get; set; } = new VisualWorkerMessageSegmentacaoSemanticaModel();
public VisualWorkerMessageMatrizConfiancaModel matriz_confianca { get; set; } = new VisualWorkerMessageMatrizConfiancaModel();
public List<VisualWorkerMessageDeteccaoModel> deteccao { get; set; } = new List<VisualWorkerMessageDeteccaoModel>();
public VisualWorkerMessageAnaliseModel Clone()
{
return new VisualWorkerMessageAnaliseModel()
{
timestamp = timestamp,
segmentacao = segmentacao?.Clone() ?? new VisualWorkerMessageSegmentacaoSemanticaModel(),
matriz_confianca = matriz_confianca?.Clone() ?? new VisualWorkerMessageMatrizConfiancaModel(),
deteccao = deteccao?.Select(x => x.Clone()).ToList() ?? new List<VisualWorkerMessageDeteccaoModel>()
};
}
}
public class VisualWorkerMessageAnaliseBBoxModel
{
public string tipo { get; set; }
public List<double> bbox { get; set; } // [x, y, w, h]
public List<double> centro_percentual { get; set; } // [x%, y%]
public double? distancia_m { get; set; }
public double? largura_m { get; set; }
public double? altura_m { get; set; }
public List<double> profundidades { get; set; } // [z1, z2] ou null
public double? variacao { get; set; } // delta Z ou null
}
public class VisualWorkerMessageSegmentacaoSemanticaModel
{
public double timestamp { get; set; }
public int height { get; set; }
public int width { get; set; }
public double? erro_angular { get; set; }
public double? erro_lateral_pct { get; set; }
public StatusCarroMapa status_corredor { get; set; }
public StatusCarroMapa status_corredor_anterior { get; set; }
public VisualWorkerMessageSegmentacaoSemanticaDebugCorredorModel status_corredor_debug { get; set; }
public List<double?[]> centros_corredor { get; set; } = new List<double?[]>();
public List<int> larguras_px { get; set; } = new List<int>();
public VisualWorkerMessageSegmentacaoSemanticaModel Clone()
{
return new VisualWorkerMessageSegmentacaoSemanticaModel()
{
timestamp = timestamp,
height = height,
width = width,
erro_angular = erro_angular,
erro_lateral_pct = erro_lateral_pct,
status_corredor = status_corredor,
status_corredor_anterior = status_corredor_anterior,
status_corredor_debug = status_corredor_debug?.Clone(),
centros_corredor = centros_corredor?
.Select(x => x?.ToArray())
.ToList()
?? new List<double?[]>(),
larguras_px = new List<int>(larguras_px ?? new List<int>()),
};
}
}
public class VisualWorkerMessageSegmentacaoSemanticaDebugCorredorModel
{
public string origem_status { get; set; }
public StatusCarroMapa status_modelo { get; set; }
public string status_modelo_nome { get; set; }
public string status_modelo_label_name { get; set; }
public double status_modelo_conf { get; set; }
public dynamic status_modelo_probs { get; set; }
public StatusCarroMapa status_heuristico { get; set; }
public string status_heuristico_nome { get; set; }
public dynamic heuristica_debug { get; set; }
public VisualWorkerMessageSegmentacaoSemanticaDebugCorredorModel Clone()
{
return new VisualWorkerMessageSegmentacaoSemanticaDebugCorredorModel
{
origem_status = origem_status,
status_modelo = status_modelo,
status_modelo_nome = status_modelo_nome,
status_modelo_label_name = status_modelo_label_name,
status_modelo_conf = status_modelo_conf,
status_modelo_probs = CloneDynamic(status_modelo_probs),
status_heuristico = status_heuristico,
status_heuristico_nome = status_heuristico_nome,
heuristica_debug = CloneDynamic(heuristica_debug)
};
}
private static object CloneDynamic(object valor)
{
if (valor is JToken token)
return token.DeepClone();
return valor;
}
}
public class VisualWorkerMessageMatrizConfiancaModel
{
public float ts { get; set; }
public int seq { get; set; }
public int grid_w { get; set; }
public int grid_h { get; set; }
public List<float> y_range_m { get; set; } = new List<float>();
public List<float> row_dist_m { get; set; } = new List<float>();
public List<float> row_scale_x_m { get; set; } = new List<float>();
public VisualWorkerMessageMatrizConfiancaBlockModel block { get; set; } = new VisualWorkerMessageMatrizConfiancaBlockModel();
public VisualWorkerMessageMatrizConfiancaModel Clone()
{
return new VisualWorkerMessageMatrizConfiancaModel()
{
ts = ts,
seq = seq,
grid_w = grid_w,
grid_h = grid_h,
y_range_m = new List<float>(y_range_m ?? new List<float>()),
row_dist_m = new List<float>(row_dist_m ?? new List<float>()),
row_scale_x_m = new List<float>(row_scale_x_m ?? new List<float>()),
block = block?.Clone() ?? new VisualWorkerMessageMatrizConfiancaBlockModel(),
};
}
}
public class VisualWorkerMessageMatrizConfiancaBlockModel
{
public float? d_block_line_m { get; set; }
public float d_obs_true_min_m { get; set; }
public bool blocked { get; set; }
public bool blocked_raw { get; set; }
public string reason { get; set; }
public string reason_detail { get; set; }
public VisualWorkerMessageMatrizConfiancaBlockDecisionModel decision { get; set; }
public VisualWorkerMessageMatrizConfiancaBlockDecisionTrendModel trend { get; set; }
public VisualWorkerMessageMatrizConfiancaBlockModel Clone()
{
return new VisualWorkerMessageMatrizConfiancaBlockModel()
{
d_block_line_m = d_block_line_m,
d_obs_true_min_m = d_obs_true_min_m,
blocked = blocked,
blocked_raw = blocked_raw,
reason = reason,
reason_detail = reason_detail,
decision = decision?.Clone(),
trend = trend?.Clone()
};
}
}
public class VisualWorkerMessageMatrizConfiancaBlockDecisionModel
{
public bool parar { get; set; }
public float dist_necessaria { get; set; }
public float? v_max_sugerida_mps { get; set; }
public int frames_on { get; set; }
public int frames_off { get; set; }
public int N_on { get; set; }
public int N_off { get; set; }
public string mode { get; set; }
public double risk_ema { get; set; }
public int frames_risk_on { get; set; }
public VisualWorkerMessageMatrizConfiancaBlockDecisionModel Clone()
{
return new VisualWorkerMessageMatrizConfiancaBlockDecisionModel()
{
parar = parar,
dist_necessaria = dist_necessaria,
v_max_sugerida_mps = v_max_sugerida_mps,
frames_on = frames_on,
frames_off = frames_off,
N_on = N_on,
N_off = N_off,
mode = mode,
frames_risk_on = frames_risk_on,
risk_ema = risk_ema
};
}
}
public class VisualWorkerMessageMatrizConfiancaBlockDecisionTrendModel
{
public double risk_raw { get; set; }
public double risk_ema { get; set; }
public string band { get; set; }
public double delta_central { get; set; }
public double delta_side_bias { get; set; }
public double approaching_obs_m { get; set; }
public double approaching_det_m { get; set; }
public int frames_risk_on { get; set; }
public int frames_risk_off { get; set; }
public VisualWorkerMessageMatrizConfiancaBlockDecisionTrendModel Clone()
{
return new VisualWorkerMessageMatrizConfiancaBlockDecisionTrendModel()
{
risk_raw = risk_raw,
risk_ema = risk_ema,
band = band,
delta_central = delta_central,
delta_side_bias = delta_side_bias,
approaching_obs_m = approaching_obs_m,
approaching_det_m = approaching_det_m,
frames_risk_on = frames_risk_on,
frames_risk_off = frames_risk_off
};
}
}
public class VisualWorkerMessageDeteccaoModel
{
public int label_id { get; set; }
public string label { get; set; }
public double conf { get; set; }
public List<double> bbox_norm { get; set; }
public List<double> bbox_px { get; set; }
public int track_id { get; set; }
public string track_status { get; set; }
public bool tem_tracker { get; set; }
public List<double> xyz_m { get; set; }
public double? distancia_m { get; set; }
public double? lateral_m { get; set; }
public double? altura_relativa_m { get; set; }
public List<double> bbox_full { get; set; }
public VisualWorkerMessageDeteccaoModel Clone()
{
return new VisualWorkerMessageDeteccaoModel()
{
label_id = label_id,
label = label,
bbox_norm = bbox_norm != null
? new List<double>(bbox_norm)
: new List<double>(),
bbox_px = bbox_px != null
? new List<double>(bbox_px)
: new List<double>(),
conf = conf,
track_id = track_id,
track_status = track_status,
tem_tracker = tem_tracker,
xyz_m = xyz_m != null
? new List<double>(xyz_m)
: new List<double>(),
distancia_m = distancia_m,
lateral_m = lateral_m,
altura_relativa_m = altura_relativa_m,
bbox_full = bbox_full != null
? new List<double>(bbox_full)
: new List<double>(),
};
}
}
public class VisualWorkerPerformanceModel
{
public double timestamp { get; set; }
public Dictionary<string, VisualWorkerPerformanceLoopModel> loops { get; set; } = new Dictionary<string, VisualWorkerPerformanceLoopModel>();
public JObject sync { get; set; } = new JObject();
public JObject camera_cache { get; set; } = new JObject();
public VisualWorkerPerformanceCacheModel visual_cache { get; set; } = new VisualWorkerPerformanceCacheModel();
public VisualWorkerPerformancePublicacaoModel pub_debug { get; set; } = new VisualWorkerPerformancePublicacaoModel();
public JObject contadores { get; set; } = new JObject();
[JsonExtensionData]
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
public VisualWorkerPerformanceModel Clone()
{
return new VisualWorkerPerformanceModel
{
timestamp = timestamp,
loops = loops?.ToDictionary(
x => x.Key,
x => x.Value?.Clone()
) ?? new Dictionary<string, VisualWorkerPerformanceLoopModel>(),
sync = sync != null ? (JObject)sync.DeepClone() : new JObject(),
camera_cache = camera_cache != null
? (JObject)camera_cache.DeepClone()
: new JObject(),
visual_cache = visual_cache?.Clone()
?? new VisualWorkerPerformanceCacheModel(),
pub_debug = pub_debug?.Clone()
?? new VisualWorkerPerformancePublicacaoModel(),
contadores = contadores != null
? (JObject)contadores.DeepClone()
: new JObject(),
Extra = Extra?.ToDictionary(
x => x.Key,
x => x.Value?.DeepClone()
) ?? new Dictionary<string, JToken>()
};
}
}
public class VisualWorkerPerformanceLoopModel
{
public double fps_real { get; set; }
public JObject periodo_ms { get; set; } = new JObject();
public JObject latencia_ms { get; set; } = new JObject();
public Dictionary<string, JObject> metrics_ms { get; set; } = new Dictionary<string, JObject>();
[JsonExtensionData]
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
public VisualWorkerPerformanceLoopModel Clone()
{
return new VisualWorkerPerformanceLoopModel
{
fps_real = fps_real,
periodo_ms = periodo_ms != null
? (JObject)periodo_ms.DeepClone()
: new JObject(),
latencia_ms = latencia_ms != null
? (JObject)latencia_ms.DeepClone()
: new JObject(),
metrics_ms = metrics_ms?.ToDictionary(
x => x.Key,
x => x.Value != null
? (JObject)x.Value.DeepClone()
: new JObject()
) ?? new Dictionary<string, JObject>(),
Extra = Extra?.ToDictionary(
x => x.Key,
x => x.Value?.DeepClone()
) ?? new Dictionary<string, JToken>()
};
}
}
public class VisualWorkerPerformanceCacheModel
{
public double seg_ts { get; set; }
public double det_ts { get; set; }
public double grid_ts { get; set; }
public bool tem_seg { get; set; }
public bool tem_grid { get; set; }
public VisualWorkerPerformanceCacheModel Clone()
{
return (VisualWorkerPerformanceCacheModel)MemberwiseClone();
}
}
public class VisualWorkerPerformancePublicacaoModel
{
public double ts { get; set; }
public int publicou { get; set; }
public int campos { get; set; }
public double redis_ms { get; set; }
public VisualWorkerPerformancePublicacaoModel Clone()
{
return (VisualWorkerPerformancePublicacaoModel)MemberwiseClone();
}
}
public enum VisualWorkerCommandType
{
ScriptCarregado = 1,
CalibrarProfundidade = 2,
IniciarCameraManager = 3,
AtualizarSaudeCamera = 4,
GetCameraFrame = 5,
SaveCameraFrames = 6,
EnviarImagemMock = 7
}
}