incluido parametrizacao mandatoria e parada por falha

This commit is contained in:
Diego Freitas 2024-03-07 16:08:37 -03:00
parent d09fcde642
commit 5ed566bbf6
177 changed files with 27039 additions and 18211 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -87,6 +87,9 @@
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>.\Microsoft.DirectX.DirectInput.dll</HintPath> <HintPath>.\Microsoft.DirectX.DirectInput.dll</HintPath>
</Reference> </Reference>
<Reference Include="MQTTnet, Version=3.1.1.0, Culture=neutral, PublicKeyToken=b69712f52770c0a7, processorArchitecture=MSIL">
<HintPath>..\packages\MQTTnet.3.1.1\lib\net461\MQTTnet.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
@ -295,6 +298,7 @@
<Compile Include="Models\Modules\SensoriamentoModel.cs" /> <Compile Include="Models\Modules\SensoriamentoModel.cs" />
<Compile Include="Models\MotorComum.cs" /> <Compile Include="Models\MotorComum.cs" />
<Compile Include="Models\Operacoes\OperacaoModel.cs" /> <Compile Include="Models\Operacoes\OperacaoModel.cs" />
<Compile Include="Models\PIDModel.cs" />
<Compile Include="Models\Variaveis.cs" /> <Compile Include="Models\Variaveis.cs" />
<Compile Include="Services\APIService.cs" /> <Compile Include="Services\APIService.cs" />
<Compile Include="Services\CameraService.cs" /> <Compile Include="Services\CameraService.cs" />
@ -311,6 +315,7 @@
<Compile Include="Services\GPSService.cs" /> <Compile Include="Services\GPSService.cs" />
<Compile Include="Services\IDispositivosService.cs" /> <Compile Include="Services\IDispositivosService.cs" />
<Compile Include="Services\MapasService.cs" /> <Compile Include="Services\MapasService.cs" />
<Compile Include="Services\MqttService.cs" />
<Compile Include="Services\PythonService.cs" /> <Compile Include="Services\PythonService.cs" />
<Compile Include="Services\SerialService.cs" /> <Compile Include="Services\SerialService.cs" />
<Compile Include="Services\SocketService.cs" /> <Compile Include="Services\SocketService.cs" />
@ -344,6 +349,9 @@
<Content Include="Python\Models\deeplabv3plus\__init__.py"> <Content Include="Python\Models\deeplabv3plus\__init__.py">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Include="Python\Output\folium\mqtt.min.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Python\Scripts\api.py"> <Content Include="Python\Scripts\api.py">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>

View File

