using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using static AgroBase.Models.Enums; namespace AgroBase.Models.Operadores { public class WeedWorkerModel { 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 CameraFrames { get; set; } = new Dictionary(); public WeedWorkerAnaliseModel Analise { get; set; } = new WeedWorkerAnaliseModel(); public OAKImuModel Imu { get; set; } = new OAKImuModel(); public WeedWorkerPerformanceModel Performance { get; set; } = new WeedWorkerPerformanceModel(); public WeedWorkerAnaliseMetricasModel MetricasAnalise { get; set; } = new WeedWorkerAnaliseMetricasModel(); public WeedWorkerRedisTimestampsModel Timestamps { get; set; } = new WeedWorkerRedisTimestampsModel(); public WeedWorkerModel Clone() { return new WeedWorkerModel { Iniciado = Iniciado, IniciadoEm = IniciadoEm, Pronto = Pronto, ProntoEm = ProntoEm, UltimaMensagem = UltimaMensagem, Imu = Imu?.Clone(), Analise = Analise?.Clone() ?? new WeedWorkerAnaliseModel(), MetricasAnalise = MetricasAnalise?.Clone() ?? new WeedWorkerAnaliseMetricasModel(), Performance = Performance?.Clone() ?? new WeedWorkerPerformanceModel(), Timestamps = Timestamps?.Clone() ?? new WeedWorkerRedisTimestampsModel() }; } public void ReiniciarEstado() { Iniciado = false; IniciadoEm = DateTime.MinValue; Pronto = false; ProntoEm = DateTime.MinValue; UltimaMensagem = DateTime.MinValue; CameraFrames = new Dictionary(); Analise = new WeedWorkerAnaliseModel(); Imu = new OAKImuModel(); MetricasAnalise = new WeedWorkerAnaliseMetricasModel(); Performance = new WeedWorkerPerformanceModel(); Timestamps = new WeedWorkerRedisTimestampsModel(); } } public class WeedWorkerAnaliseMetricasModel { public double ts_analise { get; set; } public double fps_model { get; set; } public double fps_inferencia { get; set; } public double infer_ms { get; set; } public double infer_gpu_ms { get; set; } public WeedWorkerAnaliseMetricasModel Clone() { return (WeedWorkerAnaliseMetricasModel)MemberwiseClone(); } } public class WeedWorkerAnaliseEnvelopeModel { public double ts_analise { get; set; } public double fps_model { get; set; } public double fps_inferencia { get; set; } public double infer_ms { get; set; } public double infer_gpu_ms { get; set; } public WeedWorkerAnaliseModel analise { get; set; } = new WeedWorkerAnaliseModel(); [JsonExtensionData] public IDictionary Extra { get; set; } = new Dictionary(); public WeedWorkerAnaliseEnvelopeModel Clone() { return new WeedWorkerAnaliseEnvelopeModel { ts_analise = ts_analise, fps_model = fps_model, fps_inferencia = fps_inferencia, infer_ms = infer_ms, infer_gpu_ms = infer_gpu_ms, analise = analise?.Clone() ?? new WeedWorkerAnaliseModel(), Extra = Extra?.ToDictionary( x => x.Key, x => x.Value?.DeepClone() ) ?? new Dictionary() }; } } public class WeedWorkerAnaliseModel { public DateTime Timestamp { get { return FuncoesGlobais.UnixToDateTime(timestamp.ToString()); } } public double timestamp { get; set; } public int height { get; set; } public int width { get; set; } public Dictionary controle { get; set; } = new Dictionary(); public bool ervas_no_radar { get; set; } public double fracao_ervas_no_radar { get; set; } public double percentual_ervas_no_radar { get; set; } public WeedWorkerAnaliseEstatisticasModel estatisticas { get; set; } = new WeedWorkerAnaliseEstatisticasModel(); public WeedWorkerAnaliseModel Clone() { return new WeedWorkerAnaliseModel() { timestamp = timestamp, controle = new Dictionary(controle ?? new Dictionary()), height = height, width = width, ervas_no_radar = ervas_no_radar, fracao_ervas_no_radar = fracao_ervas_no_radar, percentual_ervas_no_radar = percentual_ervas_no_radar, estatisticas = estatisticas?.Clone() }; } } public class WeedWorkerAnaliseEstatisticasModel { public WeedWorkerAnaliseEstatisticasErvasModel erva { get; set; } = new WeedWorkerAnaliseEstatisticasErvasModel(); public WeedWorkerAnaliseEstatisticasBicosModel bicos { get; set; } = new WeedWorkerAnaliseEstatisticasBicosModel(); public WeedWorkerAnaliseEstatisticasModel Clone() { return new WeedWorkerAnaliseEstatisticasModel() { erva = erva?.Clone(), bicos = bicos?.Clone() }; } } public class WeedWorkerAnaliseEstatisticasErvasModel { public double frac_global { get; set; } public double ema_global { get; set; } public double thr_on_global { get; set; } public double thr_off_global { get; set; } public double vel_adj { get; set; } public WeedWorkerAnaliseEstatisticasErvasModel Clone() { return new WeedWorkerAnaliseEstatisticasErvasModel() { ema_global = ema_global, frac_global = frac_global, thr_off_global = thr_off_global, thr_on_global = thr_on_global, vel_adj = vel_adj, }; } } public class WeedWorkerAnaliseEstatisticasBicosModel { public string motivo { get; set; } public List frac_erva_por_bico { get; set; } = new List(); public List ema_frac_por_bico { get; set; } = new List(); public WeedWorkerAnaliseEstatisticasBicosFaixaModel faixa { get; set; } = new WeedWorkerAnaliseEstatisticasBicosFaixaModel(); public List larguras { get; set; } = new List(); public int shift_px { get; set; } public double thr_on_eff { get; set; } public double thr_off_eff { get; set; } public List on_cnt { get; set; } = new List(); public List off_cnt { get; set; } = new List(); public List estado_bico { get; set; } = new List(); [JsonExtensionData] public IDictionary Extra { get; set; } = new Dictionary(); public WeedWorkerAnaliseEstatisticasBicosModel Clone() { return new WeedWorkerAnaliseEstatisticasBicosModel { motivo = motivo, frac_erva_por_bico = new List(frac_erva_por_bico ?? new List()), ema_frac_por_bico = new List(ema_frac_por_bico ?? new List()), faixa = faixa?.Clone() ?? new WeedWorkerAnaliseEstatisticasBicosFaixaModel(), larguras = new List(larguras ?? new List()), shift_px = shift_px, thr_on_eff = thr_on_eff, thr_off_eff = thr_off_eff, on_cnt = new List(on_cnt ?? new List()), off_cnt = new List(off_cnt ?? new List()), estado_bico = new List(estado_bico ?? new List()), Extra = Extra?.ToDictionary( x => x.Key, x => x.Value?.DeepClone() ) ?? new Dictionary() }; } } public class WeedWorkerAnaliseEstatisticasBicosFaixaModel { public int y_top { get; set; } public int y_bot { get; set; } public WeedWorkerAnaliseEstatisticasBicosFaixaModel Clone() { return new WeedWorkerAnaliseEstatisticasBicosFaixaModel() { y_bot = y_bot, y_top = y_top, }; } } public class WeedWorkerPerformanceModel { public double timestamp { get; set; } public Dictionary loops { get; set; } = new Dictionary(); public JObject sync { get; set; } = new JObject(); public WeedWorkerPerformanceCacheModel weed_cache { get; set; } = new WeedWorkerPerformanceCacheModel(); public WeedWorkerPerformancePublicacaoModel pub_debug { get; set; } = new WeedWorkerPerformancePublicacaoModel(); public JObject contadores { get; set; } = new JObject(); [JsonExtensionData] public IDictionary Extra { get; set; } = new Dictionary(); public WeedWorkerPerformanceModel Clone() { return new WeedWorkerPerformanceModel { timestamp = timestamp, loops = loops?.ToDictionary( x => x.Key, x => x.Value?.Clone() ) ?? new Dictionary(), sync = sync != null ? (JObject)sync.DeepClone() : new JObject(), weed_cache = weed_cache?.Clone() ?? new WeedWorkerPerformanceCacheModel(), pub_debug = pub_debug?.Clone() ?? new WeedWorkerPerformancePublicacaoModel(), contadores = contadores != null ? (JObject)contadores.DeepClone() : new JObject(), Extra = Extra?.ToDictionary( x => x.Key, x => x.Value?.DeepClone() ) ?? new Dictionary() }; } } public class WeedWorkerPerformanceLoopModel { public double fps_real { get; set; } public JObject periodo_ms { get; set; } = new JObject(); public JObject latencia_ms { get; set; } = new JObject(); public Dictionary metrics_ms { get; set; } = new Dictionary(); [Newtonsoft.Json.JsonExtensionData] public IDictionary Extra { get; set; } = new Dictionary(); public WeedWorkerPerformanceLoopModel Clone() { return new WeedWorkerPerformanceLoopModel { 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(), Extra = Extra?.ToDictionary( x => x.Key, x => x.Value?.DeepClone() ) ?? new Dictionary() }; } } public class WeedWorkerPerformanceCacheModel { public double tensor_ts { get; set; } public double? tensor_age_ms { get; set; } public double tensor_consumido_ts { get; set; } public bool tem_tensor { get; set; } public WeedWorkerPerformanceCacheModel Clone() { return (WeedWorkerPerformanceCacheModel)MemberwiseClone(); } } public class WeedWorkerPerformancePublicacaoModel { public double ts { get; set; } public int publicou { get; set; } public int campos { get; set; } public double redis_ms { get; set; } public WeedWorkerPerformancePublicacaoModel Clone() { return (WeedWorkerPerformancePublicacaoModel)MemberwiseClone(); } } public class WeedWorkerRedisTimestampsModel { public double analise { get; set; } public double analise_weed { get; set; } public double performance_weed { get; set; } public WeedWorkerRedisTimestampsModel Clone() { return (WeedWorkerRedisTimestampsModel)MemberwiseClone(); } } public enum WeedWorkerCommandType { ScriptCarregado = 1, IniciarCameraManager = 2, AtualizarSaudeCamera = 3, GetCameraFrame = 4, SaveCameraFrames = 5, EnviarDadosControle = 6, ReiniciarDeteccoes = 7 } }