incluido parametrizacao mandatoria e parada por falha

This commit is contained in:
Diego Freitas 2024-03-07 16:08:37 -03:00
parent 74ffa4b6e5
commit 120738582b
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>
<HintPath>.\Microsoft.DirectX.DirectInput.dll</HintPath>
</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">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
@ -295,6 +298,7 @@
<Compile Include="Models\Modules\SensoriamentoModel.cs" />
<Compile Include="Models\MotorComum.cs" />
<Compile Include="Models\Operacoes\OperacaoModel.cs" />
<Compile Include="Models\PIDModel.cs" />
<Compile Include="Models\Variaveis.cs" />
<Compile Include="Services\APIService.cs" />
<Compile Include="Services\CameraService.cs" />
@ -311,6 +315,7 @@
<Compile Include="Services\GPSService.cs" />
<Compile Include="Services\IDispositivosService.cs" />
<Compile Include="Services\MapasService.cs" />
<Compile Include="Services\MqttService.cs" />
<Compile Include="Services\PythonService.cs" />
<Compile Include="Services\SerialService.cs" />
<Compile Include="Services\SocketService.cs" />
@ -344,6 +349,9 @@
<Content Include="Python\Models\deeplabv3plus\__init__.py">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Python\Output\folium\mqtt.min.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Python\Scripts\api.py">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>

View File

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

View File