@ -17,12 +17,13 @@ using Emgu.CV;
using Emgu.CV.CvEnum; using Emgu.CV.CvEnum;
using Emgu.CV.Structure; using Emgu.CV.Structure;
using Newtonsoft.Json; using Newtonsoft.Json;
using static MqttService;
namespace AgroBase.Forms namespace AgroBase.Forms
{ {
public partial class frmAtuCamera : Form public partial class frmAtuCamera : Form
{ {
private CameraService<CameraCoordenadasFrameModel> cameraService = new CameraService<CameraCoordenadasFrameModel>(); private CameraService cameraService = new CameraService();
private ChromiumWebBrowser chromiumWebBrowser = null; private ChromiumWebBrowser chromiumWebBrowser = null;
private Timer tmrLeitura; private Timer tmrLeitura;
@ -46,8 +47,8 @@ namespace AgroBase.Forms
{ {
try try
{ {
cameraService.socket.Disconnect();
cameraService.pythonProcess.Kill(); cameraService.pythonProcess.Kill();
Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -93,12 +94,12 @@ namespace AgroBase.Forms
VideoUrl, VideoUrl,
ArquivoLeitura, ArquivoLeitura,
"1", "1",
SocketPorta VideoUrl
}, },
VideoPorta, VideoPorta,
VideoUrl, VideoUrl,
true, VideoUrl,
SocketPorta new Timer()
); );
tmrLeitura = new Timer() { Interval = 200 }; tmrLeitura = new Timer() { Interval = 200 };
@ -111,7 +112,7 @@ namespace AgroBase.Forms
{ {
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0; cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
cmbCameras.Items.Clear(); cmbCameras.Items.Clear();
cmbCameras.Items.AddRange(cameraService.AtualizaListaCameras().ToArray()); cmbCameras.Items.AddRange(CameraService.AtualizaListaCameras().Keys.ToArray());
if (cmbCameras.Items.Count == 1) if (cmbCameras.Items.Count == 1)
{ {
cameraService.selectedCamera = 0; cameraService.selectedCamera = 0;
@ -132,13 +133,22 @@ namespace AgroBase.Forms
int i = 0; int i = 0;
//var coordenadas = cameraService.AferirDadosCamera<CameraCoordenadasModel>(); //var coordenadas = cameraService.AferirDadosCamera<CameraCoordenadasModel>();
var leituras = cameraService.socket.DadosRecebidos.ToList().OrderByDescending(x => x.timestamp).Take(MaxLeituras).ToList(); var MqttTopico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == VideoUrl);
if (!leituras.Any()) CameraCoordenadasFrameModel leitura = null;
var Mensagem = MqttTopico.Mensagens.LastOrDefault(x => x.Momento > cameraService.IniciadoEm);
if (Mensagem != null)
{ {
return; try
{
leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
}
catch
{
}
} }
foreach (var objeto in leituras.FirstOrDefault().objetos) foreach (var objeto in leitura.objetos)
{ {
GroupBox gpb = new GroupBox() GroupBox gpb = new GroupBox()
{ {

View File

@ -40,6 +40,7 @@
this.cmbOperacao = new System.Windows.Forms.ComboBox(); this.cmbOperacao = new System.Windows.Forms.ComboBox();
this.lblOperacao = new System.Windows.Forms.Label(); this.lblOperacao = new System.Windows.Forms.Label();
this.lblOperacaoStatus = new System.Windows.Forms.Label(); this.lblOperacaoStatus = new System.Windows.Forms.Label();
this.lblMqtt = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.picRobo)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.picRobo)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
// //
@ -140,17 +141,29 @@
// lblOperacaoStatus // lblOperacaoStatus
// //
this.lblOperacaoStatus.AutoSize = true; this.lblOperacaoStatus.AutoSize = true;
this.lblOperacaoStatus.Location = new System.Drawing.Point(671, 664); this.lblOperacaoStatus.Location = new System.Drawing.Point(671, 602);
this.lblOperacaoStatus.Name = "lblOperacaoStatus"; this.lblOperacaoStatus.Name = "lblOperacaoStatus";
this.lblOperacaoStatus.Size = new System.Drawing.Size(287, 24); this.lblOperacaoStatus.Size = new System.Drawing.Size(287, 24);
this.lblOperacaoStatus.TabIndex = 12; this.lblOperacaoStatus.TabIndex = 12;
this.lblOperacaoStatus.Text = "Operação: Manual - Não iniciado"; this.lblOperacaoStatus.Text = "Operação: Manual - Não iniciado";
// //
// lblMqtt
//
this.lblMqtt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.lblMqtt.AutoSize = true;
this.lblMqtt.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblMqtt.Location = new System.Drawing.Point(894, 675);
this.lblMqtt.Name = "lblMqtt";
this.lblMqtt.Size = new System.Drawing.Size(114, 13);
this.lblMqtt.TabIndex = 13;
this.lblMqtt.Text = "MQTT: Desconectado";
//
// frmIHM // frmIHM
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 24F); this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 24F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1020, 697); this.ClientSize = new System.Drawing.Size(1020, 697);
this.Controls.Add(this.lblMqtt);
this.Controls.Add(this.lblOperacaoStatus); this.Controls.Add(this.lblOperacaoStatus);
this.Controls.Add(this.lblOperacao); this.Controls.Add(this.lblOperacao);
this.Controls.Add(this.cmbOperacao); this.Controls.Add(this.cmbOperacao);
@ -188,5 +201,6 @@
private System.Windows.Forms.ComboBox cmbOperacao; private System.Windows.Forms.ComboBox cmbOperacao;
private System.Windows.Forms.Label lblOperacao; private System.Windows.Forms.Label lblOperacao;
private System.Windows.Forms.Label lblOperacaoStatus; private System.Windows.Forms.Label lblOperacaoStatus;
private System.Windows.Forms.Label lblMqtt;
} }
} }

View File

@ -40,7 +40,7 @@ namespace AgroBase.Forms.IHM
private void TmrDispositivos_Tick(object sender, EventArgs e) private void TmrDispositivos_Tick(object sender, EventArgs e)
{ {
SerialService.AtualizarDispositivos(); SerialService.RealizarVarreduraPortasUSB();
var Labels = this.Controls.OfType<Label>().Where(y => y.Name.Contains("lblD_")).ToList(); var Labels = this.Controls.OfType<Label>().Where(y => y.Name.Contains("lblD_")).ToList();
Labels.ForEach(lbl => Labels.ForEach(lbl =>
@ -73,24 +73,19 @@ namespace AgroBase.Forms.IHM
else else
{ {
IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Modulo.Dispositivo && x._Porta.PortName == Modulo.PortaCOM); IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Modulo.Dispositivo && x._Porta.PortName == Modulo.PortaCOM);
if (dispositivoService == null) if (dispositivoService != null)
{ {
dispositivoService = DispositivosServiceFactory.CreateDispositivoService(
Modulo.Dispositivo,
"Nome: " + Enum.GetName(typeof(T_Code), Modulo.Dispositivo),
"Descrição: " + Enum.GetName(typeof(T_Code), Modulo.Dispositivo),
new SerialPort()
);
Variaveis.DispositivosConectados.Add(dispositivoService);
dispositivoService.InstanciarDispositivo(Variaveis.DispositivosConectados.Count - 1);
}
if (!dispositivoService._Porta.IsOpen) if (!dispositivoService._Porta.IsOpen)
{ {
dispositivoService.btnConectar_Click(new object(), new EventArgs()); dispositivoService.btnConectar_Click(new object(), new EventArgs());
} }
DispositivoConectado = dispositivoService._Porta.IsOpen; DispositivoConectado = dispositivoService._Porta.IsOpen;
} }
else
{
DispositivoConectado = false;
}
}
lblDisp.ForeColor = DispositivoConectado ? Color.Green : Color.Red; lblDisp.ForeColor = DispositivoConectado ? Color.Green : Color.Red;
} }
@ -100,6 +95,9 @@ namespace AgroBase.Forms.IHM
{ {
Variaveis.DispositivosConectados.Where(x => x.Dados.GetStatusConexao()).ToList().ForEach(x => x.AcaoDesconectar()); Variaveis.DispositivosConectados.Where(x => x.Dados.GetStatusConexao()).ToList().ForEach(x => x.AcaoDesconectar());
} }
lblMqtt.Text = "MQTT: " + (Variaveis.MqttService.StatusConexao() ? "Conectado" : "Desconectado");
lblMqtt.ForeColor = Variaveis.MqttService.StatusConexao() ? Color.Green : Color.Red;
} }
@ -116,33 +114,19 @@ namespace AgroBase.Forms.IHM
private void btnIniciar_Click(object sender, EventArgs e) private void btnIniciar_Click(object sender, EventArgs e)
{ {
Variaveis.OperacaoEmAndamento.ModulosMandatorios.ForEach(Modulo =>
{
Modulo.Conectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == Modulo.Dispositivo && x._Porta.IsOpen);
});
bool OperacaoLiberada =
(Variaveis.OperacaoEmAndamento.ModulosMandatorios.Where(x => x.Mandatorio).All(x => x.Conectado) && Variaveis.OperacaoEmAndamento.ModulosMandatorios.Any(x => x.Mandatorio)) ||
(Variaveis.OperacaoEmAndamento.ModulosMandatorios.All(x => !x.Mandatorio) && Variaveis.OperacaoEmAndamento.ModulosMandatorios.Any(x => x.Conectado));
if (Variaveis.OperacaoEmAndamento.Iniciado) if (Variaveis.OperacaoEmAndamento.Iniciado)
{ {
Variaveis.OperacaoEmAndamento.FinalizarOperacao(); Variaveis.OperacaoEmAndamento.FinalizarOperacao();
} }
else else
{ {
if (OperacaoLiberada) if (Variaveis.OperacaoEmAndamento.ModulosConectados)
{ {
Variaveis.OperacaoEmAndamento.IniciarOperacao(); Variaveis.OperacaoEmAndamento.frmOperacao.ShowDialog();
} }
else else
{ {
string MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo) + MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
", é necessário que todos os módulos mandatórios estejam devidamente conectados ao equipamento, ou pelo menos um dos módulos:\r\n";
Variaveis.OperacaoEmAndamento.ModulosMandatorios.ForEach(Modulo =>
{
MensagemErro += Enum.GetName(typeof(T_Code), Modulo.Dispositivo) + ": ( " + (Modulo.Conectado ? "OK" : " ") + " ) - Mandatório: " + (Modulo.Mandatorio ? "Sim" : "Não") + "\r\n";
});
MessageBox.Show(MensagemErro, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
} }
} }

View File

@ -27,7 +27,7 @@ namespace AgroBase.Forms.Movimentacao
}; };
private CameraService<CameraDeepLabV3PlusModel> cameraService = new CameraService<CameraDeepLabV3PlusModel>(); private CameraService cameraService = new CameraService();
private ChromiumWebBrowser chromiumWebBrowser = null; private ChromiumWebBrowser chromiumWebBrowser = null;
private Timer tmrLeitura; private Timer tmrLeitura;
@ -66,7 +66,7 @@ namespace AgroBase.Forms.Movimentacao
try try
{ {
tmrLeitura.Stop(); tmrLeitura.Stop();
cameraService.socket.Disconnect(); Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
cameraService.pythonProcess.Kill(); cameraService.pythonProcess.Kill();
} }
catch (Exception ex) catch (Exception ex)
@ -290,12 +290,12 @@ namespace AgroBase.Forms.Movimentacao
VideoUrl, VideoUrl,
ArquivoLeitura, ArquivoLeitura,
MostrarDebug ? "1" : "0", MostrarDebug ? "1" : "0",
SocketPorta VideoUrl
}, },
VideoPorta, VideoPorta,
VideoUrl, VideoUrl,
false, VideoUrl,
SocketPorta new Timer()
); );
tmrLeitura = new Timer() { Interval = 200 }; tmrLeitura = new Timer() { Interval = 200 };
@ -308,7 +308,7 @@ namespace AgroBase.Forms.Movimentacao
{ {
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0; cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
cmbCameras.Items.Clear(); cmbCameras.Items.Clear();
cmbCameras.Items.AddRange(cameraService.AtualizaListaCameras().ToArray()); cmbCameras.Items.AddRange(CameraService.AtualizaListaCameras().Keys.ToArray());
if (cmbCameras.Items.Count == 1) if (cmbCameras.Items.Count == 1)
{ {
cameraService.selectedCamera = 0; cameraService.selectedCamera = 0;

View File

@ -23,20 +23,8 @@ namespace AgroBase.Forms.Operacoes
{ {
public partial class frmOperacaoMapaGPS : Form public partial class frmOperacaoMapaGPS : Form
{ {
#region Variáveis
private List<CameraSoloModel> CamerasSolo = new List<CameraSoloModel>();
private CameraCaminhoModel cameraCaminho;
private Timer tmrLeituras = new Timer() { Interval = 200 }; private Timer tmrLeituras = new Timer() { Interval = 200 };
DispositivosService<MovimentacaoModel> Movimentacao;
DispositivosService<DirecionalModel> Direcional;
DispositivosService<AtuadorModel> Atuador;
#endregion
#region Eventos do formulário #region Eventos do formulário
public frmOperacaoMapaGPS() public frmOperacaoMapaGPS()
@ -64,35 +52,24 @@ namespace AgroBase.Forms.Operacoes
AtualizarDispositivos(); AtualizarDispositivos();
AtualizaListaCameras(); AtualizaListaCameras();
Variaveis.OperacaoEmAndamento = new OperacaoModel(ModoOperacao.MapaGPS, Movimentacao, Direcional, Atuador);
} }
private void frmOperacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e) private void frmOperacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e)
{ {
tmrLeituras.Stop(); tmrLeituras.Stop();
//DesligarCameraSoloE(); Variaveis.OperacaoEmAndamento.CamerasSolo.ForEach(Camera =>
CamerasSolo.ForEach(Camera =>
{ {
DesligarCameraSolo(Camera); DesligarCameraSolo(Camera);
}); });
DesligarCameraCaminho(); DesligarCameraCaminho(Variaveis.OperacaoEmAndamento.CameraCaminho);
Variaveis.OperacaoEmAndamento.FinalizarOperacao(); Variaveis.OperacaoEmAndamento.FinalizarOperacao();
} }
private void AtualizarDispositivos() private void AtualizarDispositivos()
{ {
Movimentacao = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov); chbMOVativo.Checked = Variaveis.OperacaoEmAndamento.DispMov != null && Variaveis.OperacaoEmAndamento.DispMov._Porta.IsOpen;
Direcional = (DispositivosService<DirecionalModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Dir); chbDIRativo.Checked = Variaveis.OperacaoEmAndamento.DispDir != null && Variaveis.OperacaoEmAndamento.DispDir._Porta.IsOpen;
Atuador = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu); chbATUativo.Checked = Variaveis.OperacaoEmAndamento.DispAtu != null && Variaveis.OperacaoEmAndamento.DispAtu._Porta.IsOpen;
Variaveis.OperacaoEmAndamento.DispMov = Movimentacao;
Variaveis.OperacaoEmAndamento.DispDir = Direcional;
Variaveis.OperacaoEmAndamento.DispAtu = Atuador;
chbMOVativo.Checked = Movimentacao != null && Movimentacao._Porta.IsOpen;
chbDIRativo.Checked = Direcional != null && Direcional._Porta.IsOpen;
chbATUativo.Checked = Atuador != null && Atuador._Porta.IsOpen;
chbGPSativo.Checked = GPSService.PortaGPS != null && GPSService.PortaGPS.IsOpen; chbGPSativo.Checked = GPSService.PortaGPS != null && GPSService.PortaGPS.IsOpen;
AtualizarGrafico(); AtualizarGrafico();
@ -104,21 +81,24 @@ namespace AgroBase.Forms.Operacoes
private void TmrLeituras_Tick(object sender, EventArgs e) private void TmrLeituras_Tick(object sender, EventArgs e)
{ {
Variaveis.OperacaoEmAndamento.Tempo = TimeSpan.FromTicks(Variaveis.OperacaoEmAndamento.Iniciado ? ((Variaveis.OperacaoEmAndamento.TimestampFim > 0 ? Variaveis.OperacaoEmAndamento.TimestampFim : DateTime.Now.Ticks) - Variaveis.OperacaoEmAndamento.TimestampInicio) : 0);
if (Variaveis.OperacaoEmAndamento.Iniciado) if (Variaveis.OperacaoEmAndamento.Iniciado)
{ {
CamerasSolo.ForEach(CameraSolo => Variaveis.OperacaoEmAndamento.CamerasSolo.Where(x => x.Iniciada).ToList().ForEach(CameraSolo =>
{ {
AtualizaLeituraCameraSolo(CameraSolo); AtualizaLeituraCameraSolo(CameraSolo);
}); });
Variaveis.OperacaoEmAndamento.Sensoriamento.ErvasNoRadar = Variaveis.OperacaoEmAndamento.CamerasSolo.Sum(x => x.ErvasNoRadar);
AtualizaLeituraCameraCaminho(); AtualizaLeituraCameraCaminho();
AtualizarGrafico();
} }
else
{
Variaveis.OperacaoEmAndamento.AtualizarRuasSelecionadas();
}
AtualizarGrafico();
AtualizarInformacoesGerais(); AtualizarInformacoesGerais();
pnlOrientacao.Invalidate();
pnlInclinacao.Invalidate();
if (!Variaveis.OperacaoEmAndamento.Iniciado && btnIniciarOperacao.Text == "Finalizar Operação") if (!Variaveis.OperacaoEmAndamento.Iniciado && btnIniciarOperacao.Text == "Finalizar Operação")
{ {
@ -128,13 +108,27 @@ namespace AgroBase.Forms.Operacoes
private void AtualizaLeituraCameraSolo(CameraSoloModel CameraSolo) private void AtualizaLeituraCameraSolo(CameraSoloModel CameraSolo)
{ {
if (CameraSolo.camera.socket != null && CameraSolo.camera.socket.DadosRecebidos.Any()) if (CameraSolo.camera._mqttTopico != null && CameraSolo.camera._mqttTopico.Mensagens.Any(x => x.Momento > CameraSolo.camera.IniciadoEm))
{ {
int BicosPorCamera = Atuador.Dados.QuantidadeBicos / CamerasSolo.Count(); try
var leitura = CameraSolo.camera.socket.DadosRecebidos.Last(); {
var Verdes = leitura.objetos.ToList(); var Mensagem = CameraSolo.camera._mqttTopico.Mensagens.LastOrDefault(x => x.Momento > CameraSolo.camera.IniciadoEm);
int intervaloPorBico = Convert.ToInt32(CameraSolo.camera.socket.DadosRecebidos.First().x_max) / BicosPorCamera; if (Mensagem != null)
int inicioBarraPulverizadora = Convert.ToInt32(CameraSolo.camera.socket.DadosRecebidos.First().y_max * (1 - Atuador.Dados.PercentualInicioPulverizacao)); {
CameraSolo.Leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
}
}
catch
{
}
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu;
int BicosPorCamera = Atuador.Dados.QuantidadeBicos / Variaveis.OperacaoEmAndamento.CamerasSolo.Count();
var Verdes = CameraSolo.Leitura.objetos.ToList();
int intervaloPorBico = Convert.ToInt32(CameraSolo.Leitura.x_max) / BicosPorCamera;
int inicioBarraPulverizadora = Convert.ToInt32(CameraSolo.Leitura.y_max * (1 - Atuador.Dados.PercentualInicioPulverizacao));
List<bool> BicosAnteriores = new List<bool>(); List<bool> BicosAnteriores = new List<bool>();
// Inicialize todos os bicos como inativos antes de verificar os objetos verdes // Inicialize todos os bicos como inativos antes de verificar os objetos verdes
@ -183,7 +177,7 @@ namespace AgroBase.Forms.Operacoes
} }
} }
lblUltimaLeituraSolo.Text = "Ultima Leitura Solo: " + FuncoesGlobais.TimestampToDate(leitura.timestamp); lblUltimaLeituraSolo.Text = "Ultima Leitura Solo: " + FuncoesGlobais.TimestampToDate(CameraSolo.Leitura.timestamp);
pnlAtuadores.Invalidate(); pnlAtuadores.Invalidate();
AtualizaInformacoesControleOperacao(); AtualizaInformacoesControleOperacao();
@ -194,8 +188,26 @@ namespace AgroBase.Forms.Operacoes
{ {
try try
{ {
var contornosJson = File.ReadAllText("Python/Output/" + cameraCaminho.ArquivoLeitura); var cameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminho;
cameraCaminho.Leituras = JsonConvert.DeserializeObject<CameraDeepLabV3PlusModel[]>(contornosJson).ToList(); var MqttTopico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == cameraCaminho.MqttTopico);
if (MqttTopico != null && MqttTopico.Mensagens.Any(x => x.Momento > cameraCaminho.camera.IniciadoEm))
{
try
{
var Mensagem = MqttTopico.Mensagens.LastOrDefault(x => x.Momento > cameraCaminho.camera.IniciadoEm);
if (Mensagem != null)
{
cameraCaminho.Leitura = JsonConvert.DeserializeObject<CameraDeepLabV3PlusModel>(Mensagem.Mensagem);
}
}
catch
{
}
}
//var contornosJson = File.ReadAllText("Python/Output/" + cameraCaminho.ArquivoLeitura);
//cameraCaminho.Leituras = JsonConvert.DeserializeObject<CameraDeepLabV3PlusModel[]>(contornosJson).ToList();
pnlCaminho.Invalidate(); pnlCaminho.Invalidate();
@ -222,58 +234,22 @@ namespace AgroBase.Forms.Operacoes
Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloRuaCamera = cameraCaminho.Angulo; Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloRuaCamera = cameraCaminho.Angulo;
pnlInclinacao.Invalidate(); pnlAnguloCamera.Invalidate();
lblUltimaLeituraRua.Text = "Ultima Leitura Rua: " + FuncoesGlobais.TimestampToDate(cameraCaminho.Leituras.FirstOrDefault().timestamp); lblUltimaLeituraRua.Text = "Ultima Leitura Rua: " + FuncoesGlobais.TimestampToDate(cameraCaminho.Leitura.timestamp);
AtualizaInformacoesControleOperacao(); AtualizaInformacoesControleOperacao();
} }
catch catch (Exception ex)
{ {
Console.WriteLine("Erro ao receber dados da Camera Caminho: " + ex.Message);
} }
} }
private void AtualizaInformacoesControleOperacao() private void AtualizaInformacoesControleOperacao()
{ {
var BicosNaoAtuados = new List<AtuadorBicoModel>(); Variaveis.OperacaoEmAndamento.AtualizarControleAtuadores();
Atuador.Dados.BicosPulverizadores.ForEach(x =>
{
BicosNaoAtuados.Add(x);
});
Variaveis.OperacaoEmAndamento.Sensoriamento.ErvasNoRadar = CamerasSolo.Sum(x => x.ErvasNoRadar);
Variaveis.OperacaoEmAndamento.Sensoriamento.ErvasIdentificadas = Variaveis.OperacaoEmAndamento.Sensoriamento.AtuacoesPorBico.Sum();
if (Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual == StatusOperacao.Aguardando)
{
Variaveis.OperacaoEmAndamento.Controle.BicosAtuados = BicosNaoAtuados.ToList();
Variaveis.OperacaoEmAndamento.Controle.RPM = 0;
Variaveis.OperacaoEmAndamento.Controle.Angulo = 0;
}
else
{
Variaveis.OperacaoEmAndamento.Controle.BicosAtuados =
!chbATUativo.Checked ? BicosNaoAtuados
: Atuador.Dados.BicosPulverizadores;
Variaveis.OperacaoEmAndamento.CalculaDadosMovimentacaoAutonoma(); Variaveis.OperacaoEmAndamento.CalculaDadosMovimentacaoAutonoma();
/*Variaveis.OperacaoEmAndamento.Controle.RPM =
!chbMOVativo.Checked ? 0 :
!cameraCaminho.PontosExtremos.Any() ? 0 :
Variaveis.OperacaoEmAndamento.Sensoriamento.ErvasNoRadar == 0 ?
Variaveis.OperacaoEmAndamento.Controle.RPM_Max :
Variaveis.OperacaoEmAndamento.Controle.RPM_Min;
Variaveis.OperacaoEmAndamento.Controle.Angulo =
!chbDIRativo.Checked ? 0 :
cameraCaminho.Angulo > Variaveis.OperacaoEmAndamento.Controle.Angulo_Max ? Variaveis.OperacaoEmAndamento.Controle.Angulo_Max :
cameraCaminho.Angulo < Variaveis.OperacaoEmAndamento.Controle.Angulo_Min ? Variaveis.OperacaoEmAndamento.Controle.Angulo_Min :
cameraCaminho.Angulo;*/
}
pnlOrientacao.Invalidate();
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(); Variaveis.OperacaoEmAndamento.AtualizarDadosControle();
} }
@ -281,7 +257,7 @@ namespace AgroBase.Forms.Operacoes
{ {
MovSensorimanetoGrafico Log = null; MovSensorimanetoGrafico Log = null;
var Motor = Movimentacao.Dados.Motores.FirstOrDefault(x => x.ID == "ET" && x.LogGrafico.Any()); var Motor = Variaveis.OperacaoEmAndamento.DispMov.Dados.Motores.FirstOrDefault(x => x.ID == "ET" && x.LogGrafico.Any());
if (Motor.LogGrafico.Count > 0) if (Motor.LogGrafico.Count > 0)
{ {
@ -298,19 +274,19 @@ namespace AgroBase.Forms.Operacoes
chart.Series.Clear(); chart.Series.Clear();
List<string> Momentos = Logs.Select(x => x.Momento.ToString("mm:ss:fff")).ToList(); List<string> Momentos = Logs.Select(x => x.Momento.ToString("mm:ss:fff")).ToList();
var serieRPMsp = new Series("Velocidade: " + (Log != null ? Log.Velocidade : 0)); var serieVelocidade = new Series("Velocidade: " + (Log != null ? Log.Velocidade : 0));
serieRPMsp.Points.DataBindXY(Momentos, Logs.Select(x => x.Velocidade).ToList()); serieVelocidade.Points.DataBindXY(Momentos, Logs.Select(x => x.Velocidade).ToList());
serieRPMsp.ChartType = SeriesChartType.Line; serieVelocidade.ChartType = SeriesChartType.Line;
chart.Series.Add(serieRPMsp); chart.Series.Add(serieVelocidade);
Minimo = Logs.Min(x => x.Velocidade) < Minimo ? Logs.Min(x => x.Velocidade) : Minimo; Minimo = Logs.Min(x => x.Velocidade) < Minimo ? Logs.Min(x => x.Velocidade) : Minimo;
Maximo = Logs.Min(x => x.Velocidade) > Maximo ? Logs.Min(x => x.Velocidade) : Maximo; Maximo = Logs.Min(x => x.Velocidade) > Maximo ? Logs.Min(x => x.Velocidade) : Maximo;
//var serieRPM = new Series("RPM: " + (Log != null ? Log.RPM : 0)); var serieRPMsp = new Series("RPM SP: " + (Log != null ? Log.RPM_SP : 0));
//serieRPM.Points.DataBindXY(Momentos, Logs.Select(x => x.RPM).ToList()); serieRPMsp.Points.DataBindXY(Momentos, Logs.Select(x => x.RPM_SP).ToList());
//serieRPM.ChartType = SeriesChartType.Spline; serieRPMsp.ChartType = SeriesChartType.Spline;
//chart.Series.Add(serieRPM); chart.Series.Add(serieRPMsp);
//Minimo = Logs.Min(x => x.RPM) < Minimo ? Logs.Min(x => x.RPM) : Minimo; Minimo = Logs.Min(x => x.RPM_SP) < Minimo ? Logs.Min(x => x.RPM_SP) : Minimo;
//Maximo = Logs.Max(x => x.RPM) > Maximo ? Logs.Max(x => x.RPM) : Maximo; Maximo = Logs.Max(x => x.RPM_SP) > Maximo ? Logs.Max(x => x.RPM_SP) : Maximo;
var seriePotencia = new Series("Potencia: " + (Log != null ? Log.Potencia : 0)); var seriePotencia = new Series("Potencia: " + (Log != null ? Log.Potencia : 0));
seriePotencia.Points.DataBindXY(Momentos, Logs.Select(x => x.Potencia).ToList()); seriePotencia.Points.DataBindXY(Momentos, Logs.Select(x => x.Potencia).ToList());
@ -337,21 +313,23 @@ namespace AgroBase.Forms.Operacoes
private void AtualizarInformacoesGerais() private void AtualizarInformacoesGerais()
{ {
if (Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual == StatusOperacao.Parametrizando) var statusAtual = Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual;
if (statusAtual == StatusOperacao.Parametrizando)
{ {
this.Text = "Operação Mapa GPS - Parametrização"; this.Text = "Operação Mapa GPS - Parametrização";
} }
else if (Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual == StatusOperacao.Aguardando) else if (statusAtual == StatusOperacao.Aguardando)
{ {
this.Text = "Operação Mapa GPS - Iniciando em " + (Variaveis.OperacaoEmAndamento.TempoIniciarOperacao - Variaveis.OperacaoEmAndamento.Tempo.Seconds) + " segundo" + (Variaveis.OperacaoEmAndamento.TempoIniciarOperacao - Variaveis.OperacaoEmAndamento.Tempo.Seconds == 1 ? "" : "s") + "..."; this.Text = "Operação Mapa GPS - Iniciando em " + (Variaveis.OperacaoEmAndamento.TempoAguardando.AddSeconds(Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) - DateTime.Now).TotalSeconds.ToString("0") + " segundo" + ((Variaveis.OperacaoEmAndamento.TempoAguardando.AddSeconds(Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) - DateTime.Now).TotalSeconds >= 1 ? "" : "s") + "...";
} }
else if (Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual == StatusOperacao.Concluida) else if (statusAtual == StatusOperacao.Concluida)
{ {
this.Text = "Operação Mapa GPS - Concluída"; this.Text = "Operação Mapa GPS - Concluída";
} }
else if (Variaveis.OperacaoEmAndamento.Iniciado) else if (Variaveis.OperacaoEmAndamento.Iniciado)
{ {
this.Text = "Operação Mapa GPS - Iniciado"; this.Text = "Operação Mapa GPS - Em andamento";
} }
lblDistanciaEsquerda.Text = "Distancia da Esquerda: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaEsquerda.ToString("0.00") + " cm"; lblDistanciaEsquerda.Text = "Distancia da Esquerda: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaEsquerda.ToString("0.00") + " cm";
@ -365,13 +343,13 @@ namespace AgroBase.Forms.Operacoes
lblHerbicidaPorErva.Text = "Herbicida por Erva: " + Variaveis.OperacaoEmAndamento.Sensoriamento.HerbicidaPorErva.ToString("0.000") + " mL"; lblHerbicidaPorErva.Text = "Herbicida por Erva: " + Variaveis.OperacaoEmAndamento.Sensoriamento.HerbicidaPorErva.ToString("0.000") + " mL";
lblBateriaConsumida.Text = "Bateria Consumida: " + Variaveis.OperacaoEmAndamento.Sensoriamento.BateriaConsumida.ToString("0.00") + "%"; lblBateriaConsumida.Text = "Bateria Consumida: " + Variaveis.OperacaoEmAndamento.Sensoriamento.BateriaConsumida.ToString("0.00") + "%";
lblPressao.Text = "P: " + Atuador.Dados.PressaoLinha.ToString("0.00") + " psi"; lblPressao.Text = "P: " + Variaveis.OperacaoEmAndamento.DispAtu.Dados.PressaoLinha.ToString("0.00") + " psi";
pgbReservatorio.Value = Convert.ToInt32(Atuador.Dados.PercentualReservatorio); pgbReservatorio.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio);
lblPorcentagemReservatorio.Text = Atuador.Dados.PercentualReservatorio.ToString("00.00") + "%"; lblPorcentagemReservatorio.Text = Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio.ToString("00.00") + "%";
pgbBateria.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria); pgbBateria.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria);
lblPorcentagemReservatorio.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria.ToString("00.00") + "%"; lblPorcentagemBateria.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria.ToString("00.00") + "%";
pgbProgresso.Value = Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto <= 100 ? Convert.ToInt32(Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto) : 100; pgbProgresso.Value = Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto <= 100 ? Convert.ToInt32(Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto) : 100;
lblPorcentagemProgresso.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto.ToString("00.00") + "%"; lblPorcentagemProgresso.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto.ToString("00.00") + "%";
@ -387,74 +365,65 @@ namespace AgroBase.Forms.Operacoes
private void AtualizaListaCameras() private void AtualizaListaCameras()
{ {
var listaCameras = new CameraService<object>().AtualizaListaCameras().ToArray(); var listaCameras = CameraService.AtualizaListaCameras().Keys.ToArray();
var cameras = gpbOpcoes.Controls.OfType<ComboBox>().Where(x => x.Name.Contains("cmbCameraSolo")).OrderBy(x => x.TabIndex).ToList(); var cameras = gpbOpcoes.Controls.OfType<ComboBox>().Where(x => x.Name.Contains("cmbCameraSolo")).OrderBy(x => x.TabIndex).ToList();
foreach (ComboBox cmb in cameras) foreach (ComboBox cmb in cameras)
{ {
string CamNome = cmb.Name.Replace("cmbCameraSolo", ""); string CamNome = cmb.Name.Replace("cmbCameraSolo", "");
CameraSoloModel CameraSolo = CamerasSolo.FirstOrDefault(x => x.Nome == CamNome); CameraSoloModel CameraSolo = Variaveis.OperacaoEmAndamento.CamerasSolo.FirstOrDefault(x => x.Nome == CamNome);
if (CameraSolo == null) if (CameraSolo == null)
{ {
CameraSolo = new CameraSoloModel() CameraSolo = new CameraSoloModel()
{ {
Nome = CamNome, Nome = CamNome,
Posicao = CamerasSolo.Count(), Posicao = Variaveis.OperacaoEmAndamento.CamerasSolo.Count(),
ArquivoLeitura = "ervas_" + CamNome + ".json", ArquivoLeitura = "ervas_" + CamNome + ".json",
browser = null, browser = null,
camera = new CameraService<CameraCoordenadasFrameModel>(), camera = new CameraService(),
CameraSelecionada = "", CameraSelecionada = "",
combo = cmb, combo = cmb,
MaxLeituras = 10, MaxLeituras = 10,
SocketPorta = (VariaveisPortas.SocketSolo + CamerasSolo.Count()).ToString(), VideoPorta = (VariaveisPortas.CameraSolo + Variaveis.OperacaoEmAndamento.CamerasSolo.Count()).ToString(),
VideoPorta = (VariaveisPortas.CameraSolo + CamerasSolo.Count()).ToString(),
VideoUrl = "green_objects_" + CamNome, VideoUrl = "green_objects_" + CamNome,
MqttTopico = "green_objects_" + CamNome,
panel = pnlCameraSolo.Controls.OfType<Panel>().Where(x => x.Name.Replace("pnl", "cmb") == cmb.Name).FirstOrDefault(), panel = pnlCameraSolo.Controls.OfType<Panel>().Where(x => x.Name.Replace("pnl", "cmb") == cmb.Name).FirstOrDefault(),
}; };
CamerasSolo.Add(CameraSolo); Variaveis.OperacaoEmAndamento.CamerasSolo.Add(CameraSolo);
} }
CameraSolo.combo.Items.Clear(); CameraSolo.combo.Items.Clear();
CameraSolo.combo.Items.AddRange(listaCameras); CameraSolo.combo.Items.AddRange(listaCameras);
if (CameraSolo.combo.Items.Count == 1)
{
CameraSolo.camera.selectedCamera = 0;
}
CameraSolo.combo.SelectedIndex = CameraSolo.camera.selectedCamera; CameraSolo.combo.SelectedIndex = CameraSolo.camera.selectedCamera;
} }
if (cameraCaminho == null) if (Variaveis.OperacaoEmAndamento.CameraCaminho == null)
{ {
cameraCaminho = new CameraCaminhoModel() Variaveis.OperacaoEmAndamento.CameraCaminho = new CameraCaminhoModel()
{ {
Nome = "Caminho", Nome = "Caminho",
Posicao = 0, Posicao = 0,
ArquivoLeitura = "leitura_ruas.json", ArquivoLeitura = "leitura_ruas.json",
browser = null, browser = null,
camera = new CameraService<CameraDeepLabV3PlusModel>(), camera = new CameraService(),
CameraSelecionada = "", CameraSelecionada = "",
combo = cmbCameraCaminho, combo = cmbCameraCaminho,
MaxLeituras = 1, MaxLeituras = 1,
SocketPorta = (VariaveisPortas.SocketCaminho + 0).ToString(),
VideoPorta = (VariaveisPortas.CameraCaminho + 0).ToString(), VideoPorta = (VariaveisPortas.CameraCaminho + 0).ToString(),
VideoUrl = "street_detector", VideoUrl = "street_detector",
MqttTopico = "street_detector",
panel = pnlCameraCaminho, panel = pnlCameraCaminho,
Angulo = 0, Angulo = 0,
AnguloDireito = 0, AnguloDireito = 0,
AnguloEsquerdo = 0, AnguloEsquerdo = 0,
Leituras = new List<CameraDeepLabV3PlusModel>(), Leitura = new CameraDeepLabV3PlusModel(),
PontosExtremos = new List<Point>() PontosExtremos = new List<Point>()
}; };
} }
cameraCaminho.camera.selectedCamera = cmbCameraCaminho.SelectedIndex > 0 ? cmbCameraCaminho.SelectedIndex : 0;
cmbCameraCaminho.Items.Clear(); cmbCameraCaminho.Items.Clear();
cmbCameraCaminho.Items.AddRange(listaCameras); cmbCameraCaminho.Items.AddRange(listaCameras);
if (cmbCameraCaminho.Items.Count == 1) cmbCameraCaminho.SelectedIndex = Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera;
{
cameraCaminho.camera.selectedCamera = 0;
}
cmbCameraCaminho.SelectedIndex = cameraCaminho.camera.selectedCamera;
} }
private void cmbCameraSolo_SelectedIndexChanged(object sender, EventArgs e) private void cmbCameraSolo_SelectedIndexChanged(object sender, EventArgs e)
@ -463,15 +432,13 @@ namespace AgroBase.Forms.Operacoes
string CamNome = cmb.Name.Replace("cmbCameraSolo", ""); string CamNome = cmb.Name.Replace("cmbCameraSolo", "");
CameraSoloModel CameraSolo = CamerasSolo.FirstOrDefault(x => x.Nome == CamNome); CameraSoloModel CameraSolo = Variaveis.OperacaoEmAndamento.CamerasSolo.FirstOrDefault(x => x.Nome == CamNome);
if (CameraSolo.CameraSelecionada != "Sem vídeo" && CameraSolo.CameraSelecionada != "") if (CameraSolo.combo.SelectedIndex > 0 && (cmbCameraCaminho.SelectedIndex == CameraSolo.combo.SelectedIndex || Variaveis.OperacaoEmAndamento.CamerasSolo.Any(x => x.Nome != CameraSolo.Nome && x.combo.SelectedIndex == CameraSolo.combo.SelectedIndex)))
{ {
cmbCameraCaminho.Items.Add(CameraSolo.CameraSelecionada); MessageBox.Show("Essa câmera já está sendo usada por outro processo!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Warning);
CamerasSolo.Where(x => x.Nome != CamNome).ToList().ForEach(Camera => CameraSolo.combo.SelectedIndex = CameraSolo.camera.selectedCamera;
{ return;
Camera.combo.Items.Add(CameraSolo.CameraSelecionada);
});
} }
CameraSolo.camera.selectedCamera = CameraSolo.combo.SelectedIndex; CameraSolo.camera.selectedCamera = CameraSolo.combo.SelectedIndex;
@ -481,17 +448,6 @@ namespace AgroBase.Forms.Operacoes
IniciarCameraSolo(CameraSolo); IniciarCameraSolo(CameraSolo);
} }
CameraSolo.CameraSelecionada = CameraSolo.combo.Text; CameraSolo.CameraSelecionada = CameraSolo.combo.Text;
//btnIniciarOperacao.Enabled = cmbCameraSolo.SelectedIndex > 0 && cmbCameraCaminho.SelectedIndex > 0;
if (CameraSolo.CameraSelecionada != "Sem vídeo" && CameraSolo.CameraSelecionada != "")
{
cmbCameraCaminho.Items.Remove(CameraSolo.CameraSelecionada);
CamerasSolo.Where(x => x.Nome != CamNome).ToList().ForEach(Camera =>
{
Camera.combo.Items.Remove(CameraSolo.CameraSelecionada);
});
}
} }
private void IniciarCameraSolo(CameraSoloModel CameraSolo) private void IniciarCameraSolo(CameraSoloModel CameraSolo)
@ -504,41 +460,18 @@ namespace AgroBase.Forms.Operacoes
CameraSolo.VideoUrl, CameraSolo.VideoUrl,
CameraSolo.ArquivoLeitura, CameraSolo.ArquivoLeitura,
"1", "1",
CameraSolo.SocketPorta CameraSolo.MqttTopico
}, },
CameraSolo.VideoPorta, CameraSolo.VideoPorta,
CameraSolo.VideoUrl, CameraSolo.VideoUrl,
true, CameraSolo.MqttTopico,
CameraSolo.SocketPorta CameraSolo.tmrProcesso
); );
if (CameraSolo.browser == null)
{
CameraSolo.browser = new ChromiumWebBrowser(CameraSolo.camera.URLcamera);
CameraSolo.panel.Controls.Add(CameraSolo.browser);
CameraSolo.browser.Dock = DockStyle.Fill;
}
} }
private void DesligarCameraSolo(CameraSoloModel CameraSolo) private void DesligarCameraSolo(CameraSoloModel CameraSolo)
{ {
try CameraSolo.DesligarCamera();
{
CameraSolo.panel.Controls.Remove(CameraSolo.browser);
CameraSolo.browser = null;
if (CameraSolo.camera.socket != null)
{
CameraSolo.camera.socket.Disconnect();
}
if (CameraSolo.camera.pythonProcess != null)
{
CameraSolo.camera.pythonProcess.Kill();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} }
@ -546,43 +479,24 @@ namespace AgroBase.Forms.Operacoes
private void cmbCameraCaminho_SelectedIndexChanged(object sender, EventArgs e) private void cmbCameraCaminho_SelectedIndexChanged(object sender, EventArgs e)
{ {
if (cameraCaminho.CameraSelecionada != "Sem vídeo" && cameraCaminho.CameraSelecionada != "") if (Variaveis.OperacaoEmAndamento.CameraCaminho.combo.SelectedIndex > 0 && Variaveis.OperacaoEmAndamento.CamerasSolo.Any(x => x.combo.SelectedIndex == Variaveis.OperacaoEmAndamento.CameraCaminho.combo.SelectedIndex))
{ {
//cmbCameraSoloE.Items.Add(cameraCaminhoSelecionada); MessageBox.Show("Essa câmera já está sendo usada por outro processo!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Warning);
CamerasSolo.ForEach(Camera => Variaveis.OperacaoEmAndamento.CameraCaminho.combo.SelectedIndex = Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera;
{ return;
Camera.combo.Items.Add(cameraCaminho.CameraSelecionada);
});
} }
cameraCaminho.camera.selectedCamera = cmbCameraCaminho.SelectedIndex; Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera = cmbCameraCaminho.SelectedIndex;
if (cameraCaminho.camera.selectedCamera > 0) DesligarCameraCaminho(Variaveis.OperacaoEmAndamento.CameraCaminho);
if (Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera > 0)
{ {
DesligarCameraCaminho(); IniciarCameraCaminho(Variaveis.OperacaoEmAndamento.CameraCaminho);
IniciarCameraCaminho();
} }
else Variaveis.OperacaoEmAndamento.CameraCaminho.CameraSelecionada = cmbCameraCaminho.Text;
{
DesligarCameraCaminho();
}
cameraCaminho.CameraSelecionada = cmbCameraCaminho.Text;
//btnIniciarOperacao.Enabled = cmbCameraSolo.SelectedIndex > 0 && cmbCameraCaminho.SelectedIndex > 0;
if (cameraCaminho.CameraSelecionada != "Sem vídeo" && cameraCaminho.CameraSelecionada != "")
{
cmbCameraSoloE.Items.Remove(cameraCaminho.CameraSelecionada);
CamerasSolo.ForEach(Camera =>
{
Camera.combo.Items.Remove(cameraCaminho.CameraSelecionada);
});
} }
} private void IniciarCameraCaminho(CameraCaminhoModel cameraCaminho)
private void IniciarCameraCaminho()
{ {
cameraCaminho.ArquivoLeitura = cameraCaminho.ArquivoLeitura;
cameraCaminho.camera.IniciarCamera( cameraCaminho.camera.IniciarCamera(
PythonService.ScriptStreetDetector, PythonService.ScriptStreetDetector,
new string[] { new string[] {
@ -591,41 +505,18 @@ namespace AgroBase.Forms.Operacoes
cameraCaminho.VideoUrl, cameraCaminho.VideoUrl,
cameraCaminho.ArquivoLeitura, cameraCaminho.ArquivoLeitura,
"1", "1",
cameraCaminho.SocketPorta cameraCaminho.MqttTopico
}, },
cameraCaminho.VideoPorta, cameraCaminho.VideoPorta,
cameraCaminho.VideoUrl, cameraCaminho.VideoUrl,
false, cameraCaminho.MqttTopico,
cameraCaminho.SocketPorta cameraCaminho.tmrProcesso
); );
if (cameraCaminho.browser == null)
{
cameraCaminho.browser = new ChromiumWebBrowser(cameraCaminho.camera.URLcamera);
cameraCaminho.panel.Controls.Add(cameraCaminho.browser);
cameraCaminho.browser.Dock = DockStyle.Fill;
}
} }
private void DesligarCameraCaminho() private void DesligarCameraCaminho(CameraCaminhoModel cameraCaminho)
{ {
try cameraCaminho.DesligarCamera();
{
cameraCaminho.panel.Controls.Remove(cameraCaminho.browser);
cameraCaminho.browser = null;
if (cameraCaminho.camera.socket != null)
{
cameraCaminho.camera.socket.Disconnect();
}
if (cameraCaminho.camera.pythonProcess != null)
{
cameraCaminho.camera.pythonProcess.Kill();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} }
#endregion #endregion
@ -649,9 +540,16 @@ namespace AgroBase.Forms.Operacoes
Variaveis.OperacaoEmAndamento.FinalizarOperacao(); Variaveis.OperacaoEmAndamento.FinalizarOperacao();
} }
else else
{
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
{ {
Variaveis.OperacaoEmAndamento.IniciarOperacao(null, false); Variaveis.OperacaoEmAndamento.IniciarOperacao(null, false);
} }
else
{
MessageBox.Show("Finalize a parametrização corretamente para iniciar a operação!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
AtualizaComponentesOperacao(); AtualizaComponentesOperacao();
} }
@ -669,6 +567,8 @@ namespace AgroBase.Forms.Operacoes
private void pnlAtuadores_Paint(object sender, PaintEventArgs e) private void pnlAtuadores_Paint(object sender, PaintEventArgs e)
{ {
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu;
Graphics g = e.Graphics; Graphics g = e.Graphics;
Panel myPanel = (Panel)sender; Panel myPanel = (Panel)sender;
int panelWidth = myPanel.Width; int panelWidth = myPanel.Width;
@ -739,8 +639,10 @@ namespace AgroBase.Forms.Operacoes
private void pnlCaminho_Paint(object sender, PaintEventArgs e) private void pnlCaminho_Paint(object sender, PaintEventArgs e)
{ {
var cameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminho;
Panel pnlContornos = (Panel)sender; Panel pnlContornos = (Panel)sender;
if (cameraCaminho.Leituras == null || cameraCaminho.Leituras.Count == 0) return; if (cameraCaminho.Leitura == null) return;
Graphics graphics = e.Graphics; Graphics graphics = e.Graphics;
graphics.Clear(pnlContornos.BackColor); // Limpa o fundo graphics.Clear(pnlContornos.BackColor); // Limpa o fundo
@ -764,9 +666,7 @@ namespace AgroBase.Forms.Operacoes
List<Point> pontosCamera = new List<Point>(); List<Point> pontosCamera = new List<Point>();
var Classe = cameraCaminho.ClassMap.FirstOrDefault(x => x.Key == "rua"); var Classe = cameraCaminho.ClassMap.FirstOrDefault(x => x.Key == "rua");
foreach (var Leitura in cameraCaminho.Leituras.OrderByDescending(x => x.timestamp)) foreach (var cameraClass in cameraCaminho.Leitura.Classes.Where(x => x.Classe == Classe.Key))
{
foreach (var cameraClass in Leitura.Classes.Where(x => x.Classe == Classe.Key))
{ {
if (cameraClass.Contornos == null || cameraClass.Contornos.Length == 0) continue; if (cameraClass.Contornos == null || cameraClass.Contornos.Length == 0) continue;
@ -797,9 +697,6 @@ namespace AgroBase.Forms.Operacoes
} }
} }
} }
// Plotar apenas a ultima leitura do json
break;
}
using (Pen pen = new Pen(Classe.Value, 2)) using (Pen pen = new Pen(Classe.Value, 2))
{ {
@ -820,7 +717,7 @@ namespace AgroBase.Forms.Operacoes
try try
{ {
//DesenharInclinacao((Panel)sender, e, (float)cameraCaminho.Angulo); //DesenharInclinacao((Panel)sender, e, (float)cameraCaminho.Angulo);
DesenharInclinacao((Panel)sender, e, (float)(Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloDif), 90); DesenharInclinacao((Panel)sender, e, (float)(Variaveis.OperacaoEmAndamento.Controle.Angulo), 90);
} }
catch { } catch { }
} }
@ -902,6 +799,7 @@ namespace AgroBase.Forms.Operacoes
} }
} }
#endregion #endregion
@ -926,7 +824,6 @@ namespace AgroBase.Forms.Operacoes
} }
lblStatus.Text = "Status: " + Enum.GetName(typeof(StatusOperacao), Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual); lblStatus.Text = "Status: " + Enum.GetName(typeof(StatusOperacao), Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual);
lblDirecao.Text = "Direção: " + Enum.GetName(typeof(DirecaoCarroRua), Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.Direcao); lblDirecao.Text = "Direção: " + Enum.GetName(typeof(DirecaoCarroRua), Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.Direcao);
Console.WriteLine(Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.IdxPontoAproximadoRua);
//var Ponto = Variaveis.OperacaoEmAndamento.Mapa.Trajetoria[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual][Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.IdxPontoAproximadoRua]; //var Ponto = Variaveis.OperacaoEmAndamento.Mapa.Trajetoria[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual][Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.IdxPontoAproximadoRua];
} }
@ -938,6 +835,7 @@ namespace AgroBase.Forms.Operacoes
} }
} }
#endregion #endregion

