agrobot_base/AgroBase/OperationControl/Mapas/Controller/MapaOperacaoController.Tele...

599 lines
14 KiB
C#

using AgroBase.Models;
using AgroBase.Models.Operacoes;
using OperationControl.Controls;
using OperationControl.Mapas.Models;
using OperationControl.Models;
using static AgroBase.Models.Enums;
namespace OperationControl.Mapas
{
public sealed partial class MapaOperacaoController
{
/*
* =========================================================
* BASE
* =========================================================
*/
public void AtualizarBase(
GPSModel? dados,
MapViewControl? mapaAtual = null)
{
if (dados == null)
return;
AtualizarSnapshotGnssLocal(dados);
_entidadeService
.DefinirBase(
_estadoDinamico,
VariaveisControleOperacao
.BaseMarkerID,
"Base",
dados.Latitude,
dados.Longitude,
dados.OrientacaoReal,
dados.LatitudeAnt,
dados.LongitudeAnt
);
if (
mapaAtual?.Mapa?.Map != null
)
{
RegistrarMapa(
mapaAtual
);
RenderizarReferenciasGnssNoMapa(
mapaAtual
);
RenderizarEntidadesDinamicasNoMapa(
mapaAtual
);
mapaAtual.Mapa.Refresh();
}
}
/*
* =========================================================
* ROVER
* =========================================================
*/
public void AtualizarRover(
OperacaoParametrosModel? rover,
MapViewControl? mapaAtual = null)
{
if (
rover == null ||
string.IsNullOrWhiteSpace(
rover.RoverId
)
)
{
return;
}
AtualizarRoverNoEstadoDinamico(
rover
);
AtualizarMovimentoRover(
rover
);
if (
mapaAtual?.Mapa?.Map != null
)
{
RegistrarMapa(
mapaAtual
);
/*
* Ordem proposital.
*/
RenderizarReferenciasGnssNoMapa(
mapaAtual
);
RenderizarMovimentoNoMapa(
mapaAtual
);
RenderizarEntidadesDinamicasNoMapa(
mapaAtual
);
mapaAtual.Mapa.Refresh();
}
}
public void SincronizarRovers(
IEnumerable<OperacaoParametrosModel>?
rovers,
MapViewControl? mapaAtual = null)
{
var lista =
rovers?
.Where(
x =>
x != null &&
!string.IsNullOrWhiteSpace(
x.RoverId
)
)
.ToList()
??
new List<
OperacaoParametrosModel>();
var idsAtuais =
lista
.Select(
x => x.RoverId.Trim()
)
.ToHashSet(
StringComparer.OrdinalIgnoreCase
);
foreach (
var rover
in lista)
{
AtualizarRoverNoEstadoDinamico(
rover
);
}
/*
* Remove somente entidades dinâmicas.
*
* O rastro histórico continua disponível
* mesmo que um rover desapareça momentaneamente
* da lista da rede.
*/
var remover =
_estadoDinamico
.Entidades
.Where(
x =>
x.Tipo ==
MapaTipoEntidadeDinamica.Rover &&
!idsAtuais.Contains(
x.Id
)
)
.Select(
x => x.Id
)
.ToList();
foreach (
string id
in remover)
{
_entidadeService
.Remover(
_estadoDinamico,
id
);
}
if (
mapaAtual?.Mapa?.Map != null
)
{
RegistrarMapa(
mapaAtual
);
RenderizarReferenciasGnssNoMapa(
mapaAtual
);
RenderizarEntidadesDinamicasNoMapa(
mapaAtual
);
mapaAtual.Mapa.Refresh();
}
}
private void AtualizarRoverNoEstadoDinamico(
OperacaoParametrosModel rover)
{
var obj =
rover.DadosLeitura;
var gnss =
obj?.Gnss;
_entidadeService
.DefinirRover(
_estadoDinamico,
rover.RoverId,
string.IsNullOrWhiteSpace(
rover.Descricao
)
? rover.RoverId
: rover.Descricao,
gnss?.Latitude,
gnss?.Longitude,
gnss?.OrientacaoReal,
gnss?.LatitudeAnt,
gnss?.LongitudeAnt
);
if (obj?.Operacao != null)
{
_entidadeService
.AtualizarStatus(
_estadoDinamico,
rover.RoverId,
obj.Operacao.Status
);
}
}
private void AtualizarMovimentoRover(
OperacaoParametrosModel rover)
{
var dados =
rover.DadosLeitura;
if (dados == null)
return;
/*
* =====================================================
* RASTRO
* =====================================================
*/
double? latitude =
dados.Gnss?.Latitude;
double? longitude =
dados.Gnss?.Longitude;
bool coordenadaValida =
latitude.HasValue &&
longitude.HasValue &&
double.IsFinite(
latitude.Value
) &&
double.IsFinite(
longitude.Value
) &&
latitude.Value >= -90.0 &&
latitude.Value <= 90.0 &&
longitude.Value >= -180.0 &&
longitude.Value <= 180.0;
bool pulverizando =
dados.Atuador?
.Bicos?
.Any(
x =>
x.ComandoEstado ==
true
)
== true;
if (coordenadaValida)
{
_movimentoService
.AtualizarPosicao(
_estadoMovimento,
rover.RoverId,
latitude!.Value,
longitude!.Value,
pulverizando,
distanciaMinimaMetros:
0.10,
distanciaMaximaSegmentoMetros:
20.0
);
}
/*
* =====================================================
* MPC
* =====================================================
*/
var predicao =
dados.Controle?
.SimulacaoMPC?
.Where(
x =>
double.IsFinite(
x.latitude
) &&
double.IsFinite(
x.longitude
) &&
x.latitude >= -90.0 &&
x.latitude <= 90.0 &&
x.longitude >= -180.0 &&
x.longitude <= 180.0
)
.Select(
x =>
new MapaPontoWgs84(
x.latitude,
x.longitude
)
)
.ToList();
_movimentoService
.DefinirPredicao(
_estadoMovimento,
rover.RoverId,
predicao
);
}
/*
* =========================================================
* FOCO
* =========================================================
*/
public void DefinirFocoEntidade(
string? entidadeId,
MapViewControl? mapaAtual = null)
{
_entidadeService
.DefinirFoco(
_estadoDinamico,
entidadeId
);
if (
mapaAtual?.Mapa?.Map != null
)
{
RegistrarMapa(
mapaAtual
);
RenderizarEntidadesDinamicasNoMapa(
mapaAtual
);
mapaAtual.Mapa.Refresh();
}
Log(
"[MAPA][FOCO] " +
$"Id={(entidadeId ?? "NENHUM")}"
);
}
public MapaEntidadeDinamica?
ObterEntidade(
string? entidadeId)
{
if (
string.IsNullOrWhiteSpace(
entidadeId
)
)
{
return null;
}
return _entidadeService
.Obter(
_estadoDinamico,
entidadeId
);
}
/*
* =========================================================
* STATUS EXTERNO
* =========================================================
*/
public void AtualizarStatusRoverMapa(
string? roverId,
StatusOperacao status,
MapViewControl? mapaAtual = null)
{
if (
string.IsNullOrWhiteSpace(
roverId
)
)
{
return;
}
var entidade =
_entidadeService
.Obter(
_estadoDinamico,
roverId
);
if (entidade == null)
return;
_entidadeService
.AtualizarStatus(
_estadoDinamico,
roverId,
status
);
if (
mapaAtual?.Mapa?.Map != null
)
{
RenderizarEntidadesDinamicasNoMapa(
mapaAtual
);
mapaAtual.Mapa.Refresh();
}
else
{
foreach (
var mapa
in _mapasRegistrados
.ToArray())
{
RenderizarEntidadesDinamicasNoMapa(
mapa
);
mapa.Mapa.Refresh();
}
}
}
/*
* =========================================================
* MOVIMENTO
* =========================================================
*/
public void LimparMovimentoRover(
string? roverId,
bool limparPredicao = true)
{
if (
string.IsNullOrWhiteSpace(
roverId
)
)
{
return;
}
_movimentoService
.LimparRastro(
_estadoMovimento,
roverId,
limparPredicao
);
foreach (
var mapa
in _mapasRegistrados.ToArray())
{
RenderizarMovimentoNoMapa(
mapa
);
GarantirEntidadesNoTopo(
mapa
);
mapa.Mapa.Refresh();
}
}
/*
* =========================================================
* REFERÊNCIA GNSS
* =========================================================
*/
public void DefinirExibicaoReferenciasGnss(
bool mostrar)
{
if (
_mostrarReferenciasGnss ==
mostrar
)
{
return;
}
_mostrarReferenciasGnss =
mostrar;
foreach (
var mapa
in _mapasRegistrados.ToArray())
{
RenderizarReferenciasGnssNoMapa(
mapa
);
GarantirEntidadesNoTopo(
mapa
);
mapa.Mapa.Refresh();
}
}
}
}