@ -40,6 +40,7 @@
this.cmbOperacao = new System.Windows.Forms.ComboBox();
this.lblOperacao = 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();
this.SuspendLayout();
//
@ -140,17 +141,29 @@
// lblOperacaoStatus
//
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.Size = new System.Drawing.Size(287, 24);
this.lblOperacaoStatus.TabIndex = 12;
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
//
this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 24F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1020, 697);
this.Controls.Add(this.lblMqtt);
this.Controls.Add(this.lblOperacaoStatus);
this.Controls.Add(this.lblOperacao);
this.Controls.Add(this.cmbOperacao);
@ -188,5 +201,6 @@
private System.Windows.Forms.ComboBox cmbOperacao;
private System.Windows.Forms.Label lblOperacao;
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)
{
SerialService.AtualizarDispositivos();
SerialService.RealizarVarreduraPortasUSB();
var Labels = this.Controls.OfType<Label>().Where(y => y.Name.Contains("lblD_")).ToList();
Labels.ForEach(lbl =>
@ -73,23 +73,18 @@ namespace AgroBase.Forms.IHM
else
{
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)
{
dispositivoService.btnConectar_Click(new object(), new EventArgs());
}
DispositivoConectado = dispositivoService._Porta.IsOpen;
}
if (!dispositivoService._Porta.IsOpen)
else
{
dispositivoService.btnConectar_Click(new object(), new EventArgs());
DispositivoConectado = false;
}
DispositivoConectado = dispositivoService._Porta.IsOpen;
}
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());
}
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)
{
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)
{
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
}
else
{
if (OperacaoLiberada)
if (Variaveis.OperacaoEmAndamento.ModulosConectados)
{
Variaveis.OperacaoEmAndamento.IniciarOperacao();
Variaveis.OperacaoEmAndamento.frmOperacao.ShowDialog();
}
else
{
string MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo) +
", é 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);
MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "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 Timer tmrLeitura;
@ -66,7 +66,7 @@ namespace AgroBase.Forms.Movimentacao
try
{
tmrLeitura.Stop();
cameraService.socket.Disconnect();
Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
cameraService.pythonProcess.Kill();
}
catch (Exception ex)
@ -290,12 +290,12 @@ namespace AgroBase.Forms.Movimentacao
VideoUrl,
ArquivoLeitura,
MostrarDebug ? "1" : "0",
SocketPorta
VideoUrl
},
VideoPorta,
VideoUrl,
false,
SocketPorta
VideoUrl,
new Timer()
);
tmrLeitura = new Timer() { Interval = 200 };
@ -308,7 +308,7 @@ namespace AgroBase.Forms.Movimentacao
{
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
cmbCameras.Items.Clear();
cmbCameras.Items.AddRange(cameraService.AtualizaListaCameras().ToArray());
cmbCameras.Items.AddRange(CameraService.AtualizaListaCameras().Keys.ToArray());
if (cmbCameras.Items.Count == 1)
{
cameraService.selectedCamera = 0;

View File

@ -23,20 +23,8 @@ namespace AgroBase.Forms.Operacoes
{
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 };
DispositivosService<MovimentacaoModel> Movimentacao;
DispositivosService<DirecionalModel> Direcional;
DispositivosService<AtuadorModel> Atuador;
#endregion
#region Eventos do formulário
public frmOperacaoMapaGPS()
@ -64,35 +52,24 @@ namespace AgroBase.Forms.Operacoes
AtualizarDispositivos();
AtualizaListaCameras();
Variaveis.OperacaoEmAndamento = new OperacaoModel(ModoOperacao.MapaGPS, Movimentacao, Direcional, Atuador);
}
private void frmOperacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e)
{
tmrLeituras.Stop();
//DesligarCameraSoloE();
CamerasSolo.ForEach(Camera =>
Variaveis.OperacaoEmAndamento.CamerasSolo.ForEach(Camera =>
{
DesligarCameraSolo(Camera);
});
DesligarCameraCaminho();
DesligarCameraCaminho(Variaveis.OperacaoEmAndamento.CameraCaminho);
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
}
private void AtualizarDispositivos()
{
Movimentacao = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov);
Direcional = (DispositivosService<DirecionalModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Dir);
Atuador = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu);
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;
chbMOVativo.Checked = Variaveis.OperacaoEmAndamento.DispMov != null && Variaveis.OperacaoEmAndamento.DispMov._Porta.IsOpen;
chbDIRativo.Checked = Variaveis.OperacaoEmAndamento.DispDir != null && Variaveis.OperacaoEmAndamento.DispDir._Porta.IsOpen;
chbATUativo.Checked = Variaveis.OperacaoEmAndamento.DispAtu != null && Variaveis.OperacaoEmAndamento.DispAtu._Porta.IsOpen;
chbGPSativo.Checked = GPSService.PortaGPS != null && GPSService.PortaGPS.IsOpen;
AtualizarGrafico();
@ -104,21 +81,24 @@ namespace AgroBase.Forms.Operacoes
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)
{
CamerasSolo.ForEach(CameraSolo =>
Variaveis.OperacaoEmAndamento.CamerasSolo.Where(x => x.Iniciada).ToList().ForEach(CameraSolo =>
{
AtualizaLeituraCameraSolo(CameraSolo);
});
Variaveis.OperacaoEmAndamento.Sensoriamento.ErvasNoRadar = Variaveis.OperacaoEmAndamento.CamerasSolo.Sum(x => x.ErvasNoRadar);
AtualizaLeituraCameraCaminho();
AtualizarGrafico();
}
else
{
Variaveis.OperacaoEmAndamento.AtualizarRuasSelecionadas();
}
AtualizarGrafico();
AtualizarInformacoesGerais();
pnlOrientacao.Invalidate();
pnlInclinacao.Invalidate();
if (!Variaveis.OperacaoEmAndamento.Iniciado && btnIniciarOperacao.Text == "Finalizar Operação")
{
@ -128,13 +108,27 @@ namespace AgroBase.Forms.Operacoes
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();
var leitura = CameraSolo.camera.socket.DadosRecebidos.Last();
var Verdes = leitura.objetos.ToList();
int intervaloPorBico = Convert.ToInt32(CameraSolo.camera.socket.DadosRecebidos.First().x_max) / BicosPorCamera;
int inicioBarraPulverizadora = Convert.ToInt32(CameraSolo.camera.socket.DadosRecebidos.First().y_max * (1 - Atuador.Dados.PercentualInicioPulverizacao));
try
{
var Mensagem = CameraSolo.camera._mqttTopico.Mensagens.LastOrDefault(x => x.Momento > CameraSolo.camera.IniciadoEm);
if (Mensagem != null)
{
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>();
// 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();
AtualizaInformacoesControleOperacao();
@ -194,8 +188,26 @@ namespace AgroBase.Forms.Operacoes
{
try
{
var contornosJson = File.ReadAllText("Python/Output/" + cameraCaminho.ArquivoLeitura);
cameraCaminho.Leituras = JsonConvert.DeserializeObject<CameraDeepLabV3PlusModel[]>(contornosJson).ToList();
var cameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminho;
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();
@ -222,58 +234,22 @@ namespace AgroBase.Forms.Operacoes
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();
}
catch
catch (Exception ex)
{
Console.WriteLine("Erro ao receber dados da Camera Caminho: " + ex.Message);
}
}
private void AtualizaInformacoesControleOperacao()
{
var BicosNaoAtuados = new List<AtuadorBicoModel>();
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.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.AtualizarControleAtuadores();
Variaveis.OperacaoEmAndamento.CalculaDadosMovimentacaoAutonoma();
Variaveis.OperacaoEmAndamento.AtualizarDadosControle();
}
@ -281,7 +257,7 @@ namespace AgroBase.Forms.Operacoes
{
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)
{
@ -298,19 +274,19 @@ namespace AgroBase.Forms.Operacoes
chart.Series.Clear();
List<string> Momentos = Logs.Select(x => x.Momento.ToString("mm:ss:fff")).ToList();
var serieRPMsp = new Series("Velocidade: " + (Log != null ? Log.Velocidade : 0));
serieRPMsp.Points.DataBindXY(Momentos, Logs.Select(x => x.Velocidade).ToList());
serieRPMsp.ChartType = SeriesChartType.Line;
chart.Series.Add(serieRPMsp);
var serieVelocidade = new Series("Velocidade: " + (Log != null ? Log.Velocidade : 0));
serieVelocidade.Points.DataBindXY(Momentos, Logs.Select(x => x.Velocidade).ToList());
serieVelocidade.ChartType = SeriesChartType.Line;
chart.Series.Add(serieVelocidade);
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;
//var serieRPM = new Series("RPM: " + (Log != null ? Log.RPM : 0));
//serieRPM.Points.DataBindXY(Momentos, Logs.Select(x => x.RPM).ToList());
//serieRPM.ChartType = SeriesChartType.Spline;
//chart.Series.Add(serieRPM);
//Minimo = Logs.Min(x => x.RPM) < Minimo ? Logs.Min(x => x.RPM) : Minimo;
//Maximo = Logs.Max(x => x.RPM) > Maximo ? Logs.Max(x => x.RPM) : Maximo;
var serieRPMsp = new Series("RPM SP: " + (Log != null ? Log.RPM_SP : 0));
serieRPMsp.Points.DataBindXY(Momentos, Logs.Select(x => x.RPM_SP).ToList());
serieRPMsp.ChartType = SeriesChartType.Spline;
chart.Series.Add(serieRPMsp);
Minimo = Logs.Min(x => x.RPM_SP) < Minimo ? Logs.Min(x => x.RPM_SP) : Minimo;
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));
seriePotencia.Points.DataBindXY(Momentos, Logs.Select(x => x.Potencia).ToList());
@ -337,21 +313,23 @@ namespace AgroBase.Forms.Operacoes
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";
}
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";
}
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";
@ -365,13 +343,13 @@ namespace AgroBase.Forms.Operacoes
lblHerbicidaPorErva.Text = "Herbicida por Erva: " + Variaveis.OperacaoEmAndamento.Sensoriamento.HerbicidaPorErva.ToString("0.000") + " mL";
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);
lblPorcentagemReservatorio.Text = Atuador.Dados.PercentualReservatorio.ToString("00.00") + "%";
pgbReservatorio.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio);
lblPorcentagemReservatorio.Text = Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio.ToString("00.00") + "%";
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;
lblPorcentagemProgresso.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto.ToString("00.00") + "%";
@ -387,74 +365,65 @@ namespace AgroBase.Forms.Operacoes
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();
foreach (ComboBox cmb in cameras)
{
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)
{
CameraSolo = new CameraSoloModel()
{
Nome = CamNome,
Posicao = CamerasSolo.Count(),
Posicao = Variaveis.OperacaoEmAndamento.CamerasSolo.Count(),
ArquivoLeitura = "ervas_" + CamNome + ".json",
browser = null,
camera = new CameraService<CameraCoordenadasFrameModel>(),
camera = new CameraService(),
CameraSelecionada = "",
combo = cmb,
MaxLeituras = 10,
SocketPorta = (VariaveisPortas.SocketSolo + CamerasSolo.Count()).ToString(),
VideoPorta = (VariaveisPortas.CameraSolo + CamerasSolo.Count()).ToString(),
VideoPorta = (VariaveisPortas.CameraSolo + Variaveis.OperacaoEmAndamento.CamerasSolo.Count()).ToString(),
VideoUrl = "green_objects_" + CamNome,
MqttTopico = "green_objects_" + CamNome,
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.AddRange(listaCameras);
if (CameraSolo.combo.Items.Count == 1)
{
CameraSolo.camera.selectedCamera = 0;
}
CameraSolo.combo.SelectedIndex = CameraSolo.camera.selectedCamera;
}
if (cameraCaminho == null)
if (Variaveis.OperacaoEmAndamento.CameraCaminho == null)
{
cameraCaminho = new CameraCaminhoModel()
Variaveis.OperacaoEmAndamento.CameraCaminho = new CameraCaminhoModel()
{
Nome = "Caminho",
Posicao = 0,
ArquivoLeitura = "leitura_ruas.json",
browser = null,
camera = new CameraService<CameraDeepLabV3PlusModel>(),
camera = new CameraService(),
CameraSelecionada = "",
combo = cmbCameraCaminho,
MaxLeituras = 1,
SocketPorta = (VariaveisPortas.SocketCaminho + 0).ToString(),
VideoPorta = (VariaveisPortas.CameraCaminho + 0).ToString(),
VideoUrl = "street_detector",
MqttTopico = "street_detector",
panel = pnlCameraCaminho,
Angulo = 0,
AnguloDireito = 0,
AnguloEsquerdo = 0,
Leituras = new List<CameraDeepLabV3PlusModel>(),
Leitura = new CameraDeepLabV3PlusModel(),
PontosExtremos = new List<Point>()
};
}
cameraCaminho.camera.selectedCamera = cmbCameraCaminho.SelectedIndex > 0 ? cmbCameraCaminho.SelectedIndex : 0;
cmbCameraCaminho.Items.Clear();
cmbCameraCaminho.Items.AddRange(listaCameras);
if (cmbCameraCaminho.Items.Count == 1)
{
cameraCaminho.camera.selectedCamera = 0;
}
cmbCameraCaminho.SelectedIndex = cameraCaminho.camera.selectedCamera;
cmbCameraCaminho.SelectedIndex = Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera;
}
private void cmbCameraSolo_SelectedIndexChanged(object sender, EventArgs e)
@ -463,15 +432,13 @@ namespace AgroBase.Forms.Operacoes
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);
CamerasSolo.Where(x => x.Nome != CamNome).ToList().ForEach(Camera =>
{
Camera.combo.Items.Add(CameraSolo.CameraSelecionada);
});
MessageBox.Show("Essa câmera já está sendo usada por outro processo!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Warning);
CameraSolo.combo.SelectedIndex = CameraSolo.camera.selectedCamera;
return;
}
CameraSolo.camera.selectedCamera = CameraSolo.combo.SelectedIndex;
@ -481,17 +448,6 @@ namespace AgroBase.Forms.Operacoes
IniciarCameraSolo(CameraSolo);
}
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)
@ -504,41 +460,18 @@ namespace AgroBase.Forms.Operacoes
CameraSolo.VideoUrl,
CameraSolo.ArquivoLeitura,
"1",
CameraSolo.SocketPorta
CameraSolo.MqttTopico
},
CameraSolo.VideoPorta,
CameraSolo.VideoUrl,
true,
CameraSolo.SocketPorta
CameraSolo.VideoUrl,
CameraSolo.MqttTopico,
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)
{
try
{
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);
}
CameraSolo.DesligarCamera();
}
@ -546,86 +479,44 @@ namespace AgroBase.Forms.Operacoes
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);
CamerasSolo.ForEach(Camera =>
{
Camera.combo.Items.Add(cameraCaminho.CameraSelecionada);
});
MessageBox.Show("Essa câmera já está sendo usada por outro processo!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Variaveis.OperacaoEmAndamento.CameraCaminho.combo.SelectedIndex = Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera;
return;
}
cameraCaminho.camera.selectedCamera = cmbCameraCaminho.SelectedIndex;
if (cameraCaminho.camera.selectedCamera > 0)
Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera = cmbCameraCaminho.SelectedIndex;
DesligarCameraCaminho(Variaveis.OperacaoEmAndamento.CameraCaminho);
if (Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera > 0)
{
DesligarCameraCaminho();
IniciarCameraCaminho();
IniciarCameraCaminho(Variaveis.OperacaoEmAndamento.CameraCaminho);
}
else
{
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);
});
}
Variaveis.OperacaoEmAndamento.CameraCaminho.CameraSelecionada = cmbCameraCaminho.Text;
}
private void IniciarCameraCaminho()
private void IniciarCameraCaminho(CameraCaminhoModel cameraCaminho)
{
cameraCaminho.ArquivoLeitura = cameraCaminho.ArquivoLeitura;
cameraCaminho.camera.IniciarCamera(
PythonService.ScriptStreetDetector,
new string[] {
cameraCaminho.MaxLeituras.ToString(),
cameraCaminho.VideoPorta,
cameraCaminho.VideoUrl,
new string[] {
cameraCaminho.MaxLeituras.ToString(),
cameraCaminho.VideoPorta,
cameraCaminho.VideoUrl,
cameraCaminho.ArquivoLeitura,
"1",
cameraCaminho.SocketPorta
"1",
cameraCaminho.MqttTopico
},
cameraCaminho.VideoPorta,
cameraCaminho.VideoUrl,
false,
cameraCaminho.SocketPorta
cameraCaminho.MqttTopico,
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.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);
}
cameraCaminho.DesligarCamera();
}
#endregion
@ -650,7 +541,14 @@ namespace AgroBase.Forms.Operacoes
}
else
{
Variaveis.OperacaoEmAndamento.IniciarOperacao(null, false);
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
{
Variaveis.OperacaoEmAndamento.IniciarOperacao(null, false);
}
else
{
MessageBox.Show("Finalize a parametrização corretamente para iniciar a operação!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
AtualizaComponentesOperacao();
}
@ -669,6 +567,8 @@ namespace AgroBase.Forms.Operacoes
private void pnlAtuadores_Paint(object sender, PaintEventArgs e)
{
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu;
Graphics g = e.Graphics;
Panel myPanel = (Panel)sender;
int panelWidth = myPanel.Width;
@ -739,8 +639,10 @@ namespace AgroBase.Forms.Operacoes
private void pnlCaminho_Paint(object sender, PaintEventArgs e)
{
var cameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminho;
Panel pnlContornos = (Panel)sender;
if (cameraCaminho.Leituras == null || cameraCaminho.Leituras.Count == 0) return;
if (cameraCaminho.Leitura == null) return;
Graphics graphics = e.Graphics;
graphics.Clear(pnlContornos.BackColor); // Limpa o fundo
@ -764,41 +666,36 @@ namespace AgroBase.Forms.Operacoes
List<Point> pontosCamera = new List<Point>();
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;
using (Pen pen = new Pen(Color.Blue, 2))
{
if (cameraClass.Contornos == null || cameraClass.Contornos.Length == 0) continue;
using (Pen pen = new Pen(Color.Blue, 2))
for (int i = 0; i < cameraClass.Contornos.Length - 1; i++)
{
for (int i = 0; i < cameraClass.Contornos.Length - 1; i++)
{
Point contorno = new Point() { X = cameraClass.Contornos[i][0], Y = cameraClass.Contornos[i][1] };
Point contornoP = new Point() { X = cameraClass.Contornos[i + 1][0], Y = cameraClass.Contornos[i + 1][1] };
Point contorno = new Point() { X = cameraClass.Contornos[i][0], Y = cameraClass.Contornos[i][1] };
Point contornoP = new Point() { X = cameraClass.Contornos[i + 1][0], Y = cameraClass.Contornos[i + 1][1] };
// Aplica a escala e o deslocamento às coordenadas
Point start = new Point((int)(contorno.X * escala + deslocamentoX), (int)(contorno.Y * escala + deslocamentoY));
Point end = new Point((int)(contornoP.X * escala + deslocamentoX), (int)(contornoP.Y * escala + deslocamentoY));
// Aplica a escala e o deslocamento às coordenadas
Point start = new Point((int)(contorno.X * escala + deslocamentoX), (int)(contorno.Y * escala + deslocamentoY));
Point end = new Point((int)(contornoP.X * escala + deslocamentoX), (int)(contornoP.Y * escala + deslocamentoY));
graphics.DrawLine(pen, start, end);
graphics.DrawLine(pen, start, end);
pontosCamera.Add(contorno);
}
pontosCamera.Add(contorno);
}
// Se necessário, fechar o contorno conectando o último ponto ao primeiro
if (cameraClass.Contornos.Length > 1)
{
var primeiro = cameraClass.Contornos.First();
var ultimo = cameraClass.Contornos.Last();
Point start = new Point((int)(ultimo[0] * escala + deslocamentoX), (int)(ultimo[1] * escala + deslocamentoY));
Point end = new Point((int)(primeiro[0] * escala + deslocamentoX), (int)(primeiro[1] * escala + deslocamentoY));
graphics.DrawLine(pen, start, end);
}
// Se necessário, fechar o contorno conectando o último ponto ao primeiro
if (cameraClass.Contornos.Length > 1)
{
var primeiro = cameraClass.Contornos.First();
var ultimo = cameraClass.Contornos.Last();
Point start = new Point((int)(ultimo[0] * escala + deslocamentoX), (int)(ultimo[1] * escala + deslocamentoY));
Point end = new Point((int)(primeiro[0] * escala + deslocamentoX), (int)(primeiro[1] * escala + deslocamentoY));
graphics.DrawLine(pen, start, end);
}
}
// Plotar apenas a ultima leitura do json
break;
}
using (Pen pen = new Pen(Classe.Value, 2))
@ -820,7 +717,7 @@ namespace AgroBase.Forms.Operacoes
try
{
//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 { }
}
@ -901,12 +798,13 @@ namespace AgroBase.Forms.Operacoes
}
}
}
#endregion
#region SIMULACAO GPS
@ -926,7 +824,6 @@ namespace AgroBase.Forms.Operacoes
}
lblStatus.Text = "Status: " + Enum.GetName(typeof(StatusOperacao), Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual);
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];
}
@ -938,6 +835,7 @@ namespace AgroBase.Forms.Operacoes
}
}
#endregion

View File

@ -29,9 +29,9 @@ namespace AgroBase.Forms.Operacoes
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = 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.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea3 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
System.Windows.Forms.DataVisualization.Charting.Legend legend3 = new System.Windows.Forms.DataVisualization.Charting.Legend();
System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series();
this.pnlCameraSolo = new System.Windows.Forms.Panel();
this.pnlCameraSoloD = new System.Windows.Forms.Panel();
this.pnlCameraSoloE = new System.Windows.Forms.Panel();
@ -178,18 +178,18 @@ namespace AgroBase.Forms.Operacoes
//
// chartGraficos
//
chartArea2.Name = "ChartArea1";
this.chartGraficos.ChartAreas.Add(chartArea2);
chartArea3.Name = "ChartArea1";
this.chartGraficos.ChartAreas.Add(chartArea3);
this.chartGraficos.Dock = System.Windows.Forms.DockStyle.Fill;
legend2.Name = "Legend1";
this.chartGraficos.Legends.Add(legend2);
legend3.Name = "Legend1";
this.chartGraficos.Legends.Add(legend3);
this.chartGraficos.Location = new System.Drawing.Point(0, 0);
this.chartGraficos.Margin = new System.Windows.Forms.Padding(2);
this.chartGraficos.Name = "chartGraficos";
series2.ChartArea = "ChartArea1";
series2.Legend = "Legend1";
series2.Name = "Series1";
this.chartGraficos.Series.Add(series2);
series3.ChartArea = "ChartArea1";
series3.Legend = "Legend1";
series3.Name = "Series1";
this.chartGraficos.Series.Add(series3);
this.chartGraficos.Size = new System.Drawing.Size(405, 254);
this.chartGraficos.TabIndex = 0;
this.chartGraficos.Text = "chart1";
@ -716,7 +716,7 @@ namespace AgroBase.Forms.Operacoes
this.pnlInclinacao.BackColor = System.Drawing.Color.White;
this.pnlInclinacao.BackgroundImage = global::AgroBase.Properties.Resources.transferidor;
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.Name = "pnlInclinacao";
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.BackgroundImage = global::AgroBase.Properties.Resources.transferidor;
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.Name = "pnlAnguloCamera";
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);
nudVelocidadeMP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP);
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)
@ -119,6 +121,8 @@ namespace AgroBase.Forms.Operacoes
Variaveis.OperacaoEmAndamento.Controle.Angulo_Min = Convert.ToInt32(nudAnguloMinimo.Value);
Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP = Convert.ToInt32(nudVelocidadeMP.Value);
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)
{

View File

@ -1,6 +1,7 @@
using AgroBase.Models;
using AgroBase.Services;
using CefSharp.WinForms;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@ -15,7 +16,7 @@ namespace AgroBase.Forms.Sensoriamento
{
public partial class frmSenCamera : Form
{
private CameraService<CameraAnguloModel> cameraService = new CameraService<CameraAnguloModel>();
private CameraService cameraService = new CameraService();
private ChromiumWebBrowser chromiumWebBrowser = null;
private Timer tmrLeitura;
@ -40,7 +41,7 @@ namespace AgroBase.Forms.Sensoriamento
{
try
{
cameraService.socket.Disconnect();
Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
cameraService.pythonProcess.Kill();
}
catch (Exception ex)
@ -86,12 +87,12 @@ namespace AgroBase.Forms.Sensoriamento
VideoUrl,
ArquivoLeitura,
MostrarDebug ? "1" : "0",
SocketPorta
VideoUrl
},
VideoPorta,
VideoUrl,
true,
VariaveisPortas.SocketCaminho.ToString()
VideoUrl,
new Timer()
);
tmrLeitura = new Timer() { Interval = 200 };
@ -104,7 +105,7 @@ namespace AgroBase.Forms.Sensoriamento
{
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
cmbCameras.Items.Clear();
cmbCameras.Items.AddRange(cameraService.AtualizaListaCameras().ToArray());
cmbCameras.Items.AddRange(CameraService.AtualizaListaCameras().Keys.ToArray());
if (cmbCameras.Items.Count == 1)
{
cameraService.selectedCamera = 0;
@ -124,9 +125,22 @@ namespace AgroBase.Forms.Sensoriamento
this.pnlLeituras.Controls.Clear();
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()
{
@ -172,7 +186,7 @@ namespace AgroBase.Forms.Sensoriamento
pnlLeituras.Controls.Add(gpb);
i++;
}
}*/
}

View File

@ -34,6 +34,7 @@ namespace AgroBase
this.erroStrip = new System.Windows.Forms.StatusStrip();
this.lblStripErro = new System.Windows.Forms.ToolStripStatusLabel();
this.pnlLateral = new System.Windows.Forms.Panel();
this.chbConexaoautomatica = new System.Windows.Forms.CheckBox();
this.gpbDispositivos = new System.Windows.Forms.GroupBox();
this.lstDisponiveis = new System.Windows.Forms.ListView();
this.btnRemover = new System.Windows.Forms.Button();
@ -51,6 +52,7 @@ namespace AgroBase
this.lblStripJoystickComando = new System.Windows.Forms.ToolStripStatusLabel();
this.lblStripOperacao = 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.lblKmh = new System.Windows.Forms.Label();
this.trkKmh = new System.Windows.Forms.TrackBar();
@ -74,7 +76,7 @@ namespace AgroBase
this.btnMapas = new System.Windows.Forms.Button();
this.btnSenCamera = new System.Windows.Forms.Button();
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.btnContornos = new System.Windows.Forms.Button();
this.btnGPS = new System.Windows.Forms.Button();
@ -99,7 +101,7 @@ namespace AgroBase
this.gpbSensoriamento.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).BeginInit();
this.gpbJoystick.SuspendLayout();
this.groupBox2.SuspendLayout();
this.gpbControleDirecional.SuspendLayout();
this.gpbAtalhos.SuspendLayout();
this.gpbOperacao.SuspendLayout();
this.SuspendLayout();
@ -139,6 +141,7 @@ namespace AgroBase
// pnlLateral
//
this.pnlLateral.AutoScroll = true;
this.pnlLateral.Controls.Add(this.chbConexaoautomatica);
this.pnlLateral.Controls.Add(this.gpbDispositivos);
this.pnlLateral.Controls.Add(this.btnRemover);
this.pnlLateral.Controls.Add(this.lblDispositivos);
@ -152,6 +155,16 @@ namespace AgroBase
this.pnlLateral.Size = new System.Drawing.Size(613, 592);
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
//
this.gpbDispositivos.Controls.Add(this.lstDisponiveis);
@ -291,7 +304,8 @@ namespace AgroBase
this.lblStripJoystick,
this.lblStripJoystickComando,
this.lblStripOperacao,
this.lblStripOperacaoStatus});
this.lblStripOperacaoStatus,
this.lblStripMqtt});
this.generalStrip.Location = new System.Drawing.Point(0, 587);
this.generalStrip.Name = "generalStrip";
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.Text = "Não iniciado";
//
// lblStripMqtt
//
this.lblStripMqtt.Name = "lblStripMqtt";
this.lblStripMqtt.Size = new System.Drawing.Size(119, 15);
this.lblStripMqtt.Text = "MQTT: Desconectado";
//
// gpbMovimentacao
//
this.gpbMovimentacao.Controls.Add(this.lblKmh);
@ -486,7 +506,7 @@ namespace AgroBase
this.gpbSensoriamento.Margin = new System.Windows.Forms.Padding(2);
this.gpbSensoriamento.Name = "gpbSensoriamento";
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.TabStop = false;
this.gpbSensoriamento.Text = "Sensoriamento";
@ -512,7 +532,7 @@ namespace AgroBase
this.gridSenMotores.Name = "gridSenMotores";
this.gridSenMotores.RowHeadersWidth = 51;
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;
//
// btnDiagnosticos
@ -585,20 +605,20 @@ namespace AgroBase
this.gpbJoystick.TabStop = false;
this.gpbJoystick.Text = "Joystick";
//
// groupBox2
// gpbControleDirecional
//
this.groupBox2.Controls.Add(this.tkbVelocidade);
this.groupBox2.Controls.Add(this.tkbAngulo);
this.groupBox2.Controls.Add(this.lblAngulo);
this.groupBox2.Controls.Add(this.lblVelocidade);
this.groupBox2.Location = new System.Drawing.Point(9, 154);
this.groupBox2.Margin = new System.Windows.Forms.Padding(2);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Padding = new System.Windows.Forms.Padding(2);
this.groupBox2.Size = new System.Drawing.Size(330, 149);
this.groupBox2.TabIndex = 19;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Controle Direcional";
this.gpbControleDirecional.Controls.Add(this.tkbVelocidade);
this.gpbControleDirecional.Controls.Add(this.tkbAngulo);
this.gpbControleDirecional.Controls.Add(this.lblAngulo);
this.gpbControleDirecional.Controls.Add(this.lblVelocidade);
this.gpbControleDirecional.Location = new System.Drawing.Point(9, 154);
this.gpbControleDirecional.Margin = new System.Windows.Forms.Padding(2);
this.gpbControleDirecional.Name = "gpbControleDirecional";
this.gpbControleDirecional.Padding = new System.Windows.Forms.Padding(2);
this.gpbControleDirecional.Size = new System.Drawing.Size(330, 149);
this.gpbControleDirecional.TabIndex = 19;
this.gpbControleDirecional.TabStop = false;
this.gpbControleDirecional.Text = "Controle Direcional";
//
// gpbAtalhos
//
@ -729,7 +749,7 @@ namespace AgroBase
this.ClientSize = new System.Drawing.Size(1058, 609);
this.Controls.Add(this.gpbOperacao);
this.Controls.Add(this.gpbAtalhos);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.gpbControleDirecional);
this.Controls.Add(this.gpbJoystick);
this.Controls.Add(this.gpbMovimentacao);
this.Controls.Add(this.gpbSensoriamento);
@ -763,8 +783,8 @@ namespace AgroBase
this.gpbSensoriamento.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).EndInit();
this.gpbJoystick.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.gpbControleDirecional.ResumeLayout(false);
this.gpbControleDirecional.PerformLayout();
this.gpbAtalhos.ResumeLayout(false);
this.gpbOperacao.ResumeLayout(false);
this.gpbOperacao.PerformLayout();
@ -776,7 +796,6 @@ namespace AgroBase
#endregion
private System.Windows.Forms.GroupBox gpbAcoes;
private System.Windows.Forms.Panel pnlLateral;
private System.Windows.Forms.Button btnNovoDispositivo;
private System.Windows.Forms.GroupBox gpbNovoDispositivo;
private System.Windows.Forms.Button btnSalvar;
@ -815,13 +834,12 @@ namespace AgroBase
private System.Windows.Forms.GroupBox gpbJoystick;
private System.Windows.Forms.Label lblSenMotores;
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 gpbOperacao;
private System.Windows.Forms.Label lblModoOperacao;
private System.Windows.Forms.ComboBox cmbModoOperacao;
private System.Windows.Forms.Button btnIniciarOperacao;
private System.Windows.Forms.CheckBox chbDebugMode;
private System.Windows.Forms.Label lblKmh;
public System.Windows.Forms.TrackBar trkKmh;
private System.Windows.Forms.ToolStripStatusLabel lblStripOperacao;
@ -830,6 +848,10 @@ namespace AgroBase
private System.Windows.Forms.Button btnConfigurarOperacao;
private System.Windows.Forms.Button btnIHM;
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;
AtualizaDadosGerais();
IniciarConexaoMqtt();
}
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()
{
btnJoyAtt_Click(new object(), new EventArgs());
@ -136,7 +144,7 @@ namespace AgroBase
{
Variaveis.DispositivosConectados.Where(x => x.Dados.GetStatusConexao()).ToList().ForEach(x => x.AcaoDesconectar());
}
SerialService.AtualizarDispositivos();
SerialService.RealizarVarreduraPortasUSB();
}
private void frmPrincipal_FormClosed(object sender, FormClosedEventArgs e)
@ -242,89 +250,32 @@ namespace AgroBase
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)
{
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)
{
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
btnIniciarOperacao.Text = "Iniciar Operação";
btnIniciarOperacao.Text = "Abrir Operação";
cmbModoOperacao.Enabled = true;
}
else
{
if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.Manual)
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
{
if (MovConectado || DirConectado || AtuConectado)
{
Variaveis.OperacaoEmAndamento.IniciarOperacao(null, false);
cmbModoOperacao.Enabled = false;
}
else
{
MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo) +
", é 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" : " ") + " )";
}
Variaveis.OperacaoEmAndamento.frmOperacao.Show();
}
else if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.MapaGPS)
else
{
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" : " ") + " )";
}
MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
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);
lblStripOperacaoStatus.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Iniciado" : "Não iniciado";
}
private void btnConfigurarOperacao_Click(object sender, EventArgs e)

View File

@ -4,17 +4,69 @@ using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AgroBase.Models
{
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 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 Panel panel { get; set; }
public ComboBox combo { get; set; }
@ -22,7 +74,7 @@ namespace AgroBase.Models
public int MaxLeituras { get; set; }
public string VideoPorta { 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 Dictionary<string, Color> ClassMap = new Dictionary<string, Color>()
@ -33,7 +85,7 @@ namespace AgroBase.Models
{ "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 double Angulo { get; set; }
public double AnguloEsquerdo { get; set; }
@ -110,5 +162,8 @@ namespace AgroBase.Models
return Pontos;
}
}
}

View File

@ -21,7 +21,7 @@ namespace AgroBase.Models
public double timestamp { get; set; }
public double x_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
@ -46,7 +46,7 @@ namespace AgroBase.Models
public class CameraDeepLabV3PlusModel
{
public double timestamp { get; set; }
public List<CameraDeepLabV3PlusClasseModel> Classes { get; set; }
public List<CameraDeepLabV3PlusClasseModel> Classes { get; set; } = new List<CameraDeepLabV3PlusClasseModel>();
}
public class CameraDeepLabV3PlusClasseModel

View File

@ -1,19 +1,70 @@
using AgroBase.Services;
using CefSharp.WinForms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AgroBase.Models
{
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 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 Panel panel { get;set; }
public ComboBox combo { get;set; }
@ -21,9 +72,13 @@ namespace AgroBase.Models
public int MaxLeituras { get; set; }
public string VideoPorta { 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 CameraCoordenadasFrameModel Leitura { get; set; } = new CameraCoordenadasFrameModel();
public int ErvasNoRadar { get; set; }
}
}