View File

@ -29,9 +29,9 @@ namespace AgroBase.Forms.Operacoes
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea3 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend(); System.Windows.Forms.DataVisualization.Charting.Legend legend3 = new System.Windows.Forms.DataVisualization.Charting.Legend();
System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series();
this.pnlCameraSolo = new System.Windows.Forms.Panel(); this.pnlCameraSolo = new System.Windows.Forms.Panel();
this.pnlCameraSoloD = new System.Windows.Forms.Panel(); this.pnlCameraSoloD = new System.Windows.Forms.Panel();
this.pnlCameraSoloE = new System.Windows.Forms.Panel(); this.pnlCameraSoloE = new System.Windows.Forms.Panel();
@ -178,18 +178,18 @@ namespace AgroBase.Forms.Operacoes
// //
// chartGraficos // chartGraficos
// //
chartArea2.Name = "ChartArea1"; chartArea3.Name = "ChartArea1";
this.chartGraficos.ChartAreas.Add(chartArea2); this.chartGraficos.ChartAreas.Add(chartArea3);
this.chartGraficos.Dock = System.Windows.Forms.DockStyle.Fill; this.chartGraficos.Dock = System.Windows.Forms.DockStyle.Fill;
legend2.Name = "Legend1"; legend3.Name = "Legend1";
this.chartGraficos.Legends.Add(legend2); this.chartGraficos.Legends.Add(legend3);
this.chartGraficos.Location = new System.Drawing.Point(0, 0); this.chartGraficos.Location = new System.Drawing.Point(0, 0);
this.chartGraficos.Margin = new System.Windows.Forms.Padding(2); this.chartGraficos.Margin = new System.Windows.Forms.Padding(2);
this.chartGraficos.Name = "chartGraficos"; this.chartGraficos.Name = "chartGraficos";
series2.ChartArea = "ChartArea1"; series3.ChartArea = "ChartArea1";
series2.Legend = "Legend1"; series3.Legend = "Legend1";
series2.Name = "Series1"; series3.Name = "Series1";
this.chartGraficos.Series.Add(series2); this.chartGraficos.Series.Add(series3);
this.chartGraficos.Size = new System.Drawing.Size(405, 254); this.chartGraficos.Size = new System.Drawing.Size(405, 254);
this.chartGraficos.TabIndex = 0; this.chartGraficos.TabIndex = 0;
this.chartGraficos.Text = "chart1"; this.chartGraficos.Text = "chart1";
@ -716,7 +716,7 @@ namespace AgroBase.Forms.Operacoes
this.pnlInclinacao.BackColor = System.Drawing.Color.White; this.pnlInclinacao.BackColor = System.Drawing.Color.White;
this.pnlInclinacao.BackgroundImage = global::AgroBase.Properties.Resources.transferidor; this.pnlInclinacao.BackgroundImage = global::AgroBase.Properties.Resources.transferidor;
this.pnlInclinacao.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; this.pnlInclinacao.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.pnlInclinacao.Location = new System.Drawing.Point(625, 6); this.pnlInclinacao.Location = new System.Drawing.Point(937, 6);
this.pnlInclinacao.Margin = new System.Windows.Forms.Padding(2); this.pnlInclinacao.Margin = new System.Windows.Forms.Padding(2);
this.pnlInclinacao.Name = "pnlInclinacao"; this.pnlInclinacao.Name = "pnlInclinacao";
this.pnlInclinacao.Size = new System.Drawing.Size(78, 84); this.pnlInclinacao.Size = new System.Drawing.Size(78, 84);
@ -728,7 +728,7 @@ namespace AgroBase.Forms.Operacoes
this.pnlAnguloCamera.BackColor = System.Drawing.Color.White; this.pnlAnguloCamera.BackColor = System.Drawing.Color.White;
this.pnlAnguloCamera.BackgroundImage = global::AgroBase.Properties.Resources.transferidor; this.pnlAnguloCamera.BackgroundImage = global::AgroBase.Properties.Resources.transferidor;
this.pnlAnguloCamera.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; this.pnlAnguloCamera.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.pnlAnguloCamera.Location = new System.Drawing.Point(936, 6); this.pnlAnguloCamera.Location = new System.Drawing.Point(623, 6);
this.pnlAnguloCamera.Margin = new System.Windows.Forms.Padding(2); this.pnlAnguloCamera.Margin = new System.Windows.Forms.Padding(2);
this.pnlAnguloCamera.Name = "pnlAnguloCamera"; this.pnlAnguloCamera.Name = "pnlAnguloCamera";
this.pnlAnguloCamera.Size = new System.Drawing.Size(78, 84); this.pnlAnguloCamera.Size = new System.Drawing.Size(78, 84);

View File

