Envio de dados da camera, ajuste pulverizador, ajuste alertas
This commit is contained in:
parent
c4cf9a2742
commit
6b72fed408
|
|
@ -1,7 +1,9 @@
|
||||||
using AgroBase.Models;
|
using AgroBase.Models;
|
||||||
using AgroBase.Models.Components;
|
using AgroBase.Models.Components;
|
||||||
|
using AgroBase.Models.Operadores;
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
using AgroBase.Services.Operadores;
|
using AgroBase.Services.Operadores;
|
||||||
|
using Assimp;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
|
|
@ -259,7 +261,15 @@ namespace AgroBase.Forms.IHM
|
||||||
private async Task AtualizarCameras()
|
private async Task AtualizarCameras()
|
||||||
{
|
{
|
||||||
flwCamerasSolo.Controls.Clear();
|
flwCamerasSolo.Controls.Clear();
|
||||||
ListaCameras = CameraWorkerService.GetListaCameras();
|
var cameras = CameraWorkerService.GetListaCameras();
|
||||||
|
ListaCameras = cameras.Select(x => new OAKCameraModel()
|
||||||
|
{
|
||||||
|
Index = 0,
|
||||||
|
Dispositivo = x.dispositivo,
|
||||||
|
Version = x.versao,
|
||||||
|
Name = x.modelo,
|
||||||
|
Id = x.mx_id,
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
CameraCaminho = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.Clone();
|
CameraCaminho = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.Clone();
|
||||||
CamerasSolo = new List<OAKCameraModel>(Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo);
|
CamerasSolo = new List<OAKCameraModel>(Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo);
|
||||||
|
|
|
||||||
|
|
@ -175,7 +175,7 @@ namespace AgroBase.Forms.IHM
|
||||||
var CameraSolo = Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.Count() > idx ? Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo[idx] : null;
|
var CameraSolo = Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.Count() > idx ? Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo[idx] : null;
|
||||||
lbl.ForeColor = modDesconectado || CameraSolo?.Id == null ?
|
lbl.ForeColor = modDesconectado || CameraSolo?.Id == null ?
|
||||||
Color.Black
|
Color.Black
|
||||||
: !listaCameras.Any(x => x.Id == CameraSolo.Id) ?
|
: !listaCameras.Any(x => x.mx_id == CameraSolo.Id) ?
|
||||||
Color.DarkRed :
|
Color.DarkRed :
|
||||||
Color.DarkGreen;
|
Color.DarkGreen;
|
||||||
}
|
}
|
||||||
|
|
@ -186,7 +186,7 @@ namespace AgroBase.Forms.IHM
|
||||||
var CameraCaminho = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho;
|
var CameraCaminho = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho;
|
||||||
lbl.ForeColor = modDesconectado || CameraCaminho?.Id == null ?
|
lbl.ForeColor = modDesconectado || CameraCaminho?.Id == null ?
|
||||||
Color.Black
|
Color.Black
|
||||||
: !listaCameras.Any(x => x.Id == CameraCaminho.Id)
|
: !listaCameras.Any(x => x.mx_id == CameraCaminho.Id)
|
||||||
? Color.DarkRed
|
? Color.DarkRed
|
||||||
: Color.DarkGreen;
|
: Color.DarkGreen;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ namespace AgroBase.Forms
|
||||||
private void AtualizarListaCameras()
|
private void AtualizarListaCameras()
|
||||||
{
|
{
|
||||||
cmbCameras.Items.Clear();
|
cmbCameras.Items.Clear();
|
||||||
cmbCameras.Items.AddRange(CameraWorkerService.GetListaCameras().Select(x => x.Name).ToArray());
|
cmbCameras.Items.AddRange(CameraWorkerService.GetListaCameras().Select(x => x.modelo).ToArray());
|
||||||
cmbCameras.SelectedIndex = -1;
|
cmbCameras.SelectedIndex = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
using AgroBase.Models.Modules;
|
using AgroBase.Models.Modules;
|
||||||
using AgroBase.Models.Operadores;
|
using AgroBase.Models.Operadores;
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
|
using AgroBase.Services.Operadores;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
|
@ -489,6 +490,8 @@ namespace AgroBase.Models.Operacoes
|
||||||
public LivoxModel LivoxLidar { get; set; }
|
public LivoxModel LivoxLidar { get; set; }
|
||||||
public DateTime UltimoEnvioLog { get; set; } = DateTime.MinValue;
|
public DateTime UltimoEnvioLog { get; set; } = DateTime.MinValue;
|
||||||
public List<OperacaoSensoriamentoLogErrosModel> Logs { get; set; }
|
public List<OperacaoSensoriamentoLogErrosModel> Logs { get; set; }
|
||||||
|
public List<CameraWorkerItemModel> Cameras { get; set; }
|
||||||
|
public VisualWorkerResumoModel OperadorVisual { get; set; }
|
||||||
|
|
||||||
public void Atualizar()
|
public void Atualizar()
|
||||||
{
|
{
|
||||||
|
|
@ -765,6 +768,8 @@ namespace AgroBase.Models.Operacoes
|
||||||
};
|
};
|
||||||
PerformanceNcp = sen?.DadosPerformance?.Clone();
|
PerformanceNcp = sen?.DadosPerformance?.Clone();
|
||||||
LivoxLidar = sen?.LivoxLidar?.Clone();
|
LivoxLidar = sen?.LivoxLidar?.Clone();
|
||||||
|
Cameras = CameraWorkerService.ListaCameras;
|
||||||
|
OperadorVisual = VisualWorkerService.DadosLeitura?.Resumo?.UpdateClone();
|
||||||
var l = sen?.Logs;
|
var l = sen?.Logs;
|
||||||
Logs = l != null ? l.Where(x => x.Momento >= UltimoEnvioLog).ToList() : new List<OperacaoSensoriamentoLogErrosModel>();
|
Logs = l != null ? l.Where(x => x.Momento >= UltimoEnvioLog).ToList() : new List<OperacaoSensoriamentoLogErrosModel>();
|
||||||
}
|
}
|
||||||
|
|
@ -792,6 +797,8 @@ namespace AgroBase.Models.Operacoes
|
||||||
PerformanceNcp = PerformanceNcp?.Clone(),
|
PerformanceNcp = PerformanceNcp?.Clone(),
|
||||||
LivoxLidar = LivoxLidar?.Clone(),
|
LivoxLidar = LivoxLidar?.Clone(),
|
||||||
Logs = new List<OperacaoSensoriamentoLogErrosModel>(Logs ?? new List<OperacaoSensoriamentoLogErrosModel>()),
|
Logs = new List<OperacaoSensoriamentoLogErrosModel>(Logs ?? new List<OperacaoSensoriamentoLogErrosModel>()),
|
||||||
|
Cameras = new List<CameraWorkerItemModel>(Cameras ?? new List<CameraWorkerItemModel>()),
|
||||||
|
OperadorVisual = OperadorVisual?.Clone(),
|
||||||
UltimoEnvioLog = UltimoEnvioLog
|
UltimoEnvioLog = UltimoEnvioLog
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,13 @@ namespace AgroBase.Models.Operadores
|
||||||
public bool rodando { get; set; }
|
public bool rodando { get; set; }
|
||||||
public bool tem_depth { get; set; }
|
public bool tem_depth { get; set; }
|
||||||
public bool tem_imu { get; set; }
|
public bool tem_imu { get; set; }
|
||||||
|
|
||||||
|
public bool streaming { get; set; }
|
||||||
|
public double fps { get; set; }
|
||||||
|
public int stream_w { get; set; }
|
||||||
|
public int stream_h { get; set; }
|
||||||
|
public int stream_kbps { get; set; }
|
||||||
|
|
||||||
public SaudeWorkerModel saude { get; set; }
|
public SaudeWorkerModel saude { get; set; }
|
||||||
public CameraWorkerItemPerformanceModel performance { get; set; }
|
public CameraWorkerItemPerformanceModel performance { get; set; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using AgroBase.Services.Operadores;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
@ -52,6 +53,9 @@ namespace AgroBase.Models.Operadores
|
||||||
|
|
||||||
public class VisualWorkerResumoModel
|
public class VisualWorkerResumoModel
|
||||||
{
|
{
|
||||||
|
public StatusCarroMapa StatusCarro { get; set; }
|
||||||
|
public double ErroLateral { get; set; }
|
||||||
|
|
||||||
public bool ObstaculoDetectado { get; set; } = false;
|
public bool ObstaculoDetectado { get; set; } = false;
|
||||||
public bool DeveParar { get; set; } = false;
|
public bool DeveParar { get; set; } = false;
|
||||||
public bool EnviarComandoParada { get; set; } = false;
|
public bool EnviarComandoParada { get; set; } = false;
|
||||||
|
|
@ -63,6 +67,8 @@ namespace AgroBase.Models.Operadores
|
||||||
{
|
{
|
||||||
var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual;
|
var Sonar = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual;
|
||||||
ObstaculoDetectado = (Sonar.Analises?.matriz_confianca?.block?.decision?.parar ?? false);
|
ObstaculoDetectado = (Sonar.Analises?.matriz_confianca?.block?.decision?.parar ?? false);
|
||||||
|
StatusCarro = Sonar?.Analises?.segmentacao?.status_corredor ?? StatusCarroMapa.Indefinido;
|
||||||
|
ErroLateral = Sonar?.Analises?.segmentacao?.erro_angular ?? 0;
|
||||||
|
|
||||||
if (!Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado)
|
if (!Variaveis.OperacaoEmAndamento.Parametros.Controle.SonarAtivado)
|
||||||
{
|
{
|
||||||
|
|
@ -95,6 +101,8 @@ namespace AgroBase.Models.Operadores
|
||||||
{
|
{
|
||||||
return new VisualWorkerResumoModel()
|
return new VisualWorkerResumoModel()
|
||||||
{
|
{
|
||||||
|
StatusCarro = StatusCarro,
|
||||||
|
ErroLateral = ErroLateral,
|
||||||
ObstaculoDetectado = ObstaculoDetectado,
|
ObstaculoDetectado = ObstaculoDetectado,
|
||||||
DeveParar = DeveParar,
|
DeveParar = DeveParar,
|
||||||
EnviarComandoParada = EnviarComandoParada,
|
EnviarComandoParada = EnviarComandoParada,
|
||||||
|
|
@ -102,6 +110,12 @@ namespace AgroBase.Models.Operadores
|
||||||
_comandoParadaEnviado = _comandoParadaEnviado,
|
_comandoParadaEnviado = _comandoParadaEnviado,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public VisualWorkerResumoModel UpdateClone()
|
||||||
|
{
|
||||||
|
AtualizarStatusBloqueio(false);
|
||||||
|
return Clone();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class VisualWorkerDadosModel
|
public class VisualWorkerDadosModel
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,8 @@ namespace AgroBase.Services.Operadores
|
||||||
{
|
{
|
||||||
public CameraWorkerModel DadosLeitura = new CameraWorkerModel();
|
public CameraWorkerModel DadosLeitura = new CameraWorkerModel();
|
||||||
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
|
||||||
private static List<OAKCameraModel> CamerasConectadas = new List<OAKCameraModel>();
|
private static List<CameraWorkerItemModel> CamerasConectadas = new List<CameraWorkerItemModel>();
|
||||||
|
public static List<CameraWorkerItemModel> ListaCameras => CamerasConectadas.Skip(1).ToList();
|
||||||
|
|
||||||
private bool DebugMode = true;
|
private bool DebugMode = true;
|
||||||
|
|
||||||
|
|
@ -85,15 +86,14 @@ namespace AgroBase.Services.Operadores
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static List<OAKCameraModel> GetListaCameras()
|
public static List<CameraWorkerItemModel> GetListaCameras()
|
||||||
{
|
{
|
||||||
CamerasConectadas = new List<OAKCameraModel>()
|
CamerasConectadas = new List<CameraWorkerItemModel>()
|
||||||
{
|
{
|
||||||
new OAKCameraModel()
|
new CameraWorkerItemModel()
|
||||||
{
|
{
|
||||||
Dispositivo = T_Code.Vzo,
|
dispositivo = T_Code.Vzo,
|
||||||
Index = -1,
|
modelo = "Sem Video"
|
||||||
Name = "Sem Video"
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -107,13 +107,7 @@ namespace AgroBase.Services.Operadores
|
||||||
var camera_str = RedisService.Get(RedisService.CamKey(cam.Key));
|
var camera_str = RedisService.Get(RedisService.CamKey(cam.Key));
|
||||||
var camera = JsonConvert.DeserializeObject<CameraWorkerItemModel>(camera_str);
|
var camera = JsonConvert.DeserializeObject<CameraWorkerItemModel>(camera_str);
|
||||||
if (camera.mx_id == null) continue;
|
if (camera.mx_id == null) continue;
|
||||||
CamerasConectadas.Add(new OAKCameraModel()
|
CamerasConectadas.Add(camera);
|
||||||
{
|
|
||||||
Dispositivo = camera.dispositivo,
|
|
||||||
Version = camera.versao,
|
|
||||||
Name = camera.modelo,
|
|
||||||
Id = camera.mx_id,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -469,22 +469,22 @@ namespace AgroBase.Services
|
||||||
GeneralJoystick.AtualizaDispositivo();
|
GeneralJoystick.AtualizaDispositivo();
|
||||||
}
|
}
|
||||||
|
|
||||||
var _Cameras = CameraWorkerService.GetListaCameras().Where(x => x.Index > -1).ToList();
|
var _Cameras = CameraWorkerService.ListaCameras;
|
||||||
foreach (var cam in _Cameras)
|
foreach (var cam in _Cameras)
|
||||||
{
|
{
|
||||||
var disp = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == cam.Dispositivo);
|
var disp = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == cam.dispositivo);
|
||||||
if (disp == null) continue;
|
if (disp == null) continue;
|
||||||
|
|
||||||
var added = DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == cam.Dispositivo);
|
var added = DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == cam.dispositivo);
|
||||||
bool connected = disp.status != StatusModulo.Desconectado;
|
bool connected = disp.status != StatusModulo.Desconectado;
|
||||||
|
|
||||||
if (added == null && connected)
|
if (added == null && connected)
|
||||||
{
|
{
|
||||||
DispositivosMapeados.Add(new DispositivoDetalhesModel()
|
DispositivosMapeados.Add(new DispositivoDetalhesModel()
|
||||||
{
|
{
|
||||||
Dispositivo = cam.Dispositivo,
|
Dispositivo = cam.dispositivo,
|
||||||
Endereco = "USB",
|
Endereco = "USB",
|
||||||
Versao = cam.Version
|
Versao = cam.versao
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (added != null && !connected)
|
else if (added != null && !connected)
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,7 @@ namespace OperationControl.Controls
|
||||||
|
|
||||||
public MapMarkerManager markers;
|
public MapMarkerManager markers;
|
||||||
public event EventHandler<MapMarkerManager.MarkerClickedEventArgs>? MarkerClicked;
|
public event EventHandler<MapMarkerManager.MarkerClickedEventArgs>? MarkerClicked;
|
||||||
|
private bool SemRoverFocado => VariaveisControleOperacao.RoverEmFoco == null;
|
||||||
protected virtual void OnMarkerClicked(string markerId)
|
protected virtual void OnMarkerClicked(string markerId)
|
||||||
{
|
{
|
||||||
if (markerId == null) markers?.ClearMarkerFocused();
|
if (markerId == null) markers?.ClearMarkerFocused();
|
||||||
|
|
@ -532,7 +533,8 @@ namespace OperationControl.Controls
|
||||||
|
|
||||||
if (info?.Layer == markers.Layer && feat != null && markers != null && markers.TryGetIdFromFeature(feat, out var id))
|
if (info?.Layer == markers.Layer && feat != null && markers != null && markers.TryGetIdFromFeature(feat, out var id))
|
||||||
{
|
{
|
||||||
OnMarkerClicked(id);
|
if (SemRoverFocado)
|
||||||
|
OnMarkerClicked(id);
|
||||||
}
|
}
|
||||||
else if (info?.Layer == MapaPlantacao_Layer && feat is MIFeature roadFeature)
|
else if (info?.Layer == MapaPlantacao_Layer && feat is MIFeature roadFeature)
|
||||||
{
|
{
|
||||||
|
|
@ -556,7 +558,7 @@ namespace OperationControl.Controls
|
||||||
var info = Mapa.GetMapInfo(sp, Mapa.Map.Layers /*, 18*/);
|
var info = Mapa.GetMapInfo(sp, Mapa.Map.Layers /*, 18*/);
|
||||||
var feat = info?.Feature;
|
var feat = info?.Feature;
|
||||||
|
|
||||||
if (feat != null && markers != null && markers.TryGetIdFromFeature(feat, out _))
|
if (feat != null && markers != null && markers.TryGetIdFromFeature(feat, out _) && SemRoverFocado)
|
||||||
Mapa.Cursor = System.Windows.Input.Cursors.Hand;
|
Mapa.Cursor = System.Windows.Input.Cursors.Hand;
|
||||||
else if (feat != null && info?.Layer == MapaPlantacao_Layer && feat is MIFeature roadFeature && ParametrizandoOperacao)
|
else if (feat != null && info?.Layer == MapaPlantacao_Layer && feat is MIFeature roadFeature && ParametrizandoOperacao)
|
||||||
Mapa.Cursor = System.Windows.Input.Cursors.Hand;
|
Mapa.Cursor = System.Windows.Input.Cursors.Hand;
|
||||||
|
|
|
||||||
|
|
@ -79,15 +79,34 @@
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<!-- ===================== CENTRO ===================== -->
|
<!-- ===================== CENTRO ===================== -->
|
||||||
<Grid Grid.Column="1" Margin="0,0,10,0">
|
<DockPanel Grid.Column="1" Margin="0,0,10,0" LastChildFill="True">
|
||||||
<Grid.RowDefinitions>
|
|
||||||
<RowDefinition Height="85"/>
|
|
||||||
<RowDefinition Height="33"/>
|
|
||||||
</Grid.RowDefinitions>
|
|
||||||
|
|
||||||
<!-- área dos bicos -->
|
<!-- solo sempre colado embaixo -->
|
||||||
<Grid Grid.Row="0" x:Name="AreaTecnica">
|
<Grid DockPanel.Dock="Bottom" Height="10" ClipToBounds="True" Margin="8,0,8,0">
|
||||||
|
<Border Background="{StaticResource CropBrush}" CornerRadius="0,0,8,8"/>
|
||||||
|
|
||||||
|
<Border HorizontalAlignment="Left" Background="{StaticResource GroundBrush}" CornerRadius="0,0,8,8">
|
||||||
|
<Border.Width>
|
||||||
|
<MultiBinding Converter="{StaticResource RuaWidthFisicaConverter}">
|
||||||
|
<Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualWidth"/>
|
||||||
|
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="LarguraRuaCm"/>
|
||||||
|
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="ComprimentoBarraCm"/>
|
||||||
|
</MultiBinding>
|
||||||
|
</Border.Width>
|
||||||
|
|
||||||
|
<Border.Margin>
|
||||||
|
<MultiBinding Converter="{StaticResource RuaOffsetFisicaConverter}">
|
||||||
|
<Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualWidth"/>
|
||||||
|
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="ErroLateralCm"/>
|
||||||
|
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="LarguraRuaCm"/>
|
||||||
|
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="ComprimentoBarraCm"/>
|
||||||
|
</MultiBinding>
|
||||||
|
</Border.Margin>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<!-- área dos bicos ocupa o restante -->
|
||||||
|
<Grid x:Name="AreaTecnica">
|
||||||
<Grid VerticalAlignment="Top">
|
<Grid VerticalAlignment="Top">
|
||||||
<Grid.Margin>
|
<Grid.Margin>
|
||||||
<MultiBinding Converter="{StaticResource BarraTopConverter}" ConverterParameter="5">
|
<MultiBinding Converter="{StaticResource BarraTopConverter}" ConverterParameter="5">
|
||||||
|
|
@ -117,45 +136,21 @@
|
||||||
<ItemsControl.ItemTemplate>
|
<ItemsControl.ItemTemplate>
|
||||||
<DataTemplate DataType="{x:Type local:BicoModel}">
|
<DataTemplate DataType="{x:Type local:BicoModel}">
|
||||||
<local:BicoLequeIndicator HorizontalAlignment="Stretch"
|
<local:BicoLequeIndicator HorizontalAlignment="Stretch"
|
||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
Margin="2,0,2,0"
|
Margin="2,0,2,0"
|
||||||
AnguloControle="{Binding AnguloControle}"
|
AnguloControle="{Binding AnguloControle}"
|
||||||
OpeningAngle="{Binding OpeningAngle}"
|
OpeningAngle="{Binding OpeningAngle}"
|
||||||
IsCommandOn="{Binding IsCommandOn}"
|
IsCommandOn="{Binding IsCommandOn}"
|
||||||
IsSpraying="{Binding IsSpraying}"
|
IsSpraying="{Binding IsSpraying}"
|
||||||
Vazao="{Binding Vazao}"
|
Vazao="{Binding Vazao}"
|
||||||
TempoAtuado="{Binding TempoAtuado}"
|
TempoAtuado="{Binding TempoAtuado}"
|
||||||
Atuacoes="{Binding Atuacoes}" />
|
Atuacoes="{Binding Atuacoes}" />
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ItemsControl.ItemTemplate>
|
</ItemsControl.ItemTemplate>
|
||||||
</ItemsControl>
|
</ItemsControl>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
</DockPanel>
|
||||||
<!-- solo -->
|
|
||||||
<Grid Grid.Row="1" ClipToBounds="True" Margin="8,0,8,0">
|
|
||||||
<Border Background="{StaticResource CropBrush}" CornerRadius="0,0,8,8"/>
|
|
||||||
|
|
||||||
<Border HorizontalAlignment="Left" Background="{StaticResource GroundBrush}" CornerRadius="0,0,8,8">
|
|
||||||
<Border.Width>
|
|
||||||
<MultiBinding Converter="{StaticResource RuaWidthFisicaConverter}">
|
|
||||||
<Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualWidth"/>
|
|
||||||
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="LarguraRuaCm"/>
|
|
||||||
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="ComprimentoBarraCm"/>
|
|
||||||
</MultiBinding>
|
|
||||||
</Border.Width>
|
|
||||||
|
|
||||||
<Border.Margin>
|
|
||||||
<MultiBinding Converter="{StaticResource RuaOffsetFisicaConverter}">
|
|
||||||
<Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualWidth"/>
|
|
||||||
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="ErroLateralCm"/>
|
|
||||||
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="LarguraRuaCm"/>
|
|
||||||
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ctrl:PulverizadorIndicator}}" Path="ComprimentoBarraCm"/>
|
|
||||||
</MultiBinding>
|
|
||||||
</Border.Margin>
|
|
||||||
</Border>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<!-- ===================== DIREITA ===================== -->
|
<!-- ===================== DIREITA ===================== -->
|
||||||
<Grid Grid.Column="2">
|
<Grid Grid.Column="2">
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@ namespace OperationControl.Models
|
||||||
public T_Code Modulo { get; set; } // ex: "DIR", "SEN", "MOV"
|
public T_Code Modulo { get; set; } // ex: "DIR", "SEN", "MOV"
|
||||||
public string? Mod_ID { get; set; } // ID
|
public string? Mod_ID { get; set; } // ID
|
||||||
public string Mensagem { get; set; } // texto principal
|
public string Mensagem { get; set; } // texto principal
|
||||||
public DateTime Timestamp { get; set; } // opcional: hora do evento
|
public DateTime CriadoEm { get; set; }
|
||||||
|
public DateTime? AtualizadoEm { get; set; }
|
||||||
|
|
||||||
|
|
||||||
// Campo calculado para título (ex: "DIR — Falha no encoder")
|
// Campo calculado para título (ex: "DIR — Falha no encoder")
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ namespace OperationControl.Models
|
||||||
Dock = new DockWindow();
|
Dock = new DockWindow();
|
||||||
Dock.Show();
|
Dock.Show();
|
||||||
|
|
||||||
if (Mock)
|
if (Mock && false)
|
||||||
{
|
{
|
||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,133 @@
|
||||||
using OperationControl.ViewModels.Base;
|
using System.Collections.ObjectModel;
|
||||||
using System;
|
using System.ComponentModel;
|
||||||
using System.Collections.Generic;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Linq;
|
using static AgroBase.Models.Enums;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace OperationControl.ViewModels.Views.Operacao.Monitoramento
|
namespace OperationControl.ViewModels.Views.Operacao.Monitoramento
|
||||||
{
|
{
|
||||||
public class MonitoramentoViewModel : NotifyBase
|
public class FrameTipoItem
|
||||||
{
|
{
|
||||||
|
public TipoFrameCamera Valor { get; set; }
|
||||||
|
public string Nome { get; set; }
|
||||||
|
|
||||||
|
public override string ToString() => Nome;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MonitoramentoViewModel : INotifyPropertyChanged
|
||||||
|
{
|
||||||
|
public ObservableCollection<FrameTipoItem> CameraFrontalFrameTipos { get; set; }
|
||||||
|
public ObservableCollection<FrameTipoItem> CameraErvasFrameTipos { get; set; }
|
||||||
|
|
||||||
|
private FrameTipoItem _cameraFrontalFrameTipoSelecionado;
|
||||||
|
public FrameTipoItem CameraFrontalFrameTipoSelecionado
|
||||||
|
{
|
||||||
|
get => _cameraFrontalFrameTipoSelecionado;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_cameraFrontalFrameTipoSelecionado != value)
|
||||||
|
{
|
||||||
|
_cameraFrontalFrameTipoSelecionado = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
CameraFrontalFrameTipoAlterado?.Invoke(value?.Valor ?? default);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private FrameTipoItem _cameraErvasFrameTipoSelecionado;
|
||||||
|
public FrameTipoItem CameraErvasFrameTipoSelecionado
|
||||||
|
{
|
||||||
|
get => _cameraErvasFrameTipoSelecionado;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_cameraErvasFrameTipoSelecionado != value)
|
||||||
|
{
|
||||||
|
_cameraErvasFrameTipoSelecionado = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
CameraErvasFrameTipoAlterado?.Invoke(value?.Valor ?? default);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string CameraFrontalTitulo { get; } = "Camera Frontal";
|
||||||
|
private string _cameraFrontalStatus = "Sem dados";
|
||||||
|
public string CameraFrontalStatus
|
||||||
|
{
|
||||||
|
get => _cameraFrontalStatus;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_cameraFrontalStatus = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string CameraErvasTitulo { get; } = "Camera Ervas";
|
||||||
|
private string _cameraErvasStatus = "Sem dados";
|
||||||
|
public string CameraErvasStatus
|
||||||
|
{
|
||||||
|
get => _cameraErvasStatus;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_cameraErvasStatus = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool _cameraFrontalSemSinal = true;
|
||||||
|
public bool CameraFrontalSemSinal
|
||||||
|
{
|
||||||
|
get => _cameraFrontalSemSinal;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_cameraFrontalSemSinal = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private bool _cameraErvasSemSinal = true;
|
||||||
|
public bool CameraErvasSemSinal
|
||||||
|
{
|
||||||
|
get => _cameraErvasSemSinal;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_cameraErvasSemSinal = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public event Action<TipoFrameCamera>? CameraFrontalFrameTipoAlterado;
|
||||||
|
public event Action<TipoFrameCamera>? CameraErvasFrameTipoAlterado;
|
||||||
|
|
||||||
|
public MonitoramentoViewModel()
|
||||||
|
{
|
||||||
|
var itens = Enum.GetValues(typeof(TipoFrameCamera))
|
||||||
|
.Cast<TipoFrameCamera>()
|
||||||
|
.Select(x => new FrameTipoItem
|
||||||
|
{
|
||||||
|
Valor = x,
|
||||||
|
Nome = x.ToString()
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
CameraFrontalFrameTipos = new ObservableCollection<FrameTipoItem>(itens);
|
||||||
|
CameraErvasFrameTipos = new ObservableCollection<FrameTipoItem>(itens);
|
||||||
|
|
||||||
|
CameraFrontalFrameTipoSelecionado = CameraFrontalFrameTipos.FirstOrDefault();
|
||||||
|
CameraErvasFrameTipoSelecionado = CameraErvasFrameTipos.FirstOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AtualizarDadosCameras(double? cf_fps, double? cf_kbps, double? ct_fps, double? ct_kbps, StatusCarroMapa? status_carro, double? pct_ervas)
|
||||||
|
{
|
||||||
|
CameraFrontalStatus = $"{cf_fps ?? 0} fps • {cf_kbps ?? 0} kbps • {status_carro ?? StatusCarroMapa.Indefinido}";
|
||||||
|
CameraErvasStatus = $"{ct_fps ?? 0} fps • {ct_kbps ?? 0} kbps • {pct_ervas ?? 0:F2}% ervas";
|
||||||
|
CameraFrontalSemSinal = (cf_kbps ?? 0) == 0;
|
||||||
|
CameraErvasSemSinal = (ct_kbps ?? 0) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public event PropertyChangedEventHandler? PropertyChanged;
|
||||||
|
|
||||||
|
protected void OnPropertyChanged([CallerMemberName] string? propertyName = null)
|
||||||
|
{
|
||||||
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ namespace OperationControl.ViewModels.Views.Operacao
|
||||||
Mod_ID = modId,
|
Mod_ID = modId,
|
||||||
Severidade = severidade,
|
Severidade = severidade,
|
||||||
Mensagem = mensagem,
|
Mensagem = mensagem,
|
||||||
Timestamp = DateTime.Now
|
CriadoEm = DateTime.Now
|
||||||
};
|
};
|
||||||
|
|
||||||
AlertasAtivos.Add(alerta);
|
AlertasAtivos.Add(alerta);
|
||||||
|
|
@ -187,6 +187,11 @@ namespace OperationControl.ViewModels.Views.Operacao
|
||||||
{
|
{
|
||||||
App.Current.Dispatcher.BeginInvoke(new Action(() =>
|
App.Current.Dispatcher.BeginInvoke(new Action(() =>
|
||||||
{
|
{
|
||||||
|
string GerarChave(string roverId, T_Code modulo, string? modId) => $"{roverId}|{modulo}|{modId ?? ""}";
|
||||||
|
|
||||||
|
var agora = DateTime.Now;
|
||||||
|
|
||||||
|
// 1) Gera os alertas que DEVERIAM existir neste momento
|
||||||
var alertasEsperados = new List<AlertaModel>();
|
var alertasEsperados = new List<AlertaModel>();
|
||||||
|
|
||||||
foreach (var rover in VariaveisControleOperacao.RoversNaRede)
|
foreach (var rover in VariaveisControleOperacao.RoversNaRede)
|
||||||
|
|
@ -210,8 +215,8 @@ namespace OperationControl.ViewModels.Views.Operacao
|
||||||
Modulo = mod.modulo,
|
Modulo = mod.modulo,
|
||||||
Mod_ID = ind.label,
|
Mod_ID = ind.label,
|
||||||
Severidade = DeParaStatus(ind.status, ind.em_uso),
|
Severidade = DeParaStatus(ind.status, ind.em_uso),
|
||||||
Mensagem = string.Join(", ", ind.motivos ?? new List<string>()),
|
Mensagem = string.Join(", ", ind.motivos ?? new List<string>())
|
||||||
Timestamp = DateTime.Now
|
// NÃO define Timestamp aqui ainda
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -229,64 +234,75 @@ namespace OperationControl.ViewModels.Views.Operacao
|
||||||
Modulo = mod.modulo,
|
Modulo = mod.modulo,
|
||||||
Mod_ID = null,
|
Mod_ID = null,
|
||||||
Severidade = DeParaStatus(mod.status, mandatorio),
|
Severidade = DeParaStatus(mod.status, mandatorio),
|
||||||
Mensagem = string.Join(", ", mod.motivos ?? new List<string>()),
|
Mensagem = string.Join(", ", mod.motivos ?? new List<string>())
|
||||||
Timestamp = DateTime.Now
|
// NÃO define Timestamp aqui ainda
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string GerarChave(string roverId, T_Code modulo, string? modId)
|
|
||||||
=> $"{roverId}|{modulo}|{modId ?? ""}";
|
|
||||||
|
|
||||||
var mapaEsperado = alertasEsperados.ToDictionary(
|
var mapaEsperado = alertasEsperados.ToDictionary(
|
||||||
x => GerarChave(x.Rover_ID, x.Modulo, x.Mod_ID),
|
x => GerarChave(x.Rover_ID, x.Modulo, x.Mod_ID),
|
||||||
x => x);
|
x => x);
|
||||||
|
|
||||||
var alertasAtuais = AlertasAtivos.ToList();
|
var mapaAtual = AlertasAtivos.ToDictionary(
|
||||||
|
x => GerarChave(x.Rover_ID, x.Modulo, x.Mod_ID),
|
||||||
|
x => x);
|
||||||
|
|
||||||
// Remove os alertas que não deveriam mais existir
|
// 2) Remove os alertas que não existem mais
|
||||||
foreach (var atual in alertasAtuais)
|
var chavesParaRemover = mapaAtual.Keys
|
||||||
|
.Where(chave => !mapaEsperado.ContainsKey(chave))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var chave in chavesParaRemover)
|
||||||
{
|
{
|
||||||
var chave = GerarChave(atual.Rover_ID, atual.Modulo, atual.Mod_ID);
|
var alertaRemover = mapaAtual[chave];
|
||||||
if (!mapaEsperado.ContainsKey(chave))
|
|
||||||
{
|
|
||||||
AlertasAtivos.Remove(atual);
|
|
||||||
|
|
||||||
if (ToastAlerta == atual)
|
AlertasAtivos.Remove(alertaRemover);
|
||||||
LimparToast();
|
|
||||||
}
|
if (ToastAlerta == alertaRemover)
|
||||||
|
LimparToast();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adiciona ou atualiza os alertas esperados
|
// 3) Adiciona novos ou atualiza os existentes
|
||||||
foreach (var esperado in alertasEsperados)
|
foreach (var kv in mapaEsperado)
|
||||||
{
|
{
|
||||||
var existente = AlertasAtivos.FirstOrDefault(x =>
|
var chave = kv.Key;
|
||||||
x.Rover_ID == esperado.Rover_ID &&
|
var esperado = kv.Value;
|
||||||
x.Modulo == esperado.Modulo &&
|
|
||||||
x.Mod_ID == esperado.Mod_ID);
|
|
||||||
|
|
||||||
if (existente == null)
|
if (!mapaAtual.TryGetValue(chave, out var existente))
|
||||||
{
|
{
|
||||||
|
// Novo alerta
|
||||||
|
esperado.CriadoEm = agora;
|
||||||
AlertasAtivos.Add(esperado);
|
AlertasAtivos.Add(esperado);
|
||||||
MostrarToast(esperado);
|
MostrarToast(esperado);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Alerta já existia -> mantém Timestamp original
|
||||||
bool mudou =
|
bool mudou =
|
||||||
existente.Mensagem != esperado.Mensagem ||
|
existente.Mensagem != esperado.Mensagem ||
|
||||||
existente.Severidade != esperado.Severidade;
|
existente.Severidade != esperado.Severidade;
|
||||||
|
|
||||||
existente.Mensagem = esperado.Mensagem;
|
|
||||||
existente.Severidade = esperado.Severidade;
|
|
||||||
|
|
||||||
if (mudou)
|
if (mudou)
|
||||||
{
|
{
|
||||||
existente.Timestamp = DateTime.Now;
|
existente.Mensagem = esperado.Mensagem;
|
||||||
|
existente.Severidade = esperado.Severidade;
|
||||||
|
|
||||||
|
// Se quiser que Timestamp represente "última mudança", mantém isso:
|
||||||
|
existente.AtualizadoEm = agora;
|
||||||
|
|
||||||
MostrarToast(existente);
|
MostrarToast(existente);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ordenado = AlertasAtivos.OrderByDescending(x => x.AtualizadoEm ?? x.CriadoEm).ToList();
|
||||||
|
AlertasAtivos.Clear();
|
||||||
|
foreach (var a in ordenado)
|
||||||
|
{
|
||||||
|
AlertasAtivos.Add(a);
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ using AgroBase.Models.Operacoes;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using OperationControl.ViewModels.Views.Operacao;
|
using OperationControl.ViewModels.Views.Operacao;
|
||||||
using OperationControl.Controls;
|
using OperationControl.Controls;
|
||||||
using static OpenTK.Graphics.OpenGL.GL;
|
|
||||||
|
|
||||||
namespace OperationControl.ViewModels
|
namespace OperationControl.ViewModels
|
||||||
{
|
{
|
||||||
|
|
@ -528,15 +527,17 @@ namespace OperationControl.ViewModels
|
||||||
var obj = rover.DadosLeitura;
|
var obj = rover.DadosLeitura;
|
||||||
if (obj == null) return;
|
if (obj == null) return;
|
||||||
|
|
||||||
|
// MAPA
|
||||||
var simulacao = obj.Controle?.SimulacaoMPC?.Select(x => new double[] { x.longitude, x.latitude })?.ToList();
|
var simulacao = obj.Controle?.SimulacaoMPC?.Select(x => new double[] { x.longitude, x.latitude })?.ToList();
|
||||||
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerPosition(rover.RoverId, lat: obj.Gnss?.Latitude, lon: obj.Gnss?.Longitude, heading: obj.Gnss?.OrientacaoReal, predict: simulacao);
|
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerPosition(rover.RoverId, lat: obj.Gnss?.Latitude, lon: obj.Gnss?.Longitude, heading: obj.Gnss?.OrientacaoReal, predict: simulacao);
|
||||||
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerInfo(rover.RoverId, status: obj.Operacao?.Status ?? AgroBase.Models.Enums.StatusOperacao.NaoIniciado);
|
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerInfo(rover.RoverId, status: obj.Operacao?.Status ?? AgroBase.Models.Enums.StatusOperacao.NaoIniciado);
|
||||||
|
|
||||||
//_viewOperacaoBottom?._vm?.AtualizarListaAlertasRoverSelecionado(rover.RoverId);
|
// ALERTAS
|
||||||
_viewOperacaoBottom?._vm?.AtualizarListaAlertasTodosRovers();
|
_viewOperacaoBottom?._vm?.AtualizarListaAlertasTodosRovers();
|
||||||
|
|
||||||
if (rover.RoverId != VariaveisControleOperacao.SelectedRoverId) return;
|
if (rover.RoverId != VariaveisControleOperacao.SelectedRoverId) return;
|
||||||
|
|
||||||
|
// ESQUERDA
|
||||||
var conexao = obj.ModulosSaude?.FirstOrDefault(x => x.modulo == AgroBase.Models.Enums.T_Code.Ipb);
|
var conexao = obj.ModulosSaude?.FirstOrDefault(x => x.modulo == AgroBase.Models.Enums.T_Code.Ipb);
|
||||||
double c = conexao?.saude ?? 0;
|
double c = conexao?.saude ?? 0;
|
||||||
double conexao_latencia = conexao?.detalhes?["avg_rtt"]?.Value<double>() ?? 0.0;
|
double conexao_latencia = conexao?.detalhes?["avg_rtt"]?.Value<double>() ?? 0.0;
|
||||||
|
|
@ -557,6 +558,7 @@ namespace OperationControl.ViewModels
|
||||||
$"{obj.Gnss?.QualidadeFix ?? AgroBase.Models.Enums.TiposCorrecaoGPS.SemCorrecao} {obj.Gnss?.PrecisaoCm:F2} cm"
|
$"{obj.Gnss?.QualidadeFix ?? AgroBase.Models.Enums.TiposCorrecaoGPS.SemCorrecao} {obj.Gnss?.PrecisaoCm:F2} cm"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// DIREITA (RESUMO)
|
||||||
_viewOperacaoRight?._vm?.AtualizarResumo(r =>
|
_viewOperacaoRight?._vm?.AtualizarResumo(r =>
|
||||||
{
|
{
|
||||||
r.Operacao = (obj.Operacao?.Liberada ?? false) ? "🔓 Liberada" : "🔒 Bloqueada";
|
r.Operacao = (obj.Operacao?.Liberada ?? false) ? "🔓 Liberada" : "🔒 Bloqueada";
|
||||||
|
|
@ -580,14 +582,16 @@ namespace OperationControl.ViewModels
|
||||||
r.InfestacaoPercentual = obj.Atuador?.PercentualErvasTerreno ?? 0;
|
r.InfestacaoPercentual = obj.Atuador?.PercentualErvasTerreno ?? 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// DIAGNOSTICO
|
||||||
_viewOperacaoCenter?.Diagnostico?._vm?.AtualizarDados(rover);
|
_viewOperacaoCenter?.Diagnostico?._vm?.AtualizarDados(rover);
|
||||||
_viewOperacaoCenter?.Diagnostico?.AtualizarGraficos();
|
_viewOperacaoCenter?.Diagnostico?.AtualizarGraficos();
|
||||||
|
|
||||||
|
// PULVERIZADOR
|
||||||
var bomba = obj.Atuador?.Bombas?.FirstOrDefault();
|
var bomba = obj.Atuador?.Bombas?.FirstOrDefault();
|
||||||
var ATU = _viewOperacaoCenter.Monitoramento.Pulverizador;
|
var ATU = _viewOperacaoCenter.Monitoramento.Pulverizador;
|
||||||
ATU.ComprimentoBarraCm = AgroBase.Models.VariaveisEquipamento.ComprimentoBarraPulverizadoraCm;
|
ATU.ComprimentoBarraCm = AgroBase.Models.VariaveisEquipamento.ComprimentoBarraPulverizadoraCm;
|
||||||
ATU.DistanciaEntreBicosCm = AgroBase.Models.VariaveisEquipamento.DistanciaEntreBicosCm;
|
ATU.DistanciaEntreBicosCm = AgroBase.Models.VariaveisEquipamento.DistanciaEntreBicosCm;
|
||||||
ATU.AlturaBarra = obj?.Controle?.AlturaBarra ?? AgroBase.Models.VariaveisEquipamento.AlturaBarraPulverizadoraCm;
|
//ATU.AlturaBarra = obj?.Controle?.AlturaBarra ?? AgroBase.Models.VariaveisEquipamento.AlturaBarraPulverizadoraCm;
|
||||||
ATU.IsBombaOn = bomba?.LeituraEstado ?? false;
|
ATU.IsBombaOn = bomba?.LeituraEstado ?? false;
|
||||||
ATU.PressaoLinha = obj?.Atuador?.PressaoLinhaPsi ?? 0;
|
ATU.PressaoLinha = obj?.Atuador?.PressaoLinhaPsi ?? 0;
|
||||||
ATU.VazaoInstantanea = obj?.Atuador?.VazaoInstantaneaMLs ?? 0;
|
ATU.VazaoInstantanea = obj?.Atuador?.VazaoInstantaneaMLs ?? 0;
|
||||||
|
|
@ -615,6 +619,11 @@ namespace OperationControl.ViewModels
|
||||||
bico.Atuacoes = _bc.QtdAtuacoes;
|
bico.Atuacoes = _bc.QtdAtuacoes;
|
||||||
bico.TempoAtuado = _bc.TempoAtuado / 1000.0;
|
bico.TempoAtuado = _bc.TempoAtuado / 1000.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CAMERAS
|
||||||
|
var camera_snr = obj?.Cameras?.FirstOrDefault(x => x.dispositivo == AgroBase.Models.Enums.T_Code.Snr);
|
||||||
|
var camera_cam = obj?.Cameras?.FirstOrDefault(x => x.dispositivo == AgroBase.Models.Enums.T_Code.Cam);
|
||||||
|
_viewOperacaoCenter?.Monitoramento?._vm?.AtualizarDadosCameras(camera_snr?.fps, camera_snr?.stream_kbps, camera_cam?.fps, camera_cam?.stream_kbps, obj?.OperadorVisual?.StatusCarro, obj?.Atuador?.PercentualErvasNoRadar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,10 @@
|
||||||
d:DesignHeight="900"
|
d:DesignHeight="900"
|
||||||
d:DesignWidth="1600">
|
d:DesignWidth="1600">
|
||||||
|
|
||||||
|
<UserControl.Resources>
|
||||||
|
<BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
|
||||||
|
</UserControl.Resources>
|
||||||
|
|
||||||
<Grid Margin="12">
|
<Grid Margin="12">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="2.2*"/>
|
<RowDefinition Height="2.2*"/>
|
||||||
|
|
@ -21,13 +25,7 @@
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<!-- CÂMERA FRONTAL -->
|
<!-- CÂMERA FRONTAL -->
|
||||||
<Border Grid.Row="0" Grid.Column="0"
|
<Border Grid.Row="0" Grid.Column="0" Margin="0,0,6,6" Padding="10" CornerRadius="10" Background="#202020" BorderBrush="#353535" BorderThickness="1">
|
||||||
Margin="0,0,6,6"
|
|
||||||
Padding="10"
|
|
||||||
CornerRadius="10"
|
|
||||||
Background="#202020"
|
|
||||||
BorderBrush="#353535"
|
|
||||||
BorderThickness="1">
|
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
|
|
@ -36,49 +34,23 @@
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<DockPanel Grid.Row="0" Margin="0,0,0,8">
|
<DockPanel Grid.Row="0" Margin="0,0,0,8">
|
||||||
<TextBlock Text="Câmera frontal"
|
<TextBlock Text="{Binding CameraFrontalTitulo}" DockPanel.Dock="Left" FontSize="12" FontWeight="SemiBold" Foreground="#E6E6E6" VerticalAlignment="Center" Margin="0,0,10,0"/>
|
||||||
DockPanel.Dock="Left"
|
|
||||||
FontSize="12"
|
|
||||||
FontWeight="SemiBold"
|
|
||||||
Foreground="#E6E6E6"
|
|
||||||
VerticalAlignment="Center"/>
|
|
||||||
|
|
||||||
<ComboBox x:Name="cmbCameraFrontalFrameTipo"
|
<ComboBox Width="130" Height="26" HorizontalAlignment="Right" ItemsSource="{Binding CameraFrontalFrameTipos}" SelectedItem="{Binding CameraFrontalFrameTipoSelecionado, Mode=TwoWay}" DisplayMemberPath="Nome"/>
|
||||||
Width="130"
|
|
||||||
Height="26"
|
|
||||||
HorizontalAlignment="Right"
|
|
||||||
SelectionChanged="cmbCameraFrontalFrameTipo_SelectionChanged"/>
|
|
||||||
|
|
||||||
<TextBlock Text="12 fps • 230 kbps • CaminhandoRua"
|
<TextBlock Text="{Binding CameraFrontalStatus}" Margin="12,0,8,0" Foreground="#AFAFAF" FontSize="11" VerticalAlignment="Center" HorizontalAlignment="Right"/>
|
||||||
Margin="12,0,8,0"
|
|
||||||
Foreground="#AFAFAF"
|
|
||||||
FontSize="11"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
HorizontalAlignment="Right"/>
|
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
|
|
||||||
<Grid Grid.Row="1" Background="Black">
|
<Grid Grid.Row="1" Background="Black">
|
||||||
<TextBlock Text="SEM SINAL"
|
<TextBlock Text="SEM SINAL" Foreground="Gray" FontSize="18" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding CameraFrontalSemSinal, Converter={StaticResource BoolToVisibilityConverter}}"/>
|
||||||
Foreground="Gray"
|
|
||||||
FontSize="18"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
VerticalAlignment="Center"/>
|
|
||||||
|
|
||||||
<Image x:Name="imgVideoFront"
|
<Image x:Name="imgVideoFront" Stretch="Uniform" RenderOptions.BitmapScalingMode="LowQuality"/>
|
||||||
Stretch="Uniform"
|
|
||||||
RenderOptions.BitmapScalingMode="LowQuality"/>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
<!-- CÂMERA DE ERVAS -->
|
<!-- CÂMERA DE ERVAS -->
|
||||||
<Border Grid.Row="0" Grid.Column="1"
|
<Border Grid.Row="0" Grid.Column="1" Margin="6,0,0,6" Padding="10" CornerRadius="10" Background="#202020" BorderBrush="#353535" BorderThickness="1">
|
||||||
Margin="6,0,0,6"
|
|
||||||
Padding="10"
|
|
||||||
CornerRadius="10"
|
|
||||||
Background="#202020"
|
|
||||||
BorderBrush="#353535"
|
|
||||||
BorderThickness="1">
|
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
|
|
@ -87,15 +59,15 @@
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<DockPanel Grid.Row="0" Margin="0,0,0,8">
|
<DockPanel Grid.Row="0" Margin="0,0,0,8">
|
||||||
<TextBlock Text="Câmera de ervas" DockPanel.Dock="Left" FontSize="12" FontWeight="SemiBold" Foreground="#E6E6E6" VerticalAlignment="Center"/>
|
<TextBlock Text="{Binding CameraErvasTitulo}" DockPanel.Dock="Left" FontSize="12" FontWeight="SemiBold" Foreground="#E6E6E6" VerticalAlignment="Center" Margin="0,0,10,0"/>
|
||||||
|
|
||||||
<ComboBox x:Name="cmbCameraTraseiraFrameTipo" Width="130" Height="26" HorizontalAlignment="Right" SelectionChanged="cmbCameraTraseiraFrameTipo_SelectionChanged"/>
|
<ComboBox Width="130" Height="26" HorizontalAlignment="Right" ItemsSource="{Binding CameraErvasFrameTipos}" SelectedItem="{Binding CameraErvasFrameTipoSelecionado, Mode=TwoWay}" DisplayMemberPath="Nome"/>
|
||||||
|
|
||||||
<TextBlock Text="10 fps • 193 kbps • 5,41% erva • 0,00% cana" Margin="12,0,8,0" Foreground="#AFAFAF" FontSize="11" VerticalAlignment="Center" HorizontalAlignment="Right"/>
|
<TextBlock Text="{Binding CameraErvasStatus}" Margin="12,0,8,0" Foreground="#AFAFAF" FontSize="11" VerticalAlignment="Center" HorizontalAlignment="Right"/>
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
|
|
||||||
<Grid Grid.Row="1" Background="Black">
|
<Grid Grid.Row="1" Background="Black">
|
||||||
<TextBlock Text="SEM SINAL" Foreground="Gray" FontSize="18" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
<TextBlock Text="SEM SINAL" Foreground="Gray" FontSize="18" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding CameraErvasSemSinal, Converter={StaticResource BoolToVisibilityConverter}}"/>
|
||||||
|
|
||||||
<Image x:Name="imgVideoWeed" Stretch="Uniform" RenderOptions.BitmapScalingMode="LowQuality"/>
|
<Image x:Name="imgVideoWeed" Stretch="Uniform" RenderOptions.BitmapScalingMode="LowQuality"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
@ -120,18 +92,12 @@
|
||||||
<!-- ÁREA DIREITA INFERIOR -->
|
<!-- ÁREA DIREITA INFERIOR -->
|
||||||
<Grid Grid.Row="1" Grid.Column="1" Margin="6,6,0,0">
|
<Grid Grid.Row="1" Grid.Column="1" Margin="6,6,0,0">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="1.15*"/>
|
<RowDefinition Height="1.45*"/>
|
||||||
<RowDefinition Height="0.85*"/>
|
<RowDefinition Height="0.55*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<!-- PULVERIZADOR -->
|
<!-- PULVERIZADOR -->
|
||||||
<Border Grid.Row="0"
|
<Border Grid.Row="0" Margin="0,0,0,6" Padding="10" CornerRadius="10" Background="#202020" BorderBrush="#353535" BorderThickness="1">
|
||||||
Margin="0,0,0,6"
|
|
||||||
Padding="10"
|
|
||||||
CornerRadius="10"
|
|
||||||
Background="#202020"
|
|
||||||
BorderBrush="#353535"
|
|
||||||
BorderThickness="1">
|
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
|
|
@ -139,17 +105,9 @@
|
||||||
<RowDefinition Height="*"/>
|
<RowDefinition Height="*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<TextBlock Grid.Row="0"
|
<TextBlock Grid.Row="0" Text="Pulverizador" Margin="0,0,0,8" FontSize="12" FontWeight="SemiBold" Foreground="#E6E6E6"/>
|
||||||
Text="Pulverizador"
|
|
||||||
Margin="0,0,0,8"
|
|
||||||
FontSize="12"
|
|
||||||
FontWeight="SemiBold"
|
|
||||||
Foreground="#E6E6E6"/>
|
|
||||||
|
|
||||||
<controls:PulverizadorIndicator Grid.Row="1"
|
<controls:PulverizadorIndicator Grid.Row="1" x:Name="areaPulverizador" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
|
||||||
x:Name="areaPulverizador"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Stretch"/>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
|
|
@ -164,7 +122,7 @@
|
||||||
|
|
||||||
<TextBlock Grid.Row="0" Text="Ações rápidas" Margin="0,0,0,8" FontSize="12" FontWeight="SemiBold" Foreground="#E6E6E6"/>
|
<TextBlock Grid.Row="0" Text="Ações rápidas" Margin="0,0,0,8" FontSize="12" FontWeight="SemiBold" Foreground="#E6E6E6"/>
|
||||||
|
|
||||||
<UniformGrid Grid.Row="1" Rows="2" Columns="2" Margin="0,4,0,0">
|
<UniformGrid Grid.Row="1" Rows="1" Columns="4" Margin="0,4,0,0">
|
||||||
<Button Content="Retorno à base" Margin="4"/>
|
<Button Content="Retorno à base" Margin="4"/>
|
||||||
<Button Content="Parametrização" Margin="4"/>
|
<Button Content="Parametrização" Margin="4"/>
|
||||||
<Button Content="Pausar operação" Margin="4"/>
|
<Button Content="Pausar operação" Margin="4"/>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
using OperationControl.Controls;
|
using OperationControl.Controls;
|
||||||
using OperationControl.Models;
|
using OperationControl.Models;
|
||||||
using OperationControl.ViewModels.Views.Operacao.Monitoramento;
|
using OperationControl.ViewModels.Views.Operacao.Monitoramento;
|
||||||
using System.Windows.Controls;
|
|
||||||
|
|
||||||
namespace OperationControl.Views.Operacao
|
namespace OperationControl.Views.Operacao
|
||||||
{
|
{
|
||||||
|
|
@ -25,15 +24,8 @@ namespace OperationControl.Views.Operacao
|
||||||
videoFront = new TcpVideoReceiver(5000, imgVideoFront);
|
videoFront = new TcpVideoReceiver(5000, imgVideoFront);
|
||||||
videoWeed = new TcpVideoReceiver(5002, imgVideoWeed);
|
videoWeed = new TcpVideoReceiver(5002, imgVideoWeed);
|
||||||
|
|
||||||
cmbCameraFrontalFrameTipo.Items.Clear();
|
_vm.CameraFrontalFrameTipoAlterado += _vm_CameraFrontalFrameTipoAlterado;
|
||||||
foreach (var m in Enum.GetNames(typeof(AgroBase.Models.Enums.TipoFrameCamera)))
|
_vm.CameraErvasFrameTipoAlterado += _vm_CameraErvasFrameTipoAlterado;
|
||||||
cmbCameraFrontalFrameTipo.Items.Add(m);
|
|
||||||
cmbCameraFrontalFrameTipo.SelectedIndex = 0;
|
|
||||||
|
|
||||||
cmbCameraTraseiraFrameTipo.Items.Clear();
|
|
||||||
foreach (var m in Enum.GetNames(typeof(AgroBase.Models.Enums.TipoFrameCamera)))
|
|
||||||
cmbCameraTraseiraFrameTipo.Items.Add(m);
|
|
||||||
cmbCameraTraseiraFrameTipo.SelectedIndex = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region MAPA
|
#region MAPA
|
||||||
|
|
@ -52,9 +44,11 @@ namespace OperationControl.Views.Operacao
|
||||||
|
|
||||||
#region CAMERA FRONTAL
|
#region CAMERA FRONTAL
|
||||||
|
|
||||||
private void cmbCameraFrontalFrameTipo_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
private void _vm_CameraFrontalFrameTipoAlterado(AgroBase.Models.Enums.TipoFrameCamera tipo)
|
||||||
{
|
{
|
||||||
|
if (!IsLoaded) return;
|
||||||
if (VariaveisControleOperacao.SelectedRoverId == VariaveisControleOperacao.BaseMarkerID) return;
|
if (VariaveisControleOperacao.SelectedRoverId == VariaveisControleOperacao.BaseMarkerID) return;
|
||||||
|
|
||||||
PararStreamCameraFrontal();
|
PararStreamCameraFrontal();
|
||||||
IniciarStreamCameraFrontal();
|
IniciarStreamCameraFrontal();
|
||||||
}
|
}
|
||||||
|
|
@ -62,22 +56,28 @@ namespace OperationControl.Views.Operacao
|
||||||
public void IniciarStreamCameraFrontal()
|
public void IniciarStreamCameraFrontal()
|
||||||
{
|
{
|
||||||
videoFront.Iniciar();
|
videoFront.Iniciar();
|
||||||
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, true, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraFrontalFrameTipo.SelectedIndex));
|
var tipo = _vm.CameraFrontalFrameTipoSelecionado?.Valor ?? AgroBase.Models.Enums.TipoFrameCamera.Rgb;
|
||||||
|
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, true, tipo);
|
||||||
|
//_vm.CameraFrontalSemSinal = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PararStreamCameraFrontal(bool finalizar = false)
|
public void PararStreamCameraFrontal(bool finalizar = false)
|
||||||
{
|
{
|
||||||
videoFront.Parar();
|
videoFront.Parar();
|
||||||
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, false, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraFrontalFrameTipo.SelectedIndex));
|
var tipo = _vm.CameraFrontalFrameTipoSelecionado?.Valor ?? AgroBase.Models.Enums.TipoFrameCamera.Rgb;
|
||||||
|
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Snr, false, tipo);
|
||||||
|
//_vm.CameraFrontalSemSinal = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CAMERA ERVAS
|
#region CAMERA ERVAS
|
||||||
|
|
||||||
private void cmbCameraTraseiraFrameTipo_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
private void _vm_CameraErvasFrameTipoAlterado(AgroBase.Models.Enums.TipoFrameCamera tipo)
|
||||||
{
|
{
|
||||||
|
if (!IsLoaded) return;
|
||||||
if (VariaveisControleOperacao.SelectedRoverId == VariaveisControleOperacao.BaseMarkerID) return;
|
if (VariaveisControleOperacao.SelectedRoverId == VariaveisControleOperacao.BaseMarkerID) return;
|
||||||
|
|
||||||
PararStreamCameraErvas();
|
PararStreamCameraErvas();
|
||||||
IniciarStreamCameraErvas();
|
IniciarStreamCameraErvas();
|
||||||
}
|
}
|
||||||
|
|
@ -85,13 +85,17 @@ namespace OperationControl.Views.Operacao
|
||||||
public void IniciarStreamCameraErvas()
|
public void IniciarStreamCameraErvas()
|
||||||
{
|
{
|
||||||
videoWeed.Iniciar();
|
videoWeed.Iniciar();
|
||||||
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, true, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraTraseiraFrameTipo.SelectedIndex));
|
var tipo = _vm.CameraErvasFrameTipoSelecionado?.Valor ?? AgroBase.Models.Enums.TipoFrameCamera.Rgb;
|
||||||
|
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, true, tipo);
|
||||||
|
//_vm.CameraErvasSemSinal = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PararStreamCameraErvas(bool finalizar = false)
|
public void PararStreamCameraErvas(bool finalizar = false)
|
||||||
{
|
{
|
||||||
videoWeed.Parar();
|
videoWeed.Parar();
|
||||||
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, false, ((AgroBase.Models.Enums.TipoFrameCamera)cmbCameraTraseiraFrameTipo.SelectedIndex));
|
var tipo = _vm.CameraErvasFrameTipoSelecionado?.Valor ?? AgroBase.Models.Enums.TipoFrameCamera.Rgb;
|
||||||
|
VariaveisControleOperacao.EnviarComandoTransmissaoVideo(AgroBase.Models.Enums.T_Code.Cam, false, tipo);
|
||||||
|
//_vm.CameraErvasSemSinal = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
||||||
|
|
@ -2117,7 +2117,7 @@ namespace OperationControl.Windows
|
||||||
Modulo = Modulo,
|
Modulo = Modulo,
|
||||||
Mod_ID = Mod_ID,
|
Mod_ID = Mod_ID,
|
||||||
Mensagem = Mensagem,
|
Mensagem = Mensagem,
|
||||||
Timestamp = DateTime.Now,
|
CriadoEm = DateTime.Now,
|
||||||
};
|
};
|
||||||
AlertasAtivos.Add(alerta);
|
AlertasAtivos.Add(alerta);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue