incluido parametrizacao mandatoria e parada por falha
This commit is contained in:
parent
74ffa4b6e5
commit
120738582b
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.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,43 +479,24 @@ 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[] {
|
||||
|
|
@ -591,41 +505,18 @@ namespace AgroBase.Forms.Operacoes
|
|||
cameraCaminho.VideoUrl,
|
||||
cameraCaminho.ArquivoLeitura,
|
||||
"1",
|
||||
cameraCaminho.SocketPorta
|
||||
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 { }
|
||||
}
|
||||
|
|
@ -902,6 +799,7 @@ namespace AgroBase.Forms.Operacoes
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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++;
|
||||
}
|
||||
}*/
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -136,5 +136,13 @@ namespace AgroBase.Models
|
|||
Volta
|
||||
}
|
||||
|
||||
public enum ParametrosOperacao
|
||||
{
|
||||
CameraSolo,
|
||||
CameraCaminho,
|
||||
Mapa,
|
||||
Joystick
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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() :
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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);
|
||||
}});
|
||||
}}
|
||||
// Conectar ao broker MQTT
|
||||
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
|
||||
|
||||
// Atualiza o marcador a cada 2 segundos
|
||||
setInterval(atualizarMarcador, 2000);
|
||||
// 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);
|
||||
}}*/
|
||||
}});
|
||||
}}
|
||||
"""
|
||||
|
||||
|
|
|
|||
|
|
@ -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,20 +93,10 @@ def generate_and_save_json(image):
|
|||
detected_classes = set(np.unique(image))
|
||||
|
||||
global json_reading_data
|
||||
contours_info = []
|
||||
|
||||
# Caminho completo para o arquivo de saída
|
||||
output_path = output_folder + output_file
|
||||
|
||||
# Carregar os dados existentes se o arquivo já existir
|
||||
if os.path.exists(output_path):
|
||||
with open(output_path, 'r') as f:
|
||||
try:
|
||||
existing_data = json.load(f)
|
||||
if type(existing_data) is list:
|
||||
contours_info.extend(existing_data)
|
||||
except json.JSONDecodeError:
|
||||
print("Erro ao decodificar o JSON existente. Um novo arquivo será criado.")
|
||||
|
||||
timestamp = time.time()
|
||||
json_data = {'timestamp': timestamp, 'Classes': []}
|
||||
for l in detected_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()
|
||||
|
|
@ -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__)
|
||||
|
||||
|
|
@ -85,6 +89,8 @@ def detect_objects(conf_threshold, nms_threshold, _camera_index):
|
|||
json_data = {'timestamp': timestamp, 'x_max': width, 'y_max': height, 'objetos': current_readings}
|
||||
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()
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
|
@ -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
|
|
@ -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}
|
||||
|
|
@ -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
|
|
@ -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}
|
||||
|
|
@ -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}]
|
||||
|
|
@ -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}
|
||||
|
|
@ -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}]
|
||||
|
|
@ -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}]
|
||||
|
|
@ -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}]
|
||||
|
|
@ -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}]
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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}]
|
||||
|
|
@ -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}
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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}]
|
||||
|
|
@ -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}
|
||||
|
|
@ -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}]
|
||||
|
|
@ -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}
|
||||
|
|
@ -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}]
|
||||
|
|
@ -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}]
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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}]
|
||||
|
|
@ -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
Loading…
Reference in New Issue