@ -58,6 +58,8 @@ namespace AgroBase.Forms.Operacoes
nudAnguloMinimo.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.Angulo_Min); nudAnguloMinimo.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.Angulo_Min);
nudVelocidadeMP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP); nudVelocidadeMP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP);
nudTemposalvarlog.Value = Variaveis.OperacaoEmAndamento.tmrLogs.Interval / 1000; nudTemposalvarlog.Value = Variaveis.OperacaoEmAndamento.tmrLogs.Interval / 1000;
nudQtdBicos.Value = Variaveis.OperacaoEmAndamento.DispAtu.Dados.QuantidadeBicos;
nudQtdCameras.Value = Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo;
} }
private void chbD_CheckedChanged(object sender, EventArgs e) private void chbD_CheckedChanged(object sender, EventArgs e)
@ -119,6 +121,8 @@ namespace AgroBase.Forms.Operacoes
Variaveis.OperacaoEmAndamento.Controle.Angulo_Min = Convert.ToInt32(nudAnguloMinimo.Value); Variaveis.OperacaoEmAndamento.Controle.Angulo_Min = Convert.ToInt32(nudAnguloMinimo.Value);
Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP = Convert.ToInt32(nudVelocidadeMP.Value); Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP = Convert.ToInt32(nudVelocidadeMP.Value);
Variaveis.OperacaoEmAndamento.tmrLogs.Interval = Convert.ToInt32(nudTemposalvarlog.Value * 1000); Variaveis.OperacaoEmAndamento.tmrLogs.Interval = Convert.ToInt32(nudTemposalvarlog.Value * 1000);
Variaveis.OperacaoEmAndamento.DispAtu.Dados.QuantidadeBicos = Convert.ToInt32(nudQtdBicos.Value);
Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo = Convert.ToInt32(nudQtdCameras.Value);
if (chbSalvar.Checked) if (chbSalvar.Checked)
{ {

View File

@ -1,6 +1,7 @@
using AgroBase.Models; using AgroBase.Models;
using AgroBase.Services; using AgroBase.Services;
using CefSharp.WinForms; using CefSharp.WinForms;
using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
@ -15,7 +16,7 @@ namespace AgroBase.Forms.Sensoriamento
{ {
public partial class frmSenCamera : Form public partial class frmSenCamera : Form
{ {
private CameraService<CameraAnguloModel> cameraService = new CameraService<CameraAnguloModel>(); private CameraService cameraService = new CameraService();
private ChromiumWebBrowser chromiumWebBrowser = null; private ChromiumWebBrowser chromiumWebBrowser = null;
private Timer tmrLeitura; private Timer tmrLeitura;
@ -40,7 +41,7 @@ namespace AgroBase.Forms.Sensoriamento
{ {
try try
{ {
cameraService.socket.Disconnect(); Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
cameraService.pythonProcess.Kill(); cameraService.pythonProcess.Kill();
} }
catch (Exception ex) catch (Exception ex)
@ -86,12 +87,12 @@ namespace AgroBase.Forms.Sensoriamento
VideoUrl, VideoUrl,
ArquivoLeitura, ArquivoLeitura,
MostrarDebug ? "1" : "0", MostrarDebug ? "1" : "0",
SocketPorta VideoUrl
}, },
VideoPorta, VideoPorta,
VideoUrl, VideoUrl,
true, VideoUrl,
VariaveisPortas.SocketCaminho.ToString() new Timer()
); );
tmrLeitura = new Timer() { Interval = 200 }; tmrLeitura = new Timer() { Interval = 200 };
@ -104,7 +105,7 @@ namespace AgroBase.Forms.Sensoriamento
{ {
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0; cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
cmbCameras.Items.Clear(); cmbCameras.Items.Clear();
cmbCameras.Items.AddRange(cameraService.AtualizaListaCameras().ToArray()); cmbCameras.Items.AddRange(CameraService.AtualizaListaCameras().Keys.ToArray());
if (cmbCameras.Items.Count == 1) if (cmbCameras.Items.Count == 1)
{ {
cameraService.selectedCamera = 0; cameraService.selectedCamera = 0;
@ -124,9 +125,22 @@ namespace AgroBase.Forms.Sensoriamento
this.pnlLeituras.Controls.Clear(); this.pnlLeituras.Controls.Clear();
int i = 0; int i = 0;
var leituras = cameraService.socket.DadosRecebidos.ToList().OrderByDescending(x => x.timestamp).Take(MaxLeituras).ToList(); var MqttTopico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == VideoUrl);
CameraCoordenadasFrameModel leitura = null;
var Mensagem = MqttTopico.Mensagens.LastOrDefault(x => x.Momento > cameraService.IniciadoEm);
if (Mensagem != null)
{
try
{
leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
}
catch
{
foreach (var leitura in leituras) }
}
/*foreach (var leitura in leituras)
{ {
GroupBox gpb = new GroupBox() GroupBox gpb = new GroupBox()
{ {
@ -172,7 +186,7 @@ namespace AgroBase.Forms.Sensoriamento
pnlLeituras.Controls.Add(gpb); pnlLeituras.Controls.Add(gpb);
i++; i++;
} }*/
} }

View File

@ -34,6 +34,7 @@ namespace AgroBase
this.erroStrip = new System.Windows.Forms.StatusStrip(); this.erroStrip = new System.Windows.Forms.StatusStrip();
this.lblStripErro = new System.Windows.Forms.ToolStripStatusLabel(); this.lblStripErro = new System.Windows.Forms.ToolStripStatusLabel();
this.pnlLateral = new System.Windows.Forms.Panel(); this.pnlLateral = new System.Windows.Forms.Panel();
this.chbConexaoautomatica = new System.Windows.Forms.CheckBox();
this.gpbDispositivos = new System.Windows.Forms.GroupBox(); this.gpbDispositivos = new System.Windows.Forms.GroupBox();
this.lstDisponiveis = new System.Windows.Forms.ListView(); this.lstDisponiveis = new System.Windows.Forms.ListView();
this.btnRemover = new System.Windows.Forms.Button(); this.btnRemover = new System.Windows.Forms.Button();
@ -51,6 +52,7 @@ namespace AgroBase
this.lblStripJoystickComando = new System.Windows.Forms.ToolStripStatusLabel(); this.lblStripJoystickComando = new System.Windows.Forms.ToolStripStatusLabel();
this.lblStripOperacao = new System.Windows.Forms.ToolStripStatusLabel(); this.lblStripOperacao = new System.Windows.Forms.ToolStripStatusLabel();
this.lblStripOperacaoStatus = new System.Windows.Forms.ToolStripStatusLabel(); this.lblStripOperacaoStatus = new System.Windows.Forms.ToolStripStatusLabel();
this.lblStripMqtt = new System.Windows.Forms.ToolStripStatusLabel();
this.gpbMovimentacao = new System.Windows.Forms.GroupBox(); this.gpbMovimentacao = new System.Windows.Forms.GroupBox();
this.lblKmh = new System.Windows.Forms.Label(); this.lblKmh = new System.Windows.Forms.Label();
this.trkKmh = new System.Windows.Forms.TrackBar(); this.trkKmh = new System.Windows.Forms.TrackBar();
@ -74,7 +76,7 @@ namespace AgroBase
this.btnMapas = new System.Windows.Forms.Button(); this.btnMapas = new System.Windows.Forms.Button();
this.btnSenCamera = new System.Windows.Forms.Button(); this.btnSenCamera = new System.Windows.Forms.Button();
this.gpbJoystick = new System.Windows.Forms.GroupBox(); this.gpbJoystick = new System.Windows.Forms.GroupBox();
this.groupBox2 = new System.Windows.Forms.GroupBox(); this.gpbControleDirecional = new System.Windows.Forms.GroupBox();
this.gpbAtalhos = new System.Windows.Forms.GroupBox(); this.gpbAtalhos = new System.Windows.Forms.GroupBox();
this.btnContornos = new System.Windows.Forms.Button(); this.btnContornos = new System.Windows.Forms.Button();
this.btnGPS = new System.Windows.Forms.Button(); this.btnGPS = new System.Windows.Forms.Button();
@ -99,7 +101,7 @@ namespace AgroBase
this.gpbSensoriamento.SuspendLayout(); this.gpbSensoriamento.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).BeginInit();
this.gpbJoystick.SuspendLayout(); this.gpbJoystick.SuspendLayout();
this.groupBox2.SuspendLayout(); this.gpbControleDirecional.SuspendLayout();
this.gpbAtalhos.SuspendLayout(); this.gpbAtalhos.SuspendLayout();
this.gpbOperacao.SuspendLayout(); this.gpbOperacao.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
@ -139,6 +141,7 @@ namespace AgroBase
// pnlLateral // pnlLateral
// //
this.pnlLateral.AutoScroll = true; this.pnlLateral.AutoScroll = true;
this.pnlLateral.Controls.Add(this.chbConexaoautomatica);
this.pnlLateral.Controls.Add(this.gpbDispositivos); this.pnlLateral.Controls.Add(this.gpbDispositivos);
this.pnlLateral.Controls.Add(this.btnRemover); this.pnlLateral.Controls.Add(this.btnRemover);
this.pnlLateral.Controls.Add(this.lblDispositivos); this.pnlLateral.Controls.Add(this.lblDispositivos);
@ -152,6 +155,16 @@ namespace AgroBase
this.pnlLateral.Size = new System.Drawing.Size(613, 592); this.pnlLateral.Size = new System.Drawing.Size(613, 592);
this.pnlLateral.TabIndex = 0; this.pnlLateral.TabIndex = 0;
// //
// chbConexaoautomatica
//
this.chbConexaoautomatica.AutoSize = true;
this.chbConexaoautomatica.Location = new System.Drawing.Point(172, 28);
this.chbConexaoautomatica.Name = "chbConexaoautomatica";
this.chbConexaoautomatica.Size = new System.Drawing.Size(123, 17);
this.chbConexaoautomatica.TabIndex = 21;
this.chbConexaoautomatica.Text = "Conexão automática";
this.chbConexaoautomatica.UseVisualStyleBackColor = true;
//
// gpbDispositivos // gpbDispositivos
// //
this.gpbDispositivos.Controls.Add(this.lstDisponiveis); this.gpbDispositivos.Controls.Add(this.lstDisponiveis);
@ -291,7 +304,8 @@ namespace AgroBase
this.lblStripJoystick, this.lblStripJoystick,
this.lblStripJoystickComando, this.lblStripJoystickComando,
this.lblStripOperacao, this.lblStripOperacao,
this.lblStripOperacaoStatus}); this.lblStripOperacaoStatus,
this.lblStripMqtt});
this.generalStrip.Location = new System.Drawing.Point(0, 587); this.generalStrip.Location = new System.Drawing.Point(0, 587);
this.generalStrip.Name = "generalStrip"; this.generalStrip.Name = "generalStrip";
this.generalStrip.Padding = new System.Windows.Forms.Padding(1, 0, 10, 0); this.generalStrip.Padding = new System.Windows.Forms.Padding(1, 0, 10, 0);
@ -323,6 +337,12 @@ namespace AgroBase
this.lblStripOperacaoStatus.Size = new System.Drawing.Size(74, 17); this.lblStripOperacaoStatus.Size = new System.Drawing.Size(74, 17);
this.lblStripOperacaoStatus.Text = "Não iniciado"; this.lblStripOperacaoStatus.Text = "Não iniciado";
// //
// lblStripMqtt
//
this.lblStripMqtt.Name = "lblStripMqtt";
this.lblStripMqtt.Size = new System.Drawing.Size(119, 15);
this.lblStripMqtt.Text = "MQTT: Desconectado";
//
// gpbMovimentacao // gpbMovimentacao
// //
this.gpbMovimentacao.Controls.Add(this.lblKmh); this.gpbMovimentacao.Controls.Add(this.lblKmh);
@ -486,7 +506,7 @@ namespace AgroBase
this.gpbSensoriamento.Margin = new System.Windows.Forms.Padding(2); this.gpbSensoriamento.Margin = new System.Windows.Forms.Padding(2);
this.gpbSensoriamento.Name = "gpbSensoriamento"; this.gpbSensoriamento.Name = "gpbSensoriamento";
this.gpbSensoriamento.Padding = new System.Windows.Forms.Padding(2); this.gpbSensoriamento.Padding = new System.Windows.Forms.Padding(2);
this.gpbSensoriamento.Size = new System.Drawing.Size(423, 184); this.gpbSensoriamento.Size = new System.Drawing.Size(423, 172);
this.gpbSensoriamento.TabIndex = 13; this.gpbSensoriamento.TabIndex = 13;
this.gpbSensoriamento.TabStop = false; this.gpbSensoriamento.TabStop = false;
this.gpbSensoriamento.Text = "Sensoriamento"; this.gpbSensoriamento.Text = "Sensoriamento";
@ -512,7 +532,7 @@ namespace AgroBase
this.gridSenMotores.Name = "gridSenMotores"; this.gridSenMotores.Name = "gridSenMotores";
this.gridSenMotores.RowHeadersWidth = 51; this.gridSenMotores.RowHeadersWidth = 51;
this.gridSenMotores.RowTemplate.Height = 24; this.gridSenMotores.RowTemplate.Height = 24;
this.gridSenMotores.Size = new System.Drawing.Size(414, 144); this.gridSenMotores.Size = new System.Drawing.Size(414, 132);
this.gridSenMotores.TabIndex = 0; this.gridSenMotores.TabIndex = 0;
// //
// btnDiagnosticos // btnDiagnosticos
@ -585,20 +605,20 @@ namespace AgroBase
this.gpbJoystick.TabStop = false; this.gpbJoystick.TabStop = false;
this.gpbJoystick.Text = "Joystick"; this.gpbJoystick.Text = "Joystick";
// //
// groupBox2 // gpbControleDirecional
// //
this.groupBox2.Controls.Add(this.tkbVelocidade); this.gpbControleDirecional.Controls.Add(this.tkbVelocidade);
this.groupBox2.Controls.Add(this.tkbAngulo); this.gpbControleDirecional.Controls.Add(this.tkbAngulo);
this.groupBox2.Controls.Add(this.lblAngulo); this.gpbControleDirecional.Controls.Add(this.lblAngulo);
this.groupBox2.Controls.Add(this.lblVelocidade); this.gpbControleDirecional.Controls.Add(this.lblVelocidade);
this.groupBox2.Location = new System.Drawing.Point(9, 154); this.gpbControleDirecional.Location = new System.Drawing.Point(9, 154);
this.groupBox2.Margin = new System.Windows.Forms.Padding(2); this.gpbControleDirecional.Margin = new System.Windows.Forms.Padding(2);
this.groupBox2.Name = "groupBox2"; this.gpbControleDirecional.Name = "gpbControleDirecional";
this.groupBox2.Padding = new System.Windows.Forms.Padding(2); this.gpbControleDirecional.Padding = new System.Windows.Forms.Padding(2);
this.groupBox2.Size = new System.Drawing.Size(330, 149); this.gpbControleDirecional.Size = new System.Drawing.Size(330, 149);
this.groupBox2.TabIndex = 19; this.gpbControleDirecional.TabIndex = 19;
this.groupBox2.TabStop = false; this.gpbControleDirecional.TabStop = false;
this.groupBox2.Text = "Controle Direcional"; this.gpbControleDirecional.Text = "Controle Direcional";
// //
// gpbAtalhos // gpbAtalhos
// //
@ -729,7 +749,7 @@ namespace AgroBase
this.ClientSize = new System.Drawing.Size(1058, 609); this.ClientSize = new System.Drawing.Size(1058, 609);
this.Controls.Add(this.gpbOperacao); this.Controls.Add(this.gpbOperacao);
this.Controls.Add(this.gpbAtalhos); this.Controls.Add(this.gpbAtalhos);
this.Controls.Add(this.groupBox2); this.Controls.Add(this.gpbControleDirecional);
this.Controls.Add(this.gpbJoystick); this.Controls.Add(this.gpbJoystick);
this.Controls.Add(this.gpbMovimentacao); this.Controls.Add(this.gpbMovimentacao);
this.Controls.Add(this.gpbSensoriamento); this.Controls.Add(this.gpbSensoriamento);
@ -763,8 +783,8 @@ namespace AgroBase
this.gpbSensoriamento.PerformLayout(); this.gpbSensoriamento.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).EndInit();
this.gpbJoystick.ResumeLayout(false); this.gpbJoystick.ResumeLayout(false);
this.groupBox2.ResumeLayout(false); this.gpbControleDirecional.ResumeLayout(false);
this.groupBox2.PerformLayout(); this.gpbControleDirecional.PerformLayout();
this.gpbAtalhos.ResumeLayout(false); this.gpbAtalhos.ResumeLayout(false);
this.gpbOperacao.ResumeLayout(false); this.gpbOperacao.ResumeLayout(false);
this.gpbOperacao.PerformLayout(); this.gpbOperacao.PerformLayout();
@ -776,7 +796,6 @@ namespace AgroBase
#endregion #endregion
private System.Windows.Forms.GroupBox gpbAcoes; private System.Windows.Forms.GroupBox gpbAcoes;
private System.Windows.Forms.Panel pnlLateral;
private System.Windows.Forms.Button btnNovoDispositivo; private System.Windows.Forms.Button btnNovoDispositivo;
private System.Windows.Forms.GroupBox gpbNovoDispositivo; private System.Windows.Forms.GroupBox gpbNovoDispositivo;
private System.Windows.Forms.Button btnSalvar; private System.Windows.Forms.Button btnSalvar;
@ -815,13 +834,12 @@ namespace AgroBase
private System.Windows.Forms.GroupBox gpbJoystick; private System.Windows.Forms.GroupBox gpbJoystick;
private System.Windows.Forms.Label lblSenMotores; private System.Windows.Forms.Label lblSenMotores;
public System.Windows.Forms.DataGridView gridSenMotores; public System.Windows.Forms.DataGridView gridSenMotores;
private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.GroupBox gpbControleDirecional;
private System.Windows.Forms.GroupBox gpbAtalhos; private System.Windows.Forms.GroupBox gpbAtalhos;
private System.Windows.Forms.GroupBox gpbOperacao; private System.Windows.Forms.GroupBox gpbOperacao;
private System.Windows.Forms.Label lblModoOperacao; private System.Windows.Forms.Label lblModoOperacao;
private System.Windows.Forms.ComboBox cmbModoOperacao; private System.Windows.Forms.ComboBox cmbModoOperacao;
private System.Windows.Forms.Button btnIniciarOperacao; private System.Windows.Forms.Button btnIniciarOperacao;
private System.Windows.Forms.CheckBox chbDebugMode;
private System.Windows.Forms.Label lblKmh; private System.Windows.Forms.Label lblKmh;
public System.Windows.Forms.TrackBar trkKmh; public System.Windows.Forms.TrackBar trkKmh;
private System.Windows.Forms.ToolStripStatusLabel lblStripOperacao; private System.Windows.Forms.ToolStripStatusLabel lblStripOperacao;
@ -830,6 +848,10 @@ namespace AgroBase
private System.Windows.Forms.Button btnConfigurarOperacao; private System.Windows.Forms.Button btnConfigurarOperacao;
private System.Windows.Forms.Button btnIHM; private System.Windows.Forms.Button btnIHM;
private System.Windows.Forms.Button btnContornos; private System.Windows.Forms.Button btnContornos;
public System.Windows.Forms.ToolStripStatusLabel lblStripMqtt;
public System.Windows.Forms.Panel pnlLateral;
public System.Windows.Forms.CheckBox chbConexaoautomatica;
public System.Windows.Forms.CheckBox chbDebugMode;
} }
} }

View File

@ -34,6 +34,9 @@ namespace AgroBase
{ {
timerDispositivos.Enabled = true; timerDispositivos.Enabled = true;
AtualizaDadosGerais(); AtualizaDadosGerais();
IniciarConexaoMqtt();
} }
private void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e) private void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e)
@ -45,6 +48,11 @@ namespace AgroBase
} }
} }
private async void IniciarConexaoMqtt()
{
await Variaveis.MqttService.ConnectAsync();
}
public void AtualizaDadosGerais() public void AtualizaDadosGerais()
{ {
btnJoyAtt_Click(new object(), new EventArgs()); btnJoyAtt_Click(new object(), new EventArgs());
@ -136,7 +144,7 @@ namespace AgroBase
{ {
Variaveis.DispositivosConectados.Where(x => x.Dados.GetStatusConexao()).ToList().ForEach(x => x.AcaoDesconectar()); Variaveis.DispositivosConectados.Where(x => x.Dados.GetStatusConexao()).ToList().ForEach(x => x.AcaoDesconectar());
} }
SerialService.AtualizarDispositivos(); SerialService.RealizarVarreduraPortasUSB();
} }
private void frmPrincipal_FormClosed(object sender, FormClosedEventArgs e) private void frmPrincipal_FormClosed(object sender, FormClosedEventArgs e)
@ -242,89 +250,32 @@ namespace AgroBase
private void cmbModoOperacao_SelectedIndexChanged(object sender, EventArgs e) private void cmbModoOperacao_SelectedIndexChanged(object sender, EventArgs e)
{ {
Variaveis.OperacaoEmAndamento.Modo = (ModoOperacao)cmbModoOperacao.SelectedIndex; Variaveis.OperacaoEmAndamento = OperacaoModel.CarregarParametrosOperacaoPadrao((ModoOperacao)cmbModoOperacao.SelectedIndex);
} }
private void btnIniciarOperacao_Click(object sender, EventArgs e) private void btnIniciarOperacao_Click(object sender, EventArgs e)
{ {
bool DebugMode = chbDebugMode.Checked;
string MensagemErro = "";
bool MovConectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == T_Code.Mov && (x._Porta.IsOpen || DebugMode));
bool DirConectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == T_Code.Dir && (x._Porta.IsOpen || DebugMode));
bool AtuConectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == T_Code.Atu && (x._Porta.IsOpen || DebugMode));
bool GpsConectado = GPSService.PortaGPS != null || DebugMode;
if (Variaveis.OperacaoEmAndamento.Iniciado) if (Variaveis.OperacaoEmAndamento.Iniciado)
{ {
Variaveis.OperacaoEmAndamento.FinalizarOperacao(); Variaveis.OperacaoEmAndamento.FinalizarOperacao();
btnIniciarOperacao.Text = "Iniciar Operação"; btnIniciarOperacao.Text = "Abrir Operação";
cmbModoOperacao.Enabled = true; cmbModoOperacao.Enabled = true;
} }
else else
{ {
if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.Manual) if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
{ {
if (MovConectado || DirConectado || AtuConectado) Variaveis.OperacaoEmAndamento.frmOperacao.Show();
{
Variaveis.OperacaoEmAndamento.IniciarOperacao(null, false);
cmbModoOperacao.Enabled = false;
} }
else else
{ {
MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo) + MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
", é necessário que ao menos um dos seguintes módulos estejam devidamente conectados ao equipamento:\r\n" +
"Movimentação: ( " + (MovConectado ? "OK" : " ") + " )\r\n" +
"Direcional: ( " + (DirConectado ? "OK" : " ") + " )\r\n" +
"Atuador: ( " + (AtuConectado ? "OK" : " ") + " )";
} }
} }
else if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.MapaGPS)
{
if (MovConectado && DirConectado && AtuConectado && GpsConectado)
{
frmOperacaoMapaGPS frmMapaGPS = new frmOperacaoMapaGPS();
frmMapaGPS.Show();
}
else
{
MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo) +
", é necessário que os seguintes módulos estejam devidamente conectados ao equipamento:\r\n" +
"Movimentação: ( " + (MovConectado ? "OK" : " ") + " )\r\n" +
"Direcional: ( " + (DirConectado ? "OK" : " ") + " )\r\n" +
"Atuador: ( " + (AtuConectado ? "OK" : " ") + " )";
}
}
else if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.SeguidorDeLinha)
{
if (GpsConectado)
{
frmMovCamera frmCamera = new frmMovCamera();
frmCamera.Show();
}
else
{
MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo) +
", é necessário que os seguintes módulos estejam devidamente conectados ao equipamento:\r\n" +
"GPS: ( " + (GpsConectado ? "OK" : " ") + " )";
}
}
if (MensagemErro != "")
{
MessageBox.Show(MensagemErro, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
btnIniciarOperacao.Text = "Finalizar Operação";
}
lblStripOperacao.Text = "Operação: " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo); lblStripOperacao.Text = "Operação: " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo);
lblStripOperacaoStatus.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Iniciado" : "Não iniciado"; lblStripOperacaoStatus.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Iniciado" : "Não iniciado";
} }
private void btnConfigurarOperacao_Click(object sender, EventArgs e) private void btnConfigurarOperacao_Click(object sender, EventArgs e)

View File

@ -4,17 +4,69 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
namespace AgroBase.Models namespace AgroBase.Models
{ {
public class CameraCaminhoModel public class CameraCaminhoModel
{ {
public CameraCaminhoModel()
{
tmrProcesso.Tick += TmrProcesso_Tick;
tmrProcesso.Start();
}
public Timer tmrProcesso = new Timer() { Interval = 500 };
private void TmrProcesso_Tick(object sender, EventArgs e)
{
if (camera._mqttTopico != null)
{
var Mensagem = camera._mqttTopico.Mensagens.FirstOrDefault(y => y.Momento > camera.IniciadoEm && y.Mensagem == "OK");
if (Mensagem != null)
{
tmrProcesso.Stop();
camera.ProntoEm = Mensagem.Momento;
if (browser == null)
{
Iniciada = true;
browser = new ChromiumWebBrowser(camera.URLcamera);
panel.Controls.Add(browser);
browser.Dock = DockStyle.Fill;
}
}
}
}
public void DesligarCamera()
{
try
{
Iniciada = false;
Variaveis.MqttService.Topicos.Remove(camera._mqttTopico);
panel.Controls.Remove(browser);
browser = null;
Variaveis.MqttService.UnsubscribeAsync(camera._mqttTopico).ConfigureAwait(false);
if (camera.pythonProcess != null)
{
camera.pythonProcess.Kill();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public string Nome { get; set; } public string Nome { get; set; }
public int Posicao { get; set; } public int Posicao { get; set; }
public CameraService<CameraDeepLabV3PlusModel> camera { get; set; } public bool Iniciada { get; set; } = false;
public CameraService camera { get; set; }
public ChromiumWebBrowser browser { get; set; } public ChromiumWebBrowser browser { get; set; }
public Panel panel { get; set; } public Panel panel { get; set; }
public ComboBox combo { get; set; } public ComboBox combo { get; set; }
@ -22,7 +74,7 @@ namespace AgroBase.Models
public int MaxLeituras { get; set; } public int MaxLeituras { get; set; }
public string VideoPorta { get; set; } public string VideoPorta { get; set; }
public string VideoUrl { get; set; } public string VideoUrl { get; set; }
public string SocketPorta { get; set; } public string MqttTopico { get; set; } = "street_detector";
public string CameraSelecionada { get; set; } public string CameraSelecionada { get; set; }
public Dictionary<string, Color> ClassMap = new Dictionary<string, Color>() public Dictionary<string, Color> ClassMap = new Dictionary<string, Color>()
@ -33,7 +85,7 @@ namespace AgroBase.Models
{ "ceu", Color.Gold }, { "ceu", Color.Gold },
}; };
public List<CameraDeepLabV3PlusModel> Leituras { get; set; } = new List<CameraDeepLabV3PlusModel>(); public CameraDeepLabV3PlusModel Leitura { get; set; } = new CameraDeepLabV3PlusModel();
public List<Point> PontosExtremos { get; set; } = new List<Point>(); public List<Point> PontosExtremos { get; set; } = new List<Point>();
public double Angulo { get; set; } public double Angulo { get; set; }
public double AnguloEsquerdo { get; set; } public double AnguloEsquerdo { get; set; }
@ -110,5 +162,8 @@ namespace AgroBase.Models
return Pontos; return Pontos;
} }
} }
} }

View File

@ -21,7 +21,7 @@ namespace AgroBase.Models
public double timestamp { get; set; } public double timestamp { get; set; }
public double x_max { get; set; } public double x_max { get; set; }
public double y_max { get; set; } public double y_max { get; set; }
public CameraCoordenadasObjetoModel[] objetos { get; set; } public CameraCoordenadasObjetoModel[] objetos { get; set; } = new List<CameraCoordenadasObjetoModel>().ToArray();
} }
public class CameraCoordenadasObjetoModel public class CameraCoordenadasObjetoModel
@ -46,7 +46,7 @@ namespace AgroBase.Models
public class CameraDeepLabV3PlusModel public class CameraDeepLabV3PlusModel
{ {
public double timestamp { get; set; } public double timestamp { get; set; }
public List<CameraDeepLabV3PlusClasseModel> Classes { get; set; } public List<CameraDeepLabV3PlusClasseModel> Classes { get; set; } = new List<CameraDeepLabV3PlusClasseModel>();
} }
public class CameraDeepLabV3PlusClasseModel public class CameraDeepLabV3PlusClasseModel

View File

