599 lines
14 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
} |