operationcontrol

This commit is contained in:
Diego Freitas 2026-05-21 19:50:08 -03:00
parent 7c8da7e435
commit eeb92bbbc0
5 changed files with 699 additions and 100 deletions

View File

@ -1208,7 +1208,8 @@ namespace OperationControl.Controls
public bool TryGetIdFromFeature(MIFeature feature, out string id) public bool TryGetIdFromFeature(MIFeature feature, out string id)
{ {
var f = _features.FirstOrDefault(x => x.Features.Contains(feature)); //var f = _features.FirstOrDefault(x => x.Features.Contains(feature));
var f = _features.FirstOrDefault(x => x.Features.Contains(feature) || x.MarkerShapes.Contains(feature));
if (f != null) if (f != null)
{ {
id = f.Id; id = f.Id;
@ -1221,13 +1222,29 @@ namespace OperationControl.Controls
public void SetMarkerFocused(string id, bool focused) public void SetMarkerFocused(string id, bool focused)
{ {
ClearMarkerFocused(); ClearMarkerFocused();
var f = _features.FirstOrDefault(x => x.Id == id); var f = _features.FirstOrDefault(x => x.Id == id);
if (f != null) f.Focused = focused; if (f != null)
{
f.Focused = focused;
f.UpdateData();
}
UpdateFeatures();
} }
public void ClearMarkerFocused() public void ClearMarkerFocused()
{ {
_features.ForEach(f => f.Focused = false); foreach (var f in _features)
{
if (f.Focused)
{
f.Focused = false;
f.UpdateData();
}
}
UpdateFeatures();
} }
private void UpdateFeatures() private void UpdateFeatures()
@ -1273,7 +1290,8 @@ namespace OperationControl.Controls
Lat = lat ?? 0, Lat = lat ?? 0,
Lon = lon ?? 0, Lon = lon ?? 0,
Label = lbl, Label = lbl,
Seta = new List<GeometryFeature>(), MarkerShapes = new List<MIFeature>(),
IsBase = isBase,
Status = status ?? StatusOperacao.NaoIniciado, Status = status ?? StatusOperacao.NaoIniciado,
Pulverizando = pulv ?? false, Pulverizando = pulv ?? false,
Focused = false Focused = false
@ -1339,6 +1357,7 @@ namespace OperationControl.Controls
{ {
public void CreateTrajectory(MapControl _map) public void CreateTrajectory(MapControl _map)
{ {
_mapParent = _map;
_trajProvider = new MemoryProvider(_trajFeatures); _trajProvider = new MemoryProvider(_trajFeatures);
_trajLayer = new Layer _trajLayer = new Layer
{ {
@ -1346,7 +1365,7 @@ namespace OperationControl.Controls
DataSource = _trajProvider, DataSource = _trajProvider,
Style = null Style = null
}; };
_map.Map!.Layers.Add(_trajLayer); _mapParent.Map!.Layers.Add(_trajLayer);
_predProvider = new MemoryProvider(_predFeatures); _predProvider = new MemoryProvider(_predFeatures);
_predLayer = new Layer _predLayer = new Layer
{ {
@ -1354,9 +1373,10 @@ namespace OperationControl.Controls
DataSource = _predProvider, DataSource = _predProvider,
Style = null Style = null
}; };
_map.Map!.Layers.Add(_predLayer); _mapParent.Map!.Layers.Add(_predLayer);
} }
MapControl _mapParent;
public string Id { get; set; } public string Id { get; set; }
public bool Focused { get; set; } public bool Focused { get; set; }
public bool Pulverizando { get; set; } public bool Pulverizando { get; set; }
@ -1368,7 +1388,8 @@ namespace OperationControl.Controls
public string Label { get; set; } public string Label { get; set; }
public System.Windows.Media.Color Color { get; set; } public System.Windows.Media.Color Color { get; set; }
public StatusOperacao Status { get; set; } public StatusOperacao Status { get; set; }
public List<GeometryFeature> Seta { get; set; } public List<MIFeature> MarkerShapes { get; set; }
public bool IsBase { get; set; }
public Coordinate Position { get; set; } public Coordinate Position { get; set; }
public List<double[]> Predict { get; set; } public List<double[]> Predict { get; set; }
@ -1388,13 +1409,20 @@ namespace OperationControl.Controls
var (x, y) = Mapsui.Projections.SphericalMercator.FromLonLat(Lon, Lat); var (x, y) = Mapsui.Projections.SphericalMercator.FromLonLat(Lon, Lat);
var newPoint = new MPoint(x, y); var newPoint = new MPoint(x, y);
UpsertHeadingFeature(newPoint, withArrowHead: true); MarkerShapes.Clear();
if (IsBase)
CreateBaseMarker(newPoint);
else
CreateRoverTriangleMarker(newPoint);
foreach (var shape in MarkerShapes)
Features.Add(shape);
// ponto invisível/pequeno para hit-test e precisão
Point = new PointFeature(newPoint); Point = new PointFeature(newPoint);
SetStyles(); SetStyles();
Features.Add(Point); Features.Add(Point);
Seta.ForEach(f => Features.Add(f));
if (lat != null || lon != null) if (lat != null || lon != null)
UpdateRoverPosition(); UpdateRoverPosition();
@ -1402,68 +1430,178 @@ namespace OperationControl.Controls
UpdatePredictTrajectory(); UpdatePredictTrajectory();
} }
private void UpsertHeadingFeature(MPoint centerWorld, bool withArrowHead = true) private (double lengthWorld, double widthWorld, bool realScale) GetRoverSizeWorld()
{ {
Seta.Clear(); double resolution = 1.0;
// 1) Comprimento constante em tela: px -> metros try
//var resolution = _map.Map?.Navigator?.Resolutions?.LastOrDefault() ?? 1.0; // m/px no WebMercator
var resolution = 1.0;
var lenPx = 9; // corpo da seta (ajuste fino: 12~20 px)
var headPx = 6; // “asas” da seta (se withArrowHead = true)
var len = lenPx * resolution; // metros
var headLen = headPx * resolution; // metros
// 2) 0° = Norte (↑). Se o seu 0° for Leste (→), troque sin/cos conforme comentário abaixo.
var rad = Heading * Math.PI / 180.0;
var dx = len * Math.Sin(rad); // se 0° = Leste → use cos(rad)
var dy = len * Math.Cos(rad); // se 0° = Leste → use sin(rad)
var p0 = centerWorld;
var p1 = new MPoint(centerWorld.X + dx, centerWorld.Y + dy);
// 3) Corpo da seta (linha principal)
var mainLine = new LineString(new Coordinate[] { new Coordinate(p0.X, p0.Y), new Coordinate(p1.X, p1.Y) });
var mainFeat = new GeometryFeature { Geometry = mainLine };
SetHeadingStyle(mainFeat, Color);
Seta.Add(mainFeat);
// 5) (Opcional) cabeça da seta em “V”: duas linhas com ±θ a partir da ponta
if (withArrowHead)
{ {
var theta = 25 * Math.PI / 180.0; // abertura do V (~25°) resolution = _mapParent.Map.Navigator.Viewport.Resolution;
// perna esquerda
var dxL = headLen * Math.Sin(rad + Math.PI - theta);
var dyL = headLen * Math.Cos(rad + Math.PI - theta);
var pL = new MPoint(p1.X + dxL, p1.Y + dyL);
var leftLine = new LineString(new Coordinate[] { new Coordinate(p1.X, p1.Y), new Coordinate(pL.X, pL.Y) });
// perna direita
var dxR = headLen * Math.Sin(rad + Math.PI + theta);
var dyR = headLen * Math.Cos(rad + Math.PI + theta);
var pR = new MPoint(p1.X + dxR, p1.Y + dyR);
var rightLine = new LineString(new Coordinate[] { new Coordinate(p1.X, p1.Y), new Coordinate(pR.X, pR.Y) });
var fL = new GeometryFeature { Geometry = leftLine };
var fR = new GeometryFeature { Geometry = rightLine };
SetHeadingStyle(fL, Color);
SetHeadingStyle(fR, Color);
Seta.Add(fL);
Seta.Add(fR);
} }
catch
{
resolution = 1.0;
} }
private static void SetHeadingStyle(GeometryFeature f, System.Windows.Media.Color wpfColor) // Dimensões reais do robô em metros
double robotLengthM = 1.20;
double robotWidthM = 1.00;
// Acima disso: ícone fixo em px
// Abaixo disso: tamanho real em metros
double realScaleResolutionThreshold = 0.14;
if (resolution < realScaleResolutionThreshold)
{ {
if (f.Styles == null) f.Styles = new List<IStyle>(); else f.Styles.Clear(); return (robotLengthM, robotWidthM, true);
var c = new Mapsui.Styles.Color(wpfColor.R, wpfColor.G, wpfColor.B, 230); }
f.Styles.Add(new VectorStyle
double normalPx = 24;
double minPx = 16;
double maxPx = 32;
double sizePx = Math.Clamp(normalPx, minPx, maxPx);
double lengthWorld = sizePx * resolution;
double widthWorld = lengthWorld * 0.75;
return (lengthWorld, widthWorld, false);
}
private void CreateRoverTriangleMarker(MPoint centerWorld)
{ {
Line = new Pen(c, 2), // espessura em px na tela var (baseColor, _, _) = GetStatusVisual();
Outline = null,
var (lengthWorld, widthWorld, realScale) = GetRoverSizeWorld();
double frontLength = lengthWorld * 0.55;
double backLength = lengthWorld * 0.45;
double halfWidth = widthWorld * 0.5;
// Heading: 0° = Norte
double rad = Heading * Math.PI / 180.0;
double ux = Math.Sin(rad);
double uy = Math.Cos(rad);
// perpendicular
double px = Math.Cos(rad);
double py = -Math.Sin(rad);
var front = new Coordinate(
centerWorld.X + ux * frontLength,
centerWorld.Y + uy * frontLength
);
var left = new Coordinate(
centerWorld.X - ux * backLength + px * halfWidth,
centerWorld.Y - uy * backLength + py * halfWidth
);
var right = new Coordinate(
centerWorld.X - ux * backLength - px * halfWidth,
centerWorld.Y - uy * backLength - py * halfWidth
);
var ring = new LinearRing(new[]
{
front,
left,
right,
front
}); });
var polygon = new Polygon(ring);
var triangle = new GeometryFeature
{
Geometry = polygon
};
triangle.Styles.Add(new VectorStyle
{
Fill = new Brush(baseColor),
Outline = new Pen(Mapsui.Styles.Color.White, Focused ? 3 : 2)
});
MarkerShapes.Add(triangle);
if (Focused)
{
var focusRing = new PointFeature(centerWorld);
focusRing.Styles.Add(new SymbolStyle
{
SymbolType = SymbolType.Ellipse,
SymbolScale = 1.35,
Fill = new Brush(new Mapsui.Styles.Color(baseColor.R, baseColor.G, baseColor.B, 45)),
Outline = new Pen(new Mapsui.Styles.Color(baseColor.R, baseColor.G, baseColor.B, 180), 2)
});
MarkerShapes.Add(focusRing);
}
}
private double GetMarkerSizeWorld(double normalPx = 22, double minPx = 16, double maxPx = 30)
{
double resolution = 1.0;
try
{
// metros por pixel no zoom atual
resolution = _mapParent.Map.Navigator.Viewport.Resolution;
}
catch
{
resolution = 1.0;
}
double sizePx = Math.Clamp(normalPx, minPx, maxPx);
return sizePx * resolution;
}
private void CreateBaseMarker(MPoint centerWorld)
{
var baseColor = new Mapsui.Styles.Color(220, 45, 45, 255);
double radius = GetMarkerSizeWorld(22, 16, 30);
var coords = new List<Coordinate>();
// hexágono
for (int i = 0; i < 6; i++)
{
double ang = Math.PI / 6.0 + i * Math.PI / 3.0;
coords.Add(new Coordinate(
centerWorld.X + Math.Cos(ang) * radius,
centerWorld.Y + Math.Sin(ang) * radius
));
}
coords.Add(coords[0]);
var hex = new GeometryFeature
{
Geometry = new Polygon(new LinearRing(coords.ToArray()))
};
hex.Styles.Add(new VectorStyle
{
Fill = new Brush(baseColor),
Outline = new Pen(Mapsui.Styles.Color.White, Focused ? 3 : 2)
});
MarkerShapes.Add(hex);
var center = new PointFeature(centerWorld);
center.Styles.Add(new SymbolStyle
{
SymbolType = SymbolType.Ellipse,
SymbolScale = 0.45,
Fill = new Brush(Mapsui.Styles.Color.White),
Outline = null
});
MarkerShapes.Add(center);
} }
private void SetStyles(double _pulseFactor = 1.0) private void SetStyles(double _pulseFactor = 1.0)
@ -1471,54 +1609,41 @@ namespace OperationControl.Controls
if (Point.Styles == null) Point.Styles = new List<IStyle>(); if (Point.Styles == null) Point.Styles = new List<IStyle>();
else Point.Styles.Clear(); else Point.Styles.Clear();
// Pega o “visual” conforme o Status
var (baseColor, statusGlyph, labelBackColor) = GetStatusVisual(); var (baseColor, statusGlyph, labelBackColor) = GetStatusVisual();
// 1) Ponto central minúsculo (precisão) // ponto central pequeno para referência/hit-test
Point.Styles.Add(new SymbolStyle Point.Styles.Add(new SymbolStyle
{ {
SymbolScale = 0.22, SymbolScale = 0.10,
Fill = new Brush(baseColor), Fill = new Brush(Mapsui.Styles.Color.White),
Outline = null Outline = null
}); });
// 2) “Aura” simulando gradiente (3 círculos com alpha/escala crescentes) bool showLabel =
Point.Styles.Add(new SymbolStyle Focused ||
{ true ||
SymbolScale = _pulseFactor * 0.55, Status == StatusOperacao.Erro ||
Fill = new Brush(new Color(baseColor.R, baseColor.G, baseColor.B, 120)), Status == StatusOperacao.Parado;
Outline = null
});
Point.Styles.Add(new SymbolStyle
{
SymbolScale = _pulseFactor * 0.95,
Fill = new Brush(new Color(baseColor.R, baseColor.G, baseColor.B, 70)),
Outline = null
});
Point.Styles.Add(new SymbolStyle
{
SymbolScale = _pulseFactor * 1.4,
Fill = new Brush(new Color(baseColor.R, baseColor.G, baseColor.B, 30)),
Outline = null
});
// 3) Rótulo do id (pequeno, acima do ponto) if (showLabel && !string.IsNullOrWhiteSpace(Label))
if (!string.IsNullOrWhiteSpace(Label))
{ {
// texto: se tiver glyph, coloca na frente
var texto = string.IsNullOrEmpty(statusGlyph) var texto = string.IsNullOrEmpty(statusGlyph)
? Label ? Label
: $"{Label} {statusGlyph}"; : $"{Label} {statusGlyph}";
var backColor = labelBackColor ?? new Color(0, 0, 0, 140); var backColor = labelBackColor ?? new Mapsui.Styles.Color(0, 0, 0, 150);
Point.Styles.Add(new LabelStyle Point.Styles.Add(new LabelStyle
{ {
Text = texto, Text = texto,
ForeColor = Mapsui.Styles.Color.White, ForeColor = Mapsui.Styles.Color.White,
BackColor = new Brush(backColor), BackColor = new Brush(backColor),
Offset = new Offset(0, -30), Offset = new Offset(0, -34),
Font = new Font { FontFamily = "Segoe UI Emoji", Size = 18 } Font = new Font
{
FontFamily = "Segoe UI Emoji",
Size = 15
}
}); });
} }
} }

View File

@ -145,7 +145,8 @@
Vazao="{Binding Vazao}" Vazao="{Binding Vazao}"
TempoAtuado="{Binding TempoAtuado}" TempoAtuado="{Binding TempoAtuado}"
Atuacoes="{Binding Atuacoes}" Atuacoes="{Binding Atuacoes}"
Loaded="BicoLequeIndicator_Loaded" /> Loaded="BicoLequeIndicator_Loaded"
Height="200" />
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>

View File

@ -0,0 +1,441 @@
version=1
# This file caches language service data to improve the performance of C# Dev Kit.
# It is not intended for manual editing. It can safely be deleted and will be
# regenerated automatically. For more information, see https://aka.ms/lscache
#
# To control where cache files are stored, use the following VS Code setting:
# "dotnet.projectsystem.cacheInProjectFolder": true
[project]
language=C#
primary
lastDtbSucceeded
[properties]
AssemblyName=OperationControl
CommandLineArgsForDesignTimeEvaluation=-langversion:12.0 -define:TRACE
CompilerGeneratedFilesOutputPath=
MaxSupportedLangVersion=12.0
ProjectAssetsFile=<PATH>obj/project.assets.json
RootNamespace=OperationControl
RunAnalyzers=
RunAnalyzersDuringLiveAnalysis=
SolutionPath=*Undefined*
TargetFrameworkIdentifier=.NETCoreApp
TargetPath=<PATH>bin/Debug/net8.0-windows7.0/OperationControl.dll
TargetRefPath=<PATH>obj/Debug/net8.0-windows7.0/ref/OperationControl.dll
TemporaryDependencyNodeTargetIdentifier=net8.0-windows7.0
[commandLineArguments]
/noconfig
/unsafe-
/checked-
/nowarn:1701,1702,1701,1702
/fullpaths
/nostdlib+
/errorreport:prompt
/warn:8
/define:TRACE;DEBUG;NET;NET8_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NET7_0_OR_GREATER;NET8_0_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER;WINDOWS7_0_OR_GREATER
/highentropyva+
/nullable:enable
/debug+
/debug:portable
/filealign:512
/optimize-
/out:obj\Debug\net8.0-windows7.0\OperationControl.dll
/refout:obj\Debug\net8.0-windows7.0\refint\OperationControl.dll
/target:winexe
/warnaserror-
/utf8output
/deterministic+
/langversion:12.0
/warnaserror+:NU1605,SYSLIB0011
[sourceFiles]
App.xaml.cs
AssemblyInfo.cs
Controls/
AttitudeIndicator.xaml.cs
AutoFitTextBlock.cs
Bbox3DViewer.xaml.cs
GstVideoView.xaml.cs
HeadingIndicator.xaml.cs
LabeledBar.xaml.cs
ManualControlPad.xaml.cs
MapViewControl.xaml.cs
ProgressBarText.xaml.cs
Pulverizador/
BicoLequeIndicator.xaml.cs
Converters.cs
PulverizadorIndicator.xaml.cs
RiskMeter.xaml.cs
TemperatureIndicator.xaml.cs
Converters/
BoolToVisibility.cs
MainWindow.cs
MultiplyConverter.cs
NegateAngleConverter.cs
Helpers/RelayCommand.cs
Models/
AlertaModel.cs
AppShell.cs
Enums.cs
GraficoModel.cs
Operacao/ResumoOperacionalModel.cs
TcpVideoReceiver.cs
Variaveis.cs
obj/Debug/net8.0-windows7.0/
.NETCoreApp,Version=v8.0.AssemblyAttributes.cs
OperationControl.AssemblyInfo.cs
OperationControl.GlobalUsings.g.cs
Services/
GpsService.cs
ManualControlSender.cs
ViewModels/
Base/NotifyBase.cs
Views/ConfigConexao/
ConfigConexaoViewModel.cs
NetworkConfigViewModel.cs
Views/Operacao/Monitoramento/
ControleManualViewModel.cs
Diagnostico/
DiagnosticoGraficoSerieViewModel.cs
DiagnosticoModuloItemViewModel.cs
DiagnosticoOpcoesViewModel.cs
DiagnosticoViewModel.cs
HistoricoViewModel.cs
MonitoramentoViewModel.cs
ParametrizacaoViewModel.cs
PulverizadorViewModel.cs
ResumoViewModel.cs
Views/Operacao/
OperacaoBottomViewModel.cs
OperacaoCenterViewModel.cs
OperacaoLeftViewModel.cs
OperacaoRightViewModel.cs
OperacaoTopViewModel.cs
Views/PreparacaoMapa/
PreparacaoMapaBottomViewModel.cs
PreparacaoMapaTopViewModel.cs
Windows/DockWindowViewModel.cs
Views/
ConfigConexao/ConfigConexaoView.xaml.cs
Operacao/Monitoramento/
ControleManualView.xaml.cs
DiagnosticoView.xaml.cs
HistoricoView.xaml.cs
MonitoramentoView.xaml.cs
ParametrizacaoView.xaml.cs
PulverizadorView.xaml.cs
ResumoView.xaml.cs
Operacao/
OperacaoBottomView.xaml.cs
OperacaoCenterView.xaml.cs
OperacaoLeftView.xaml.cs
OperacaoRightView.xaml.cs
OperacaoTopView.xaml.cs
PreparacaoMapa/
PreparacaoMapaBottomView.xaml.cs
PreparacaoMapaTopView.xaml.cs
PreparacaoMapaView.xaml.cs
Windows/
DockWindow.xaml.cs
MainWindow.xaml.cs
NetworkConfigWindow.xaml.cs
SelecaoTipoMapa.xaml.cs
[metadataReferences]
../AgroBase/bin/Debug/AgroBase.exe
<DOTNET>/packs/Microsoft.NETCore.App.Ref/8.0.0/ref/net8.0/
Microsoft.CSharp.dll
Microsoft.VisualBasic.Core.dll
Microsoft.Win32.Primitives.dll
Microsoft.Win32.Registry.dll
mscorlib.dll
netstandard.dll
System.AppContext.dll
System.Buffers.dll
System.Collections.Concurrent.dll
System.Collections.dll
System.Collections.Immutable.dll
System.Collections.NonGeneric.dll
System.Collections.Specialized.dll
System.ComponentModel.Annotations.dll
System.ComponentModel.DataAnnotations.dll
System.ComponentModel.dll
System.ComponentModel.EventBasedAsync.dll
System.ComponentModel.Primitives.dll
System.ComponentModel.TypeConverter.dll
System.Configuration.dll
System.Console.dll
System.Core.dll
System.Data.Common.dll
System.Data.DataSetExtensions.dll
System.Data.dll
System.Diagnostics.Contracts.dll
System.Diagnostics.Debug.dll
System.Diagnostics.DiagnosticSource.dll
System.Diagnostics.FileVersionInfo.dll
System.Diagnostics.Process.dll
System.Diagnostics.StackTrace.dll
System.Diagnostics.TextWriterTraceListener.dll
System.Diagnostics.Tools.dll
System.Diagnostics.TraceSource.dll
System.Diagnostics.Tracing.dll
System.dll
System.Drawing.Primitives.dll
System.Dynamic.Runtime.dll
System.Formats.Asn1.dll
System.Formats.Tar.dll
System.Globalization.Calendars.dll
System.Globalization.dll
System.Globalization.Extensions.dll
System.IO.Compression.Brotli.dll
System.IO.Compression.dll
System.IO.Compression.FileSystem.dll
System.IO.Compression.ZipFile.dll
System.IO.dll
System.IO.FileSystem.AccessControl.dll
System.IO.FileSystem.dll
System.IO.FileSystem.DriveInfo.dll
System.IO.FileSystem.Primitives.dll
System.IO.FileSystem.Watcher.dll
System.IO.IsolatedStorage.dll
System.IO.MemoryMappedFiles.dll
System.IO.Pipes.AccessControl.dll
System.IO.Pipes.dll
System.IO.UnmanagedMemoryStream.dll
System.Linq.dll
System.Linq.Expressions.dll
System.Linq.Parallel.dll
System.Linq.Queryable.dll
System.Memory.dll
System.Net.dll
System.Net.Http.dll
System.Net.Http.Json.dll
System.Net.HttpListener.dll
System.Net.Mail.dll
System.Net.NameResolution.dll
System.Net.NetworkInformation.dll
System.Net.Ping.dll
System.Net.Primitives.dll
System.Net.Quic.dll
System.Net.Requests.dll
System.Net.Security.dll
System.Net.ServicePoint.dll
System.Net.Sockets.dll
System.Net.WebClient.dll
System.Net.WebHeaderCollection.dll
System.Net.WebProxy.dll
System.Net.WebSockets.Client.dll
System.Net.WebSockets.dll
System.Numerics.dll
System.Numerics.Vectors.dll
System.ObjectModel.dll
System.Reflection.DispatchProxy.dll
System.Reflection.dll
System.Reflection.Emit.dll
System.Reflection.Emit.ILGeneration.dll
System.Reflection.Emit.Lightweight.dll
System.Reflection.Extensions.dll
System.Reflection.Metadata.dll
System.Reflection.Primitives.dll
System.Reflection.TypeExtensions.dll
System.Resources.Reader.dll
System.Resources.ResourceManager.dll
System.Resources.Writer.dll
System.Runtime.CompilerServices.Unsafe.dll
System.Runtime.CompilerServices.VisualC.dll
System.Runtime.dll
System.Runtime.Extensions.dll
System.Runtime.Handles.dll
System.Runtime.InteropServices.dll
System.Runtime.InteropServices.JavaScript.dll
System.Runtime.InteropServices.RuntimeInformation.dll
System.Runtime.Intrinsics.dll
System.Runtime.Loader.dll
System.Runtime.Numerics.dll
System.Runtime.Serialization.dll
System.Runtime.Serialization.Formatters.dll
System.Runtime.Serialization.Json.dll
System.Runtime.Serialization.Primitives.dll
System.Runtime.Serialization.Xml.dll
System.Security.AccessControl.dll
System.Security.Claims.dll
System.Security.Cryptography.Algorithms.dll
System.Security.Cryptography.Cng.dll
System.Security.Cryptography.Csp.dll
System.Security.Cryptography.dll
System.Security.Cryptography.Encoding.dll
System.Security.Cryptography.OpenSsl.dll
System.Security.Cryptography.Primitives.dll
System.Security.Cryptography.X509Certificates.dll
System.Security.dll
System.Security.Principal.dll
System.Security.Principal.Windows.dll
System.Security.SecureString.dll
System.ServiceModel.Web.dll
System.ServiceProcess.dll
System.Text.Encoding.CodePages.dll
System.Text.Encoding.dll
System.Text.Encoding.Extensions.dll
System.Text.RegularExpressions.dll
System.Threading.Channels.dll
System.Threading.dll
System.Threading.Overlapped.dll
System.Threading.Tasks.Dataflow.dll
System.Threading.Tasks.dll
System.Threading.Tasks.Extensions.dll
System.Threading.Tasks.Parallel.dll
System.Threading.Thread.dll
System.Threading.ThreadPool.dll
System.Threading.Timer.dll
System.Transactions.dll
System.Transactions.Local.dll
System.ValueTuple.dll
System.Web.dll
System.Web.HttpUtility.dll
System.Windows.dll
System.Xml.dll
System.Xml.Linq.dll
System.Xml.ReaderWriter.dll
System.Xml.Serialization.dll
System.Xml.XDocument.dll
System.Xml.XmlDocument.dll
System.Xml.XmlSerializer.dll
System.Xml.XPath.dll
System.Xml.XPath.XDocument.dll
<DOTNET>/packs/Microsoft.WindowsDesktop.App.Ref/8.0.0/ref/net8.0/
Accessibility.dll
Microsoft.VisualBasic.dll
Microsoft.VisualBasic.Forms.dll
Microsoft.Win32.Registry.AccessControl.dll
Microsoft.Win32.SystemEvents.dll
PresentationCore.dll
PresentationFramework.Aero.dll
PresentationFramework.Aero2.dll
PresentationFramework.AeroLite.dll
PresentationFramework.Classic.dll
PresentationFramework.dll
PresentationFramework.Luna.dll
PresentationFramework.Royale.dll
PresentationUI.dll
ReachFramework.dll
System.CodeDom.dll
System.Configuration.ConfigurationManager.dll
System.Design.dll
System.Diagnostics.EventLog.dll
System.Diagnostics.PerformanceCounter.dll
System.DirectoryServices.dll
System.Drawing.Common.dll
System.Drawing.Design.dll
System.Drawing.dll
System.IO.Packaging.dll
System.Printing.dll
System.Resources.Extensions.dll
System.Security.Cryptography.Pkcs.dll
System.Security.Cryptography.ProtectedData.dll
System.Security.Cryptography.Xml.dll
System.Security.Permissions.dll
System.Threading.AccessControl.dll
System.Windows.Controls.Ribbon.dll
System.Windows.Extensions.dll
System.Windows.Forms.Design.dll
System.Windows.Forms.Design.Editors.dll
System.Windows.Forms.dll
System.Windows.Forms.Primitives.dll
System.Windows.Input.Manipulations.dll
System.Windows.Presentation.dll
System.Xaml.dll
UIAutomationClient.dll
UIAutomationClientSideProviders.dll
UIAutomationProvider.dll
UIAutomationTypes.dll
WindowsBase.dll
WindowsFormsIntegration.dll
<NUGET>/
bitmiracle.libtiff.net/2.4.660/lib/netstandard2.0/BitMiracle.LibTiff.NET.dll
brutile.mbtiles/6.0.0/lib/net8.0/BruTile.MbTiles.dll
brutile/6.0.0/lib/net8.0/
BruTile.dll
BruTile.XmlSerializers.dll
dotspatial.projections/4.0.656/lib/net6.0/DotSpatial.Projections.dll
excss/4.3.1/lib/net8.0/ExCSS.dll
extended.wpf.toolkit/5.0.0/lib/net5.0/
Xceed.Wpf.AvalonDock.dll
Xceed.Wpf.AvalonDock.Themes.Aero.dll
Xceed.Wpf.AvalonDock.Themes.Metro.dll
Xceed.Wpf.AvalonDock.Themes.VS2010.dll
Xceed.Wpf.Toolkit.dll
ffme.windows/7.0.361-beta.1/lib/net8.0-windows7.0/ffme.win.dll
ffmpeg.autogen/7.0.0/lib/netstandard2.1/FFmpeg.AutoGen.dll
gircore.glib-2.0/0.7.0-preview.3/lib/net8.0/GLib-2.0.dll
gircore.gobject-2.0/0.7.0-preview.3/lib/net8.0/GObject-2.0.dll
gircore.gst-1.0/0.7.0-preview.3/lib/net8.0/Gst-1.0.dll
gircore.gstbase-1.0/0.7.0-preview.3/lib/net8.0/GstBase-1.0.dll
gircore.gstvideo-1.0/0.7.0-preview.3/lib/net8.0/GstVideo-1.0.dll
harfbuzzsharp/8.3.1.2/lib/net8.0/HarfBuzzSharp.dll
libvlcsharp.wpf/3.9.4/lib/net6.0-windows7.0/LibVLCSharp.WPF.dll
libvlcsharp/3.9.4/lib/net8.0/LibVLCSharp.dll
mapsui.extensions/5.0.0/lib/net8.0/Mapsui.Extensions.dll
mapsui.nts/5.0.0/lib/net8.0/Mapsui.Nts.dll
mapsui.rendering.skia/5.0.0/lib/net8.0/Mapsui.Rendering.Skia.dll
mapsui.tiling/5.0.0/lib/net8.0/Mapsui.Tiling.dll
mapsui.wpf/5.0.0/lib/net8.0-windows7.0/Mapsui.UI.Wpf.dll
mapsui/5.0.0/lib/net8.0/Mapsui.dll
mapsui3.geometries/3.0.0-alpha.3/lib/netstandard2.0/Mapsui.Geometries.dll
nettopologysuite.features/2.1.0/lib/netstandard2.0/NetTopologySuite.Features.dll
nettopologysuite.io.geojson/4.0.0/lib/netstandard2.0/NetTopologySuite.IO.GeoJSON.dll
nettopologysuite.io.geojson4stj/4.0.0/lib/netstandard2.0/NetTopologySuite.IO.GeoJSON4STJ.dll
nettopologysuite.io.shapefile/2.1.0/lib/netstandard2.0/NetTopologySuite.IO.ShapeFile.dll
nettopologysuite/2.6.0/lib/netstandard2.1/NetTopologySuite.dll
newtonsoft.json/13.0.1/lib/netstandard2.0/Newtonsoft.Json.dll
opentk.audio.openal/4.9.4/lib/netcoreapp3.1/OpenTK.Audio.OpenAL.dll
opentk.compute/4.9.4/lib/netcoreapp3.1/OpenTK.Compute.dll
opentk.core/4.9.4/lib/netstandard2.1/OpenTK.Core.dll
opentk.glwpfcontrol/4.3.3/lib/netcoreapp3.1/GLWpfControl.dll
opentk.graphics/4.9.4/lib/netcoreapp3.1/OpenTK.Graphics.dll
opentk.input/4.9.4/lib/netstandard2.0/OpenTK.Input.dll
opentk.mathematics/4.9.4/lib/netcoreapp3.1/OpenTK.Mathematics.dll
opentk.windowing.common/4.9.4/lib/netcoreapp3.1/OpenTK.Windowing.Common.dll
opentk.windowing.desktop/4.9.4/lib/netcoreapp3.1/OpenTK.Windowing.Desktop.dll
opentk.windowing.graphicslibraryframework/4.9.4/lib/netcoreapp3.1/OpenTK.Windowing.GraphicsLibraryFramework.dll
scottplot.wpf/5.1.57/lib/net8.0-windows7.0/ScottPlot.WPF.dll
scottplot/5.1.57/lib/net8.0/ScottPlot.dll
shimskiasharp/3.2.1/lib/net8.0/ShimSkiaSharp.dll
skiasharp.harfbuzz/3.119.1/lib/net8.0/SkiaSharp.HarfBuzz.dll
skiasharp.views.desktop.common/3.119.1/lib/net8.0/SkiaSharp.Views.Desktop.Common.dll
skiasharp.views.wpf/3.119.1/lib/net462/SkiaSharp.Views.WPF.dll
skiasharp/3.119.1/ref/net8.0/SkiaSharp.dll
sqlite-net-base/1.10.196-beta/lib/net8.0/SQLite-net.dll
sqlitepclraw.config.e_sqlite3/3.0.2/lib/net8.0/SQLitePCLRaw.batteries_v2.dll
sqlitepclraw.core/3.0.2/lib/netstandard2.0/SQLitePCLRaw.core.dll
sqlitepclraw.provider.e_sqlite3/3.0.2/lib/net8.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll
svg.custom/3.2.1/lib/net8.0/Svg.Custom.dll
svg.model/3.2.1/lib/net8.0/Svg.Model.dll
svg.skia/3.2.1/lib/net8.0/Svg.Skia.dll
system.io.pipelines/9.0.0/lib/net8.0/System.IO.Pipelines.dll
system.io.ports/10.0.0/lib/net8.0/System.IO.Ports.dll
system.text.encodings.web/9.0.0/lib/net8.0/System.Text.Encodings.Web.dll
system.text.json/9.0.0/lib/net8.0/System.Text.Json.dll
topten.richtextkit/0.4.167/lib/net5.0/Topten.RichTextKit.dll
[analyzerReferences]
<DOTNET>/packs/Microsoft.NETCore.App.Ref/8.0.0/analyzers/dotnet/cs/
Microsoft.Interop.ComInterfaceGenerator.dll
Microsoft.Interop.JavaScript.JSImportGenerator.dll
Microsoft.Interop.LibraryImportGenerator.dll
Microsoft.Interop.SourceGeneration.dll
System.Text.RegularExpressions.Generator.dll
<DOTNET>/packs/Microsoft.WindowsDesktop.App.Ref/8.0.0/analyzers/dotnet/
cs/System.Windows.Forms.Analyzers.CSharp.dll
System.Windows.Forms.Analyzers.dll
<DOTNET>/sdk/8.0.100/Sdks/Microsoft.NET.Sdk/analyzers/
Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll
Microsoft.CodeAnalysis.NetAnalyzers.dll
<NUGET>/system.text.json/9.0.0/analyzers/dotnet/roslyn4.4/cs/System.Text.Json.SourceGeneration.dll
[analyzerConfigFiles]
<DOTNET>/sdk/8.0.100/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_8_default.globalconfig
obj/Debug/net8.0-windows7.0/OperationControl.GeneratedMSBuildEditorConfig.editorconfig

View File

@ -103,18 +103,26 @@ namespace OperationControl.Services
porta.Open(); porta.Open();
var nmea = $"gngga com3 1\r\n"; // 🔹 1. Tenta identificar via VERSION
if (await EhUm982PorVersionAsync(porta, timeoutMs, ct))
{
PortaGps = porta;
PortaGps.DataReceived -= PortaGPS_DataReceived;
PortaGps.DataReceived += PortaGPS_DataReceived;
return true;
}
// 🔹 2. Fallback: ativa NMEA
var nmea = $"gngga com2 1\r\n";
porta.Write(Encoding.ASCII.GetBytes(nmea), 0, nmea.Length); porta.Write(Encoding.ASCII.GetBytes(nmea), 0, nmea.Length);
// Dá um tempinho pro módulo começar a cuspir NMEA
await Task.Delay(200, ct); await Task.Delay(200, ct);
string recebido = await LerAmostraAsync(porta, timeoutMs, ct); string recebido = await LerAmostraAsync(porta, timeoutMs, ct);
if (EhGpsUm982OuNmea(recebido)) if (EhGpsUm982OuNmea(recebido))
{ {
// Mantém essa porta como porta oficial do GPS PortaGps = porta;
PortaGps = porta; // não fecha
PortaGps.DataReceived -= PortaGPS_DataReceived; PortaGps.DataReceived -= PortaGPS_DataReceived;
PortaGps.DataReceived += PortaGPS_DataReceived; PortaGps.DataReceived += PortaGPS_DataReceived;
return true; return true;
@ -196,6 +204,29 @@ namespace OperationControl.Services
recebido.Contains("$GNTHS"); recebido.Contains("$GNTHS");
} }
private async Task<bool> EhUm982PorVersionAsync(SerialPort porta, int timeoutMs, CancellationToken ct)
{
try
{
var cmd = "version\r\n";
porta.DiscardInBuffer();
porta.Write(cmd);
await Task.Delay(100, ct);
string resposta = await LerAmostraAsync(porta, timeoutMs, ct);
if (!string.IsNullOrEmpty(resposta) &&
resposta.Contains("UM982"))
{
return true;
}
}
catch { }
return false;
}
/// <summary> /// <summary>
/// Fecha a porta do GPS (se estiver aberta). /// Fecha a porta do GPS (se estiver aberta).
/// </summary> /// </summary>
@ -251,9 +282,9 @@ namespace OperationControl.Services
} }
BaseFix.FixLiberado = fixar; BaseFix.FixLiberado = fixar;
string portaUsb = "com3"; string portaUsb = "com2";
string portaSaida = "com3"; string portaSaida = "com2";
string portaEntrada = "com3"; string portaEntrada = "com2";
string baseId = "957"; string baseId = "957";
if (!fixar) if (!fixar)
@ -370,8 +401,9 @@ namespace OperationControl.Services
string distancia_min = "0"; string distancia_min = "0";
string[] comandos = { string[] comandos = {
// Bauds // Bauds
$"config {porta_usb} 115200\r\n", $"config com1 115200\r\n",
$"config {porta_saida} 115200\r\n", $"config com2 115200\r\n",
$"config com3 115200\r\n",
// limpa logs das portas // limpa logs das portas
$"unlog com1\r\n", $"unlog com1\r\n",

View File

@ -187,7 +187,7 @@
<StackPanel Visibility="{Binding VisibilidadeConfiguracaoGnss}"> <StackPanel Visibility="{Binding VisibilidadeConfiguracaoGnss}">
<TextBlock Text="Configuração" Foreground="#CFCFCF" FontSize="13" FontWeight="SemiBold" Margin="0,0,0,10"/> <TextBlock Text="Configuração" Foreground="#CFCFCF" FontSize="13" FontWeight="SemiBold" Margin="0,0,0,10"/>
<Button Content="📡 Reconfigurar GNSS" Command="{Binding ReconfigurarGnssCommand}" Style="{StaticResource LeftActionButtonStyle}" Background="#1F3A5F" BorderBrush="#4F7DB8"/> <Button Content="📡 Reconfigurar Base" Command="{Binding ReconfigurarGnssCommand}" Style="{StaticResource LeftActionButtonStyle}" Background="#1F3A5F" BorderBrush="#4F7DB8"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</Border> </Border>