@ -1,19 +1,70 @@
using AgroBase.Services; using AgroBase.Services;
using CefSharp.WinForms; using CefSharp.WinForms;
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
namespace AgroBase.Models namespace AgroBase.Models
{ {
public class CameraSoloModel public class CameraSoloModel
{ {
public CameraSoloModel()
{
tmrProcesso.Tick += TmrProcesso_Tick;
tmrProcesso.Start();
}
public Timer tmrProcesso = new Timer() { Interval = 500 };
private void TmrProcesso_Tick(object sender, EventArgs e)
{
if (camera._mqttTopico != null )
{
var Mensagem = camera._mqttTopico.Mensagens.FirstOrDefault(y => y.Momento > camera.IniciadoEm && y.Mensagem == "OK");
if (Mensagem != null)
{
tmrProcesso.Stop();
camera.ProntoEm = Mensagem.Momento;
if (browser == null)
{
Iniciada = true;
browser = new ChromiumWebBrowser(camera.URLcamera);
panel.Controls.Add(browser);
browser.Dock = DockStyle.Fill;
}
}
}
}
public void DesligarCamera()
{
try
{
Iniciada = false;
Variaveis.MqttService.Topicos.Remove(camera._mqttTopico);
panel.Controls.Remove(browser);
browser = null;
Variaveis.MqttService.UnsubscribeAsync(camera._mqttTopico).ConfigureAwait(false);
if (camera.pythonProcess != null)
{
camera.pythonProcess.Kill();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public string Nome { get; set; } public string Nome { get; set; }
public int Posicao { get; set; } public int Posicao { get; set; }
public CameraService<CameraCoordenadasFrameModel> camera { get; set; } public bool Iniciada { get; set; } = false;
public CameraService camera { get; set; }
public ChromiumWebBrowser browser { get; set; } public ChromiumWebBrowser browser { get; set; }
public Panel panel { get;set; } public Panel panel { get;set; }
public ComboBox combo { get;set; } public ComboBox combo { get;set; }
@ -21,9 +72,13 @@ namespace AgroBase.Models
public int MaxLeituras { get; set; } public int MaxLeituras { get; set; }
public string VideoPorta { get; set; } public string VideoPorta { get; set; }
public string VideoUrl { get; set; } public string VideoUrl { get; set; }
public string SocketPorta { get; set; } public string MqttTopico { get; set; } = "weed_detector";
public string CameraSelecionada { get; set; } public string CameraSelecionada { get; set; }
public CameraCoordenadasFrameModel Leitura { get; set; } = new CameraCoordenadasFrameModel();
public int ErvasNoRadar { get; set; } public int ErvasNoRadar { get; set; }
} }
} }

View File

@ -136,5 +136,13 @@ namespace AgroBase.Models
Volta Volta
} }
public enum ParametrosOperacao
{
CameraSolo,
CameraCaminho,
Mapa,
Joystick
}
} }
} }

View File