View File

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

View File

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

View File

@ -17,7 +17,7 @@ namespace AgroBase.Models.Modules
public static List<PinoutModel> Pinout { get; set; }
public static List<FuncoesPinout> Funcoes { get; set; } = new List<FuncoesPinout>() { FuncoesPinout.Geral };
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 bool AtuacaoNivelAlto { get; set; } = true;
public List<AtuadorBicoModel> BicosPulverizadores { get; set; } = new List<AtuadorBicoModel>();

View File

@ -11,7 +11,7 @@ using static AgroBase.Models.Enuns;
namespace AgroBase.Models.Modules
{
class SensoriamentoModel : DispositivoBaseModel
public class SensoriamentoModel : DispositivoBaseModel
{
public static int _TaxaAmostragem { get; set; } = 500;
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");
Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria = (tensao / Sensor.LimiteMaximo) * 100;
if (Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria < 0)
{
Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria = 0;
}
}
AtualizaGrafico = true;

View File

@ -3,6 +3,7 @@ using AgroBase.Forms;
using AgroBase.Forms.Operacoes;
using AgroBase.Models.Modules;
using AgroBase.Services;
using CefSharp.DevTools.Network;
using Newtonsoft.Json;
using System;
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)
{
if (APIService.pythonProcess == null)
/*if (APIService.pythonProcess == null)
{
APIService.Inicializar();
}
}*/
this.Modo = Modo;
this.Controle = new OperacaoControleModel()
{
PIDdirecional = new PIDModel(),
TiposControle = new List<OperacaoControleTipoModel>()
{
new OperacaoControleTipoModel()
@ -67,45 +69,110 @@ namespace AgroBase.Models
}
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.Start();
this.tmrParametrizacao.Start();*/
}
public ModoOperacao Modo { get; set; }
public DispositivosService<SensoriamentoModel> DispSen { get; set; }
public DispositivosService<MovimentacaoModel> DispMov { get; set; }
public DispositivosService<DirecionalModel> DispDir { get; set; }
public DispositivosService<AtuadorModel> DispAtu { get; set; }
public MapasModel Mapa { get; set; } = new MapasModel();
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 bool Iniciado { get; set; }
public long TimestampInicio { 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 ControleAnterior { get; set; } = new OperacaoControleModel();
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 List<OperacaoSensoriamentoModel> Logs { get; set; } = new List<OperacaoSensoriamentoModel>();
public List<GPSModel> GPSTrajetoria { get; set; } = new List<GPSModel>();
public List<List<GPSModel>> GPSTrajetoriaRua { get; set; } = new List<List<GPSModel>>();
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 string PastaSaida { get; set; } = "Operacoes/";
public string PastaSaida { get; } = "Operacoes/";
public string ID { get; set; }
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)
{
var MovConectado = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov && (x._Porta.IsOpen));
var DirConectado = (DispositivosService<DirecionalModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Dir && (x._Porta.IsOpen));
var AtuConectado = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu && (x._Porta.IsOpen));
var SenConectado = (DispositivosService<SensoriamentoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Sen);
var MovConectado = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov);
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)
{
@ -117,6 +184,7 @@ namespace AgroBase.Models
DispAtu = AtuConectado,
DispDir = DirConectado,
DispMov = MovConectado,
DispSen = SenConectado,
Sensoriamento = new OperacaoSensoriamentoModel(),
Logs = new List<OperacaoSensoriamentoModel>(),
};
@ -165,6 +233,14 @@ namespace AgroBase.Models
Mandatorio = false,
},
};
OperacaoCarregar.ParametrosMandatorios = new List<OperacaoParametrosMandatoriosModel>()
{
new OperacaoParametrosMandatoriosModel()
{
Parametro = ParametrosOperacao.Joystick,
Mandatorio = false,
}
};
break;
case ModoOperacao.MapaGPS:
OperacaoCarregar.frmOperacao = new frmOperacaoMapaGPS();
@ -228,6 +304,24 @@ namespace AgroBase.Models
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;
}
@ -246,9 +340,10 @@ namespace AgroBase.Models
{
Operacao.frmOperacaoNome = Operacao.frmOperacao.Name;
Form frm = Operacao.frmOperacao;
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;
}
@ -257,6 +352,8 @@ namespace AgroBase.Models
{
string modoOpStr = nomeArquivo.Split('\\')[nomeArquivo.Split('\\').Length - 1].Replace("operacao", "").Split('.')[0];
ModoOperacao modo = (ModoOperacao)Enum.Parse(typeof(ModoOperacao), modoOpStr);
return CarregarParametrosOperacaoPadrao(modo);
OperacaoModel Operacao = new OperacaoModel(modo);
if (!File.Exists(nomeArquivo))
{
@ -281,6 +378,7 @@ namespace AgroBase.Models
{
Iniciado = true;
TimestampInicio = DateTime.Now.Ticks;
TempoAguardando = DateTime.Now;
TimestampFim = 0;
Mapa.IdxRuaAtual = 0;
if (DispMov != null)
@ -306,17 +404,26 @@ namespace AgroBase.Models
//Controle = 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)
{
Controle = controle;
}
if (DaIHM)
{
frmOperacao = new frmOperacaoMapaGPS();
frmOperacao.Show();
}
tmrLogs.Start();
tmrParametrizacao.Stop();
//tmrParametrizacao.Stop();
}
public void FinalizarOperacao()
@ -329,7 +436,7 @@ namespace AgroBase.Models
TimestampFim = DateTime.Now.Ticks;
tmrLogs.Stop();
tmrParametrizacao.Start();
//tmrParametrizacao.Start();
SalvarLog(true);
@ -368,7 +475,7 @@ namespace AgroBase.Models
ControleAtu.UltimoComando = Agora;
ControleAtu.Comandos.AddRange(Protocolos);
ControleAnterior.BicosAtuados = Controle.BicosAtuados.ToList();
ControleAnterior.BicosAtuados = new List<AtuadorBicoModel>(Controle.BicosAtuados);
}
AtualizarDadosOperacao();
@ -382,9 +489,14 @@ namespace AgroBase.Models
}
try
{
Sensoriamento.ErvasIdentificadas = Sensoriamento.AtuacoesPorBico.Sum();
Sensoriamento.VelocidadeMedia = DispMov.Dados.Motores.Average(x => x.VelocidadeInstantanea);
//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 =
Mapa == null ? 0 :
(ReferencialRuaGPS.Direcao == DirecaoCarroRua.Ida ? ((double)ReferencialRuaGPS.IdxPontoAproximadoRua / (double)(Mapa.Trajetoria[Mapa.IdxRuaAtual].Count - 1)) :
@ -528,67 +640,83 @@ namespace AgroBase.Models
GPSTrajetoriaRua[Mapa.IdxRuaAtual].Add(GPSTrajetoria[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[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]);
Sensoriamento.DistanciaPercorrida.Add(0);
}
Sensoriamento.DistanciaPercorrida[Mapa.IdxRuaAtual] += GPSService.DistanciaEntrePontos(GPSTrajetoria[GPSTrajetoria.Count - 1], GPSTrajetoria[GPSTrajetoria.Count - 2]);
}
File.WriteAllText(PastaSaida + ID + "/trajetoria.json", JsonConvert.SerializeObject(GPSTrajetoria, Formatting.None));
}
public void CalculaDadosMovimentacaoAutonoma()
public void AtualizarControleAtuadores()
{
#region Calculo do angulo de inclinacao
double Angulo = 0;
Controle.BicosAtuados = DispAtu.Dados.BicosPulverizadores;
}
public void CalcularAnguloInclinacao()
{
double erroOrientacao = 0.0;
double anguloCarro = ReferencialRuaGPS.AnguloCarro;
double anguloOposto = (anguloCarro + 180) % 360;
double anguloRua = ReferencialRuaGPS.AnguloRua;
double anguloCamera = Sensoriamento.AnguloRuaCamera;
// Calcula o erro de orientação
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)
{
Angulo = anguloOposto - ReferencialRuaGPS.AnguloRua;
erroOrientacao = anguloOposto - anguloRua;
}
Sensoriamento.AnguloDif = Angulo;
Sensoriamento.AnguloDif = erroOrientacao;
Controle.Angulo =
Angulo > Controle.Angulo_Max ? Controle.Angulo_Max :
Angulo < Controle.Angulo_Min ? Controle.Angulo_Min :
Angulo;
#endregion
// Assume-se que o anguloCamera reflete o desvio lateral.
// Isso pode precisar de ajuste dependendo de como o ângulo é medido.
double erroPosicaoLateral = anguloCamera;
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>();
DispAtu.Dados.BicosPulverizadores.ForEach(x =>
{
BicosNaoAtuados.Add(x);
});
Controle.PIDdirecional.Atualizar(erroCombinado);
}
double correcaoAngulo = Controle.PIDdirecional.Saida;
// 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.RPM = 0;
Controle.Angulo = 0;
}
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.EntrandoRua)
else if (statusAtual == StatusOperacao.EntrandoRua)
{
Controle.RPM = Controle.RPM_Min;
}
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.SaindoRua)
else if (statusAtual == StatusOperacao.SaindoRua)
{
Controle.RPM = Controle.RPM_Min;
}
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.CaminhandoRua)
else if (statusAtual == StatusOperacao.CaminhandoRua)
{
if (Sensoriamento.ErvasNoRadar == 0)
{
@ -605,7 +733,7 @@ namespace AgroBase.Models
Controle.RPM = Controle.RPM_Min;
}
}
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.Manobrando)
else if (statusAtual == StatusOperacao.Manobrando)
{
Controle.RPM = 0;
CalcularManobra();
@ -625,14 +753,25 @@ namespace AgroBase.Models
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
@ -641,14 +780,15 @@ namespace AgroBase.Models
public int RPM_Min { get; set; } = 15;
public double Angulo_Max { get; set; } = 30;
public double Angulo_Min { get; set; } = -30;
public double VelocidadeMP { get; set; } = 50;
public double Angulo { get; set; } = 0;
public int RPM { get; set; } = 0;
public Direcao Direcao { get; set; } = Direcao.Parado;
public double VelocidadeMP { get; set; } = 50;
public List<AtuadorBicoModel> BicosAtuados { get; set; } = new List<AtuadorBicoModel>();
public List<OperacaoControleTipoModel> TiposControle { get; set; }
public PIDModel PIDdirecional { get; set; } = new PIDModel();
}
public class OperacaoControleTipoModel
@ -667,6 +807,14 @@ namespace AgroBase.Models
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 DateTime Momento { get; set; }
@ -699,11 +847,13 @@ namespace AgroBase.Models
{
public bool ManobraConcluida { get; set; } = false;
private StatusOperacao _EtapaAtual;
private StatusOperacao _EtapaAnteriorParada = StatusOperacao.Parado;
public StatusOperacao StatusAtual
{
get
{
StatusOperacao etapaAtual = _EtapaAtual;
// Se a operação não estiver iniciada
if (!Variaveis.OperacaoEmAndamento.Iniciado)
{
@ -716,16 +866,37 @@ namespace AgroBase.Models
// Operação em andamento
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
if (_EtapaAtual == StatusOperacao.Concluida)
else if (_EtapaAtual == StatusOperacao.Concluida)
{
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
}
// 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;
}
else if (_EtapaAnteriorParada != StatusOperacao.Parado)
{
etapaAtual = _EtapaAnteriorParada;
_EtapaAnteriorParada = StatusOperacao.Parado;
}
// Robô está manobrando para seguir a próxima rota do mapa
else if (_EtapaAtual == StatusOperacao.Manobrando)
{
@ -798,7 +969,8 @@ namespace AgroBase.Models
try
{
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).ToList();
Pontos = Pontos.OrderBy(x => x.DataHora).ToList();
@ -828,7 +1000,7 @@ namespace AgroBase.Models
var PontosRua = IdxPontoAproximadoRua + PontosConsiderarAngulo < Rua.Count ?
Rua.Skip(IdxPontoAproximadoRua).Take(PontosConsiderarAngulo).ToList() :
Rua.Skip(PontosConsiderarAngulo).Take(IdxPontoAproximadoRua).ToList();
Rua.Skip(IdxPontoAproximadoRua - PontosConsiderarAngulo).ToList();
/*var Pontos = Rua.Count > PontosConsiderarAngulo ?
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 List<IDispositivosService> DispositivosConectados { get; set; } = new List<IDispositivosService>();
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
@ -44,4 +46,5 @@ namespace AgroBase.Models
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]
outputName = sys.argv[3]
outputMapName = sys.argv[4]
marcadorEndpoit = sys.argv[5]
ruasEndpoit = sys.argv[6]
topico_gps = sys.argv[5]
topico_ruas = sys.argv[6]
pastaSaida = 'Python/Output/'
# 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_atualizacao_marcador = f"""
<script src="folium/mqtt.min.js"></script>
<script>
var marcadorDinamico = L.marker([0, 0], {{
icon: L.AwesomeMarkers.icon({{
@ -139,26 +140,35 @@ with open(caminho_completo_html, 'r+') as arquivo_html:
}})
}}).addTo({id_mapa});
function atualizarMarcador() {{
fetch('{marcadorEndpoit}')
.then(function(response) {{
return response.json();
}})
.then(function(dados) {{
var novaLatitude = dados.latitude;
var novaLongitude = dados.longitude;
var novaPosicao = [novaLatitude, novaLongitude];
marcadorDinamico.setLatLng(novaPosicao);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
{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);
// Conectar ao broker MQTT
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
// Quando conectado, inscreva-se no tópico desejado
client.on('connect', function () {{
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 novaLongitude = dados.longitude;
var novaPosicao = [novaLatitude, novaLongitude];
marcadorDinamico.setLatLng(novaPosicao);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
{id_mapa}.setView(novaPosicao, {id_mapa}.getZoom());
}});
</script>
"""
@ -167,16 +177,13 @@ with open(caminho_completo_html, 'r+') as arquivo_html:
var trajetosSelecionados = {{}};
var RuasSelecionadas = [];
function enviarSelecaoParaServidor() {{
fetch('{ruasEndpoit}', {{
method: 'POST',
headers: {{
'Content-Type': 'application/json',
}},
body: JSON.stringify({{ids: RuasSelecionadas}}),
}})
.then(response => response.json())
.then(data => console.log('Sucesso:', data))
.catch((error) => console.error('Erro:', error));
client.publish("{topico_ruas}", JSON.stringify(RuasSelecionadas), function (err) {{
/*if (!err) {{
console.log("Mensagem publicada com sucesso");
}} else {{
console.error("Falha ao publicar mensagem", err);
}}*/
}});
}}
"""

View File

@ -11,6 +11,11 @@ import socket
import os
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
output_folder = 'Python/Output/'
@ -20,7 +25,7 @@ port = sys.argv[2]
url = sys.argv[3]
output_file = sys.argv[4]
show_lines = sys.argv[5] == "1"
socket_port = int(sys.argv[6])
mqtt_topic = sys.argv[6]
app = Flask(__name__)
@ -88,19 +93,9 @@ def generate_and_save_json(image):
detected_classes = set(np.unique(image))
global json_reading_data
contours_info = []
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.")
# Caminho completo para o arquivo de saída
output_path = output_folder + output_file
timestamp = time.time()
json_data = {'timestamp': timestamp, 'Classes': []}
@ -117,19 +112,21 @@ def generate_and_save_json(image):
for point in contour:
class_entry['Contornos'].append(point.squeeze().tolist())
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):
os.makedirs(output_folder)
# Salva os dados em um arquivo JSON
with open(output_path, 'w') as f:
json.dump(contours_info, f, indent=4)
# Salva os dados em um arquivo JSON, sobrescrevendo o arquivo existente
try:
with open(output_path, 'w') as f:
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
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
@ -161,7 +158,7 @@ def detect_and_stream(camera_index):
if not ret:
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
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')
# 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_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()
# Esta função é para confirmar que script está pronto para execução
def send_script_ready():
mqtt_client.publish(mqtt_topic, "OK")
@app.route('/' + url, methods=['GET'])
@ -228,9 +190,9 @@ def run_flask_server():
# Iniciar o servidor
if __name__ == '__main__':
# Inicia o servidor de socket em uma thread separada
socket_server_thread = threading.Thread(target=run_socket_server)
socket_server_thread.start()
# Cria trhead separada para informar que o script iniciou com sucesso
mqtt_thread = threading.Thread(target=send_script_ready)
mqtt_thread.start()
# Inicia o servidor Flask na thread principal
run_flask_server()

View File

@ -3,11 +3,15 @@ import numpy as np
from flask import Flask, Response, request
import json
import time
import socket
import threading
import sys
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
model_config = 'C:\\train\\models\\ervas\\ervas.cfg'
model_weights = 'C:\\train\\models\\ervas\\backup\\ervas_final.weights'
@ -30,7 +34,7 @@ porta = sys.argv[2]
url = sys.argv[3]
arquivoSaida = sys.argv[4]
mostrar_linhas = sys.argv[5] == "1"
socket_porta = int(sys.argv[6])
mqtt_topic = sys.argv[6]
app = Flask(__name__)
@ -84,6 +88,8 @@ def detect_objects(conf_threshold, nms_threshold, _camera_index):
timestamp = time.time()
json_data = {'timestamp': timestamp, 'x_max': width, 'y_max': height, 'objetos': current_readings}
readings.append(json_data)
mqtt_client.publish(mqtt_topic, json.dumps(json_data).encode('utf-8'))
if not os.path.exists(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')
# 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
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_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()
# Esta função é para confirmar que script está pronto para execução
def send_script_ready():
mqtt_client.publish(mqtt_topic, "OK")
# Iniciar o servidor Flask em uma thread separada
def run_flask_server():
@ -153,9 +125,9 @@ def video_feed():
# Iniciar o servidor
if __name__ == '__main__':
# Inicia o servidor de socket em uma thread separada
socket_server_thread = threading.Thread(target=run_socket_server)
socket_server_thread.start()
# Cria trhead separada para informar que o script iniciou com sucesso
mqtt_thread = threading.Thread(target=send_script_ready)
mqtt_thread.start()
# Inicia o servidor Flask na thread principal
run_flask_server()

View File

@ -61,11 +61,23 @@ namespace AgroBase.Services
var json = JsonConvert.SerializeObject(localizacao);
var data = new StringContent(json, Encoding.UTF8, "application/json");
using (var client = new HttpClient())
try
{
var response = await client.PostAsync(url, data);
using (var client = new HttpClient())
{
var response = await client.PostAsync(url, data);
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();
}
}
}
@ -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.Models;
using CefSharp.WinForms;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
@ -10,13 +11,19 @@ using System.Management;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static MqttService;
namespace AgroBase.Services
{
public class CameraService<T>
public class CameraService
{
public static Dictionary<string, string> CamerasConectadas = new Dictionary<string, string>();
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";
public string ArquivoLeitura = "leitura.json";
@ -26,83 +33,59 @@ namespace AgroBase.Services
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.Exited += PythonProcess_Exited;
IniciadoEm = DateTime.Now;
URLcamera = "http://" + Endereco + ":" + FlaskPorta + "/" + FlaskUrl +
"?conf_threshold=" + conf_threshold.ToString().Replace(",", ".") +
"&nms_threshold=" + nms_threshold.ToString().Replace(",", ".") +
"&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);
if (File.Exists(PythonService.CaminhoGeral + PythonService.CaminhoLeitura + ArquivoLeitura))
{
try
{
string tempFile = PythonService.CaminhoGeral + PythonService.CaminhoLeitura + "cp_" + ArquivoLeitura;
if (File.Exists(tempFile))
{
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;
FinalizadoEm = DateTime.Now;
}
public List<string> AtualizaListaCameras()
public static Dictionary<string, 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')"))
CamerasConectadas.Clear();
CamerasConectadas.Add("Sem vídeo", "0");
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE (PNPClass = 'Camera')")) // PNPClass = 'Image' OR PNPClass = 'Camera')
{
int i = 0;
foreach (var device in searcher.Get())
{
string cameraDesc = i.ToString() + " - " + device["Caption"].ToString();
camerasList.Add(device["DeviceID"].ToString(), cameraDesc);
cameraNames.Add(cameraDesc);
CamerasConectadas.Add(cameraDesc, device["DeviceID"].ToString());
i++;
}
}
//cameraNames = camerasList.OrderByDescending(x => x.Key).Select(x => x.Value).ToList();
foreach (string device in cameraNames)
{
Cameras.Add(device);
}
}
catch (ApplicationException)
{
}
return Cameras;
return CamerasConectadas;
}

View File

@ -80,24 +80,30 @@ namespace AgroBase.Comum
public void AtualizarPortas()
{
cmbPorta.Items.Clear();
cmbPorta.Text = "";
var DispositivosTipo = SerialService.DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).ToList();
for (int i = 0; i < DispositivosTipo.Count(); i++)
{
string PortaCom = DispositivosTipo[i].PortaCOM;
SerialPort _Porta = new SerialPort() { PortName = PortaCom };
try
if (!cmbPorta.Items.Contains(DispositivosTipo[i].PortaCOM))
{
_Porta.Open();
_Porta.Close();
cmbPorta.Items.Add(PortaCom);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
string PortaCom = DispositivosTipo[i].PortaCOM;
SerialPort _Porta = new SerialPort() { PortName = PortaCom };
try
{
_Porta.Open();
_Porta.Close();
cmbPorta.Items.Add(PortaCom);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
if (!DispositivosTipo.Any())
{
cmbPorta.Items.Clear();
cmbPorta.Text = "";
}
if (cmbPorta.Items.Count > 1)
cmbPorta.SelectedIndex = 1;
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.Altitude = ConvertToDouble(parts[9]);
APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo);
//APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo);
AtualizarCoordenadasGPS();
break;
// Recommended minimum specific GPS/Transit data
@ -240,7 +241,18 @@ namespace AgroBase.Services
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();
@ -296,9 +308,10 @@ namespace AgroBase.Services
Longitude = TrajetoFake.features[idxRuaA].geometry.coordinates[idxPonto][0],
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;
}

View File

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

View File

@ -14,6 +14,8 @@ namespace AgroBase.Services
public static string NomeArquivoMapaInterativo = "mapa_interativo.html";
public static string NomeArquivoMapaInterativoSaida = "GeoJson.json";
public static string NomeArquivoMapaGPS = "mapa_gps.html";
public static string TopicoCoordenadasGPS = "coordenadas_gps";
public static string TopicoSelecaoRuasMapa = "selecao_ruas_mapa";
}
public class MapasService
@ -28,6 +30,7 @@ namespace AgroBase.Services
public string MapaUrl = "";
public string CaminhoDadosMapa = "";
public MapaFeatureCollectionModel DadosMapa;
public bool Carregado = false;
public void CarregarMapa(string nomeArquivoMapa, string nomeArquivoSaida)
@ -52,8 +55,8 @@ namespace AgroBase.Services
NomeArquivos,
ArquivoSaida,
NomeArquivoMapa,
APIService.ApiBase() + APIService.GPS_getCoordenadasEndpoint.Replace("<id>", APIService.GPS_IDcoordenadasRobo.ToString()),
APIService.ApiBase() + APIService.Mapa_setRuasSelecionadasEndpoint
MapasVariaveisModel.TopicoCoordenadasGPS,
MapasVariaveisModel.TopicoSelecaoRuasMapa
});
MapaUrl = new Uri(CaminhoSaida + NomeArquivoMapa).AbsoluteUri;
@ -65,7 +68,14 @@ namespace AgroBase.Services
{
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;
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.CreateNoWindow = true;
pythonProcess.Exited += PythonProcess_Exited;
pythonProcess.OutputDataReceived += PythonProcess_OutputDataReceived;
pythonProcess.Start();
processosIniciados.Add(pythonProcess);
@ -44,6 +47,17 @@ namespace AgroBase.Services
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()
{
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.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Net.NetworkInformation;
using System.Windows.Forms;
using static AgroBase.Models.Enuns;
namespace AgroBase.Services
@ -21,7 +25,7 @@ namespace AgroBase.Services
public static List<DispositivoDetalhesModel> DispositivosMapeados = new List<DispositivoDetalhesModel>();
public static void AtualizarDispositivos()
public static void RealizarVarreduraPortasUSB()
{
var Portas = SerialPort.GetPortNames();
var PortasNaoMapeadas = Portas.Where(x => !DispositivosMapeados.Select(y => y.PortaCOM).Contains(x)).ToList();
@ -44,7 +48,8 @@ namespace AgroBase.Services
}
catch (Exception ex)
{
_Porta.Close();
Console.WriteLine(ex.Message.ToString());
}
}
var DispositivosRemovidos = DispositivosMapeados.Where(x => !Portas.Contains(x.PortaCOM)).ToList();
@ -52,6 +57,57 @@ namespace AgroBase.Services
{
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)

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