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? 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(); } } } }