@ -1,6 +1,7 @@
using AgroBase.Properties; using AgroBase.Properties;
using AgroBase.Services; using AgroBase.Services;
using CefSharp.WinForms; using CefSharp.WinForms;
using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -57,6 +58,7 @@ namespace AgroBase.Models
{ {
((Timer)sender).Stop(); ((Timer)sender).Stop();
picLoading.Visible = false; picLoading.Visible = false;
mapaService.Carregado = true;
if (mapaService.NomeArquivoMapa == MapasVariaveisModel.NomeArquivoMapaInterativo) if (mapaService.NomeArquivoMapa == MapasVariaveisModel.NomeArquivoMapaInterativo)
{ {
@ -127,7 +129,7 @@ namespace AgroBase.Models
private void IniciarProcessamento() private void IniciarProcessamento()
{ {
APIService.Inicializar(); //APIService.Inicializar();
GPSService.IniciarRecepcaoDados(); GPSService.IniciarRecepcaoDados();
chromiumWebBrowser = new ChromiumWebBrowser(mapaService.MapaUrl); chromiumWebBrowser = new ChromiumWebBrowser(mapaService.MapaUrl);
@ -140,6 +142,8 @@ namespace AgroBase.Models
APIService.Parar(); APIService.Parar();
GPSService.PararRecepcaoDados(); GPSService.PararRecepcaoDados();
} }
} }
public class MapaFeatureCollectionModel public class MapaFeatureCollectionModel

View File

@ -17,7 +17,7 @@ namespace AgroBase.Models.Modules
public static List<PinoutModel> Pinout { get; set; } public static List<PinoutModel> Pinout { get; set; }
public static List<FuncoesPinout> Funcoes { get; set; } = new List<FuncoesPinout>() { FuncoesPinout.Geral }; public static List<FuncoesPinout> Funcoes { get; set; } = new List<FuncoesPinout>() { FuncoesPinout.Geral };
public int QuantidadeBicos { get; set; } = 10; public int QuantidadeBicos { get; set; } = 10;
public double DensidadeHerbicida { get; set; } public double DensidadeHerbicida { get; set; } = 1.1;
public double CapacidadeReservatorio { get; set; } = 30; public double CapacidadeReservatorio { get; set; } = 30;
public bool AtuacaoNivelAlto { get; set; } = true; public bool AtuacaoNivelAlto { get; set; } = true;
public List<AtuadorBicoModel> BicosPulverizadores { get; set; } = new List<AtuadorBicoModel>(); public List<AtuadorBicoModel> BicosPulverizadores { get; set; } = new List<AtuadorBicoModel>();

View File

@ -11,7 +11,7 @@ using static AgroBase.Models.Enuns;
namespace AgroBase.Models.Modules namespace AgroBase.Models.Modules
{ {
class SensoriamentoModel : DispositivoBaseModel public class SensoriamentoModel : DispositivoBaseModel
{ {
public static int _TaxaAmostragem { get; set; } = 500; public static int _TaxaAmostragem { get; set; } = 500;
public bool Conectado { get; set; } = false; public bool Conectado { get; set; } = false;
@ -416,6 +416,10 @@ namespace AgroBase.Models.Modules
{ {
frmInstancial.frmAcompanhamento.AtualizarSensores("Tensão atual: " + tensao.ToString("0.00") + "V - Mín: " + Sensor.ValorMinimo.ToString("0.00") + "V - Máx: " + Sensor.ValorMaximo.ToString("0.00") + "V"); frmInstancial.frmAcompanhamento.AtualizarSensores("Tensão atual: " + tensao.ToString("0.00") + "V - Mín: " + Sensor.ValorMinimo.ToString("0.00") + "V - Máx: " + Sensor.ValorMaximo.ToString("0.00") + "V");
Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria = (tensao / Sensor.LimiteMaximo) * 100; Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria = (tensao / Sensor.LimiteMaximo) * 100;
if (Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria < 0)
{
Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria = 0;
}
} }
AtualizaGrafico = true; AtualizaGrafico = true;

View File

@ -3,6 +3,7 @@ using AgroBase.Forms;
using AgroBase.Forms.Operacoes; using AgroBase.Forms.Operacoes;
using AgroBase.Models.Modules; using AgroBase.Models.Modules;
using AgroBase.Services; using AgroBase.Services;
using CefSharp.DevTools.Network;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -18,14 +19,15 @@ namespace AgroBase.Models
{ {
public OperacaoModel(ModoOperacao Modo, DispositivosService<MovimentacaoModel> Mov = null, DispositivosService<DirecionalModel> Dir = null, DispositivosService<AtuadorModel> Atu = null) public OperacaoModel(ModoOperacao Modo, DispositivosService<MovimentacaoModel> Mov = null, DispositivosService<DirecionalModel> Dir = null, DispositivosService<AtuadorModel> Atu = null)
{ {
if (APIService.pythonProcess == null) /*if (APIService.pythonProcess == null)
{ {
APIService.Inicializar(); APIService.Inicializar();
} }*/
this.Modo = Modo; this.Modo = Modo;
this.Controle = new OperacaoControleModel() this.Controle = new OperacaoControleModel()
{ {
PIDdirecional = new PIDModel(),
TiposControle = new List<OperacaoControleTipoModel>() TiposControle = new List<OperacaoControleTipoModel>()
{ {
new OperacaoControleTipoModel() new OperacaoControleTipoModel()
@ -67,45 +69,110 @@ namespace AgroBase.Models
} }
this.tmrLogs.Tick -= TmrLogs_Tick; this.tmrLogs.Tick -= TmrLogs_Tick;
this.tmrLogs.Tick += TmrLogs_Tick; this.tmrLogs.Tick += TmrLogs_Tick;
this.tmrParametrizacao.Tick -= TmrParametrizacao_Tick; /*this.tmrParametrizacao.Tick -= TmrParametrizacao_Tick;
this.tmrParametrizacao.Tick += TmrParametrizacao_Tick; this.tmrParametrizacao.Tick += TmrParametrizacao_Tick;
this.tmrParametrizacao.Start(); this.tmrParametrizacao.Start();*/
} }
public ModoOperacao Modo { get; set; } public ModoOperacao Modo { get; set; }
public DispositivosService<SensoriamentoModel> DispSen { get; set; }
public DispositivosService<MovimentacaoModel> DispMov { get; set; } public DispositivosService<MovimentacaoModel> DispMov { get; set; }
public DispositivosService<DirecionalModel> DispDir { get; set; } public DispositivosService<DirecionalModel> DispDir { get; set; }
public DispositivosService<AtuadorModel> DispAtu { get; set; } public DispositivosService<AtuadorModel> DispAtu { get; set; }
public MapasModel Mapa { get; set; } = new MapasModel(); public MapasModel Mapa { get; set; } = new MapasModel();
public Form frmOperacao { get; set; } public Form frmOperacao { get; set; }
public bool ModulosConectados
{
get
{
ModulosMandatorios.ForEach(Modulo =>
{
if (Modulo.Dispositivo == T_Code.Gps)
{
Modulo.Conectado = GPSService.PortaGPS != null && GPSService.PortaGPS.IsOpen;
}
else
{
Modulo.Conectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == Modulo.Dispositivo && x._Porta.IsOpen);
}
});
bool _modulosConectados =
(ModulosMandatorios.Where(x => x.Mandatorio).All(x => x.Conectado) && ModulosMandatorios.Any(x => x.Mandatorio)) ||
(ModulosMandatorios.All(x => !x.Mandatorio) && ModulosMandatorios.Any(x => x.Conectado));
return _modulosConectados;
}
}
public bool OperacaoLiberada
{
get
{
bool _operacaoLiberada = ModulosConectados;
if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.CameraSolo && x.Mandatorio) && CamerasSolo.Count(x => x.Iniciada) < QuantidadeCamerasSolo) _operacaoLiberada = false;
if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.CameraCaminho && x.Mandatorio) && (CameraCaminho == null || !CameraCaminho.Iniciada)) _operacaoLiberada = false;
if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Mapa && x.Mandatorio) && !Mapa.mapaService.Carregado) _operacaoLiberada = false;
if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Joystick && x.Mandatorio && GeneralJoystick.JoystickConectado == null)) _operacaoLiberada = false;
if (frmInstancial.frmPrincipal.chbDebugMode.Checked) _operacaoLiberada = true;
return _operacaoLiberada;
}
}
public string ErroOperacaoLiberada
{
get
{
string MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Modo) +
", é necessário que todos os módulos mandatórios estejam devidamente conectados ao equipamento, ou pelo menos um dos módulos:\r\n";
ModulosMandatorios.ForEach(Modulo =>
{
MensagemErro += Enum.GetName(typeof(T_Code), Modulo.Dispositivo) + ": ( " + (Modulo.Conectado ? "OK" : " ") + " ) - Mandatório: " + (Modulo.Mandatorio ? "Sim" : "Não") + "\r\n";
});
return MensagemErro;
}
}
public string frmOperacaoNome { get; set; } public string frmOperacaoNome { get; set; }
public bool Iniciado { get; set; } public bool Iniciado { get; set; }
public long TimestampInicio { get; set; } public long TimestampInicio { get; set; }
public long TimestampFim { get; set; } public long TimestampFim { get; set; }
public TimeSpan Tempo { get; set; } public TimeSpan Tempo
{
get
{
return TimeSpan.FromTicks(Variaveis.OperacaoEmAndamento.Iniciado ? ((Variaveis.OperacaoEmAndamento.TimestampFim > 0 ? Variaveis.OperacaoEmAndamento.TimestampFim : DateTime.Now.Ticks) - Variaveis.OperacaoEmAndamento.TimestampInicio) : 0);
}
}
public DateTime TempoAguardando { get; set; }
public OperacaoControleModel Controle { get; set; } = new OperacaoControleModel(); public OperacaoControleModel Controle { get; set; } = new OperacaoControleModel();
public OperacaoControleModel ControleAnterior { get; set; } = new OperacaoControleModel(); public OperacaoControleModel ControleAnterior { get; set; } = new OperacaoControleModel();
public List<OperacaoModulosMandatoriosModel> ModulosMandatorios { get; set; } = new List<OperacaoModulosMandatoriosModel>(); public List<OperacaoModulosMandatoriosModel> ModulosMandatorios { get; set; } = new List<OperacaoModulosMandatoriosModel>();
public List<OperacaoParametrosMandatoriosModel> ParametrosMandatorios { get; set; } = new List<OperacaoParametrosMandatoriosModel>();
public OperacaoSensoriamentoModel Sensoriamento { get; set; } = new OperacaoSensoriamentoModel(); public OperacaoSensoriamentoModel Sensoriamento { get; set; } = new OperacaoSensoriamentoModel();
public List<OperacaoSensoriamentoModel> Logs { get; set; } = new List<OperacaoSensoriamentoModel>(); public List<OperacaoSensoriamentoModel> Logs { get; set; } = new List<OperacaoSensoriamentoModel>();
public List<GPSModel> GPSTrajetoria { get; set; } = new List<GPSModel>(); public List<GPSModel> GPSTrajetoria { get; set; } = new List<GPSModel>();
public List<List<GPSModel>> GPSTrajetoriaRua { get; set; } = new List<List<GPSModel>>(); public List<List<GPSModel>> GPSTrajetoriaRua { get; set; } = new List<List<GPSModel>>();
public OperacaoRefRuaGPS ReferencialRuaGPS { get; set; } = new OperacaoRefRuaGPS(); public OperacaoRefRuaGPS ReferencialRuaGPS { get; set; } = new OperacaoRefRuaGPS();
public int QuantidadeCamerasSolo { get; set; } = 2;
public List<CameraSoloModel> CamerasSolo { get; set; } = new List<CameraSoloModel>();
public CameraCaminhoModel CameraCaminho { get; set; }
public int TempoIniciarOperacao { get; set; } = 10; public int TempoIniciarOperacao { get; set; } = 10;
public string PastaSaida { get; set; } = "Operacoes/"; public string PastaSaida { get; } = "Operacoes/";
public string ID { get; set; } public string ID { get; set; }
public Timer tmrLogs = new Timer() { Interval = 5000 }; public Timer tmrLogs = new Timer() { Interval = 5000 };
public Timer tmrParametrizacao = new Timer() { Interval = 1000 }; public List<StatusOperacao> StatusOperacoesPararCarro { get; set; } = new List<StatusOperacao>() { StatusOperacao.Parametrizando, StatusOperacao.Aguardando, StatusOperacao.Parado, StatusOperacao.Concluida };
public static OperacaoModel CarregarParametrosOperacaoPadrao(ModoOperacao Modo) public static OperacaoModel CarregarParametrosOperacaoPadrao(ModoOperacao Modo)
{ {
var MovConectado = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov && (x._Porta.IsOpen)); var SenConectado = (DispositivosService<SensoriamentoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Sen);
var DirConectado = (DispositivosService<DirecionalModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Dir && (x._Porta.IsOpen)); var MovConectado = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov);
var AtuConectado = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu && (x._Porta.IsOpen)); var DirConectado = (DispositivosService<DirecionalModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Dir);
var AtuConectado = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu);
OperacaoModel OperacaoCarregar = new OperacaoModel(Modo) OperacaoModel OperacaoCarregar = new OperacaoModel(Modo)
{ {
@ -117,6 +184,7 @@ namespace AgroBase.Models
DispAtu = AtuConectado, DispAtu = AtuConectado,
DispDir = DirConectado, DispDir = DirConectado,
DispMov = MovConectado, DispMov = MovConectado,
DispSen = SenConectado,
Sensoriamento = new OperacaoSensoriamentoModel(), Sensoriamento = new OperacaoSensoriamentoModel(),
Logs = new List<OperacaoSensoriamentoModel>(), Logs = new List<OperacaoSensoriamentoModel>(),
}; };
@ -165,6 +233,14 @@ namespace AgroBase.Models
Mandatorio = false, Mandatorio = false,
}, },
}; };
OperacaoCarregar.ParametrosMandatorios = new List<OperacaoParametrosMandatoriosModel>()
{
new OperacaoParametrosMandatoriosModel()
{
Parametro = ParametrosOperacao.Joystick,
Mandatorio = false,
}
};
break; break;
case ModoOperacao.MapaGPS: case ModoOperacao.MapaGPS:
OperacaoCarregar.frmOperacao = new frmOperacaoMapaGPS(); OperacaoCarregar.frmOperacao = new frmOperacaoMapaGPS();
@ -228,6 +304,24 @@ namespace AgroBase.Models
Mandatorio = false, Mandatorio = false,
} }
}; };
OperacaoCarregar.ParametrosMandatorios = new List<OperacaoParametrosMandatoriosModel>()
{
new OperacaoParametrosMandatoriosModel()
{
Parametro = ParametrosOperacao.CameraSolo,
Mandatorio = true,
},
new OperacaoParametrosMandatoriosModel()
{
Parametro = ParametrosOperacao.CameraCaminho,
Mandatorio = true,
},
new OperacaoParametrosMandatoriosModel()
{
Parametro = ParametrosOperacao.Mapa,
Mandatorio = true,
}
};
break; break;
} }
@ -246,9 +340,10 @@ namespace AgroBase.Models
{ {
Operacao.frmOperacaoNome = Operacao.frmOperacao.Name; Operacao.frmOperacaoNome = Operacao.frmOperacao.Name;
Form frm = Operacao.frmOperacao; Form frm = Operacao.frmOperacao;
Operacao.frmOperacao = null; Operacao.frmOperacao = null;
File.WriteAllText("operacao" + Enum.GetName(typeof(ModoOperacao), Operacao.Modo) + ".opr", JsonConvert.SerializeObject(Operacao)); //File.WriteAllText("operacao" + Enum.GetName(typeof(ModoOperacao), Operacao.Modo) + ".opr", JsonConvert.SerializeObject(Operacao));
Operacao.frmOperacao = frm; Operacao.frmOperacao = frm;
} }
@ -257,6 +352,8 @@ namespace AgroBase.Models
{ {
string modoOpStr = nomeArquivo.Split('\\')[nomeArquivo.Split('\\').Length - 1].Replace("operacao", "").Split('.')[0]; string modoOpStr = nomeArquivo.Split('\\')[nomeArquivo.Split('\\').Length - 1].Replace("operacao", "").Split('.')[0];
ModoOperacao modo = (ModoOperacao)Enum.Parse(typeof(ModoOperacao), modoOpStr); ModoOperacao modo = (ModoOperacao)Enum.Parse(typeof(ModoOperacao), modoOpStr);
return CarregarParametrosOperacaoPadrao(modo);
OperacaoModel Operacao = new OperacaoModel(modo); OperacaoModel Operacao = new OperacaoModel(modo);
if (!File.Exists(nomeArquivo)) if (!File.Exists(nomeArquivo))
{ {
@ -281,6 +378,7 @@ namespace AgroBase.Models
{ {
Iniciado = true; Iniciado = true;
TimestampInicio = DateTime.Now.Ticks; TimestampInicio = DateTime.Now.Ticks;
TempoAguardando = DateTime.Now;
TimestampFim = 0; TimestampFim = 0;
Mapa.IdxRuaAtual = 0; Mapa.IdxRuaAtual = 0;
if (DispMov != null) if (DispMov != null)
@ -306,17 +404,26 @@ namespace AgroBase.Models
//Controle = new OperacaoControleModel(); //Controle = new OperacaoControleModel();
//ControleAnterior = new OperacaoControleModel(); //ControleAnterior = new OperacaoControleModel();
Controle.PIDdirecional = new PIDModel()
{
LimiteSaida = Controle.Angulo_Max,
SetPoint = 0,
Kp = 1.0,
Ki = 0.1,
Kd = 0.01,
};
if (controle != null) if (controle != null)
{ {
Controle = controle; Controle = controle;
} }
if (DaIHM) if (DaIHM)
{ {
frmOperacao = new frmOperacaoMapaGPS();
frmOperacao.Show(); frmOperacao.Show();
} }
tmrLogs.Start(); tmrLogs.Start();
tmrParametrizacao.Stop(); //tmrParametrizacao.Stop();
} }
public void FinalizarOperacao() public void FinalizarOperacao()
@ -329,7 +436,7 @@ namespace AgroBase.Models
TimestampFim = DateTime.Now.Ticks; TimestampFim = DateTime.Now.Ticks;
tmrLogs.Stop(); tmrLogs.Stop();
tmrParametrizacao.Start(); //tmrParametrizacao.Start();
SalvarLog(true); SalvarLog(true);
@ -368,7 +475,7 @@ namespace AgroBase.Models
ControleAtu.UltimoComando = Agora; ControleAtu.UltimoComando = Agora;
ControleAtu.Comandos.AddRange(Protocolos); ControleAtu.Comandos.AddRange(Protocolos);
ControleAnterior.BicosAtuados = Controle.BicosAtuados.ToList(); ControleAnterior.BicosAtuados = new List<AtuadorBicoModel>(Controle.BicosAtuados);
} }
AtualizarDadosOperacao(); AtualizarDadosOperacao();
@ -382,9 +489,14 @@ namespace AgroBase.Models
} }
try try
{ {
Sensoriamento.ErvasIdentificadas = Sensoriamento.AtuacoesPorBico.Sum();
Sensoriamento.VelocidadeMedia = DispMov.Dados.Motores.Average(x => x.VelocidadeInstantanea); Sensoriamento.VelocidadeMedia = DispMov.Dados.Motores.Average(x => x.VelocidadeInstantanea);
//Sensoriamento.DistanciaPercorrida = DispMov.Dados.DistanciaPercorridaOperacao; //Sensoriamento.DistanciaPercorrida = DispMov.Dados.DistanciaPercorridaOperacao;
Sensoriamento.ProgressoTrajeto = Mapa == null ? 0 : Sensoriamento.DistanciaPercorrida.Sum() / Mapa.DistanciaTotal * 100; Sensoriamento.ProgressoTrajeto = Mapa.mapaService.pythonProcess == null ? 0 : Sensoriamento.DistanciaPercorrida.Sum() / Mapa.DistanciaTotal * 100;
if (Sensoriamento.ProgressoTrajeto < 0 && Sensoriamento.ProgressoTrajeto >= 0)
{
Sensoriamento.ProgressoTrajeto = 0;
}
Sensoriamento.ProgressoRua = Sensoriamento.ProgressoRua =
Mapa == null ? 0 : Mapa == null ? 0 :
(ReferencialRuaGPS.Direcao == DirecaoCarroRua.Ida ? ((double)ReferencialRuaGPS.IdxPontoAproximadoRua / (double)(Mapa.Trajetoria[Mapa.IdxRuaAtual].Count - 1)) : (ReferencialRuaGPS.Direcao == DirecaoCarroRua.Ida ? ((double)ReferencialRuaGPS.IdxPontoAproximadoRua / (double)(Mapa.Trajetoria[Mapa.IdxRuaAtual].Count - 1)) :
@ -527,68 +639,84 @@ namespace AgroBase.Models
} }
GPSTrajetoriaRua[Mapa.IdxRuaAtual].Add(GPSTrajetoria[GPSTrajetoria.Count - 1]); GPSTrajetoriaRua[Mapa.IdxRuaAtual].Add(GPSTrajetoria[GPSTrajetoria.Count - 1]);
if (GPSTrajetoria.Count > 1) if (GPSTrajetoria.Count > 1)
{
if (ReferencialRuaGPS.DentroDaRua || true)
{ {
if (Sensoriamento.DistanciaPercorrida.Count - 1 < Mapa.IdxRuaAtual) if (Sensoriamento.DistanciaPercorrida.Count - 1 < Mapa.IdxRuaAtual)
{ {
Sensoriamento.DistanciaPercorrida.Add(0); Sensoriamento.DistanciaPercorrida.Add(0);
} }
Sensoriamento.DistanciaPercorrida[Mapa.IdxRuaAtual] += GPSService.DistanciaEntrePontos(GPSTrajetoria[GPSTrajetoria.Count - 1], GPSTrajetoria[GPSTrajetoria.Count - 2]); Sensoriamento.DistanciaPercorrida[Mapa.IdxRuaAtual] += GPSService.DistanciaEntrePontos(GPSTrajetoria[GPSTrajetoria.Count - 1], GPSTrajetoria[GPSTrajetoria.Count - 2]);
//Sensoriamento.DistanciaPercorrida[Mapa.IdxRuaAtual] = GPSService.DistanciaEntrePontos(Mapa.Trajetoria[Mapa.IdxRuaAtual][0], Mapa.Trajetoria[Mapa.IdxRuaAtual][ReferencialRuaGPS.IdxPontoAproximadoRua]);
}
} }
File.WriteAllText(PastaSaida + ID + "/trajetoria.json", JsonConvert.SerializeObject(GPSTrajetoria, Formatting.None)); File.WriteAllText(PastaSaida + ID + "/trajetoria.json", JsonConvert.SerializeObject(GPSTrajetoria, Formatting.None));
} }
public void AtualizarControleAtuadores()
public void CalculaDadosMovimentacaoAutonoma()
{ {
#region Calculo do angulo de inclinacao Controle.BicosAtuados = DispAtu.Dados.BicosPulverizadores;
double Angulo = 0; }
public void CalcularAnguloInclinacao()
{
double erroOrientacao = 0.0;
double anguloCarro = ReferencialRuaGPS.AnguloCarro; double anguloCarro = ReferencialRuaGPS.AnguloCarro;
double anguloOposto = (anguloCarro + 180) % 360; double anguloOposto = (anguloCarro + 180) % 360;
double anguloRua = ReferencialRuaGPS.AnguloRua; double anguloRua = ReferencialRuaGPS.AnguloRua;
double anguloCamera = Sensoriamento.AnguloRuaCamera;
// Calcula o erro de orientação
if ((anguloCarro + ReferencialRuaGPS.MargemErroAngulo) >= anguloRua && (anguloCarro - ReferencialRuaGPS.MargemErroAngulo) <= anguloRua) if ((anguloCarro + ReferencialRuaGPS.MargemErroAngulo) >= anguloRua && (anguloCarro - ReferencialRuaGPS.MargemErroAngulo) <= anguloRua)
{ {
Angulo = anguloCarro - ReferencialRuaGPS.AnguloRua; erroOrientacao = anguloCarro - anguloRua;
} }
else if ((anguloOposto + ReferencialRuaGPS.MargemErroAngulo) >= anguloRua && (anguloOposto - ReferencialRuaGPS.MargemErroAngulo) <= anguloRua) else if ((anguloOposto + ReferencialRuaGPS.MargemErroAngulo) >= anguloRua && (anguloOposto - ReferencialRuaGPS.MargemErroAngulo) <= anguloRua)
{ {
Angulo = anguloOposto - ReferencialRuaGPS.AnguloRua; erroOrientacao = anguloOposto - anguloRua;
} }
Sensoriamento.AnguloDif = Angulo; Sensoriamento.AnguloDif = erroOrientacao;
Controle.Angulo = // Assume-se que o anguloCamera reflete o desvio lateral.
Angulo > Controle.Angulo_Max ? Controle.Angulo_Max : // Isso pode precisar de ajuste dependendo de como o ângulo é medido.
Angulo < Controle.Angulo_Min ? Controle.Angulo_Min : double erroPosicaoLateral = anguloCamera;
Angulo;
#endregion
if (ReferencialRuaGPS.StatusAtual == StatusOperacao.Aguardando || ReferencialRuaGPS.StatusAtual == StatusOperacao.Concluida) // Combina os erros. Ajuste os pesos conforme necessário para o seu caso específico.
double pesoOrientacao = 0.3;
double pesoPosicaoLateral = 0.7;
double erroCombinado = (erroOrientacao * pesoOrientacao) + (erroPosicaoLateral * pesoPosicaoLateral);
var statusAtual = ReferencialRuaGPS.StatusAtual;
// Atualiza o PID com o erro combinado
if (!StatusOperacoesPararCarro.Contains(statusAtual) && statusAtual != StatusOperacao.Manobrando)
{ {
var BicosNaoAtuados = new List<AtuadorBicoModel>(); Controle.PIDdirecional.Atualizar(erroCombinado);
DispAtu.Dados.BicosPulverizadores.ForEach(x => }
{ double correcaoAngulo = Controle.PIDdirecional.Saida;
BicosNaoAtuados.Add(x);
});
// Aplica a correção. Isso pode incluir limites para evitar comandos excessivos.
Controle.Angulo = correcaoAngulo;
}
public void CalculaDadosMovimentacaoAutonoma()
{
CalcularAnguloInclinacao();
var statusAtual = ReferencialRuaGPS.StatusAtual;
if (StatusOperacoesPararCarro.Contains(statusAtual))
{
var BicosNaoAtuados = new List<AtuadorBicoModel>(DispAtu.Dados.BicosPulverizadores);
Controle.BicosAtuados = BicosNaoAtuados.ToList(); Controle.BicosAtuados = BicosNaoAtuados.ToList();
Controle.RPM = 0; Controle.RPM = 0;
Controle.Angulo = 0; Controle.Angulo = 0;
} }
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.EntrandoRua) else if (statusAtual == StatusOperacao.EntrandoRua)
{ {
Controle.RPM = Controle.RPM_Min; Controle.RPM = Controle.RPM_Min;
} }
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.SaindoRua) else if (statusAtual == StatusOperacao.SaindoRua)
{ {
Controle.RPM = Controle.RPM_Min; Controle.RPM = Controle.RPM_Min;
} }
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.CaminhandoRua) else if (statusAtual == StatusOperacao.CaminhandoRua)
{ {
if (Sensoriamento.ErvasNoRadar == 0) if (Sensoriamento.ErvasNoRadar == 0)
{ {
@ -605,7 +733,7 @@ namespace AgroBase.Models
Controle.RPM = Controle.RPM_Min; Controle.RPM = Controle.RPM_Min;
} }
} }
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.Manobrando) else if (statusAtual == StatusOperacao.Manobrando)
{ {
Controle.RPM = 0; Controle.RPM = 0;
CalcularManobra(); CalcularManobra();
@ -625,14 +753,25 @@ namespace AgroBase.Models
SalvarLog(false); SalvarLog(false);
} }
private void TmrParametrizacao_Tick(object sender, EventArgs e) public void AtualizarRuasSelecionadas()
{ {
if (Mapa != null) List<string> ids = new List<string>();
var Topico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa);
var Mensagem = Topico.Mensagens.LastOrDefault();
if (Mensagem != null && !Mensagem.Mensagem.Contains("[]"))
{ {
APIService.AtualizarRuasSelecionadas(); Mensagem.Mensagem = Mensagem.Mensagem.Replace("\n", "");
Mensagem.Mensagem = Mensagem.Mensagem.Replace("\"", "");
ids = JsonConvert.DeserializeObject<int[]>(Mensagem.Mensagem).Select(x => x.ToString()).ToList();
}
if (ids.Count != Mapa.RuasPercorrer.Count)
{
Mapa.RuasPercorrer = ids;
Mapa.PopularTrajetoria();
} }
} }
} }
public class OperacaoControleModel public class OperacaoControleModel
@ -641,14 +780,15 @@ namespace AgroBase.Models
public int RPM_Min { get; set; } = 15; public int RPM_Min { get; set; } = 15;
public double Angulo_Max { get; set; } = 30; public double Angulo_Max { get; set; } = 30;
public double Angulo_Min { get; set; } = -30; public double Angulo_Min { get; set; } = -30;
public double VelocidadeMP { get; set; } = 50;
public double Angulo { get; set; } = 0; public double Angulo { get; set; } = 0;
public int RPM { get; set; } = 0; public int RPM { get; set; } = 0;
public Direcao Direcao { get; set; } = Direcao.Parado; public Direcao Direcao { get; set; } = Direcao.Parado;
public double VelocidadeMP { get; set; } = 50;
public List<AtuadorBicoModel> BicosAtuados { get; set; } = new List<AtuadorBicoModel>(); public List<AtuadorBicoModel> BicosAtuados { get; set; } = new List<AtuadorBicoModel>();
public List<OperacaoControleTipoModel> TiposControle { get; set; } public List<OperacaoControleTipoModel> TiposControle { get; set; }
public PIDModel PIDdirecional { get; set; } = new PIDModel();
} }
public class OperacaoControleTipoModel public class OperacaoControleTipoModel
@ -667,6 +807,14 @@ namespace AgroBase.Models
public bool Conectado { get; set; } public bool Conectado { get; set; }
} }
public class OperacaoParametrosMandatoriosModel
{
public ParametrosOperacao Parametro { get; set; }
public bool Mandatorio { get; set; }
public bool Utilizar { get; set; }
public bool Pronto { get; set; }
}
public class OperacaoSensoriamentoModel public class OperacaoSensoriamentoModel
{ {
public DateTime Momento { get; set; } public DateTime Momento { get; set; }
@ -699,11 +847,13 @@ namespace AgroBase.Models
{ {
public bool ManobraConcluida { get; set; } = false; public bool ManobraConcluida { get; set; } = false;
private StatusOperacao _EtapaAtual; private StatusOperacao _EtapaAtual;
private StatusOperacao _EtapaAnteriorParada = StatusOperacao.Parado;
public StatusOperacao StatusAtual public StatusOperacao StatusAtual
{ {
get get
{ {
StatusOperacao etapaAtual = _EtapaAtual; StatusOperacao etapaAtual = _EtapaAtual;
// Se a operação não estiver iniciada // Se a operação não estiver iniciada
if (!Variaveis.OperacaoEmAndamento.Iniciado) if (!Variaveis.OperacaoEmAndamento.Iniciado)
{ {
@ -716,16 +866,37 @@ namespace AgroBase.Models
// Operação em andamento // Operação em andamento
else else
{ {
// Se a operação tiver algum item mandatório interrompido
if (!Variaveis.OperacaoEmAndamento.OperacaoLiberada)
{
// Da primeira vez, salva a etapa atual anterior à parada para possível retomada
if (etapaAtual != StatusOperacao.Parado)
{
_EtapaAnteriorParada = etapaAtual;
}
etapaAtual = StatusOperacao.Parado;
}
// Se a etapa atual for parado, mas a operação foi liberada, retoma de onde parou
else if (etapaAtual == StatusOperacao.Parado && Variaveis.OperacaoEmAndamento.OperacaoLiberada)
{
Variaveis.OperacaoEmAndamento.TempoAguardando = DateTime.Now;
etapaAtual = StatusOperacao.Aguardando;
}
// Etapa atual é finalizada, então finaliza a operação // Etapa atual é finalizada, então finaliza a operação
if (_EtapaAtual == StatusOperacao.Concluida) else if (_EtapaAtual == StatusOperacao.Concluida)
{ {
Variaveis.OperacaoEmAndamento.FinalizarOperacao(); Variaveis.OperacaoEmAndamento.FinalizarOperacao();
} }
// Contagem regressiva para iniciar a operação // Contagem regressiva para iniciar a operação
else if (Variaveis.OperacaoEmAndamento.Tempo.Minutes == 0 && Variaveis.OperacaoEmAndamento.Tempo.Seconds < Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) else if (Variaveis.OperacaoEmAndamento.TempoAguardando.AddSeconds(Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) > DateTime.Now)
{ {
etapaAtual = StatusOperacao.Aguardando; etapaAtual = StatusOperacao.Aguardando;
} }
else if (_EtapaAnteriorParada != StatusOperacao.Parado)
{
etapaAtual = _EtapaAnteriorParada;
_EtapaAnteriorParada = StatusOperacao.Parado;
}
// Robô está manobrando para seguir a próxima rota do mapa // Robô está manobrando para seguir a próxima rota do mapa
else if (_EtapaAtual == StatusOperacao.Manobrando) else if (_EtapaAtual == StatusOperacao.Manobrando)
{ {
@ -798,7 +969,8 @@ namespace AgroBase.Models
try try
{ {
double somaAngulo = 0; double somaAngulo = 0;
var Pontos = Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].Count > PontosConsiderarAngulo ? var Pontos = !Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua.Any() ? new List<GPSModel>() :
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].Count > PontosConsiderarAngulo ?
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() : Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() :
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).ToList(); Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).ToList();
Pontos = Pontos.OrderBy(x => x.DataHora).ToList(); Pontos = Pontos.OrderBy(x => x.DataHora).ToList();
@ -828,7 +1000,7 @@ namespace AgroBase.Models
var PontosRua = IdxPontoAproximadoRua + PontosConsiderarAngulo < Rua.Count ? var PontosRua = IdxPontoAproximadoRua + PontosConsiderarAngulo < Rua.Count ?
Rua.Skip(IdxPontoAproximadoRua).Take(PontosConsiderarAngulo).ToList() : Rua.Skip(IdxPontoAproximadoRua).Take(PontosConsiderarAngulo).ToList() :
Rua.Skip(PontosConsiderarAngulo).Take(IdxPontoAproximadoRua).ToList(); Rua.Skip(IdxPontoAproximadoRua - PontosConsiderarAngulo).ToList();
/*var Pontos = Rua.Count > PontosConsiderarAngulo ? /*var Pontos = Rua.Count > PontosConsiderarAngulo ?
Rua.OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() : Rua.OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() :

View File

@ -0,0 +1,42 @@
using System;
namespace AgroBase.Models
{
public class PIDModel
{
public double SetPoint { get; set; } = 0.0;
public double ValorAtual { get; set; } = 0.0;
public double Saida { get; private set; } = 0.0;
public double Kp { get; set; } = 1.0;
public double Ki { get; set; } = 0.1;
public double Kd { get; set; } = 0.01;
private double erroAnterior = 0.0;
private double somaErro = 0.0;
public double LimiteSaida { get; set; } = 100.0; // Define o limite máximo para a saída do PID
public double LimiteSomaErro { get; set; } = 50.0; // Define o limite para a soma do erro (wind-up)
public void Atualizar(double valorAtual)
{
ValorAtual = valorAtual;
double erro = SetPoint - ValorAtual;
// Atualiza a soma do erro com limitação para prevenir wind-up
somaErro = Math.Max(Math.Min(somaErro + erro, LimiteSomaErro), -LimiteSomaErro);
double deltaErro = erro - erroAnterior;
double saidaTemp = (Kp * erro) + (Ki * somaErro) + (Kd * deltaErro);
// Limita a saída do PID
Saida = Math.Max(Math.Min(saidaTemp, LimiteSaida), -LimiteSaida);
erroAnterior = erro;
}
public void Resetar()
{
erroAnterior = 0.0;
somaErro = 0.0;
Saida = 0.0;
}
}
}

View File

@ -14,6 +14,8 @@ namespace AgroBase.Models
public static string CaminhoSistema { get; set; } = AppDomain.CurrentDomain.BaseDirectory; public static string CaminhoSistema { get; set; } = AppDomain.CurrentDomain.BaseDirectory;
public static List<IDispositivosService> DispositivosConectados { get; set; } = new List<IDispositivosService>(); public static List<IDispositivosService> DispositivosConectados { get; set; } = new List<IDispositivosService>();
public static OperacaoModel OperacaoEmAndamento { get; set; } = new OperacaoModel(ModoOperacao.Manual); public static OperacaoModel OperacaoEmAndamento { get; set; } = new OperacaoModel(ModoOperacao.Manual);
public static MqttService MqttService { get; set; } = new MqttService("localhost", 1883);
public static List<T_Code> DispositivosConexaoInicial = new List<T_Code>() { T_Code.Dir, T_Code.Mov, T_Code.Atu, T_Code.Sen };
} }
public static class FuncoesGlobais public static class FuncoesGlobais
@ -44,4 +46,5 @@ namespace AgroBase.Models
public static int SocketCaminho { get; } = 6588; public static int SocketCaminho { get; } = 6588;
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -20,8 +20,8 @@ pathFiles = sys.argv[1]
fileName = sys.argv[2] fileName = sys.argv[2]
outputName = sys.argv[3] outputName = sys.argv[3]
outputMapName = sys.argv[4] outputMapName = sys.argv[4]
marcadorEndpoit = sys.argv[5] topico_gps = sys.argv[5]
ruasEndpoit = sys.argv[6] topico_ruas = sys.argv[6]
pastaSaida = 'Python/Output/' pastaSaida = 'Python/Output/'
# Carregar o arquivo shapefile contendo a geometria # Carregar o arquivo shapefile contendo a geometria
@ -130,6 +130,7 @@ with open(caminho_completo_html, 'r+') as arquivo_html:
# Script JavaScript para adicionar ao HTML, com o ID do mapa substituído # Script JavaScript para adicionar ao HTML, com o ID do mapa substituído
script_atualizacao_marcador = f""" script_atualizacao_marcador = f"""
<script src="folium/mqtt.min.js"></script>
<script> <script>
var marcadorDinamico = L.marker([0, 0], {{ var marcadorDinamico = L.marker([0, 0], {{
icon: L.AwesomeMarkers.icon({{ icon: L.AwesomeMarkers.icon({{
@ -139,26 +140,35 @@ with open(caminho_completo_html, 'r+') as arquivo_html:
}}) }})
}}).addTo({id_mapa}); }}).addTo({id_mapa});
function atualizarMarcador() {{ // Conectar ao broker MQTT
fetch('{marcadorEndpoit}') const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
.then(function(response) {{
return response.json(); // Quando conectado, inscreva-se no tópico desejado
}}) client.on('connect', function () {{
.then(function(dados) {{ console.log('Conectado ao broker MQTT');
// Inscrever-se no tópico
client.subscribe('{topico_gps}', function (err) {{
if (!err) {{
console.log("Inscrição bem-sucedida no tópico");
}} else {{
console.error("Falha na inscrição do tópico", err);
}}
}});
}});
// Lidar com mensagens recebidas para o tópico inscrito
client.on('message', function (topic, message) {{
// A mensagem é um Buffer, converta para string ou objeto conforme necessário
//console.log(`Mensagem recebida no tópico '${{topic}}': ${{message.toString()}}`);
var dados = JSON.parse(message);
var novaLatitude = dados.latitude; var novaLatitude = dados.latitude;
var novaLongitude = dados.longitude; var novaLongitude = dados.longitude;
var novaPosicao = [novaLatitude, novaLongitude]; var novaPosicao = [novaLatitude, novaLongitude];
marcadorDinamico.setLatLng(novaPosicao); marcadorDinamico.setLatLng(novaPosicao);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]); adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
{id_mapa}.setView(novaPosicao, {id_mapa}.getZoom()); {id_mapa}.setView(novaPosicao, {id_mapa}.getZoom());
}})
.catch(function(error) {{
console.error('Erro ao atualizar o marcador:', error);
}}); }});
}}
// Atualiza o marcador a cada 2 segundos
setInterval(atualizarMarcador, 2000);
</script> </script>
""" """
@ -167,16 +177,13 @@ with open(caminho_completo_html, 'r+') as arquivo_html:
var trajetosSelecionados = {{}}; var trajetosSelecionados = {{}};
var RuasSelecionadas = []; var RuasSelecionadas = [];
function enviarSelecaoParaServidor() {{ function enviarSelecaoParaServidor() {{
fetch('{ruasEndpoit}', {{ client.publish("{topico_ruas}", JSON.stringify(RuasSelecionadas), function (err) {{
method: 'POST', /*if (!err) {{
headers: {{ console.log("Mensagem publicada com sucesso");
'Content-Type': 'application/json', }} else {{
}}, console.error("Falha ao publicar mensagem", err);
body: JSON.stringify({{ids: RuasSelecionadas}}), }}*/
}}) }});
.then(response => response.json())
.then(data => console.log('Sucesso:', data))
.catch((error) => console.error('Erro:', error));
}} }}
""" """

View File

@ -11,6 +11,11 @@ import socket
import os import os
import sys import sys
import uuid
import paho.mqtt.client as mqtt
mqtt_client = mqtt.Client(f"client_street_detector_{uuid.uuid4()}")
mqtt_client.connect("localhost", port=1883)
json_reading_data = None json_reading_data = None
output_folder = 'Python/Output/' output_folder = 'Python/Output/'
@ -20,7 +25,7 @@ port = sys.argv[2]
url = sys.argv[3] url = sys.argv[3]
output_file = sys.argv[4] output_file = sys.argv[4]
show_lines = sys.argv[5] == "1" show_lines = sys.argv[5] == "1"
socket_port = int(sys.argv[6]) mqtt_topic = sys.argv[6]
app = Flask(__name__) app = Flask(__name__)
@ -88,20 +93,10 @@ def generate_and_save_json(image):
detected_classes = set(np.unique(image)) detected_classes = set(np.unique(image))
global json_reading_data global json_reading_data
contours_info = []
# Caminho completo para o arquivo de saída
output_path = output_folder + output_file output_path = output_folder + output_file
# Carregar os dados existentes se o arquivo já existir
if os.path.exists(output_path):
with open(output_path, 'r') as f:
try:
existing_data = json.load(f)
if type(existing_data) is list:
contours_info.extend(existing_data)
except json.JSONDecodeError:
print("Erro ao decodificar o JSON existente. Um novo arquivo será criado.")
timestamp = time.time() timestamp = time.time()
json_data = {'timestamp': timestamp, 'Classes': []} json_data = {'timestamp': timestamp, 'Classes': []}
for l in detected_classes: for l in detected_classes:
@ -117,19 +112,21 @@ def generate_and_save_json(image):
for point in contour: for point in contour:
class_entry['Contornos'].append(point.squeeze().tolist()) class_entry['Contornos'].append(point.squeeze().tolist())
json_data['Classes'].append(class_entry) json_data['Classes'].append(class_entry)
contours_info.append(json_data)
# Limita a quantidade de registros a serem salvos com base em max_readings
contours_info = contours_info[-max_readings:]
# Garante que o diretório de saída exista
if not os.path.exists(output_folder): if not os.path.exists(output_folder):
os.makedirs(output_folder) os.makedirs(output_folder)
# Salva os dados em um arquivo JSON # Salva os dados em um arquivo JSON, sobrescrevendo o arquivo existente
try:
with open(output_path, 'w') as f: with open(output_path, 'w') as f:
json.dump(contours_info, f, indent=4) json.dump([json_data], f, indent=4) # Envolva json_data em uma lista para manter o formato de lista no arquivo JSON
except OSError as e:
print(f"Erro ao abrir o arquivo: {e}")
print(f"Caminho do arquivo tentado: {output_path}")
json_reading_data = json_data json_reading_data = json_data
mqtt_client.publish(mqtt_topic, json.dumps(json_data).encode('utf-8'))
# Função para decodificar e aplicar o mapa de segmentação em um frame # Função para decodificar e aplicar o mapa de segmentação em um frame
@ -161,7 +158,7 @@ def detect_and_stream(camera_index):
if not ret: if not ret:
break break
frame = cv2.imread(model_folder + "dataset/images/81.jpeg") #frame = cv2.imread(model_folder + "dataset/images/81.jpeg")
# Processa o frame com seu modelo # Processa o frame com seu modelo
output_predictions = segment_frame(frame) output_predictions = segment_frame(frame)
@ -177,44 +174,9 @@ def detect_and_stream(camera_index):
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
# Função para lidar com a conexão de cada cliente # Esta função é para confirmar que script está pronto para execução
def handle_client_connection(client_socket): def send_script_ready():
try: mqtt_client.publish(mqtt_topic, "OK")
while True:
# Enviar o dicionário serializado em JSON
client_socket.send(json.dumps(json_reading_data).encode('utf-8'))
# Aguardar um pouco antes de enviar os próximos dados
time.sleep(0.2)
except socket.error:
print(f"Cliente desconectado.")
finally:
# Fechar a conexão do socket ao sair do loop
client_socket.close()
# Configuração inicial do servidor de socket
def start_server(address='localhost', port=socket_port):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((address, socket_port))
server.listen()
print(f"Servidor iniciado. Aguardando conexões em {address}:{socket_port}...")
try:
while True:
client_sock, address = server.accept()
print(f"Aceitando conexão de {address[0]}:{address[1]}")
client_handler = threading.Thread(
target=handle_client_connection,
args=(client_sock,)
)
client_handler.start()
finally:
server.close()
# Esta função é para iniciar o servidor de socket em uma thread separada
def run_socket_server():
start_server()
@app.route('/' + url, methods=['GET']) @app.route('/' + url, methods=['GET'])
@ -228,9 +190,9 @@ def run_flask_server():
# Iniciar o servidor # Iniciar o servidor
if __name__ == '__main__': if __name__ == '__main__':
# Inicia o servidor de socket em uma thread separada # Cria trhead separada para informar que o script iniciou com sucesso
socket_server_thread = threading.Thread(target=run_socket_server) mqtt_thread = threading.Thread(target=send_script_ready)
socket_server_thread.start() mqtt_thread.start()
# Inicia o servidor Flask na thread principal # Inicia o servidor Flask na thread principal
run_flask_server() run_flask_server()

View File

@ -3,11 +3,15 @@ import numpy as np
from flask import Flask, Response, request from flask import Flask, Response, request
import json import json
import time import time
import socket
import threading import threading
import sys import sys
import os import os
import uuid
import paho.mqtt.client as mqtt
mqtt_client = mqtt.Client(f"client_weed_detector_{uuid.uuid4()}")
mqtt_client.connect("localhost", port=1883)
# Adiciona as configurações do modelo YOLO # Adiciona as configurações do modelo YOLO
model_config = 'C:\\train\\models\\ervas\\ervas.cfg' model_config = 'C:\\train\\models\\ervas\\ervas.cfg'
model_weights = 'C:\\train\\models\\ervas\\backup\\ervas_final.weights' model_weights = 'C:\\train\\models\\ervas\\backup\\ervas_final.weights'
@ -30,7 +34,7 @@ porta = sys.argv[2]
url = sys.argv[3] url = sys.argv[3]
arquivoSaida = sys.argv[4] arquivoSaida = sys.argv[4]
mostrar_linhas = sys.argv[5] == "1" mostrar_linhas = sys.argv[5] == "1"
socket_porta = int(sys.argv[6]) mqtt_topic = sys.argv[6]
app = Flask(__name__) app = Flask(__name__)
@ -85,6 +89,8 @@ def detect_objects(conf_threshold, nms_threshold, _camera_index):
json_data = {'timestamp': timestamp, 'x_max': width, 'y_max': height, 'objetos': current_readings} json_data = {'timestamp': timestamp, 'x_max': width, 'y_max': height, 'objetos': current_readings}
readings.append(json_data) readings.append(json_data)
mqtt_client.publish(mqtt_topic, json.dumps(json_data).encode('utf-8'))
if not os.path.exists(output_folder): if not os.path.exists(output_folder):
os.makedirs(output_folder) os.makedirs(output_folder)
@ -100,44 +106,10 @@ def detect_objects(conf_threshold, nms_threshold, _camera_index):
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
# Função para lidar com a conexão de cada cliente
def handle_client_connection(client_socket):
try:
while True:
# Enviar o dicionário serializado em JSON
client_socket.send(json.dumps(json_data).encode('utf-8'))
# Aguardar um pouco antes de enviar os próximos dados # Esta função é para confirmar que script está pronto para execução
time.sleep(0.2) def send_script_ready():
except socket.error: mqtt_client.publish(mqtt_topic, "OK")
print(f"Cliente desconectado.")
finally:
# Fechar a conexão do socket ao sair do loop
client_socket.close()
# Configuração inicial do servidor de socket
def start_server(address='localhost', port=socket_porta):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((address, port))
server.listen()
print(f"Servidor iniciado. Aguardando conexões em {address}:{port}...")
try:
while True:
client_sock, address = server.accept()
print(f"Aceitando conexão de {address[0]}:{address[1]}")
client_handler = threading.Thread(
target=handle_client_connection,
args=(client_sock,)
)
client_handler.start()
finally:
server.close()
# Esta função é para iniciar o servidor de socket em uma thread separada
def run_socket_server():
start_server()
# Iniciar o servidor Flask em uma thread separada # Iniciar o servidor Flask em uma thread separada
def run_flask_server(): def run_flask_server():
@ -153,9 +125,9 @@ def video_feed():
# Iniciar o servidor # Iniciar o servidor
if __name__ == '__main__': if __name__ == '__main__':
# Inicia o servidor de socket em uma thread separada # Cria trhead separada para informar que o script iniciou com sucesso
socket_server_thread = threading.Thread(target=run_socket_server) mqtt_thread = threading.Thread(target=send_script_ready)
socket_server_thread.start() mqtt_thread.start()
# Inicia o servidor Flask na thread principal # Inicia o servidor Flask na thread principal
run_flask_server() run_flask_server()

View File

@ -61,6 +61,8 @@ namespace AgroBase.Services
var json = JsonConvert.SerializeObject(localizacao); var json = JsonConvert.SerializeObject(localizacao);
var data = new StringContent(json, Encoding.UTF8, "application/json"); var data = new StringContent(json, Encoding.UTF8, "application/json");
try
{
using (var client = new HttpClient()) using (var client = new HttpClient())
{ {
var response = await client.PostAsync(url, data); var response = await client.PostAsync(url, data);
@ -68,6 +70,16 @@ namespace AgroBase.Services
string result = await response.Content.ReadAsStringAsync(); string result = await response.Content.ReadAsStringAsync();
} }
} }
catch (Exception e)
{
Console.WriteLine("Erro ao atualizar coordenadas GPS: " + e.Message);
if (pythonProcess == null || pythonProcess.HasExited)
{
Inicializar();
}
}
}
public static async void AtualizarRuasSelecionadas() public static async void AtualizarRuasSelecionadas()
{ {
@ -93,9 +105,14 @@ namespace AgroBase.Services
} }
} }
} }
catch catch (Exception e)
{ {
Console.WriteLine("Erro ao atualizar ruas selecionadas: " + e.Message);
if (pythonProcess == null || pythonProcess.HasExited)
{
Inicializar();
}
} }
} }

View File

@ -1,5 +1,6 @@
using AgroBase.Forms; using AgroBase.Forms;
using AgroBase.Models; using AgroBase.Models;
using CefSharp.WinForms;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -10,13 +11,19 @@ using System.Management;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using static MqttService;
namespace AgroBase.Services namespace AgroBase.Services
{ {
public class CameraService<T> public class CameraService
{ {
public static Dictionary<string, string> CamerasConectadas = new Dictionary<string, string>();
public Process pythonProcess; public Process pythonProcess;
public SocketService<T> socket; public DateTime? IniciadoEm = null;
public DateTime? ProntoEm = null;
public DateTime? FinalizadoEm = null;
public MqttTopicosModel _mqttTopico;
private string Endereco = "localhost"; private string Endereco = "localhost";
public string ArquivoLeitura = "leitura.json"; public string ArquivoLeitura = "leitura.json";
@ -26,83 +33,59 @@ namespace AgroBase.Services
public string URLcamera = ""; public string URLcamera = "";
public void IniciarCamera(string Script, string[] Argumentos, string FlaskPorta, string FlaskUrl, bool AtivaSocket, string SocketPorta) public void IniciarCamera(string Script, string[] Argumentos, string FlaskPorta, string FlaskUrl, string MqttTopico, Timer tmrProcesso)
{ {
if (_mqttTopico == null)
{
_mqttTopico = new MqttTopicosModel()
{
Topico = MqttTopico,
Mensagens = new List<MqttTopicosMensagensModel>(),
Inscrever = true
};
}
Variaveis.MqttService.Topicos.Add(_mqttTopico);
Variaveis.MqttService.SubscribeAsync(_mqttTopico).ConfigureAwait(false);
tmrProcesso.Start();
pythonProcess = PythonService.RunScript(Script, Argumentos); pythonProcess = PythonService.RunScript(Script, Argumentos);
pythonProcess.Exited += PythonProcess_Exited;
IniciadoEm = DateTime.Now;
URLcamera = "http://" + Endereco + ":" + FlaskPorta + "/" + FlaskUrl + URLcamera = "http://" + Endereco + ":" + FlaskPorta + "/" + FlaskUrl +
"?conf_threshold=" + conf_threshold.ToString().Replace(",", ".") + "?conf_threshold=" + conf_threshold.ToString().Replace(",", ".") +
"&nms_threshold=" + nms_threshold.ToString().Replace(",", ".") + "&nms_threshold=" + nms_threshold.ToString().Replace(",", ".") +
"&camera_index=" + (selectedCamera - 1); "&camera_index=" + (selectedCamera - 1);
socket = new SocketService<T>();
if (AtivaSocket)
{
socket.Connect(Endereco, Convert.ToInt32(SocketPorta));
}
} }
public T AferirDadosJson() private void PythonProcess_Exited(object sender, EventArgs e)
{ {
T Coordenadas = default(T); FinalizadoEm = DateTime.Now;
}
if (File.Exists(PythonService.CaminhoGeral + PythonService.CaminhoLeitura + ArquivoLeitura)) public static Dictionary<string, string> AtualizaListaCameras()
{ {
try try
{ {
string tempFile = PythonService.CaminhoGeral + PythonService.CaminhoLeitura + "cp_" + ArquivoLeitura; CamerasConectadas.Clear();
if (File.Exists(tempFile)) CamerasConectadas.Add("Sem vídeo", "0");
{ using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE (PNPClass = 'Camera')")) // PNPClass = 'Image' OR PNPClass = 'Camera')
File.Delete(tempFile);
}
File.Copy(PythonService.CaminhoGeral + PythonService.CaminhoLeitura + ArquivoLeitura, tempFile);
var linhas = File.ReadAllText(tempFile);
Coordenadas = JsonConvert.DeserializeObject<T>(linhas);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return Coordenadas;
}
public List<string> AtualizaListaCameras()
{
List<string> Cameras = new List<string>() { "Sem vídeo" };
try
{
//Variaveis.videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
var cameraNames = new List<string>();
var camerasList = new Dictionary<string, string>();
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE (PNPClass = 'Image' OR PNPClass = 'Camera')"))
{ {
int i = 0; int i = 0;
foreach (var device in searcher.Get()) foreach (var device in searcher.Get())
{ {
string cameraDesc = i.ToString() + " - " + device["Caption"].ToString(); string cameraDesc = i.ToString() + " - " + device["Caption"].ToString();
camerasList.Add(device["DeviceID"].ToString(), cameraDesc); CamerasConectadas.Add(cameraDesc, device["DeviceID"].ToString());
cameraNames.Add(cameraDesc);
i++; i++;
} }
} }
//cameraNames = camerasList.OrderByDescending(x => x.Key).Select(x => x.Value).ToList();
foreach (string device in cameraNames)
{
Cameras.Add(device);
}
} }
catch (ApplicationException) catch (ApplicationException)
{ {
} }
return Cameras; return CamerasConectadas;
} }

View File

@ -80,10 +80,10 @@ namespace AgroBase.Comum
public void AtualizarPortas() public void AtualizarPortas()
{ {
cmbPorta.Items.Clear();
cmbPorta.Text = "";
var DispositivosTipo = SerialService.DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).ToList(); var DispositivosTipo = SerialService.DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).ToList();
for (int i = 0; i < DispositivosTipo.Count(); i++) for (int i = 0; i < DispositivosTipo.Count(); i++)
{
if (!cmbPorta.Items.Contains(DispositivosTipo[i].PortaCOM))
{ {
string PortaCom = DispositivosTipo[i].PortaCOM; string PortaCom = DispositivosTipo[i].PortaCOM;
SerialPort _Porta = new SerialPort() { PortName = PortaCom }; SerialPort _Porta = new SerialPort() { PortName = PortaCom };
@ -98,6 +98,12 @@ namespace AgroBase.Comum
Console.WriteLine(ex.Message); Console.WriteLine(ex.Message);
} }
} }
}
if (!DispositivosTipo.Any())
{
cmbPorta.Items.Clear();
cmbPorta.Text = "";
}
if (cmbPorta.Items.Count > 1) if (cmbPorta.Items.Count > 1)
cmbPorta.SelectedIndex = 1; cmbPorta.SelectedIndex = 1;
else if (cmbPorta.Items.Count > 0) else if (cmbPorta.Items.Count > 0)

View File

@ -110,7 +110,8 @@ namespace AgroBase.Services
UltimaLeitura.PrecisaoHorizontal = double.TryParse(parts[8], NumberStyles.Float, CultureInfo.InvariantCulture, out double hdop) ? hdop : 0; UltimaLeitura.PrecisaoHorizontal = double.TryParse(parts[8], NumberStyles.Float, CultureInfo.InvariantCulture, out double hdop) ? hdop : 0;
UltimaLeitura.Altitude = ConvertToDouble(parts[9]); UltimaLeitura.Altitude = ConvertToDouble(parts[9]);
APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo); //APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo);
AtualizarCoordenadasGPS();
break; break;
// Recommended minimum specific GPS/Transit data // Recommended minimum specific GPS/Transit data
@ -240,7 +241,18 @@ namespace AgroBase.Services
return Math.PI / 180 * angle; return Math.PI / 180 * angle;
} }
private static void AtualizarCoordenadasGPS()
{
var Coordenadas = new
{
latitude = UltimaLeitura.Latitude,
longitude = UltimaLeitura.Longitude
};
Variaveis.MqttService.PublishAsync(
Variaveis.MqttService.Topicos.First(x => x.Topico == MapasVariaveisModel.TopicoCoordenadasGPS),
JsonConvert.SerializeObject(Coordenadas)
).ConfigureAwait(false);
}
private static MapaFeatureCollectionModel TrajetoFake = new MapaFeatureCollectionModel(); private static MapaFeatureCollectionModel TrajetoFake = new MapaFeatureCollectionModel();
@ -296,9 +308,10 @@ namespace AgroBase.Services
Longitude = TrajetoFake.features[idxRuaA].geometry.coordinates[idxPonto][0], Longitude = TrajetoFake.features[idxRuaA].geometry.coordinates[idxPonto][0],
Latitude = TrajetoFake.features[idxRuaA].geometry.coordinates[idxPonto][1], Latitude = TrajetoFake.features[idxRuaA].geometry.coordinates[idxPonto][1],
}; };
APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo); //APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo);
AtualizarCoordenadasGPS();
if (Variaveis.OperacaoEmAndamento.Tempo.Minutes == 0 && Variaveis.OperacaoEmAndamento.Tempo.Seconds < Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) if (Variaveis.OperacaoEmAndamento.StatusOperacoesPararCarro.Contains(Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual))
{ {
return; return;
} }

View File

@ -20,6 +20,7 @@ namespace AgroBase.Services
int TempoConectado { get; set; } int TempoConectado { get; set; }
GroupBox gpbItem { get; set; } GroupBox gpbItem { get; set; }
void AtualizarPortas();
string PortaCOM(); string PortaCOM();
string StatusPorta(); string StatusPorta();
Control InstanciarDispositivo(int index); Control InstanciarDispositivo(int index);

View File

@ -14,6 +14,8 @@ namespace AgroBase.Services
public static string NomeArquivoMapaInterativo = "mapa_interativo.html"; public static string NomeArquivoMapaInterativo = "mapa_interativo.html";
public static string NomeArquivoMapaInterativoSaida = "GeoJson.json"; public static string NomeArquivoMapaInterativoSaida = "GeoJson.json";
public static string NomeArquivoMapaGPS = "mapa_gps.html"; public static string NomeArquivoMapaGPS = "mapa_gps.html";
public static string TopicoCoordenadasGPS = "coordenadas_gps";
public static string TopicoSelecaoRuasMapa = "selecao_ruas_mapa";
} }
public class MapasService public class MapasService
@ -28,6 +30,7 @@ namespace AgroBase.Services
public string MapaUrl = ""; public string MapaUrl = "";
public string CaminhoDadosMapa = ""; public string CaminhoDadosMapa = "";
public MapaFeatureCollectionModel DadosMapa; public MapaFeatureCollectionModel DadosMapa;
public bool Carregado = false;
public void CarregarMapa(string nomeArquivoMapa, string nomeArquivoSaida) public void CarregarMapa(string nomeArquivoMapa, string nomeArquivoSaida)
@ -52,8 +55,8 @@ namespace AgroBase.Services
NomeArquivos, NomeArquivos,
ArquivoSaida, ArquivoSaida,
NomeArquivoMapa, NomeArquivoMapa,
APIService.ApiBase() + APIService.GPS_getCoordenadasEndpoint.Replace("<id>", APIService.GPS_IDcoordenadasRobo.ToString()), MapasVariaveisModel.TopicoCoordenadasGPS,
APIService.ApiBase() + APIService.Mapa_setRuasSelecionadasEndpoint MapasVariaveisModel.TopicoSelecaoRuasMapa
}); });
MapaUrl = new Uri(CaminhoSaida + NomeArquivoMapa).AbsoluteUri; MapaUrl = new Uri(CaminhoSaida + NomeArquivoMapa).AbsoluteUri;
@ -65,7 +68,14 @@ namespace AgroBase.Services
{ {
NomeArquivoMapa = nomeArquivoMapa; NomeArquivoMapa = nomeArquivoMapa;
pythonProcess = PythonService.RunScript(PythonService.ScriptMapGPS, new string[] { CaminhoMapa, NomeArquivos, ArquivoSaida, NomeArquivoMapa, APIService.ApiBase() + APIService.GPS_getCoordenadasEndpoint.Replace("<id>", APIService.GPS_IDcoordenadasRobo.ToString()) }); pythonProcess = PythonService.RunScript(PythonService.ScriptMapGPS, new string[] {
CaminhoMapa,
NomeArquivos,
ArquivoSaida,
NomeArquivoMapa,
MapasVariaveisModel.TopicoCoordenadasGPS,
MapasVariaveisModel.TopicoSelecaoRuasMapa
});
MapaUrl = new Uri(CaminhoSaida + NomeArquivoMapa).AbsoluteUri; MapaUrl = new Uri(CaminhoSaida + NomeArquivoMapa).AbsoluteUri;
CaminhoDadosMapa = CaminhoSaida + ArquivoSaida; CaminhoDadosMapa = CaminhoSaida + ArquivoSaida;

View File

@ -0,0 +1,178 @@
using AgroBase.Forms;
using AgroBase.Services;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
public class MqttService
{
private IMqttClient _client;
private IMqttClientOptions _options;
private Timer tmrCheck = new Timer() { Interval = 1000 };
public List<MqttTopicosModel> Topicos = new List<MqttTopicosModel>()
{
new MqttTopicosModel()
{
Topico = MapasVariaveisModel.TopicoCoordenadasGPS,
Mensagens = new List<MqttTopicosMensagensModel>(),
Inscrever = false
},
new MqttTopicosModel()
{
Topico = MapasVariaveisModel.TopicoSelecaoRuasMapa,
Mensagens = new List < MqttTopicosMensagensModel>(),
Inscrever = true
}
};
public MqttService(string brokerAddress, int brokerPort)
{
var factory = new MqttFactory();
_client = factory.CreateMqttClient();
_options = new MqttClientOptionsBuilder()
.WithTcpServer(brokerAddress, brokerPort)
.WithCleanSession()
.Build();
_client.UseConnectedHandler(async e =>
{
Console.WriteLine("Connected to MQTT Broker.");
// Exemplo de inscrição em um tópico
foreach (var topic in Topicos)
{
await SubscribeAsync(topic);
}
});
_client.UseDisconnectedHandler(e =>
{
Console.WriteLine("Disconnected from MQTT Broker.");
});
_client.UseApplicationMessageReceivedHandler(e =>
{
string message = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
//Console.WriteLine($"Message received on topic {e.ApplicationMessage.Topic}");
// Aqui você pode adicionar o código para lidar com a mensagem recebida
var topico = Topicos.FirstOrDefault(x => x.Topico == e.ApplicationMessage.Topic);
if (topico != null)
{
topico.Mensagens.Add(new MqttTopicosMensagensModel()
{
Momento = DateTime.Now,
Cliente = e.ClientId,
Mensagem = message
});
}
});
tmrCheck.Tick += TmrCheck_Tick;
tmrCheck.Start();
}
private void TmrCheck_Tick(object sender, EventArgs e)
{
if (!_client.IsConnected)
{
ConnectAsync().ConfigureAwait(false);
}
frmInstancial.frmPrincipal.lblStripMqtt.Text = "MQTT: " + (_client.IsConnected ? "Conectado" : "Desconectado");
}
public bool StatusConexao()
{
return _client.IsConnected;
}
public async Task ConnectAsync()
{
await _client.ConnectAsync(_options);
}
public async Task DisconnectAsync()
{
await _client.DisconnectAsync();
}
public async Task PublishAsync(MqttTopicosModel topic, string message)
{
if (topic.Inscrever)
{
return;
}
var payload = Encoding.UTF8.GetBytes(message);
var mqttMessage = new MqttApplicationMessageBuilder()
.WithTopic(topic.Topico)
.WithPayload(payload)
.Build();
await _client.PublishAsync(mqttMessage);
}
public async Task SubscribeAsync(MqttTopicosModel topic)
{
if (!topic.Inscrever)
{
return;
}
try
{
if (!_client.IsConnected)
{
await ConnectAsync();
}
await _client.SubscribeAsync(new TopicFilterBuilder().WithTopic(topic.Topico).Build());
Console.WriteLine("Subscribed to topic: " + topic.Topico);
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred while subscribing from the topic: {ex.Message}");
}
}
public async Task UnsubscribeAsync(MqttTopicosModel topic)
{
if (!topic.Inscrever)
{
return;
}
try
{
if (!_client.IsConnected)
{
await ConnectAsync();
}
await _client.UnsubscribeAsync(new string[] { topic.Topico });
Console.WriteLine("Unsubscribed from topic: " + topic.Topico);
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred while unsubscribing from the topic: {ex.Message}");
}
}
public class MqttTopicosModel
{
public string Topico { get; set; }
public List<MqttTopicosMensagensModel> Mensagens { get; set; }
public bool Inscrever { get; set; }
}
public class MqttTopicosMensagensModel
{
public DateTime Momento { get; set; }
public string Cliente { get; set; }
public string Mensagem { get; set; }
}
}

View File

@ -37,6 +37,9 @@ namespace AgroBase.Services
pythonProcess.StartInfo.RedirectStandardOutput = true; pythonProcess.StartInfo.RedirectStandardOutput = true;
pythonProcess.StartInfo.CreateNoWindow = true; pythonProcess.StartInfo.CreateNoWindow = true;
pythonProcess.Exited += PythonProcess_Exited;
pythonProcess.OutputDataReceived += PythonProcess_OutputDataReceived;
pythonProcess.Start(); pythonProcess.Start();
processosIniciados.Add(pythonProcess); processosIniciados.Add(pythonProcess);
@ -44,6 +47,17 @@ namespace AgroBase.Services
return pythonProcess; return pythonProcess;
} }
private static void PythonProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Dados recebidos: " + e.Data);
}
private static void PythonProcess_Exited(object sender, EventArgs e)
{
Console.WriteLine("Processo finalizado");
}
public static void EncerrarProcessos() public static void EncerrarProcessos()
{ {
foreach (var processo in processosIniciados) foreach (var processo in processosIniciados)

View File

@ -1,8 +1,12 @@
using System; using AgroBase.Forms;
using AgroBase.Models;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.IO.Ports; using System.IO.Ports;
using System.Linq; using System.Linq;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using System.Windows.Forms;
using static AgroBase.Models.Enuns; using static AgroBase.Models.Enuns;
namespace AgroBase.Services namespace AgroBase.Services
@ -21,7 +25,7 @@ namespace AgroBase.Services
public static List<DispositivoDetalhesModel> DispositivosMapeados = new List<DispositivoDetalhesModel>(); public static List<DispositivoDetalhesModel> DispositivosMapeados = new List<DispositivoDetalhesModel>();
public static void AtualizarDispositivos() public static void RealizarVarreduraPortasUSB()
{ {
var Portas = SerialPort.GetPortNames(); var Portas = SerialPort.GetPortNames();
var PortasNaoMapeadas = Portas.Where(x => !DispositivosMapeados.Select(y => y.PortaCOM).Contains(x)).ToList(); var PortasNaoMapeadas = Portas.Where(x => !DispositivosMapeados.Select(y => y.PortaCOM).Contains(x)).ToList();
@ -44,7 +48,8 @@ namespace AgroBase.Services
} }
catch (Exception ex) catch (Exception ex)
{ {
_Porta.Close();
Console.WriteLine(ex.Message.ToString());
} }
} }
var DispositivosRemovidos = DispositivosMapeados.Where(x => !Portas.Contains(x.PortaCOM)).ToList(); var DispositivosRemovidos = DispositivosMapeados.Where(x => !Portas.Contains(x.PortaCOM)).ToList();
@ -52,6 +57,57 @@ namespace AgroBase.Services
{ {
DispositivosMapeados.Remove(Dispositivo); DispositivosMapeados.Remove(Dispositivo);
} }
AtualizarDispositivos();
}
public static void AtualizarDispositivos()
{
Variaveis.DispositivosConexaoInicial.ForEach(Dispositivo =>
{
bool DispositivoConectado = false;
if (Dispositivo == T_Code.Gps)
{
try
{
if (!GPSService.PortaGPS.IsOpen)
{
GPSService.IniciarRecepcaoDados();
}
DispositivoConectado = GPSService.PortaGPS.IsOpen;
}
catch
{
DispositivoConectado = false;
}
}
else
{
IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
if (dispositivoService == null)
{
dispositivoService = DispositivosServiceFactory.CreateDispositivoService(
Dispositivo,
"Nome: " + Enum.GetName(typeof(T_Code), Dispositivo),
"Descrição: " + Enum.GetName(typeof(T_Code), Dispositivo),
new SerialPort()
);
Variaveis.DispositivosConectados.Add(dispositivoService);
Control controle = dispositivoService.InstanciarDispositivo(Variaveis.DispositivosConectados.Count - 1);
controle.Location = new System.Drawing.Point(controle.Location.X, controle.Location.Y + (Variaveis.DispositivosConectados.Count * 50));
frmInstancial.frmPrincipal.pnlLateral.Controls.Add(controle);
frmInstancial.frmPrincipal.cmbDispositivos.Items.Add(dispositivoService._Descricao);
}
dispositivoService.AtualizarPortas();
if (dispositivoService.PortaCOM() != "" && !dispositivoService._Porta.IsOpen && frmInstancial.frmPrincipal.chbConexaoautomatica.Checked)
{
dispositivoService.btnConectar_Click(new object(), new EventArgs());
}
DispositivoConectado = dispositivoService._Porta.IsOpen;
}
});
} }
private static void _Porta_DataReceived(object sender, SerialDataReceivedEventArgs e) private static void _Porta_DataReceived(object sender, SerialDataReceivedEventArgs e)

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-05T08:31:02.222015-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-05T08:31:07.2061661-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-05T08:31:12.2084248-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-05T08:31:17.222643-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-05T08:31:22.2078603-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-05T08:31:27.223979-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-05T08:31:32.2090732-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-05T08:31:37.2073804-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-05T08:31:42.2275244-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-05T08:31:47.20807-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-05T08:31:52.2051867-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-05T08:31:54.2356184-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-05T08:32:29.2024134-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-05T14:15:38.1949976-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":0.0,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0}

View File

@ -0,0 +1 @@
[{"Latitude":0.0,"Longitude":0.0,"DataHora":"0001-01-01T00:00:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":0.0}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-06T09:12:20.7301128-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[],"ProgressoTrajeto":"NaN","ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":8,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":0.0,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0}

View File

@ -0,0 +1 @@
[{"Latitude":0.0,"Longitude":0.0,"DataHora":"0001-01-01T00:00:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":0.0}]

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-06T09:12:44.8955208-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":8,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":-1,"IdxRuaAtual":0}

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:12:44.5275222-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.64967801047743}]

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-06T09:13:06.0225353-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":8,"AnguloCarro":70.64967801047743,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-06T09:13:08.1415751-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":8,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0}]

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:13:05.5295528-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.64967801047743},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:13:07.5295752-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.64967801047743}]

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-06T09:13:52.1634387-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":9,"AtuacoesPorBico":[3,2,2,2],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":2,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-06T09:13:57.1210255-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":17,"AtuacoesPorBico":[5,4,4,4],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":2,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-06T09:14:00.1225745-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":17,"AtuacoesPorBico":[5,4,4,4],"DistanciaPercorrida":[0.0],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0}],{"Momento":"2024-03-06T09:14:02.4086088-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":17,"AtuacoesPorBico":[5,4,4,4],"DistanciaPercorrida":[15.532164373823042],"ProgressoTrajeto":1.1641049109827626,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":332.97738784499131,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0}]

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:13:51.5824385-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649522174804645},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:13:56.549026-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649522174804645},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-06T09:13:59.526575-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649522174804645},{"Latitude":-22.339583249992106,"Longitude":-47.26398959993972,"DataHora":"2024-03-06T09:14:02.2486216-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649522174804645}]

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Latitude":-22.339583249992106,"Longitude":-47.26398959993972,"DataHora":"2024-03-06T09:14:58.5276819-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339583249992106,"Longitude":-47.26398959993972,"DataHora":"2024-03-06T09:15:03.5297995-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:15:08.5294096-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:15:13.5260135-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:16:18.5269824-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:16:23.5625752-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:16:28.5261589-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:16:33.5317484-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:16:38.5263293-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:16:43.5259135-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:16:48.5574941-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:16:49.5770136-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:16:54.5306001-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:19:08.5630058-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:19:13.6055868-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-06T09:19:18.5591666-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-06T09:19:23.557058-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:19:28.5579564-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:19:33.558548-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:19:38.5751328-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:19:43.5577107-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:19:48.5586699-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:19:53.5573883-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:19:58.5609788-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:20:03.570613-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:32:44.4427166-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:32:48.5607846-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:32:53.5573886-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:32:58.560986-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:33:03.5735823-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:33:08.5589774-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:33:12.557589-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:33:14.5599043-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:35:08.6081105-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:35:20.2388053-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-06T09:35:23.5528822-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-06T09:35:28.5289536-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:35:33.5267856-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:35:38.528376-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:36:10.4721004-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:36:13.5586472-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:36:18.5292521-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:36:21.525818-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:36:22.5303378-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:37:12.6225043-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:37:17.6220906-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-06T09:37:22.6236691-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-06T09:37:27.623262-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339725742622608,"Longitude":-47.263923810772091,"DataHora":"2024-03-06T09:37:39.9890365-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:37:46.0271635-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:37:47.6206804-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:37:52.6222717-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:37:57.6368608-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:38:02.6204631-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-06T09:43:57.6653924-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":2,"AtuacoesPorBico":[1,1,0,0],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":2,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-06T09:44:02.2624572-03:00","ErvasNoRadar":4,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":8,"AtuacoesPorBico":[2,3,1,2],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":2,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-06T09:44:07.2610423-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":16,"AtuacoesPorBico":[4,5,3,4],"DistanciaPercorrida":[0.0],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":3,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-06T09:44:12.2636425-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":16,"AtuacoesPorBico":[4,5,3,4],"DistanciaPercorrida":[15.532164373823042],"ProgressoTrajeto":1.1641049109827626,"ProgressoRua":37.5,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":4,"AnguloCarro":332.97738784499131,"AnguloCarroBussola":0.0,"AnguloRua":333.49773703294312,"AnguloRuaCamera":0.0,"AnguloDif":-0.52034918795180829,"Direcao":1,"DentroDaRua":true,"IdxPontoAproximadoRua":3,"IdxRuaAtual":0},{"Momento":"2024-03-06T09:44:17.2612513-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":18,"AtuacoesPorBico":[5,5,4,4],"DistanciaPercorrida":[25.822843000933517],"ProgressoTrajeto":1.9353708620020584,"ProgressoRua":100.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":6,"AnguloCarro":333.59977895821442,"AnguloCarroBussola":0.0,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":-0.25269769811006881,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0},{"Momento":"2024-03-06T09:44:22.2958472-03:00","ErvasNoRadar":2,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":30,"AtuacoesPorBico":[8,8,7,7],"DistanciaPercorrida":[43.0191269239837],"ProgressoTrajeto":3.224198232333924,"ProgressoRua":100.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":6,"AnguloCarro":343.23615375058216,"AnguloCarroBussola":0.0,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":9.3836770942576777,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0},{"Momento":"2024-03-06T09:44:27.2634368-03:00","ErvasNoRadar":4,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":40,"AtuacoesPorBico":[10,11,9,10],"DistanciaPercorrida":[43.0191269239837],"ProgressoTrajeto":3.224198232333924,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":6,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0}

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:43:57.6453911-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T09:44:01.5144562-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-06T09:44:06.5160416-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-06T09:44:11.5256344-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:44:16.5107183-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:44:21.5143291-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T09:44:26.5119181-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T10:39:17.8869183-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T10:39:22.8894947-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-06T10:39:27.896086-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-06T10:39:32.8896702-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:39:37.8862602-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:39:42.887849-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:39:47.8894332-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:39:52.8920206-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:39:57.8866005-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:40:02.8891749-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:40:07.9277619-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:40:12.8853457-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:40:17.8899355-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:40:22.889532-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:41:49.6702931-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:41:52.8873696-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:41:57.888958-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:42:02.9115696-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:42:07.885639-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T10:42:12.8872419-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T11:01:32.7871782-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T11:01:37.7177721-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-06T11:01:42.7163666-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-06T11:01:47.7369642-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T11:01:52.7175529-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T11:02:04.2478276-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T11:02:07.7163949-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T11:02:12.7339987-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T11:02:17.7175904-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T11:02:22.7161791-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T11:02:27.7157708-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T11:02:31.7148607-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T11:06:02.7149726-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-06T13:17:41.6950636-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[0,0,0,0],"DistanciaPercorrida":[],"ProgressoTrajeto":"NaN","ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":0.0,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0}

View File

@ -0,0 +1 @@
[{"Latitude":0.0,"Longitude":0.0,"DataHora":"0001-01-01T00:00:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":0.0}]

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-06T13:20:11.1204972-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":0,"AtuacoesPorBico":[],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":0.0,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0}

View File

@ -0,0 +1 @@
[{"Latitude":0.0,"Longitude":0.0,"DataHora":"0001-01-01T00:00:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":0.0}]

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-06T13:21:12.6962758-03:00","ErvasNoRadar":3,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":3,"AtuacoesPorBico":[1,2,0,0],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":2,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-06T13:21:17.6858684-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":7,"AtuacoesPorBico":[3,3,0,1],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":2,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-06T13:21:22.6824589-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":9,"AtuacoesPorBico":[3,3,1,2],"DistanciaPercorrida":[0.0],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":3,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.18452915675431,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":0,"IdxRuaAtual":0},{"Momento":"2024-03-06T13:21:27.6830503-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":9,"AtuacoesPorBico":[3,3,1,2],"DistanciaPercorrida":[15.532164373823042],"ProgressoTrajeto":1.1641049109827626,"ProgressoRua":37.5,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":4,"AnguloCarro":332.97738784499131,"AnguloCarroBussola":0.0,"AnguloRua":333.49773703294312,"AnguloRuaCamera":0.0,"AnguloDif":-0.52034918795180829,"Direcao":1,"DentroDaRua":true,"IdxPontoAproximadoRua":3,"IdxRuaAtual":0},{"Momento":"2024-03-06T13:21:32.6856424-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":11,"AtuacoesPorBico":[3,3,2,3],"DistanciaPercorrida":[25.822843000933517],"ProgressoTrajeto":1.9353708620020584,"ProgressoRua":100.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":6,"AnguloCarro":333.59977895821442,"AnguloCarroBussola":0.0,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":-0.25269769811006881,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0},{"Momento":"2024-03-06T13:21:37.6952366-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":11,"AtuacoesPorBico":[3,3,2,3],"DistanciaPercorrida":[43.0191269239837],"ProgressoTrajeto":3.224198232333924,"ProgressoRua":100.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":6,"AnguloCarro":343.23615375058216,"AnguloCarroBussola":0.0,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":9.3836770942576777,"Direcao":1,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0},{"Momento":"2024-03-06T13:21:42.6848181-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":11,"AtuacoesPorBico":[3,3,2,3],"DistanciaPercorrida":[43.0191269239837],"ProgressoTrajeto":3.224198232333924,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":6,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0},{"Momento":"2024-03-06T13:21:43.7763363-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":11,"AtuacoesPorBico":[3,3,2,3],"DistanciaPercorrida":[43.0191269239837],"ProgressoTrajeto":3.224198232333924,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0}]

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T13:21:11.9477588-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T13:21:16.9863534-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-06T13:21:21.947939-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-06T13:21:26.9525351-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:21:31.9521219-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:21:36.9497175-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:21:41.9843013-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:21:43.0258182-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:10.3019118-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:11.9859434-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:16.9505633-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:21.9481207-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:27.0146348-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:31.9492579-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:41.0411825-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:41.9504053-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:46.9489766-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:51.9985747-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:23:56.9505846-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T13:24:01.9481247-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
[{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T15:51:01.8075756-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339442335994335,"Longitude":-47.264067138109773,"DataHora":"2024-03-06T15:51:06.8235984-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339566770425247,"Longitude":-47.263998524140789,"DataHora":"2024-03-06T15:51:11.8085152-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339649665078522,"Longitude":-47.263954035496013,"DataHora":"2024-03-06T15:51:16.8084443-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T15:51:21.8123518-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T15:51:26.8092421-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T15:51:31.8232175-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T15:51:36.8111394-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T15:51:41.8070229-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181},{"Latitude":-22.339797742622608,"Longitude":-47.263905810772087,"DataHora":"2024-03-06T15:51:43.8224148-03:00","Altitude":0.0,"Velocidade":0.0,"NumeroSatelites":0,"PrecisaoHorizontal":0.0,"Orientacao":70.649306441870181}]

View File

@ -0,0 +1 @@
[{"Momento":"2024-03-06T15:53:09.7370174-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":4,"AtuacoesPorBico":[0,0,0,4],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0},{"Momento":"2024-03-06T16:08:33.9489668-03:00","ErvasNoRadar":0,"VelocidadeMedia":0.0,"HerbicidaConsumido":0.0,"HerbicidaPorErva":0.0,"PorcentagemBateria":0.0,"BateriaConsumida":0.0,"ErvasIdentificadas":4,"AtuacoesPorBico":[0,0,0,4],"DistanciaPercorrida":[],"ProgressoTrajeto":0.0,"ProgressoRua":0.0,"DistanciaEsquerda":0.0,"DistanciaDireita":0.0,"Status":1,"AnguloCarro":0.0,"AnguloCarroBussola":0.0,"AnguloRua":333.85247665632448,"AnguloRuaCamera":0.0,"AnguloDif":0.0,"Direcao":0,"DentroDaRua":false,"IdxPontoAproximadoRua":8,"IdxRuaAtual":0}]

Some files were not shown because too many files have changed in this diff Show More