incluido parametrizacao mandatoria e parada por falha
This commit is contained in:
parent
d09fcde642
commit
5ed566bbf6
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>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>.\Microsoft.DirectX.DirectInput.dll</HintPath>
|
<HintPath>.\Microsoft.DirectX.DirectInput.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="MQTTnet, Version=3.1.1.0, Culture=neutral, PublicKeyToken=b69712f52770c0a7, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\MQTTnet.3.1.1\lib\net461\MQTTnet.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
|
@ -295,6 +298,7 @@
|
||||||
<Compile Include="Models\Modules\SensoriamentoModel.cs" />
|
<Compile Include="Models\Modules\SensoriamentoModel.cs" />
|
||||||
<Compile Include="Models\MotorComum.cs" />
|
<Compile Include="Models\MotorComum.cs" />
|
||||||
<Compile Include="Models\Operacoes\OperacaoModel.cs" />
|
<Compile Include="Models\Operacoes\OperacaoModel.cs" />
|
||||||
|
<Compile Include="Models\PIDModel.cs" />
|
||||||
<Compile Include="Models\Variaveis.cs" />
|
<Compile Include="Models\Variaveis.cs" />
|
||||||
<Compile Include="Services\APIService.cs" />
|
<Compile Include="Services\APIService.cs" />
|
||||||
<Compile Include="Services\CameraService.cs" />
|
<Compile Include="Services\CameraService.cs" />
|
||||||
|
|
@ -311,6 +315,7 @@
|
||||||
<Compile Include="Services\GPSService.cs" />
|
<Compile Include="Services\GPSService.cs" />
|
||||||
<Compile Include="Services\IDispositivosService.cs" />
|
<Compile Include="Services\IDispositivosService.cs" />
|
||||||
<Compile Include="Services\MapasService.cs" />
|
<Compile Include="Services\MapasService.cs" />
|
||||||
|
<Compile Include="Services\MqttService.cs" />
|
||||||
<Compile Include="Services\PythonService.cs" />
|
<Compile Include="Services\PythonService.cs" />
|
||||||
<Compile Include="Services\SerialService.cs" />
|
<Compile Include="Services\SerialService.cs" />
|
||||||
<Compile Include="Services\SocketService.cs" />
|
<Compile Include="Services\SocketService.cs" />
|
||||||
|
|
@ -344,6 +349,9 @@
|
||||||
<Content Include="Python\Models\deeplabv3plus\__init__.py">
|
<Content Include="Python\Models\deeplabv3plus\__init__.py">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="Python\Output\folium\mqtt.min.js">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="Python\Scripts\api.py">
|
<Content Include="Python\Scripts\api.py">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,13 @@ using Emgu.CV;
|
||||||
using Emgu.CV.CvEnum;
|
using Emgu.CV.CvEnum;
|
||||||
using Emgu.CV.Structure;
|
using Emgu.CV.Structure;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using static MqttService;
|
||||||
|
|
||||||
namespace AgroBase.Forms
|
namespace AgroBase.Forms
|
||||||
{
|
{
|
||||||
public partial class frmAtuCamera : Form
|
public partial class frmAtuCamera : Form
|
||||||
{
|
{
|
||||||
private CameraService<CameraCoordenadasFrameModel> cameraService = new CameraService<CameraCoordenadasFrameModel>();
|
private CameraService cameraService = new CameraService();
|
||||||
private ChromiumWebBrowser chromiumWebBrowser = null;
|
private ChromiumWebBrowser chromiumWebBrowser = null;
|
||||||
private Timer tmrLeitura;
|
private Timer tmrLeitura;
|
||||||
|
|
||||||
|
|
@ -46,8 +47,8 @@ namespace AgroBase.Forms
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
cameraService.socket.Disconnect();
|
|
||||||
cameraService.pythonProcess.Kill();
|
cameraService.pythonProcess.Kill();
|
||||||
|
Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
@ -93,12 +94,12 @@ namespace AgroBase.Forms
|
||||||
VideoUrl,
|
VideoUrl,
|
||||||
ArquivoLeitura,
|
ArquivoLeitura,
|
||||||
"1",
|
"1",
|
||||||
SocketPorta
|
VideoUrl
|
||||||
},
|
},
|
||||||
VideoPorta,
|
VideoPorta,
|
||||||
VideoUrl,
|
VideoUrl,
|
||||||
true,
|
VideoUrl,
|
||||||
SocketPorta
|
new Timer()
|
||||||
);
|
);
|
||||||
|
|
||||||
tmrLeitura = new Timer() { Interval = 200 };
|
tmrLeitura = new Timer() { Interval = 200 };
|
||||||
|
|
@ -111,7 +112,7 @@ namespace AgroBase.Forms
|
||||||
{
|
{
|
||||||
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
||||||
cmbCameras.Items.Clear();
|
cmbCameras.Items.Clear();
|
||||||
cmbCameras.Items.AddRange(cameraService.AtualizaListaCameras().ToArray());
|
cmbCameras.Items.AddRange(CameraService.AtualizaListaCameras().Keys.ToArray());
|
||||||
if (cmbCameras.Items.Count == 1)
|
if (cmbCameras.Items.Count == 1)
|
||||||
{
|
{
|
||||||
cameraService.selectedCamera = 0;
|
cameraService.selectedCamera = 0;
|
||||||
|
|
@ -132,13 +133,22 @@ namespace AgroBase.Forms
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
//var coordenadas = cameraService.AferirDadosCamera<CameraCoordenadasModel>();
|
//var coordenadas = cameraService.AferirDadosCamera<CameraCoordenadasModel>();
|
||||||
var leituras = cameraService.socket.DadosRecebidos.ToList().OrderByDescending(x => x.timestamp).Take(MaxLeituras).ToList();
|
var MqttTopico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == VideoUrl);
|
||||||
if (!leituras.Any())
|
CameraCoordenadasFrameModel leitura = null;
|
||||||
|
var Mensagem = MqttTopico.Mensagens.LastOrDefault(x => x.Momento > cameraService.IniciadoEm);
|
||||||
|
if (Mensagem != null)
|
||||||
{
|
{
|
||||||
return;
|
try
|
||||||
|
{
|
||||||
|
leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var objeto in leituras.FirstOrDefault().objetos)
|
foreach (var objeto in leitura.objetos)
|
||||||
{
|
{
|
||||||
GroupBox gpb = new GroupBox()
|
GroupBox gpb = new GroupBox()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@
|
||||||
this.cmbOperacao = new System.Windows.Forms.ComboBox();
|
this.cmbOperacao = new System.Windows.Forms.ComboBox();
|
||||||
this.lblOperacao = new System.Windows.Forms.Label();
|
this.lblOperacao = new System.Windows.Forms.Label();
|
||||||
this.lblOperacaoStatus = new System.Windows.Forms.Label();
|
this.lblOperacaoStatus = new System.Windows.Forms.Label();
|
||||||
|
this.lblMqtt = new System.Windows.Forms.Label();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.picRobo)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.picRobo)).BeginInit();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
|
|
@ -140,17 +141,29 @@
|
||||||
// lblOperacaoStatus
|
// lblOperacaoStatus
|
||||||
//
|
//
|
||||||
this.lblOperacaoStatus.AutoSize = true;
|
this.lblOperacaoStatus.AutoSize = true;
|
||||||
this.lblOperacaoStatus.Location = new System.Drawing.Point(671, 664);
|
this.lblOperacaoStatus.Location = new System.Drawing.Point(671, 602);
|
||||||
this.lblOperacaoStatus.Name = "lblOperacaoStatus";
|
this.lblOperacaoStatus.Name = "lblOperacaoStatus";
|
||||||
this.lblOperacaoStatus.Size = new System.Drawing.Size(287, 24);
|
this.lblOperacaoStatus.Size = new System.Drawing.Size(287, 24);
|
||||||
this.lblOperacaoStatus.TabIndex = 12;
|
this.lblOperacaoStatus.TabIndex = 12;
|
||||||
this.lblOperacaoStatus.Text = "Operação: Manual - Não iniciado";
|
this.lblOperacaoStatus.Text = "Operação: Manual - Não iniciado";
|
||||||
//
|
//
|
||||||
|
// lblMqtt
|
||||||
|
//
|
||||||
|
this.lblMqtt.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||||
|
this.lblMqtt.AutoSize = true;
|
||||||
|
this.lblMqtt.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
|
this.lblMqtt.Location = new System.Drawing.Point(894, 675);
|
||||||
|
this.lblMqtt.Name = "lblMqtt";
|
||||||
|
this.lblMqtt.Size = new System.Drawing.Size(114, 13);
|
||||||
|
this.lblMqtt.TabIndex = 13;
|
||||||
|
this.lblMqtt.Text = "MQTT: Desconectado";
|
||||||
|
//
|
||||||
// frmIHM
|
// frmIHM
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 24F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 24F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(1020, 697);
|
this.ClientSize = new System.Drawing.Size(1020, 697);
|
||||||
|
this.Controls.Add(this.lblMqtt);
|
||||||
this.Controls.Add(this.lblOperacaoStatus);
|
this.Controls.Add(this.lblOperacaoStatus);
|
||||||
this.Controls.Add(this.lblOperacao);
|
this.Controls.Add(this.lblOperacao);
|
||||||
this.Controls.Add(this.cmbOperacao);
|
this.Controls.Add(this.cmbOperacao);
|
||||||
|
|
@ -188,5 +201,6 @@
|
||||||
private System.Windows.Forms.ComboBox cmbOperacao;
|
private System.Windows.Forms.ComboBox cmbOperacao;
|
||||||
private System.Windows.Forms.Label lblOperacao;
|
private System.Windows.Forms.Label lblOperacao;
|
||||||
private System.Windows.Forms.Label lblOperacaoStatus;
|
private System.Windows.Forms.Label lblOperacaoStatus;
|
||||||
|
private System.Windows.Forms.Label lblMqtt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -40,7 +40,7 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void TmrDispositivos_Tick(object sender, EventArgs e)
|
private void TmrDispositivos_Tick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
SerialService.AtualizarDispositivos();
|
SerialService.RealizarVarreduraPortasUSB();
|
||||||
|
|
||||||
var Labels = this.Controls.OfType<Label>().Where(y => y.Name.Contains("lblD_")).ToList();
|
var Labels = this.Controls.OfType<Label>().Where(y => y.Name.Contains("lblD_")).ToList();
|
||||||
Labels.ForEach(lbl =>
|
Labels.ForEach(lbl =>
|
||||||
|
|
@ -73,23 +73,18 @@ namespace AgroBase.Forms.IHM
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Modulo.Dispositivo && x._Porta.PortName == Modulo.PortaCOM);
|
IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Modulo.Dispositivo && x._Porta.PortName == Modulo.PortaCOM);
|
||||||
if (dispositivoService == null)
|
if (dispositivoService != null)
|
||||||
{
|
{
|
||||||
dispositivoService = DispositivosServiceFactory.CreateDispositivoService(
|
if (!dispositivoService._Porta.IsOpen)
|
||||||
Modulo.Dispositivo,
|
{
|
||||||
"Nome: " + Enum.GetName(typeof(T_Code), Modulo.Dispositivo),
|
dispositivoService.btnConectar_Click(new object(), new EventArgs());
|
||||||
"Descrição: " + Enum.GetName(typeof(T_Code), Modulo.Dispositivo),
|
}
|
||||||
new SerialPort()
|
DispositivoConectado = dispositivoService._Porta.IsOpen;
|
||||||
);
|
|
||||||
Variaveis.DispositivosConectados.Add(dispositivoService);
|
|
||||||
dispositivoService.InstanciarDispositivo(Variaveis.DispositivosConectados.Count - 1);
|
|
||||||
}
|
}
|
||||||
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;
|
lblDisp.ForeColor = DispositivoConectado ? Color.Green : Color.Red;
|
||||||
|
|
@ -100,6 +95,9 @@ namespace AgroBase.Forms.IHM
|
||||||
{
|
{
|
||||||
Variaveis.DispositivosConectados.Where(x => x.Dados.GetStatusConexao()).ToList().ForEach(x => x.AcaoDesconectar());
|
Variaveis.DispositivosConectados.Where(x => x.Dados.GetStatusConexao()).ToList().ForEach(x => x.AcaoDesconectar());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lblMqtt.Text = "MQTT: " + (Variaveis.MqttService.StatusConexao() ? "Conectado" : "Desconectado");
|
||||||
|
lblMqtt.ForeColor = Variaveis.MqttService.StatusConexao() ? Color.Green : Color.Red;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -116,33 +114,19 @@ namespace AgroBase.Forms.IHM
|
||||||
|
|
||||||
private void btnIniciar_Click(object sender, EventArgs e)
|
private void btnIniciar_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.ModulosMandatorios.ForEach(Modulo =>
|
|
||||||
{
|
|
||||||
Modulo.Conectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == Modulo.Dispositivo && x._Porta.IsOpen);
|
|
||||||
});
|
|
||||||
bool OperacaoLiberada =
|
|
||||||
(Variaveis.OperacaoEmAndamento.ModulosMandatorios.Where(x => x.Mandatorio).All(x => x.Conectado) && Variaveis.OperacaoEmAndamento.ModulosMandatorios.Any(x => x.Mandatorio)) ||
|
|
||||||
(Variaveis.OperacaoEmAndamento.ModulosMandatorios.All(x => !x.Mandatorio) && Variaveis.OperacaoEmAndamento.ModulosMandatorios.Any(x => x.Conectado));
|
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (OperacaoLiberada)
|
if (Variaveis.OperacaoEmAndamento.ModulosConectados)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.IniciarOperacao();
|
Variaveis.OperacaoEmAndamento.frmOperacao.ShowDialog();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo) +
|
MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||||
", é necessário que todos os módulos mandatórios estejam devidamente conectados ao equipamento, ou pelo menos um dos módulos:\r\n";
|
|
||||||
Variaveis.OperacaoEmAndamento.ModulosMandatorios.ForEach(Modulo =>
|
|
||||||
{
|
|
||||||
MensagemErro += Enum.GetName(typeof(T_Code), Modulo.Dispositivo) + ": ( " + (Modulo.Conectado ? "OK" : " ") + " ) - Mandatório: " + (Modulo.Mandatorio ? "Sim" : "Não") + "\r\n";
|
|
||||||
});
|
|
||||||
MessageBox.Show(MensagemErro, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
private CameraService<CameraDeepLabV3PlusModel> cameraService = new CameraService<CameraDeepLabV3PlusModel>();
|
private CameraService cameraService = new CameraService();
|
||||||
private ChromiumWebBrowser chromiumWebBrowser = null;
|
private ChromiumWebBrowser chromiumWebBrowser = null;
|
||||||
private Timer tmrLeitura;
|
private Timer tmrLeitura;
|
||||||
|
|
||||||
|
|
@ -66,7 +66,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
tmrLeitura.Stop();
|
tmrLeitura.Stop();
|
||||||
cameraService.socket.Disconnect();
|
Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
|
||||||
cameraService.pythonProcess.Kill();
|
cameraService.pythonProcess.Kill();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
@ -290,12 +290,12 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
VideoUrl,
|
VideoUrl,
|
||||||
ArquivoLeitura,
|
ArquivoLeitura,
|
||||||
MostrarDebug ? "1" : "0",
|
MostrarDebug ? "1" : "0",
|
||||||
SocketPorta
|
VideoUrl
|
||||||
},
|
},
|
||||||
VideoPorta,
|
VideoPorta,
|
||||||
VideoUrl,
|
VideoUrl,
|
||||||
false,
|
VideoUrl,
|
||||||
SocketPorta
|
new Timer()
|
||||||
);
|
);
|
||||||
|
|
||||||
tmrLeitura = new Timer() { Interval = 200 };
|
tmrLeitura = new Timer() { Interval = 200 };
|
||||||
|
|
@ -308,7 +308,7 @@ namespace AgroBase.Forms.Movimentacao
|
||||||
{
|
{
|
||||||
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
||||||
cmbCameras.Items.Clear();
|
cmbCameras.Items.Clear();
|
||||||
cmbCameras.Items.AddRange(cameraService.AtualizaListaCameras().ToArray());
|
cmbCameras.Items.AddRange(CameraService.AtualizaListaCameras().Keys.ToArray());
|
||||||
if (cmbCameras.Items.Count == 1)
|
if (cmbCameras.Items.Count == 1)
|
||||||
{
|
{
|
||||||
cameraService.selectedCamera = 0;
|
cameraService.selectedCamera = 0;
|
||||||
|
|
|
||||||
|
|
@ -23,20 +23,8 @@ namespace AgroBase.Forms.Operacoes
|
||||||
{
|
{
|
||||||
public partial class frmOperacaoMapaGPS : Form
|
public partial class frmOperacaoMapaGPS : Form
|
||||||
{
|
{
|
||||||
#region Variáveis
|
|
||||||
|
|
||||||
private List<CameraSoloModel> CamerasSolo = new List<CameraSoloModel>();
|
|
||||||
|
|
||||||
private CameraCaminhoModel cameraCaminho;
|
|
||||||
|
|
||||||
private Timer tmrLeituras = new Timer() { Interval = 200 };
|
private Timer tmrLeituras = new Timer() { Interval = 200 };
|
||||||
|
|
||||||
DispositivosService<MovimentacaoModel> Movimentacao;
|
|
||||||
DispositivosService<DirecionalModel> Direcional;
|
|
||||||
DispositivosService<AtuadorModel> Atuador;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Eventos do formulário
|
#region Eventos do formulário
|
||||||
|
|
||||||
public frmOperacaoMapaGPS()
|
public frmOperacaoMapaGPS()
|
||||||
|
|
@ -64,35 +52,24 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
AtualizarDispositivos();
|
AtualizarDispositivos();
|
||||||
AtualizaListaCameras();
|
AtualizaListaCameras();
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento = new OperacaoModel(ModoOperacao.MapaGPS, Movimentacao, Direcional, Atuador);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void frmOperacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e)
|
private void frmOperacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e)
|
||||||
{
|
{
|
||||||
tmrLeituras.Stop();
|
tmrLeituras.Stop();
|
||||||
//DesligarCameraSoloE();
|
Variaveis.OperacaoEmAndamento.CamerasSolo.ForEach(Camera =>
|
||||||
CamerasSolo.ForEach(Camera =>
|
|
||||||
{
|
{
|
||||||
DesligarCameraSolo(Camera);
|
DesligarCameraSolo(Camera);
|
||||||
});
|
});
|
||||||
DesligarCameraCaminho();
|
DesligarCameraCaminho(Variaveis.OperacaoEmAndamento.CameraCaminho);
|
||||||
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizarDispositivos()
|
private void AtualizarDispositivos()
|
||||||
{
|
{
|
||||||
Movimentacao = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov);
|
chbMOVativo.Checked = Variaveis.OperacaoEmAndamento.DispMov != null && Variaveis.OperacaoEmAndamento.DispMov._Porta.IsOpen;
|
||||||
Direcional = (DispositivosService<DirecionalModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Dir);
|
chbDIRativo.Checked = Variaveis.OperacaoEmAndamento.DispDir != null && Variaveis.OperacaoEmAndamento.DispDir._Porta.IsOpen;
|
||||||
Atuador = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu);
|
chbATUativo.Checked = Variaveis.OperacaoEmAndamento.DispAtu != null && Variaveis.OperacaoEmAndamento.DispAtu._Porta.IsOpen;
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.DispMov = Movimentacao;
|
|
||||||
Variaveis.OperacaoEmAndamento.DispDir = Direcional;
|
|
||||||
Variaveis.OperacaoEmAndamento.DispAtu = Atuador;
|
|
||||||
|
|
||||||
chbMOVativo.Checked = Movimentacao != null && Movimentacao._Porta.IsOpen;
|
|
||||||
chbDIRativo.Checked = Direcional != null && Direcional._Porta.IsOpen;
|
|
||||||
chbATUativo.Checked = Atuador != null && Atuador._Porta.IsOpen;
|
|
||||||
chbGPSativo.Checked = GPSService.PortaGPS != null && GPSService.PortaGPS.IsOpen;
|
chbGPSativo.Checked = GPSService.PortaGPS != null && GPSService.PortaGPS.IsOpen;
|
||||||
|
|
||||||
AtualizarGrafico();
|
AtualizarGrafico();
|
||||||
|
|
@ -104,21 +81,24 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
private void TmrLeituras_Tick(object sender, EventArgs e)
|
private void TmrLeituras_Tick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Tempo = TimeSpan.FromTicks(Variaveis.OperacaoEmAndamento.Iniciado ? ((Variaveis.OperacaoEmAndamento.TimestampFim > 0 ? Variaveis.OperacaoEmAndamento.TimestampFim : DateTime.Now.Ticks) - Variaveis.OperacaoEmAndamento.TimestampInicio) : 0);
|
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
||||||
{
|
{
|
||||||
CamerasSolo.ForEach(CameraSolo =>
|
Variaveis.OperacaoEmAndamento.CamerasSolo.Where(x => x.Iniciada).ToList().ForEach(CameraSolo =>
|
||||||
{
|
{
|
||||||
AtualizaLeituraCameraSolo(CameraSolo);
|
AtualizaLeituraCameraSolo(CameraSolo);
|
||||||
});
|
});
|
||||||
|
Variaveis.OperacaoEmAndamento.Sensoriamento.ErvasNoRadar = Variaveis.OperacaoEmAndamento.CamerasSolo.Sum(x => x.ErvasNoRadar);
|
||||||
|
|
||||||
AtualizaLeituraCameraCaminho();
|
AtualizaLeituraCameraCaminho();
|
||||||
|
|
||||||
AtualizarGrafico();
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Variaveis.OperacaoEmAndamento.AtualizarRuasSelecionadas();
|
||||||
|
}
|
||||||
|
AtualizarGrafico();
|
||||||
AtualizarInformacoesGerais();
|
AtualizarInformacoesGerais();
|
||||||
|
pnlOrientacao.Invalidate();
|
||||||
|
pnlInclinacao.Invalidate();
|
||||||
|
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado && btnIniciarOperacao.Text == "Finalizar Operação")
|
if (!Variaveis.OperacaoEmAndamento.Iniciado && btnIniciarOperacao.Text == "Finalizar Operação")
|
||||||
{
|
{
|
||||||
|
|
@ -128,13 +108,27 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
private void AtualizaLeituraCameraSolo(CameraSoloModel CameraSolo)
|
private void AtualizaLeituraCameraSolo(CameraSoloModel CameraSolo)
|
||||||
{
|
{
|
||||||
if (CameraSolo.camera.socket != null && CameraSolo.camera.socket.DadosRecebidos.Any())
|
if (CameraSolo.camera._mqttTopico != null && CameraSolo.camera._mqttTopico.Mensagens.Any(x => x.Momento > CameraSolo.camera.IniciadoEm))
|
||||||
{
|
{
|
||||||
int BicosPorCamera = Atuador.Dados.QuantidadeBicos / CamerasSolo.Count();
|
try
|
||||||
var leitura = CameraSolo.camera.socket.DadosRecebidos.Last();
|
{
|
||||||
var Verdes = leitura.objetos.ToList();
|
var Mensagem = CameraSolo.camera._mqttTopico.Mensagens.LastOrDefault(x => x.Momento > CameraSolo.camera.IniciadoEm);
|
||||||
int intervaloPorBico = Convert.ToInt32(CameraSolo.camera.socket.DadosRecebidos.First().x_max) / BicosPorCamera;
|
if (Mensagem != null)
|
||||||
int inicioBarraPulverizadora = Convert.ToInt32(CameraSolo.camera.socket.DadosRecebidos.First().y_max * (1 - Atuador.Dados.PercentualInicioPulverizacao));
|
{
|
||||||
|
CameraSolo.Leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu;
|
||||||
|
|
||||||
|
int BicosPorCamera = Atuador.Dados.QuantidadeBicos / Variaveis.OperacaoEmAndamento.CamerasSolo.Count();
|
||||||
|
var Verdes = CameraSolo.Leitura.objetos.ToList();
|
||||||
|
int intervaloPorBico = Convert.ToInt32(CameraSolo.Leitura.x_max) / BicosPorCamera;
|
||||||
|
int inicioBarraPulverizadora = Convert.ToInt32(CameraSolo.Leitura.y_max * (1 - Atuador.Dados.PercentualInicioPulverizacao));
|
||||||
|
|
||||||
List<bool> BicosAnteriores = new List<bool>();
|
List<bool> BicosAnteriores = new List<bool>();
|
||||||
// Inicialize todos os bicos como inativos antes de verificar os objetos verdes
|
// Inicialize todos os bicos como inativos antes de verificar os objetos verdes
|
||||||
|
|
@ -183,7 +177,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lblUltimaLeituraSolo.Text = "Ultima Leitura Solo: " + FuncoesGlobais.TimestampToDate(leitura.timestamp);
|
lblUltimaLeituraSolo.Text = "Ultima Leitura Solo: " + FuncoesGlobais.TimestampToDate(CameraSolo.Leitura.timestamp);
|
||||||
pnlAtuadores.Invalidate();
|
pnlAtuadores.Invalidate();
|
||||||
|
|
||||||
AtualizaInformacoesControleOperacao();
|
AtualizaInformacoesControleOperacao();
|
||||||
|
|
@ -194,8 +188,26 @@ namespace AgroBase.Forms.Operacoes
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var contornosJson = File.ReadAllText("Python/Output/" + cameraCaminho.ArquivoLeitura);
|
var cameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminho;
|
||||||
cameraCaminho.Leituras = JsonConvert.DeserializeObject<CameraDeepLabV3PlusModel[]>(contornosJson).ToList();
|
var MqttTopico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == cameraCaminho.MqttTopico);
|
||||||
|
if (MqttTopico != null && MqttTopico.Mensagens.Any(x => x.Momento > cameraCaminho.camera.IniciadoEm))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var Mensagem = MqttTopico.Mensagens.LastOrDefault(x => x.Momento > cameraCaminho.camera.IniciadoEm);
|
||||||
|
if (Mensagem != null)
|
||||||
|
{
|
||||||
|
cameraCaminho.Leitura = JsonConvert.DeserializeObject<CameraDeepLabV3PlusModel>(Mensagem.Mensagem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//var contornosJson = File.ReadAllText("Python/Output/" + cameraCaminho.ArquivoLeitura);
|
||||||
|
//cameraCaminho.Leituras = JsonConvert.DeserializeObject<CameraDeepLabV3PlusModel[]>(contornosJson).ToList();
|
||||||
|
|
||||||
|
|
||||||
pnlCaminho.Invalidate();
|
pnlCaminho.Invalidate();
|
||||||
|
|
||||||
|
|
@ -222,58 +234,22 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloRuaCamera = cameraCaminho.Angulo;
|
Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloRuaCamera = cameraCaminho.Angulo;
|
||||||
|
|
||||||
pnlInclinacao.Invalidate();
|
pnlAnguloCamera.Invalidate();
|
||||||
|
|
||||||
lblUltimaLeituraRua.Text = "Ultima Leitura Rua: " + FuncoesGlobais.TimestampToDate(cameraCaminho.Leituras.FirstOrDefault().timestamp);
|
lblUltimaLeituraRua.Text = "Ultima Leitura Rua: " + FuncoesGlobais.TimestampToDate(cameraCaminho.Leitura.timestamp);
|
||||||
|
|
||||||
AtualizaInformacoesControleOperacao();
|
AtualizaInformacoesControleOperacao();
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("Erro ao receber dados da Camera Caminho: " + ex.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AtualizaInformacoesControleOperacao()
|
private void AtualizaInformacoesControleOperacao()
|
||||||
{
|
{
|
||||||
var BicosNaoAtuados = new List<AtuadorBicoModel>();
|
Variaveis.OperacaoEmAndamento.AtualizarControleAtuadores();
|
||||||
Atuador.Dados.BicosPulverizadores.ForEach(x =>
|
Variaveis.OperacaoEmAndamento.CalculaDadosMovimentacaoAutonoma();
|
||||||
{
|
|
||||||
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.AtualizarDadosControle();
|
Variaveis.OperacaoEmAndamento.AtualizarDadosControle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -281,7 +257,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
{
|
{
|
||||||
MovSensorimanetoGrafico Log = null;
|
MovSensorimanetoGrafico Log = null;
|
||||||
|
|
||||||
var Motor = Movimentacao.Dados.Motores.FirstOrDefault(x => x.ID == "ET" && x.LogGrafico.Any());
|
var Motor = Variaveis.OperacaoEmAndamento.DispMov.Dados.Motores.FirstOrDefault(x => x.ID == "ET" && x.LogGrafico.Any());
|
||||||
|
|
||||||
if (Motor.LogGrafico.Count > 0)
|
if (Motor.LogGrafico.Count > 0)
|
||||||
{
|
{
|
||||||
|
|
@ -298,19 +274,19 @@ namespace AgroBase.Forms.Operacoes
|
||||||
chart.Series.Clear();
|
chart.Series.Clear();
|
||||||
List<string> Momentos = Logs.Select(x => x.Momento.ToString("mm:ss:fff")).ToList();
|
List<string> Momentos = Logs.Select(x => x.Momento.ToString("mm:ss:fff")).ToList();
|
||||||
|
|
||||||
var serieRPMsp = new Series("Velocidade: " + (Log != null ? Log.Velocidade : 0));
|
var serieVelocidade = new Series("Velocidade: " + (Log != null ? Log.Velocidade : 0));
|
||||||
serieRPMsp.Points.DataBindXY(Momentos, Logs.Select(x => x.Velocidade).ToList());
|
serieVelocidade.Points.DataBindXY(Momentos, Logs.Select(x => x.Velocidade).ToList());
|
||||||
serieRPMsp.ChartType = SeriesChartType.Line;
|
serieVelocidade.ChartType = SeriesChartType.Line;
|
||||||
chart.Series.Add(serieRPMsp);
|
chart.Series.Add(serieVelocidade);
|
||||||
Minimo = Logs.Min(x => x.Velocidade) < Minimo ? Logs.Min(x => x.Velocidade) : Minimo;
|
Minimo = Logs.Min(x => x.Velocidade) < Minimo ? Logs.Min(x => x.Velocidade) : Minimo;
|
||||||
Maximo = Logs.Min(x => x.Velocidade) > Maximo ? Logs.Min(x => x.Velocidade) : Maximo;
|
Maximo = Logs.Min(x => x.Velocidade) > Maximo ? Logs.Min(x => x.Velocidade) : Maximo;
|
||||||
|
|
||||||
//var serieRPM = new Series("RPM: " + (Log != null ? Log.RPM : 0));
|
var serieRPMsp = new Series("RPM SP: " + (Log != null ? Log.RPM_SP : 0));
|
||||||
//serieRPM.Points.DataBindXY(Momentos, Logs.Select(x => x.RPM).ToList());
|
serieRPMsp.Points.DataBindXY(Momentos, Logs.Select(x => x.RPM_SP).ToList());
|
||||||
//serieRPM.ChartType = SeriesChartType.Spline;
|
serieRPMsp.ChartType = SeriesChartType.Spline;
|
||||||
//chart.Series.Add(serieRPM);
|
chart.Series.Add(serieRPMsp);
|
||||||
//Minimo = Logs.Min(x => x.RPM) < Minimo ? Logs.Min(x => x.RPM) : Minimo;
|
Minimo = Logs.Min(x => x.RPM_SP) < Minimo ? Logs.Min(x => x.RPM_SP) : Minimo;
|
||||||
//Maximo = Logs.Max(x => x.RPM) > Maximo ? Logs.Max(x => x.RPM) : Maximo;
|
Maximo = Logs.Max(x => x.RPM_SP) > Maximo ? Logs.Max(x => x.RPM_SP) : Maximo;
|
||||||
|
|
||||||
var seriePotencia = new Series("Potencia: " + (Log != null ? Log.Potencia : 0));
|
var seriePotencia = new Series("Potencia: " + (Log != null ? Log.Potencia : 0));
|
||||||
seriePotencia.Points.DataBindXY(Momentos, Logs.Select(x => x.Potencia).ToList());
|
seriePotencia.Points.DataBindXY(Momentos, Logs.Select(x => x.Potencia).ToList());
|
||||||
|
|
@ -337,21 +313,23 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
private void AtualizarInformacoesGerais()
|
private void AtualizarInformacoesGerais()
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual == StatusOperacao.Parametrizando)
|
var statusAtual = Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual;
|
||||||
|
|
||||||
|
if (statusAtual == StatusOperacao.Parametrizando)
|
||||||
{
|
{
|
||||||
this.Text = "Operação Mapa GPS - Parametrização";
|
this.Text = "Operação Mapa GPS - Parametrização";
|
||||||
}
|
}
|
||||||
else if (Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual == StatusOperacao.Aguardando)
|
else if (statusAtual == StatusOperacao.Aguardando)
|
||||||
{
|
{
|
||||||
this.Text = "Operação Mapa GPS - Iniciando em " + (Variaveis.OperacaoEmAndamento.TempoIniciarOperacao - Variaveis.OperacaoEmAndamento.Tempo.Seconds) + " segundo" + (Variaveis.OperacaoEmAndamento.TempoIniciarOperacao - Variaveis.OperacaoEmAndamento.Tempo.Seconds == 1 ? "" : "s") + "...";
|
this.Text = "Operação Mapa GPS - Iniciando em " + (Variaveis.OperacaoEmAndamento.TempoAguardando.AddSeconds(Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) - DateTime.Now).TotalSeconds.ToString("0") + " segundo" + ((Variaveis.OperacaoEmAndamento.TempoAguardando.AddSeconds(Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) - DateTime.Now).TotalSeconds >= 1 ? "" : "s") + "...";
|
||||||
}
|
}
|
||||||
else if (Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual == StatusOperacao.Concluida)
|
else if (statusAtual == StatusOperacao.Concluida)
|
||||||
{
|
{
|
||||||
this.Text = "Operação Mapa GPS - Concluída";
|
this.Text = "Operação Mapa GPS - Concluída";
|
||||||
}
|
}
|
||||||
else if (Variaveis.OperacaoEmAndamento.Iniciado)
|
else if (Variaveis.OperacaoEmAndamento.Iniciado)
|
||||||
{
|
{
|
||||||
this.Text = "Operação Mapa GPS - Iniciado";
|
this.Text = "Operação Mapa GPS - Em andamento";
|
||||||
}
|
}
|
||||||
|
|
||||||
lblDistanciaEsquerda.Text = "Distancia da Esquerda: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaEsquerda.ToString("0.00") + " cm";
|
lblDistanciaEsquerda.Text = "Distancia da Esquerda: " + Variaveis.OperacaoEmAndamento.Sensoriamento.DistanciaEsquerda.ToString("0.00") + " cm";
|
||||||
|
|
@ -365,13 +343,13 @@ namespace AgroBase.Forms.Operacoes
|
||||||
lblHerbicidaPorErva.Text = "Herbicida por Erva: " + Variaveis.OperacaoEmAndamento.Sensoriamento.HerbicidaPorErva.ToString("0.000") + " mL";
|
lblHerbicidaPorErva.Text = "Herbicida por Erva: " + Variaveis.OperacaoEmAndamento.Sensoriamento.HerbicidaPorErva.ToString("0.000") + " mL";
|
||||||
lblBateriaConsumida.Text = "Bateria Consumida: " + Variaveis.OperacaoEmAndamento.Sensoriamento.BateriaConsumida.ToString("0.00") + "%";
|
lblBateriaConsumida.Text = "Bateria Consumida: " + Variaveis.OperacaoEmAndamento.Sensoriamento.BateriaConsumida.ToString("0.00") + "%";
|
||||||
|
|
||||||
lblPressao.Text = "P: " + Atuador.Dados.PressaoLinha.ToString("0.00") + " psi";
|
lblPressao.Text = "P: " + Variaveis.OperacaoEmAndamento.DispAtu.Dados.PressaoLinha.ToString("0.00") + " psi";
|
||||||
|
|
||||||
pgbReservatorio.Value = Convert.ToInt32(Atuador.Dados.PercentualReservatorio);
|
pgbReservatorio.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio);
|
||||||
lblPorcentagemReservatorio.Text = Atuador.Dados.PercentualReservatorio.ToString("00.00") + "%";
|
lblPorcentagemReservatorio.Text = Variaveis.OperacaoEmAndamento.DispAtu.Dados.PercentualReservatorio.ToString("00.00") + "%";
|
||||||
|
|
||||||
pgbBateria.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria);
|
pgbBateria.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria);
|
||||||
lblPorcentagemReservatorio.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria.ToString("00.00") + "%";
|
lblPorcentagemBateria.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria.ToString("00.00") + "%";
|
||||||
|
|
||||||
pgbProgresso.Value = Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto <= 100 ? Convert.ToInt32(Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto) : 100;
|
pgbProgresso.Value = Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto <= 100 ? Convert.ToInt32(Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto) : 100;
|
||||||
lblPorcentagemProgresso.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto.ToString("00.00") + "%";
|
lblPorcentagemProgresso.Text = Variaveis.OperacaoEmAndamento.Sensoriamento.ProgressoTrajeto.ToString("00.00") + "%";
|
||||||
|
|
@ -387,74 +365,65 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
private void AtualizaListaCameras()
|
private void AtualizaListaCameras()
|
||||||
{
|
{
|
||||||
var listaCameras = new CameraService<object>().AtualizaListaCameras().ToArray();
|
var listaCameras = CameraService.AtualizaListaCameras().Keys.ToArray();
|
||||||
|
|
||||||
var cameras = gpbOpcoes.Controls.OfType<ComboBox>().Where(x => x.Name.Contains("cmbCameraSolo")).OrderBy(x => x.TabIndex).ToList();
|
var cameras = gpbOpcoes.Controls.OfType<ComboBox>().Where(x => x.Name.Contains("cmbCameraSolo")).OrderBy(x => x.TabIndex).ToList();
|
||||||
foreach (ComboBox cmb in cameras)
|
foreach (ComboBox cmb in cameras)
|
||||||
{
|
{
|
||||||
string CamNome = cmb.Name.Replace("cmbCameraSolo", "");
|
string CamNome = cmb.Name.Replace("cmbCameraSolo", "");
|
||||||
CameraSoloModel CameraSolo = CamerasSolo.FirstOrDefault(x => x.Nome == CamNome);
|
CameraSoloModel CameraSolo = Variaveis.OperacaoEmAndamento.CamerasSolo.FirstOrDefault(x => x.Nome == CamNome);
|
||||||
if (CameraSolo == null)
|
if (CameraSolo == null)
|
||||||
{
|
{
|
||||||
CameraSolo = new CameraSoloModel()
|
CameraSolo = new CameraSoloModel()
|
||||||
{
|
{
|
||||||
Nome = CamNome,
|
Nome = CamNome,
|
||||||
Posicao = CamerasSolo.Count(),
|
Posicao = Variaveis.OperacaoEmAndamento.CamerasSolo.Count(),
|
||||||
ArquivoLeitura = "ervas_" + CamNome + ".json",
|
ArquivoLeitura = "ervas_" + CamNome + ".json",
|
||||||
browser = null,
|
browser = null,
|
||||||
camera = new CameraService<CameraCoordenadasFrameModel>(),
|
camera = new CameraService(),
|
||||||
CameraSelecionada = "",
|
CameraSelecionada = "",
|
||||||
combo = cmb,
|
combo = cmb,
|
||||||
MaxLeituras = 10,
|
MaxLeituras = 10,
|
||||||
SocketPorta = (VariaveisPortas.SocketSolo + CamerasSolo.Count()).ToString(),
|
VideoPorta = (VariaveisPortas.CameraSolo + Variaveis.OperacaoEmAndamento.CamerasSolo.Count()).ToString(),
|
||||||
VideoPorta = (VariaveisPortas.CameraSolo + CamerasSolo.Count()).ToString(),
|
|
||||||
VideoUrl = "green_objects_" + CamNome,
|
VideoUrl = "green_objects_" + CamNome,
|
||||||
|
MqttTopico = "green_objects_" + CamNome,
|
||||||
panel = pnlCameraSolo.Controls.OfType<Panel>().Where(x => x.Name.Replace("pnl", "cmb") == cmb.Name).FirstOrDefault(),
|
panel = pnlCameraSolo.Controls.OfType<Panel>().Where(x => x.Name.Replace("pnl", "cmb") == cmb.Name).FirstOrDefault(),
|
||||||
};
|
};
|
||||||
CamerasSolo.Add(CameraSolo);
|
Variaveis.OperacaoEmAndamento.CamerasSolo.Add(CameraSolo);
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraSolo.combo.Items.Clear();
|
CameraSolo.combo.Items.Clear();
|
||||||
CameraSolo.combo.Items.AddRange(listaCameras);
|
CameraSolo.combo.Items.AddRange(listaCameras);
|
||||||
if (CameraSolo.combo.Items.Count == 1)
|
|
||||||
{
|
|
||||||
CameraSolo.camera.selectedCamera = 0;
|
|
||||||
}
|
|
||||||
CameraSolo.combo.SelectedIndex = CameraSolo.camera.selectedCamera;
|
CameraSolo.combo.SelectedIndex = CameraSolo.camera.selectedCamera;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cameraCaminho == null)
|
if (Variaveis.OperacaoEmAndamento.CameraCaminho == null)
|
||||||
{
|
{
|
||||||
cameraCaminho = new CameraCaminhoModel()
|
Variaveis.OperacaoEmAndamento.CameraCaminho = new CameraCaminhoModel()
|
||||||
{
|
{
|
||||||
Nome = "Caminho",
|
Nome = "Caminho",
|
||||||
Posicao = 0,
|
Posicao = 0,
|
||||||
ArquivoLeitura = "leitura_ruas.json",
|
ArquivoLeitura = "leitura_ruas.json",
|
||||||
browser = null,
|
browser = null,
|
||||||
camera = new CameraService<CameraDeepLabV3PlusModel>(),
|
camera = new CameraService(),
|
||||||
CameraSelecionada = "",
|
CameraSelecionada = "",
|
||||||
combo = cmbCameraCaminho,
|
combo = cmbCameraCaminho,
|
||||||
MaxLeituras = 1,
|
MaxLeituras = 1,
|
||||||
SocketPorta = (VariaveisPortas.SocketCaminho + 0).ToString(),
|
|
||||||
VideoPorta = (VariaveisPortas.CameraCaminho + 0).ToString(),
|
VideoPorta = (VariaveisPortas.CameraCaminho + 0).ToString(),
|
||||||
VideoUrl = "street_detector",
|
VideoUrl = "street_detector",
|
||||||
|
MqttTopico = "street_detector",
|
||||||
panel = pnlCameraCaminho,
|
panel = pnlCameraCaminho,
|
||||||
Angulo = 0,
|
Angulo = 0,
|
||||||
AnguloDireito = 0,
|
AnguloDireito = 0,
|
||||||
AnguloEsquerdo = 0,
|
AnguloEsquerdo = 0,
|
||||||
Leituras = new List<CameraDeepLabV3PlusModel>(),
|
Leitura = new CameraDeepLabV3PlusModel(),
|
||||||
PontosExtremos = new List<Point>()
|
PontosExtremos = new List<Point>()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
cameraCaminho.camera.selectedCamera = cmbCameraCaminho.SelectedIndex > 0 ? cmbCameraCaminho.SelectedIndex : 0;
|
|
||||||
cmbCameraCaminho.Items.Clear();
|
cmbCameraCaminho.Items.Clear();
|
||||||
cmbCameraCaminho.Items.AddRange(listaCameras);
|
cmbCameraCaminho.Items.AddRange(listaCameras);
|
||||||
if (cmbCameraCaminho.Items.Count == 1)
|
cmbCameraCaminho.SelectedIndex = Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera;
|
||||||
{
|
|
||||||
cameraCaminho.camera.selectedCamera = 0;
|
|
||||||
}
|
|
||||||
cmbCameraCaminho.SelectedIndex = cameraCaminho.camera.selectedCamera;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cmbCameraSolo_SelectedIndexChanged(object sender, EventArgs e)
|
private void cmbCameraSolo_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
|
@ -463,15 +432,13 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
string CamNome = cmb.Name.Replace("cmbCameraSolo", "");
|
string CamNome = cmb.Name.Replace("cmbCameraSolo", "");
|
||||||
|
|
||||||
CameraSoloModel CameraSolo = CamerasSolo.FirstOrDefault(x => x.Nome == CamNome);
|
CameraSoloModel CameraSolo = Variaveis.OperacaoEmAndamento.CamerasSolo.FirstOrDefault(x => x.Nome == CamNome);
|
||||||
|
|
||||||
if (CameraSolo.CameraSelecionada != "Sem vídeo" && CameraSolo.CameraSelecionada != "")
|
if (CameraSolo.combo.SelectedIndex > 0 && (cmbCameraCaminho.SelectedIndex == CameraSolo.combo.SelectedIndex || Variaveis.OperacaoEmAndamento.CamerasSolo.Any(x => x.Nome != CameraSolo.Nome && x.combo.SelectedIndex == CameraSolo.combo.SelectedIndex)))
|
||||||
{
|
{
|
||||||
cmbCameraCaminho.Items.Add(CameraSolo.CameraSelecionada);
|
MessageBox.Show("Essa câmera já está sendo usada por outro processo!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||||
CamerasSolo.Where(x => x.Nome != CamNome).ToList().ForEach(Camera =>
|
CameraSolo.combo.SelectedIndex = CameraSolo.camera.selectedCamera;
|
||||||
{
|
return;
|
||||||
Camera.combo.Items.Add(CameraSolo.CameraSelecionada);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraSolo.camera.selectedCamera = CameraSolo.combo.SelectedIndex;
|
CameraSolo.camera.selectedCamera = CameraSolo.combo.SelectedIndex;
|
||||||
|
|
@ -481,17 +448,6 @@ namespace AgroBase.Forms.Operacoes
|
||||||
IniciarCameraSolo(CameraSolo);
|
IniciarCameraSolo(CameraSolo);
|
||||||
}
|
}
|
||||||
CameraSolo.CameraSelecionada = CameraSolo.combo.Text;
|
CameraSolo.CameraSelecionada = CameraSolo.combo.Text;
|
||||||
|
|
||||||
//btnIniciarOperacao.Enabled = cmbCameraSolo.SelectedIndex > 0 && cmbCameraCaminho.SelectedIndex > 0;
|
|
||||||
|
|
||||||
if (CameraSolo.CameraSelecionada != "Sem vídeo" && CameraSolo.CameraSelecionada != "")
|
|
||||||
{
|
|
||||||
cmbCameraCaminho.Items.Remove(CameraSolo.CameraSelecionada);
|
|
||||||
CamerasSolo.Where(x => x.Nome != CamNome).ToList().ForEach(Camera =>
|
|
||||||
{
|
|
||||||
Camera.combo.Items.Remove(CameraSolo.CameraSelecionada);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void IniciarCameraSolo(CameraSoloModel CameraSolo)
|
private void IniciarCameraSolo(CameraSoloModel CameraSolo)
|
||||||
|
|
@ -504,41 +460,18 @@ namespace AgroBase.Forms.Operacoes
|
||||||
CameraSolo.VideoUrl,
|
CameraSolo.VideoUrl,
|
||||||
CameraSolo.ArquivoLeitura,
|
CameraSolo.ArquivoLeitura,
|
||||||
"1",
|
"1",
|
||||||
CameraSolo.SocketPorta
|
CameraSolo.MqttTopico
|
||||||
},
|
},
|
||||||
CameraSolo.VideoPorta,
|
CameraSolo.VideoPorta,
|
||||||
CameraSolo.VideoUrl,
|
CameraSolo.VideoUrl,
|
||||||
true,
|
CameraSolo.MqttTopico,
|
||||||
CameraSolo.SocketPorta
|
CameraSolo.tmrProcesso
|
||||||
);
|
);
|
||||||
|
|
||||||
if (CameraSolo.browser == null)
|
|
||||||
{
|
|
||||||
CameraSolo.browser = new ChromiumWebBrowser(CameraSolo.camera.URLcamera);
|
|
||||||
CameraSolo.panel.Controls.Add(CameraSolo.browser);
|
|
||||||
CameraSolo.browser.Dock = DockStyle.Fill;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DesligarCameraSolo(CameraSoloModel CameraSolo)
|
private void DesligarCameraSolo(CameraSoloModel CameraSolo)
|
||||||
{
|
{
|
||||||
try
|
CameraSolo.DesligarCamera();
|
||||||
{
|
|
||||||
CameraSolo.panel.Controls.Remove(CameraSolo.browser);
|
|
||||||
CameraSolo.browser = null;
|
|
||||||
if (CameraSolo.camera.socket != null)
|
|
||||||
{
|
|
||||||
CameraSolo.camera.socket.Disconnect();
|
|
||||||
}
|
|
||||||
if (CameraSolo.camera.pythonProcess != null)
|
|
||||||
{
|
|
||||||
CameraSolo.camera.pythonProcess.Kill();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -546,86 +479,44 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
private void cmbCameraCaminho_SelectedIndexChanged(object sender, EventArgs e)
|
private void cmbCameraCaminho_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (cameraCaminho.CameraSelecionada != "Sem vídeo" && cameraCaminho.CameraSelecionada != "")
|
if (Variaveis.OperacaoEmAndamento.CameraCaminho.combo.SelectedIndex > 0 && Variaveis.OperacaoEmAndamento.CamerasSolo.Any(x => x.combo.SelectedIndex == Variaveis.OperacaoEmAndamento.CameraCaminho.combo.SelectedIndex))
|
||||||
{
|
{
|
||||||
//cmbCameraSoloE.Items.Add(cameraCaminhoSelecionada);
|
MessageBox.Show("Essa câmera já está sendo usada por outro processo!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||||
CamerasSolo.ForEach(Camera =>
|
Variaveis.OperacaoEmAndamento.CameraCaminho.combo.SelectedIndex = Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera;
|
||||||
{
|
return;
|
||||||
Camera.combo.Items.Add(cameraCaminho.CameraSelecionada);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cameraCaminho.camera.selectedCamera = cmbCameraCaminho.SelectedIndex;
|
Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera = cmbCameraCaminho.SelectedIndex;
|
||||||
if (cameraCaminho.camera.selectedCamera > 0)
|
DesligarCameraCaminho(Variaveis.OperacaoEmAndamento.CameraCaminho);
|
||||||
|
if (Variaveis.OperacaoEmAndamento.CameraCaminho.camera.selectedCamera > 0)
|
||||||
{
|
{
|
||||||
DesligarCameraCaminho();
|
IniciarCameraCaminho(Variaveis.OperacaoEmAndamento.CameraCaminho);
|
||||||
IniciarCameraCaminho();
|
|
||||||
}
|
}
|
||||||
else
|
Variaveis.OperacaoEmAndamento.CameraCaminho.CameraSelecionada = cmbCameraCaminho.Text;
|
||||||
{
|
|
||||||
DesligarCameraCaminho();
|
|
||||||
}
|
|
||||||
cameraCaminho.CameraSelecionada = cmbCameraCaminho.Text;
|
|
||||||
|
|
||||||
//btnIniciarOperacao.Enabled = cmbCameraSolo.SelectedIndex > 0 && cmbCameraCaminho.SelectedIndex > 0;
|
|
||||||
|
|
||||||
if (cameraCaminho.CameraSelecionada != "Sem vídeo" && cameraCaminho.CameraSelecionada != "")
|
|
||||||
{
|
|
||||||
cmbCameraSoloE.Items.Remove(cameraCaminho.CameraSelecionada);
|
|
||||||
CamerasSolo.ForEach(Camera =>
|
|
||||||
{
|
|
||||||
Camera.combo.Items.Remove(cameraCaminho.CameraSelecionada);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void IniciarCameraCaminho()
|
private void IniciarCameraCaminho(CameraCaminhoModel cameraCaminho)
|
||||||
{
|
{
|
||||||
cameraCaminho.ArquivoLeitura = cameraCaminho.ArquivoLeitura;
|
|
||||||
cameraCaminho.camera.IniciarCamera(
|
cameraCaminho.camera.IniciarCamera(
|
||||||
PythonService.ScriptStreetDetector,
|
PythonService.ScriptStreetDetector,
|
||||||
new string[] {
|
new string[] {
|
||||||
cameraCaminho.MaxLeituras.ToString(),
|
cameraCaminho.MaxLeituras.ToString(),
|
||||||
cameraCaminho.VideoPorta,
|
cameraCaminho.VideoPorta,
|
||||||
cameraCaminho.VideoUrl,
|
cameraCaminho.VideoUrl,
|
||||||
cameraCaminho.ArquivoLeitura,
|
cameraCaminho.ArquivoLeitura,
|
||||||
"1",
|
"1",
|
||||||
cameraCaminho.SocketPorta
|
cameraCaminho.MqttTopico
|
||||||
},
|
},
|
||||||
cameraCaminho.VideoPorta,
|
cameraCaminho.VideoPorta,
|
||||||
cameraCaminho.VideoUrl,
|
cameraCaminho.VideoUrl,
|
||||||
false,
|
cameraCaminho.MqttTopico,
|
||||||
cameraCaminho.SocketPorta
|
cameraCaminho.tmrProcesso
|
||||||
);
|
);
|
||||||
|
|
||||||
if (cameraCaminho.browser == null)
|
|
||||||
{
|
|
||||||
cameraCaminho.browser = new ChromiumWebBrowser(cameraCaminho.camera.URLcamera);
|
|
||||||
cameraCaminho.panel.Controls.Add(cameraCaminho.browser);
|
|
||||||
cameraCaminho.browser.Dock = DockStyle.Fill;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DesligarCameraCaminho()
|
private void DesligarCameraCaminho(CameraCaminhoModel cameraCaminho)
|
||||||
{
|
{
|
||||||
try
|
cameraCaminho.DesligarCamera();
|
||||||
{
|
|
||||||
cameraCaminho.panel.Controls.Remove(cameraCaminho.browser);
|
|
||||||
cameraCaminho.browser = null;
|
|
||||||
if (cameraCaminho.camera.socket != null)
|
|
||||||
{
|
|
||||||
cameraCaminho.camera.socket.Disconnect();
|
|
||||||
}
|
|
||||||
if (cameraCaminho.camera.pythonProcess != null)
|
|
||||||
{
|
|
||||||
cameraCaminho.camera.pythonProcess.Kill();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
@ -650,7 +541,14 @@ namespace AgroBase.Forms.Operacoes
|
||||||
}
|
}
|
||||||
else
|
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();
|
AtualizaComponentesOperacao();
|
||||||
}
|
}
|
||||||
|
|
@ -669,6 +567,8 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
private void pnlAtuadores_Paint(object sender, PaintEventArgs e)
|
private void pnlAtuadores_Paint(object sender, PaintEventArgs e)
|
||||||
{
|
{
|
||||||
|
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu;
|
||||||
|
|
||||||
Graphics g = e.Graphics;
|
Graphics g = e.Graphics;
|
||||||
Panel myPanel = (Panel)sender;
|
Panel myPanel = (Panel)sender;
|
||||||
int panelWidth = myPanel.Width;
|
int panelWidth = myPanel.Width;
|
||||||
|
|
@ -739,8 +639,10 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
private void pnlCaminho_Paint(object sender, PaintEventArgs e)
|
private void pnlCaminho_Paint(object sender, PaintEventArgs e)
|
||||||
{
|
{
|
||||||
|
var cameraCaminho = Variaveis.OperacaoEmAndamento.CameraCaminho;
|
||||||
|
|
||||||
Panel pnlContornos = (Panel)sender;
|
Panel pnlContornos = (Panel)sender;
|
||||||
if (cameraCaminho.Leituras == null || cameraCaminho.Leituras.Count == 0) return;
|
if (cameraCaminho.Leitura == null) return;
|
||||||
|
|
||||||
Graphics graphics = e.Graphics;
|
Graphics graphics = e.Graphics;
|
||||||
graphics.Clear(pnlContornos.BackColor); // Limpa o fundo
|
graphics.Clear(pnlContornos.BackColor); // Limpa o fundo
|
||||||
|
|
@ -764,41 +666,36 @@ namespace AgroBase.Forms.Operacoes
|
||||||
|
|
||||||
List<Point> pontosCamera = new List<Point>();
|
List<Point> pontosCamera = new List<Point>();
|
||||||
var Classe = cameraCaminho.ClassMap.FirstOrDefault(x => x.Key == "rua");
|
var Classe = cameraCaminho.ClassMap.FirstOrDefault(x => x.Key == "rua");
|
||||||
foreach (var Leitura in cameraCaminho.Leituras.OrderByDescending(x => x.timestamp))
|
foreach (var cameraClass in cameraCaminho.Leitura.Classes.Where(x => x.Classe == Classe.Key))
|
||||||
{
|
{
|
||||||
foreach (var cameraClass in Leitura.Classes.Where(x => x.Classe == Classe.Key))
|
if (cameraClass.Contornos == null || cameraClass.Contornos.Length == 0) continue;
|
||||||
|
|
||||||
|
using (Pen pen = new Pen(Color.Blue, 2))
|
||||||
{
|
{
|
||||||
if (cameraClass.Contornos == null || cameraClass.Contornos.Length == 0) continue;
|
for (int i = 0; i < cameraClass.Contornos.Length - 1; i++)
|
||||||
|
|
||||||
using (Pen pen = new Pen(Color.Blue, 2))
|
|
||||||
{
|
{
|
||||||
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
|
// Aplica a escala e o deslocamento às coordenadas
|
||||||
Point start = new Point((int)(contorno.X * escala + deslocamentoX), (int)(contorno.Y * escala + deslocamentoY));
|
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));
|
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
|
// Se necessário, fechar o contorno conectando o último ponto ao primeiro
|
||||||
if (cameraClass.Contornos.Length > 1)
|
if (cameraClass.Contornos.Length > 1)
|
||||||
{
|
{
|
||||||
var primeiro = cameraClass.Contornos.First();
|
var primeiro = cameraClass.Contornos.First();
|
||||||
var ultimo = cameraClass.Contornos.Last();
|
var ultimo = cameraClass.Contornos.Last();
|
||||||
Point start = new Point((int)(ultimo[0] * escala + deslocamentoX), (int)(ultimo[1] * escala + deslocamentoY));
|
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));
|
Point end = new Point((int)(primeiro[0] * escala + deslocamentoX), (int)(primeiro[1] * escala + deslocamentoY));
|
||||||
graphics.DrawLine(pen, start, end);
|
graphics.DrawLine(pen, start, end);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Plotar apenas a ultima leitura do json
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
using (Pen pen = new Pen(Classe.Value, 2))
|
using (Pen pen = new Pen(Classe.Value, 2))
|
||||||
|
|
@ -820,7 +717,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//DesenharInclinacao((Panel)sender, e, (float)cameraCaminho.Angulo);
|
//DesenharInclinacao((Panel)sender, e, (float)cameraCaminho.Angulo);
|
||||||
DesenharInclinacao((Panel)sender, e, (float)(Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloDif), 90);
|
DesenharInclinacao((Panel)sender, e, (float)(Variaveis.OperacaoEmAndamento.Controle.Angulo), 90);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|
@ -901,12 +798,13 @@ namespace AgroBase.Forms.Operacoes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region SIMULACAO GPS
|
#region SIMULACAO GPS
|
||||||
|
|
||||||
|
|
@ -926,7 +824,6 @@ namespace AgroBase.Forms.Operacoes
|
||||||
}
|
}
|
||||||
lblStatus.Text = "Status: " + Enum.GetName(typeof(StatusOperacao), Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual);
|
lblStatus.Text = "Status: " + Enum.GetName(typeof(StatusOperacao), Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual);
|
||||||
lblDirecao.Text = "Direção: " + Enum.GetName(typeof(DirecaoCarroRua), Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.Direcao);
|
lblDirecao.Text = "Direção: " + Enum.GetName(typeof(DirecaoCarroRua), Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.Direcao);
|
||||||
Console.WriteLine(Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.IdxPontoAproximadoRua);
|
|
||||||
//var Ponto = Variaveis.OperacaoEmAndamento.Mapa.Trajetoria[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual][Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.IdxPontoAproximadoRua];
|
//var Ponto = Variaveis.OperacaoEmAndamento.Mapa.Trajetoria[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual][Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.IdxPontoAproximadoRua];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -938,6 +835,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,9 +29,9 @@ namespace AgroBase.Forms.Operacoes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
|
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea3 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
|
||||||
System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend();
|
System.Windows.Forms.DataVisualization.Charting.Legend legend3 = new System.Windows.Forms.DataVisualization.Charting.Legend();
|
||||||
System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
|
System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series();
|
||||||
this.pnlCameraSolo = new System.Windows.Forms.Panel();
|
this.pnlCameraSolo = new System.Windows.Forms.Panel();
|
||||||
this.pnlCameraSoloD = new System.Windows.Forms.Panel();
|
this.pnlCameraSoloD = new System.Windows.Forms.Panel();
|
||||||
this.pnlCameraSoloE = new System.Windows.Forms.Panel();
|
this.pnlCameraSoloE = new System.Windows.Forms.Panel();
|
||||||
|
|
@ -178,18 +178,18 @@ namespace AgroBase.Forms.Operacoes
|
||||||
//
|
//
|
||||||
// chartGraficos
|
// chartGraficos
|
||||||
//
|
//
|
||||||
chartArea2.Name = "ChartArea1";
|
chartArea3.Name = "ChartArea1";
|
||||||
this.chartGraficos.ChartAreas.Add(chartArea2);
|
this.chartGraficos.ChartAreas.Add(chartArea3);
|
||||||
this.chartGraficos.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.chartGraficos.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
legend2.Name = "Legend1";
|
legend3.Name = "Legend1";
|
||||||
this.chartGraficos.Legends.Add(legend2);
|
this.chartGraficos.Legends.Add(legend3);
|
||||||
this.chartGraficos.Location = new System.Drawing.Point(0, 0);
|
this.chartGraficos.Location = new System.Drawing.Point(0, 0);
|
||||||
this.chartGraficos.Margin = new System.Windows.Forms.Padding(2);
|
this.chartGraficos.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.chartGraficos.Name = "chartGraficos";
|
this.chartGraficos.Name = "chartGraficos";
|
||||||
series2.ChartArea = "ChartArea1";
|
series3.ChartArea = "ChartArea1";
|
||||||
series2.Legend = "Legend1";
|
series3.Legend = "Legend1";
|
||||||
series2.Name = "Series1";
|
series3.Name = "Series1";
|
||||||
this.chartGraficos.Series.Add(series2);
|
this.chartGraficos.Series.Add(series3);
|
||||||
this.chartGraficos.Size = new System.Drawing.Size(405, 254);
|
this.chartGraficos.Size = new System.Drawing.Size(405, 254);
|
||||||
this.chartGraficos.TabIndex = 0;
|
this.chartGraficos.TabIndex = 0;
|
||||||
this.chartGraficos.Text = "chart1";
|
this.chartGraficos.Text = "chart1";
|
||||||
|
|
@ -716,7 +716,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
this.pnlInclinacao.BackColor = System.Drawing.Color.White;
|
this.pnlInclinacao.BackColor = System.Drawing.Color.White;
|
||||||
this.pnlInclinacao.BackgroundImage = global::AgroBase.Properties.Resources.transferidor;
|
this.pnlInclinacao.BackgroundImage = global::AgroBase.Properties.Resources.transferidor;
|
||||||
this.pnlInclinacao.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
|
this.pnlInclinacao.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
|
||||||
this.pnlInclinacao.Location = new System.Drawing.Point(625, 6);
|
this.pnlInclinacao.Location = new System.Drawing.Point(937, 6);
|
||||||
this.pnlInclinacao.Margin = new System.Windows.Forms.Padding(2);
|
this.pnlInclinacao.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.pnlInclinacao.Name = "pnlInclinacao";
|
this.pnlInclinacao.Name = "pnlInclinacao";
|
||||||
this.pnlInclinacao.Size = new System.Drawing.Size(78, 84);
|
this.pnlInclinacao.Size = new System.Drawing.Size(78, 84);
|
||||||
|
|
@ -728,7 +728,7 @@ namespace AgroBase.Forms.Operacoes
|
||||||
this.pnlAnguloCamera.BackColor = System.Drawing.Color.White;
|
this.pnlAnguloCamera.BackColor = System.Drawing.Color.White;
|
||||||
this.pnlAnguloCamera.BackgroundImage = global::AgroBase.Properties.Resources.transferidor;
|
this.pnlAnguloCamera.BackgroundImage = global::AgroBase.Properties.Resources.transferidor;
|
||||||
this.pnlAnguloCamera.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
|
this.pnlAnguloCamera.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
|
||||||
this.pnlAnguloCamera.Location = new System.Drawing.Point(936, 6);
|
this.pnlAnguloCamera.Location = new System.Drawing.Point(623, 6);
|
||||||
this.pnlAnguloCamera.Margin = new System.Windows.Forms.Padding(2);
|
this.pnlAnguloCamera.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.pnlAnguloCamera.Name = "pnlAnguloCamera";
|
this.pnlAnguloCamera.Name = "pnlAnguloCamera";
|
||||||
this.pnlAnguloCamera.Size = new System.Drawing.Size(78, 84);
|
this.pnlAnguloCamera.Size = new System.Drawing.Size(78, 84);
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,8 @@ namespace AgroBase.Forms.Operacoes
|
||||||
nudAnguloMinimo.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.Angulo_Min);
|
nudAnguloMinimo.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.Angulo_Min);
|
||||||
nudVelocidadeMP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP);
|
nudVelocidadeMP.Value = Convert.ToInt32(Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP);
|
||||||
nudTemposalvarlog.Value = Variaveis.OperacaoEmAndamento.tmrLogs.Interval / 1000;
|
nudTemposalvarlog.Value = Variaveis.OperacaoEmAndamento.tmrLogs.Interval / 1000;
|
||||||
|
nudQtdBicos.Value = Variaveis.OperacaoEmAndamento.DispAtu.Dados.QuantidadeBicos;
|
||||||
|
nudQtdCameras.Value = Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void chbD_CheckedChanged(object sender, EventArgs e)
|
private void chbD_CheckedChanged(object sender, EventArgs e)
|
||||||
|
|
@ -119,6 +121,8 @@ namespace AgroBase.Forms.Operacoes
|
||||||
Variaveis.OperacaoEmAndamento.Controle.Angulo_Min = Convert.ToInt32(nudAnguloMinimo.Value);
|
Variaveis.OperacaoEmAndamento.Controle.Angulo_Min = Convert.ToInt32(nudAnguloMinimo.Value);
|
||||||
Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP = Convert.ToInt32(nudVelocidadeMP.Value);
|
Variaveis.OperacaoEmAndamento.Controle.VelocidadeMP = Convert.ToInt32(nudVelocidadeMP.Value);
|
||||||
Variaveis.OperacaoEmAndamento.tmrLogs.Interval = Convert.ToInt32(nudTemposalvarlog.Value * 1000);
|
Variaveis.OperacaoEmAndamento.tmrLogs.Interval = Convert.ToInt32(nudTemposalvarlog.Value * 1000);
|
||||||
|
Variaveis.OperacaoEmAndamento.DispAtu.Dados.QuantidadeBicos = Convert.ToInt32(nudQtdBicos.Value);
|
||||||
|
Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo = Convert.ToInt32(nudQtdCameras.Value);
|
||||||
|
|
||||||
if (chbSalvar.Checked)
|
if (chbSalvar.Checked)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
using AgroBase.Models;
|
using AgroBase.Models;
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
using CefSharp.WinForms;
|
using CefSharp.WinForms;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
|
@ -15,7 +16,7 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
{
|
{
|
||||||
public partial class frmSenCamera : Form
|
public partial class frmSenCamera : Form
|
||||||
{
|
{
|
||||||
private CameraService<CameraAnguloModel> cameraService = new CameraService<CameraAnguloModel>();
|
private CameraService cameraService = new CameraService();
|
||||||
private ChromiumWebBrowser chromiumWebBrowser = null;
|
private ChromiumWebBrowser chromiumWebBrowser = null;
|
||||||
private Timer tmrLeitura;
|
private Timer tmrLeitura;
|
||||||
|
|
||||||
|
|
@ -40,7 +41,7 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
cameraService.socket.Disconnect();
|
Variaveis.MqttService.UnsubscribeAsync(cameraService._mqttTopico).GetAwaiter().GetResult();
|
||||||
cameraService.pythonProcess.Kill();
|
cameraService.pythonProcess.Kill();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
@ -86,12 +87,12 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
VideoUrl,
|
VideoUrl,
|
||||||
ArquivoLeitura,
|
ArquivoLeitura,
|
||||||
MostrarDebug ? "1" : "0",
|
MostrarDebug ? "1" : "0",
|
||||||
SocketPorta
|
VideoUrl
|
||||||
},
|
},
|
||||||
VideoPorta,
|
VideoPorta,
|
||||||
VideoUrl,
|
VideoUrl,
|
||||||
true,
|
VideoUrl,
|
||||||
VariaveisPortas.SocketCaminho.ToString()
|
new Timer()
|
||||||
);
|
);
|
||||||
|
|
||||||
tmrLeitura = new Timer() { Interval = 200 };
|
tmrLeitura = new Timer() { Interval = 200 };
|
||||||
|
|
@ -104,7 +105,7 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
{
|
{
|
||||||
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
cameraService.selectedCamera = cmbCameras.SelectedIndex > 0 ? cmbCameras.SelectedIndex : 0;
|
||||||
cmbCameras.Items.Clear();
|
cmbCameras.Items.Clear();
|
||||||
cmbCameras.Items.AddRange(cameraService.AtualizaListaCameras().ToArray());
|
cmbCameras.Items.AddRange(CameraService.AtualizaListaCameras().Keys.ToArray());
|
||||||
if (cmbCameras.Items.Count == 1)
|
if (cmbCameras.Items.Count == 1)
|
||||||
{
|
{
|
||||||
cameraService.selectedCamera = 0;
|
cameraService.selectedCamera = 0;
|
||||||
|
|
@ -124,9 +125,22 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
this.pnlLeituras.Controls.Clear();
|
this.pnlLeituras.Controls.Clear();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
var leituras = cameraService.socket.DadosRecebidos.ToList().OrderByDescending(x => x.timestamp).Take(MaxLeituras).ToList();
|
var MqttTopico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == VideoUrl);
|
||||||
|
CameraCoordenadasFrameModel leitura = null;
|
||||||
|
var Mensagem = MqttTopico.Mensagens.LastOrDefault(x => x.Momento > cameraService.IniciadoEm);
|
||||||
|
if (Mensagem != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
leitura = JsonConvert.DeserializeObject<CameraCoordenadasFrameModel>(Mensagem.Mensagem);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
foreach (var leitura in leituras)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*foreach (var leitura in leituras)
|
||||||
{
|
{
|
||||||
GroupBox gpb = new GroupBox()
|
GroupBox gpb = new GroupBox()
|
||||||
{
|
{
|
||||||
|
|
@ -172,7 +186,7 @@ namespace AgroBase.Forms.Sensoriamento
|
||||||
pnlLeituras.Controls.Add(gpb);
|
pnlLeituras.Controls.Add(gpb);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ namespace AgroBase
|
||||||
this.erroStrip = new System.Windows.Forms.StatusStrip();
|
this.erroStrip = new System.Windows.Forms.StatusStrip();
|
||||||
this.lblStripErro = new System.Windows.Forms.ToolStripStatusLabel();
|
this.lblStripErro = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.pnlLateral = new System.Windows.Forms.Panel();
|
this.pnlLateral = new System.Windows.Forms.Panel();
|
||||||
|
this.chbConexaoautomatica = new System.Windows.Forms.CheckBox();
|
||||||
this.gpbDispositivos = new System.Windows.Forms.GroupBox();
|
this.gpbDispositivos = new System.Windows.Forms.GroupBox();
|
||||||
this.lstDisponiveis = new System.Windows.Forms.ListView();
|
this.lstDisponiveis = new System.Windows.Forms.ListView();
|
||||||
this.btnRemover = new System.Windows.Forms.Button();
|
this.btnRemover = new System.Windows.Forms.Button();
|
||||||
|
|
@ -51,6 +52,7 @@ namespace AgroBase
|
||||||
this.lblStripJoystickComando = new System.Windows.Forms.ToolStripStatusLabel();
|
this.lblStripJoystickComando = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.lblStripOperacao = new System.Windows.Forms.ToolStripStatusLabel();
|
this.lblStripOperacao = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.lblStripOperacaoStatus = new System.Windows.Forms.ToolStripStatusLabel();
|
this.lblStripOperacaoStatus = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
|
this.lblStripMqtt = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.gpbMovimentacao = new System.Windows.Forms.GroupBox();
|
this.gpbMovimentacao = new System.Windows.Forms.GroupBox();
|
||||||
this.lblKmh = new System.Windows.Forms.Label();
|
this.lblKmh = new System.Windows.Forms.Label();
|
||||||
this.trkKmh = new System.Windows.Forms.TrackBar();
|
this.trkKmh = new System.Windows.Forms.TrackBar();
|
||||||
|
|
@ -74,7 +76,7 @@ namespace AgroBase
|
||||||
this.btnMapas = new System.Windows.Forms.Button();
|
this.btnMapas = new System.Windows.Forms.Button();
|
||||||
this.btnSenCamera = new System.Windows.Forms.Button();
|
this.btnSenCamera = new System.Windows.Forms.Button();
|
||||||
this.gpbJoystick = new System.Windows.Forms.GroupBox();
|
this.gpbJoystick = new System.Windows.Forms.GroupBox();
|
||||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
this.gpbControleDirecional = new System.Windows.Forms.GroupBox();
|
||||||
this.gpbAtalhos = new System.Windows.Forms.GroupBox();
|
this.gpbAtalhos = new System.Windows.Forms.GroupBox();
|
||||||
this.btnContornos = new System.Windows.Forms.Button();
|
this.btnContornos = new System.Windows.Forms.Button();
|
||||||
this.btnGPS = new System.Windows.Forms.Button();
|
this.btnGPS = new System.Windows.Forms.Button();
|
||||||
|
|
@ -99,7 +101,7 @@ namespace AgroBase
|
||||||
this.gpbSensoriamento.SuspendLayout();
|
this.gpbSensoriamento.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).BeginInit();
|
||||||
this.gpbJoystick.SuspendLayout();
|
this.gpbJoystick.SuspendLayout();
|
||||||
this.groupBox2.SuspendLayout();
|
this.gpbControleDirecional.SuspendLayout();
|
||||||
this.gpbAtalhos.SuspendLayout();
|
this.gpbAtalhos.SuspendLayout();
|
||||||
this.gpbOperacao.SuspendLayout();
|
this.gpbOperacao.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
|
|
@ -139,6 +141,7 @@ namespace AgroBase
|
||||||
// pnlLateral
|
// pnlLateral
|
||||||
//
|
//
|
||||||
this.pnlLateral.AutoScroll = true;
|
this.pnlLateral.AutoScroll = true;
|
||||||
|
this.pnlLateral.Controls.Add(this.chbConexaoautomatica);
|
||||||
this.pnlLateral.Controls.Add(this.gpbDispositivos);
|
this.pnlLateral.Controls.Add(this.gpbDispositivos);
|
||||||
this.pnlLateral.Controls.Add(this.btnRemover);
|
this.pnlLateral.Controls.Add(this.btnRemover);
|
||||||
this.pnlLateral.Controls.Add(this.lblDispositivos);
|
this.pnlLateral.Controls.Add(this.lblDispositivos);
|
||||||
|
|
@ -152,6 +155,16 @@ namespace AgroBase
|
||||||
this.pnlLateral.Size = new System.Drawing.Size(613, 592);
|
this.pnlLateral.Size = new System.Drawing.Size(613, 592);
|
||||||
this.pnlLateral.TabIndex = 0;
|
this.pnlLateral.TabIndex = 0;
|
||||||
//
|
//
|
||||||
|
// chbConexaoautomatica
|
||||||
|
//
|
||||||
|
this.chbConexaoautomatica.AutoSize = true;
|
||||||
|
this.chbConexaoautomatica.Location = new System.Drawing.Point(172, 28);
|
||||||
|
this.chbConexaoautomatica.Name = "chbConexaoautomatica";
|
||||||
|
this.chbConexaoautomatica.Size = new System.Drawing.Size(123, 17);
|
||||||
|
this.chbConexaoautomatica.TabIndex = 21;
|
||||||
|
this.chbConexaoautomatica.Text = "Conexão automática";
|
||||||
|
this.chbConexaoautomatica.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
// gpbDispositivos
|
// gpbDispositivos
|
||||||
//
|
//
|
||||||
this.gpbDispositivos.Controls.Add(this.lstDisponiveis);
|
this.gpbDispositivos.Controls.Add(this.lstDisponiveis);
|
||||||
|
|
@ -291,7 +304,8 @@ namespace AgroBase
|
||||||
this.lblStripJoystick,
|
this.lblStripJoystick,
|
||||||
this.lblStripJoystickComando,
|
this.lblStripJoystickComando,
|
||||||
this.lblStripOperacao,
|
this.lblStripOperacao,
|
||||||
this.lblStripOperacaoStatus});
|
this.lblStripOperacaoStatus,
|
||||||
|
this.lblStripMqtt});
|
||||||
this.generalStrip.Location = new System.Drawing.Point(0, 587);
|
this.generalStrip.Location = new System.Drawing.Point(0, 587);
|
||||||
this.generalStrip.Name = "generalStrip";
|
this.generalStrip.Name = "generalStrip";
|
||||||
this.generalStrip.Padding = new System.Windows.Forms.Padding(1, 0, 10, 0);
|
this.generalStrip.Padding = new System.Windows.Forms.Padding(1, 0, 10, 0);
|
||||||
|
|
@ -323,6 +337,12 @@ namespace AgroBase
|
||||||
this.lblStripOperacaoStatus.Size = new System.Drawing.Size(74, 17);
|
this.lblStripOperacaoStatus.Size = new System.Drawing.Size(74, 17);
|
||||||
this.lblStripOperacaoStatus.Text = "Não iniciado";
|
this.lblStripOperacaoStatus.Text = "Não iniciado";
|
||||||
//
|
//
|
||||||
|
// lblStripMqtt
|
||||||
|
//
|
||||||
|
this.lblStripMqtt.Name = "lblStripMqtt";
|
||||||
|
this.lblStripMqtt.Size = new System.Drawing.Size(119, 15);
|
||||||
|
this.lblStripMqtt.Text = "MQTT: Desconectado";
|
||||||
|
//
|
||||||
// gpbMovimentacao
|
// gpbMovimentacao
|
||||||
//
|
//
|
||||||
this.gpbMovimentacao.Controls.Add(this.lblKmh);
|
this.gpbMovimentacao.Controls.Add(this.lblKmh);
|
||||||
|
|
@ -486,7 +506,7 @@ namespace AgroBase
|
||||||
this.gpbSensoriamento.Margin = new System.Windows.Forms.Padding(2);
|
this.gpbSensoriamento.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.gpbSensoriamento.Name = "gpbSensoriamento";
|
this.gpbSensoriamento.Name = "gpbSensoriamento";
|
||||||
this.gpbSensoriamento.Padding = new System.Windows.Forms.Padding(2);
|
this.gpbSensoriamento.Padding = new System.Windows.Forms.Padding(2);
|
||||||
this.gpbSensoriamento.Size = new System.Drawing.Size(423, 184);
|
this.gpbSensoriamento.Size = new System.Drawing.Size(423, 172);
|
||||||
this.gpbSensoriamento.TabIndex = 13;
|
this.gpbSensoriamento.TabIndex = 13;
|
||||||
this.gpbSensoriamento.TabStop = false;
|
this.gpbSensoriamento.TabStop = false;
|
||||||
this.gpbSensoriamento.Text = "Sensoriamento";
|
this.gpbSensoriamento.Text = "Sensoriamento";
|
||||||
|
|
@ -512,7 +532,7 @@ namespace AgroBase
|
||||||
this.gridSenMotores.Name = "gridSenMotores";
|
this.gridSenMotores.Name = "gridSenMotores";
|
||||||
this.gridSenMotores.RowHeadersWidth = 51;
|
this.gridSenMotores.RowHeadersWidth = 51;
|
||||||
this.gridSenMotores.RowTemplate.Height = 24;
|
this.gridSenMotores.RowTemplate.Height = 24;
|
||||||
this.gridSenMotores.Size = new System.Drawing.Size(414, 144);
|
this.gridSenMotores.Size = new System.Drawing.Size(414, 132);
|
||||||
this.gridSenMotores.TabIndex = 0;
|
this.gridSenMotores.TabIndex = 0;
|
||||||
//
|
//
|
||||||
// btnDiagnosticos
|
// btnDiagnosticos
|
||||||
|
|
@ -585,20 +605,20 @@ namespace AgroBase
|
||||||
this.gpbJoystick.TabStop = false;
|
this.gpbJoystick.TabStop = false;
|
||||||
this.gpbJoystick.Text = "Joystick";
|
this.gpbJoystick.Text = "Joystick";
|
||||||
//
|
//
|
||||||
// groupBox2
|
// gpbControleDirecional
|
||||||
//
|
//
|
||||||
this.groupBox2.Controls.Add(this.tkbVelocidade);
|
this.gpbControleDirecional.Controls.Add(this.tkbVelocidade);
|
||||||
this.groupBox2.Controls.Add(this.tkbAngulo);
|
this.gpbControleDirecional.Controls.Add(this.tkbAngulo);
|
||||||
this.groupBox2.Controls.Add(this.lblAngulo);
|
this.gpbControleDirecional.Controls.Add(this.lblAngulo);
|
||||||
this.groupBox2.Controls.Add(this.lblVelocidade);
|
this.gpbControleDirecional.Controls.Add(this.lblVelocidade);
|
||||||
this.groupBox2.Location = new System.Drawing.Point(9, 154);
|
this.gpbControleDirecional.Location = new System.Drawing.Point(9, 154);
|
||||||
this.groupBox2.Margin = new System.Windows.Forms.Padding(2);
|
this.gpbControleDirecional.Margin = new System.Windows.Forms.Padding(2);
|
||||||
this.groupBox2.Name = "groupBox2";
|
this.gpbControleDirecional.Name = "gpbControleDirecional";
|
||||||
this.groupBox2.Padding = new System.Windows.Forms.Padding(2);
|
this.gpbControleDirecional.Padding = new System.Windows.Forms.Padding(2);
|
||||||
this.groupBox2.Size = new System.Drawing.Size(330, 149);
|
this.gpbControleDirecional.Size = new System.Drawing.Size(330, 149);
|
||||||
this.groupBox2.TabIndex = 19;
|
this.gpbControleDirecional.TabIndex = 19;
|
||||||
this.groupBox2.TabStop = false;
|
this.gpbControleDirecional.TabStop = false;
|
||||||
this.groupBox2.Text = "Controle Direcional";
|
this.gpbControleDirecional.Text = "Controle Direcional";
|
||||||
//
|
//
|
||||||
// gpbAtalhos
|
// gpbAtalhos
|
||||||
//
|
//
|
||||||
|
|
@ -729,7 +749,7 @@ namespace AgroBase
|
||||||
this.ClientSize = new System.Drawing.Size(1058, 609);
|
this.ClientSize = new System.Drawing.Size(1058, 609);
|
||||||
this.Controls.Add(this.gpbOperacao);
|
this.Controls.Add(this.gpbOperacao);
|
||||||
this.Controls.Add(this.gpbAtalhos);
|
this.Controls.Add(this.gpbAtalhos);
|
||||||
this.Controls.Add(this.groupBox2);
|
this.Controls.Add(this.gpbControleDirecional);
|
||||||
this.Controls.Add(this.gpbJoystick);
|
this.Controls.Add(this.gpbJoystick);
|
||||||
this.Controls.Add(this.gpbMovimentacao);
|
this.Controls.Add(this.gpbMovimentacao);
|
||||||
this.Controls.Add(this.gpbSensoriamento);
|
this.Controls.Add(this.gpbSensoriamento);
|
||||||
|
|
@ -763,8 +783,8 @@ namespace AgroBase
|
||||||
this.gpbSensoriamento.PerformLayout();
|
this.gpbSensoriamento.PerformLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.gridSenMotores)).EndInit();
|
||||||
this.gpbJoystick.ResumeLayout(false);
|
this.gpbJoystick.ResumeLayout(false);
|
||||||
this.groupBox2.ResumeLayout(false);
|
this.gpbControleDirecional.ResumeLayout(false);
|
||||||
this.groupBox2.PerformLayout();
|
this.gpbControleDirecional.PerformLayout();
|
||||||
this.gpbAtalhos.ResumeLayout(false);
|
this.gpbAtalhos.ResumeLayout(false);
|
||||||
this.gpbOperacao.ResumeLayout(false);
|
this.gpbOperacao.ResumeLayout(false);
|
||||||
this.gpbOperacao.PerformLayout();
|
this.gpbOperacao.PerformLayout();
|
||||||
|
|
@ -776,7 +796,6 @@ namespace AgroBase
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private System.Windows.Forms.GroupBox gpbAcoes;
|
private System.Windows.Forms.GroupBox gpbAcoes;
|
||||||
private System.Windows.Forms.Panel pnlLateral;
|
|
||||||
private System.Windows.Forms.Button btnNovoDispositivo;
|
private System.Windows.Forms.Button btnNovoDispositivo;
|
||||||
private System.Windows.Forms.GroupBox gpbNovoDispositivo;
|
private System.Windows.Forms.GroupBox gpbNovoDispositivo;
|
||||||
private System.Windows.Forms.Button btnSalvar;
|
private System.Windows.Forms.Button btnSalvar;
|
||||||
|
|
@ -815,13 +834,12 @@ namespace AgroBase
|
||||||
private System.Windows.Forms.GroupBox gpbJoystick;
|
private System.Windows.Forms.GroupBox gpbJoystick;
|
||||||
private System.Windows.Forms.Label lblSenMotores;
|
private System.Windows.Forms.Label lblSenMotores;
|
||||||
public System.Windows.Forms.DataGridView gridSenMotores;
|
public System.Windows.Forms.DataGridView gridSenMotores;
|
||||||
private System.Windows.Forms.GroupBox groupBox2;
|
private System.Windows.Forms.GroupBox gpbControleDirecional;
|
||||||
private System.Windows.Forms.GroupBox gpbAtalhos;
|
private System.Windows.Forms.GroupBox gpbAtalhos;
|
||||||
private System.Windows.Forms.GroupBox gpbOperacao;
|
private System.Windows.Forms.GroupBox gpbOperacao;
|
||||||
private System.Windows.Forms.Label lblModoOperacao;
|
private System.Windows.Forms.Label lblModoOperacao;
|
||||||
private System.Windows.Forms.ComboBox cmbModoOperacao;
|
private System.Windows.Forms.ComboBox cmbModoOperacao;
|
||||||
private System.Windows.Forms.Button btnIniciarOperacao;
|
private System.Windows.Forms.Button btnIniciarOperacao;
|
||||||
private System.Windows.Forms.CheckBox chbDebugMode;
|
|
||||||
private System.Windows.Forms.Label lblKmh;
|
private System.Windows.Forms.Label lblKmh;
|
||||||
public System.Windows.Forms.TrackBar trkKmh;
|
public System.Windows.Forms.TrackBar trkKmh;
|
||||||
private System.Windows.Forms.ToolStripStatusLabel lblStripOperacao;
|
private System.Windows.Forms.ToolStripStatusLabel lblStripOperacao;
|
||||||
|
|
@ -830,6 +848,10 @@ namespace AgroBase
|
||||||
private System.Windows.Forms.Button btnConfigurarOperacao;
|
private System.Windows.Forms.Button btnConfigurarOperacao;
|
||||||
private System.Windows.Forms.Button btnIHM;
|
private System.Windows.Forms.Button btnIHM;
|
||||||
private System.Windows.Forms.Button btnContornos;
|
private System.Windows.Forms.Button btnContornos;
|
||||||
|
public System.Windows.Forms.ToolStripStatusLabel lblStripMqtt;
|
||||||
|
public System.Windows.Forms.Panel pnlLateral;
|
||||||
|
public System.Windows.Forms.CheckBox chbConexaoautomatica;
|
||||||
|
public System.Windows.Forms.CheckBox chbDebugMode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,9 @@ namespace AgroBase
|
||||||
{
|
{
|
||||||
timerDispositivos.Enabled = true;
|
timerDispositivos.Enabled = true;
|
||||||
AtualizaDadosGerais();
|
AtualizaDadosGerais();
|
||||||
|
|
||||||
|
|
||||||
|
IniciarConexaoMqtt();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e)
|
private void frmPrincipal_FormClosing(object sender, FormClosingEventArgs e)
|
||||||
|
|
@ -45,6 +48,11 @@ namespace AgroBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void IniciarConexaoMqtt()
|
||||||
|
{
|
||||||
|
await Variaveis.MqttService.ConnectAsync();
|
||||||
|
}
|
||||||
|
|
||||||
public void AtualizaDadosGerais()
|
public void AtualizaDadosGerais()
|
||||||
{
|
{
|
||||||
btnJoyAtt_Click(new object(), new EventArgs());
|
btnJoyAtt_Click(new object(), new EventArgs());
|
||||||
|
|
@ -136,7 +144,7 @@ namespace AgroBase
|
||||||
{
|
{
|
||||||
Variaveis.DispositivosConectados.Where(x => x.Dados.GetStatusConexao()).ToList().ForEach(x => x.AcaoDesconectar());
|
Variaveis.DispositivosConectados.Where(x => x.Dados.GetStatusConexao()).ToList().ForEach(x => x.AcaoDesconectar());
|
||||||
}
|
}
|
||||||
SerialService.AtualizarDispositivos();
|
SerialService.RealizarVarreduraPortasUSB();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void frmPrincipal_FormClosed(object sender, FormClosedEventArgs e)
|
private void frmPrincipal_FormClosed(object sender, FormClosedEventArgs e)
|
||||||
|
|
@ -242,89 +250,32 @@ namespace AgroBase
|
||||||
|
|
||||||
private void cmbModoOperacao_SelectedIndexChanged(object sender, EventArgs e)
|
private void cmbModoOperacao_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.Modo = (ModoOperacao)cmbModoOperacao.SelectedIndex;
|
Variaveis.OperacaoEmAndamento = OperacaoModel.CarregarParametrosOperacaoPadrao((ModoOperacao)cmbModoOperacao.SelectedIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnIniciarOperacao_Click(object sender, EventArgs e)
|
private void btnIniciarOperacao_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
bool DebugMode = chbDebugMode.Checked;
|
|
||||||
string MensagemErro = "";
|
|
||||||
|
|
||||||
bool MovConectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == T_Code.Mov && (x._Porta.IsOpen || DebugMode));
|
|
||||||
bool DirConectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == T_Code.Dir && (x._Porta.IsOpen || DebugMode));
|
|
||||||
bool AtuConectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == T_Code.Atu && (x._Porta.IsOpen || DebugMode));
|
|
||||||
bool GpsConectado = GPSService.PortaGPS != null || DebugMode;
|
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
||||||
|
|
||||||
btnIniciarOperacao.Text = "Iniciar Operação";
|
btnIniciarOperacao.Text = "Abrir Operação";
|
||||||
cmbModoOperacao.Enabled = true;
|
cmbModoOperacao.Enabled = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.Manual)
|
if (Variaveis.OperacaoEmAndamento.OperacaoLiberada)
|
||||||
{
|
{
|
||||||
if (MovConectado || DirConectado || AtuConectado)
|
Variaveis.OperacaoEmAndamento.frmOperacao.Show();
|
||||||
{
|
|
||||||
Variaveis.OperacaoEmAndamento.IniciarOperacao(null, false);
|
|
||||||
|
|
||||||
cmbModoOperacao.Enabled = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
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" : " ") + " )";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.MapaGPS)
|
else
|
||||||
{
|
{
|
||||||
if (MovConectado && DirConectado && AtuConectado && GpsConectado)
|
MessageBox.Show(Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||||
{
|
|
||||||
frmOperacaoMapaGPS frmMapaGPS = new frmOperacaoMapaGPS();
|
|
||||||
frmMapaGPS.Show();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo) +
|
|
||||||
", é necessário que os seguintes módulos estejam devidamente conectados ao equipamento:\r\n" +
|
|
||||||
"Movimentação: ( " + (MovConectado ? "OK" : " ") + " )\r\n" +
|
|
||||||
"Direcional: ( " + (DirConectado ? "OK" : " ") + " )\r\n" +
|
|
||||||
"Atuador: ( " + (AtuConectado ? "OK" : " ") + " )";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.SeguidorDeLinha)
|
|
||||||
{
|
|
||||||
if (GpsConectado)
|
|
||||||
{
|
|
||||||
frmMovCamera frmCamera = new frmMovCamera();
|
|
||||||
frmCamera.Show();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo) +
|
|
||||||
", é necessário que os seguintes módulos estejam devidamente conectados ao equipamento:\r\n" +
|
|
||||||
"GPS: ( " + (GpsConectado ? "OK" : " ") + " )";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MensagemErro != "")
|
|
||||||
{
|
|
||||||
MessageBox.Show(MensagemErro, "Conexão de módulos pendentes", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
btnIniciarOperacao.Text = "Finalizar Operação";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lblStripOperacao.Text = "Operação: " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo);
|
lblStripOperacao.Text = "Operação: " + Enum.GetName(typeof(ModoOperacao), Variaveis.OperacaoEmAndamento.Modo);
|
||||||
lblStripOperacaoStatus.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Iniciado" : "Não iniciado";
|
lblStripOperacaoStatus.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Iniciado" : "Não iniciado";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnConfigurarOperacao_Click(object sender, EventArgs e)
|
private void btnConfigurarOperacao_Click(object sender, EventArgs e)
|
||||||
|
|
|
||||||
|
|
@ -4,17 +4,69 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace AgroBase.Models
|
namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
public class CameraCaminhoModel
|
public class CameraCaminhoModel
|
||||||
{
|
{
|
||||||
|
public CameraCaminhoModel()
|
||||||
|
{
|
||||||
|
tmrProcesso.Tick += TmrProcesso_Tick;
|
||||||
|
tmrProcesso.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Timer tmrProcesso = new Timer() { Interval = 500 };
|
||||||
|
|
||||||
|
private void TmrProcesso_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (camera._mqttTopico != null)
|
||||||
|
{
|
||||||
|
var Mensagem = camera._mqttTopico.Mensagens.FirstOrDefault(y => y.Momento > camera.IniciadoEm && y.Mensagem == "OK");
|
||||||
|
if (Mensagem != null)
|
||||||
|
{
|
||||||
|
tmrProcesso.Stop();
|
||||||
|
|
||||||
|
camera.ProntoEm = Mensagem.Momento;
|
||||||
|
|
||||||
|
if (browser == null)
|
||||||
|
{
|
||||||
|
Iniciada = true;
|
||||||
|
browser = new ChromiumWebBrowser(camera.URLcamera);
|
||||||
|
panel.Controls.Add(browser);
|
||||||
|
browser.Dock = DockStyle.Fill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DesligarCamera()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Iniciada = false;
|
||||||
|
Variaveis.MqttService.Topicos.Remove(camera._mqttTopico);
|
||||||
|
panel.Controls.Remove(browser);
|
||||||
|
browser = null;
|
||||||
|
Variaveis.MqttService.UnsubscribeAsync(camera._mqttTopico).ConfigureAwait(false);
|
||||||
|
if (camera.pythonProcess != null)
|
||||||
|
{
|
||||||
|
camera.pythonProcess.Kill();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public string Nome { get; set; }
|
public string Nome { get; set; }
|
||||||
public int Posicao { get; set; }
|
public int Posicao { get; set; }
|
||||||
public CameraService<CameraDeepLabV3PlusModel> camera { get; set; }
|
public bool Iniciada { get; set; } = false;
|
||||||
|
public CameraService camera { get; set; }
|
||||||
public ChromiumWebBrowser browser { get; set; }
|
public ChromiumWebBrowser browser { get; set; }
|
||||||
public Panel panel { get; set; }
|
public Panel panel { get; set; }
|
||||||
public ComboBox combo { get; set; }
|
public ComboBox combo { get; set; }
|
||||||
|
|
@ -22,7 +74,7 @@ namespace AgroBase.Models
|
||||||
public int MaxLeituras { get; set; }
|
public int MaxLeituras { get; set; }
|
||||||
public string VideoPorta { get; set; }
|
public string VideoPorta { get; set; }
|
||||||
public string VideoUrl { get; set; }
|
public string VideoUrl { get; set; }
|
||||||
public string SocketPorta { get; set; }
|
public string MqttTopico { get; set; } = "street_detector";
|
||||||
public string CameraSelecionada { get; set; }
|
public string CameraSelecionada { get; set; }
|
||||||
|
|
||||||
public Dictionary<string, Color> ClassMap = new Dictionary<string, Color>()
|
public Dictionary<string, Color> ClassMap = new Dictionary<string, Color>()
|
||||||
|
|
@ -33,7 +85,7 @@ namespace AgroBase.Models
|
||||||
{ "ceu", Color.Gold },
|
{ "ceu", Color.Gold },
|
||||||
};
|
};
|
||||||
|
|
||||||
public List<CameraDeepLabV3PlusModel> Leituras { get; set; } = new List<CameraDeepLabV3PlusModel>();
|
public CameraDeepLabV3PlusModel Leitura { get; set; } = new CameraDeepLabV3PlusModel();
|
||||||
public List<Point> PontosExtremos { get; set; } = new List<Point>();
|
public List<Point> PontosExtremos { get; set; } = new List<Point>();
|
||||||
public double Angulo { get; set; }
|
public double Angulo { get; set; }
|
||||||
public double AnguloEsquerdo { get; set; }
|
public double AnguloEsquerdo { get; set; }
|
||||||
|
|
@ -110,5 +162,8 @@ namespace AgroBase.Models
|
||||||
return Pontos;
|
return Pontos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ namespace AgroBase.Models
|
||||||
public double timestamp { get; set; }
|
public double timestamp { get; set; }
|
||||||
public double x_max { get; set; }
|
public double x_max { get; set; }
|
||||||
public double y_max { get; set; }
|
public double y_max { get; set; }
|
||||||
public CameraCoordenadasObjetoModel[] objetos { get; set; }
|
public CameraCoordenadasObjetoModel[] objetos { get; set; } = new List<CameraCoordenadasObjetoModel>().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CameraCoordenadasObjetoModel
|
public class CameraCoordenadasObjetoModel
|
||||||
|
|
@ -46,7 +46,7 @@ namespace AgroBase.Models
|
||||||
public class CameraDeepLabV3PlusModel
|
public class CameraDeepLabV3PlusModel
|
||||||
{
|
{
|
||||||
public double timestamp { get; set; }
|
public double timestamp { get; set; }
|
||||||
public List<CameraDeepLabV3PlusClasseModel> Classes { get; set; }
|
public List<CameraDeepLabV3PlusClasseModel> Classes { get; set; } = new List<CameraDeepLabV3PlusClasseModel>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CameraDeepLabV3PlusClasseModel
|
public class CameraDeepLabV3PlusClasseModel
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,70 @@
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
using CefSharp.WinForms;
|
using CefSharp.WinForms;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace AgroBase.Models
|
namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
public class CameraSoloModel
|
public class CameraSoloModel
|
||||||
{
|
{
|
||||||
|
public CameraSoloModel()
|
||||||
|
{
|
||||||
|
tmrProcesso.Tick += TmrProcesso_Tick;
|
||||||
|
tmrProcesso.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Timer tmrProcesso = new Timer() { Interval = 500 };
|
||||||
|
|
||||||
|
private void TmrProcesso_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (camera._mqttTopico != null )
|
||||||
|
{
|
||||||
|
var Mensagem = camera._mqttTopico.Mensagens.FirstOrDefault(y => y.Momento > camera.IniciadoEm && y.Mensagem == "OK");
|
||||||
|
if (Mensagem != null)
|
||||||
|
{
|
||||||
|
tmrProcesso.Stop();
|
||||||
|
|
||||||
|
camera.ProntoEm = Mensagem.Momento;
|
||||||
|
|
||||||
|
if (browser == null)
|
||||||
|
{
|
||||||
|
Iniciada = true;
|
||||||
|
browser = new ChromiumWebBrowser(camera.URLcamera);
|
||||||
|
panel.Controls.Add(browser);
|
||||||
|
browser.Dock = DockStyle.Fill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DesligarCamera()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Iniciada = false;
|
||||||
|
Variaveis.MqttService.Topicos.Remove(camera._mqttTopico);
|
||||||
|
panel.Controls.Remove(browser);
|
||||||
|
browser = null;
|
||||||
|
Variaveis.MqttService.UnsubscribeAsync(camera._mqttTopico).ConfigureAwait(false);
|
||||||
|
if (camera.pythonProcess != null)
|
||||||
|
{
|
||||||
|
camera.pythonProcess.Kill();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public string Nome { get; set; }
|
public string Nome { get; set; }
|
||||||
public int Posicao { get; set; }
|
public int Posicao { get; set; }
|
||||||
public CameraService<CameraCoordenadasFrameModel> camera { get; set; }
|
public bool Iniciada { get; set; } = false;
|
||||||
|
public CameraService camera { get; set; }
|
||||||
public ChromiumWebBrowser browser { get; set; }
|
public ChromiumWebBrowser browser { get; set; }
|
||||||
public Panel panel { get;set; }
|
public Panel panel { get;set; }
|
||||||
public ComboBox combo { get;set; }
|
public ComboBox combo { get;set; }
|
||||||
|
|
@ -21,9 +72,13 @@ namespace AgroBase.Models
|
||||||
public int MaxLeituras { get; set; }
|
public int MaxLeituras { get; set; }
|
||||||
public string VideoPorta { get; set; }
|
public string VideoPorta { get; set; }
|
||||||
public string VideoUrl { get; set; }
|
public string VideoUrl { get; set; }
|
||||||
public string SocketPorta { get; set; }
|
public string MqttTopico { get; set; } = "weed_detector";
|
||||||
public string CameraSelecionada { get; set; }
|
public string CameraSelecionada { get; set; }
|
||||||
|
public CameraCoordenadasFrameModel Leitura { get; set; } = new CameraCoordenadasFrameModel();
|
||||||
|
|
||||||
public int ErvasNoRadar { get; set; }
|
public int ErvasNoRadar { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -136,5 +136,13 @@ namespace AgroBase.Models
|
||||||
Volta
|
Volta
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum ParametrosOperacao
|
||||||
|
{
|
||||||
|
CameraSolo,
|
||||||
|
CameraCaminho,
|
||||||
|
Mapa,
|
||||||
|
Joystick
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
using AgroBase.Properties;
|
using AgroBase.Properties;
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
using CefSharp.WinForms;
|
using CefSharp.WinForms;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
@ -57,6 +58,7 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
((Timer)sender).Stop();
|
((Timer)sender).Stop();
|
||||||
picLoading.Visible = false;
|
picLoading.Visible = false;
|
||||||
|
mapaService.Carregado = true;
|
||||||
|
|
||||||
if (mapaService.NomeArquivoMapa == MapasVariaveisModel.NomeArquivoMapaInterativo)
|
if (mapaService.NomeArquivoMapa == MapasVariaveisModel.NomeArquivoMapaInterativo)
|
||||||
{
|
{
|
||||||
|
|
@ -127,7 +129,7 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
private void IniciarProcessamento()
|
private void IniciarProcessamento()
|
||||||
{
|
{
|
||||||
APIService.Inicializar();
|
//APIService.Inicializar();
|
||||||
GPSService.IniciarRecepcaoDados();
|
GPSService.IniciarRecepcaoDados();
|
||||||
|
|
||||||
chromiumWebBrowser = new ChromiumWebBrowser(mapaService.MapaUrl);
|
chromiumWebBrowser = new ChromiumWebBrowser(mapaService.MapaUrl);
|
||||||
|
|
@ -140,6 +142,8 @@ namespace AgroBase.Models
|
||||||
APIService.Parar();
|
APIService.Parar();
|
||||||
GPSService.PararRecepcaoDados();
|
GPSService.PararRecepcaoDados();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MapaFeatureCollectionModel
|
public class MapaFeatureCollectionModel
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ namespace AgroBase.Models.Modules
|
||||||
public static List<PinoutModel> Pinout { get; set; }
|
public static List<PinoutModel> Pinout { get; set; }
|
||||||
public static List<FuncoesPinout> Funcoes { get; set; } = new List<FuncoesPinout>() { FuncoesPinout.Geral };
|
public static List<FuncoesPinout> Funcoes { get; set; } = new List<FuncoesPinout>() { FuncoesPinout.Geral };
|
||||||
public int QuantidadeBicos { get; set; } = 10;
|
public int QuantidadeBicos { get; set; } = 10;
|
||||||
public double DensidadeHerbicida { get; set; }
|
public double DensidadeHerbicida { get; set; } = 1.1;
|
||||||
public double CapacidadeReservatorio { get; set; } = 30;
|
public double CapacidadeReservatorio { get; set; } = 30;
|
||||||
public bool AtuacaoNivelAlto { get; set; } = true;
|
public bool AtuacaoNivelAlto { get; set; } = true;
|
||||||
public List<AtuadorBicoModel> BicosPulverizadores { get; set; } = new List<AtuadorBicoModel>();
|
public List<AtuadorBicoModel> BicosPulverizadores { get; set; } = new List<AtuadorBicoModel>();
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ using static AgroBase.Models.Enuns;
|
||||||
|
|
||||||
namespace AgroBase.Models.Modules
|
namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
class SensoriamentoModel : DispositivoBaseModel
|
public class SensoriamentoModel : DispositivoBaseModel
|
||||||
{
|
{
|
||||||
public static int _TaxaAmostragem { get; set; } = 500;
|
public static int _TaxaAmostragem { get; set; } = 500;
|
||||||
public bool Conectado { get; set; } = false;
|
public bool Conectado { get; set; } = false;
|
||||||
|
|
@ -416,6 +416,10 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
frmInstancial.frmAcompanhamento.AtualizarSensores("Tensão atual: " + tensao.ToString("0.00") + "V - Mín: " + Sensor.ValorMinimo.ToString("0.00") + "V - Máx: " + Sensor.ValorMaximo.ToString("0.00") + "V");
|
frmInstancial.frmAcompanhamento.AtualizarSensores("Tensão atual: " + tensao.ToString("0.00") + "V - Mín: " + Sensor.ValorMinimo.ToString("0.00") + "V - Máx: " + Sensor.ValorMaximo.ToString("0.00") + "V");
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria = (tensao / Sensor.LimiteMaximo) * 100;
|
Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria = (tensao / Sensor.LimiteMaximo) * 100;
|
||||||
|
if (Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria < 0)
|
||||||
|
{
|
||||||
|
Variaveis.OperacaoEmAndamento.Sensoriamento.PorcentagemBateria = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AtualizaGrafico = true;
|
AtualizaGrafico = true;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ using AgroBase.Forms;
|
||||||
using AgroBase.Forms.Operacoes;
|
using AgroBase.Forms.Operacoes;
|
||||||
using AgroBase.Models.Modules;
|
using AgroBase.Models.Modules;
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
|
using CefSharp.DevTools.Network;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
@ -18,14 +19,15 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
public OperacaoModel(ModoOperacao Modo, DispositivosService<MovimentacaoModel> Mov = null, DispositivosService<DirecionalModel> Dir = null, DispositivosService<AtuadorModel> Atu = null)
|
public OperacaoModel(ModoOperacao Modo, DispositivosService<MovimentacaoModel> Mov = null, DispositivosService<DirecionalModel> Dir = null, DispositivosService<AtuadorModel> Atu = null)
|
||||||
{
|
{
|
||||||
if (APIService.pythonProcess == null)
|
/*if (APIService.pythonProcess == null)
|
||||||
{
|
{
|
||||||
APIService.Inicializar();
|
APIService.Inicializar();
|
||||||
}
|
}*/
|
||||||
|
|
||||||
this.Modo = Modo;
|
this.Modo = Modo;
|
||||||
this.Controle = new OperacaoControleModel()
|
this.Controle = new OperacaoControleModel()
|
||||||
{
|
{
|
||||||
|
PIDdirecional = new PIDModel(),
|
||||||
TiposControle = new List<OperacaoControleTipoModel>()
|
TiposControle = new List<OperacaoControleTipoModel>()
|
||||||
{
|
{
|
||||||
new OperacaoControleTipoModel()
|
new OperacaoControleTipoModel()
|
||||||
|
|
@ -67,45 +69,110 @@ namespace AgroBase.Models
|
||||||
}
|
}
|
||||||
this.tmrLogs.Tick -= TmrLogs_Tick;
|
this.tmrLogs.Tick -= TmrLogs_Tick;
|
||||||
this.tmrLogs.Tick += TmrLogs_Tick;
|
this.tmrLogs.Tick += TmrLogs_Tick;
|
||||||
this.tmrParametrizacao.Tick -= TmrParametrizacao_Tick;
|
/*this.tmrParametrizacao.Tick -= TmrParametrizacao_Tick;
|
||||||
this.tmrParametrizacao.Tick += TmrParametrizacao_Tick;
|
this.tmrParametrizacao.Tick += TmrParametrizacao_Tick;
|
||||||
|
|
||||||
this.tmrParametrizacao.Start();
|
this.tmrParametrizacao.Start();*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public ModoOperacao Modo { get; set; }
|
public ModoOperacao Modo { get; set; }
|
||||||
|
public DispositivosService<SensoriamentoModel> DispSen { get; set; }
|
||||||
public DispositivosService<MovimentacaoModel> DispMov { get; set; }
|
public DispositivosService<MovimentacaoModel> DispMov { get; set; }
|
||||||
public DispositivosService<DirecionalModel> DispDir { get; set; }
|
public DispositivosService<DirecionalModel> DispDir { get; set; }
|
||||||
public DispositivosService<AtuadorModel> DispAtu { get; set; }
|
public DispositivosService<AtuadorModel> DispAtu { get; set; }
|
||||||
public MapasModel Mapa { get; set; } = new MapasModel();
|
public MapasModel Mapa { get; set; } = new MapasModel();
|
||||||
public Form frmOperacao { get; set; }
|
public Form frmOperacao { get; set; }
|
||||||
|
public bool ModulosConectados
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
ModulosMandatorios.ForEach(Modulo =>
|
||||||
|
{
|
||||||
|
if (Modulo.Dispositivo == T_Code.Gps)
|
||||||
|
{
|
||||||
|
Modulo.Conectado = GPSService.PortaGPS != null && GPSService.PortaGPS.IsOpen;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Modulo.Conectado = Variaveis.DispositivosConectados.Any(x => x.Dispositivo == Modulo.Dispositivo && x._Porta.IsOpen);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
bool _modulosConectados =
|
||||||
|
(ModulosMandatorios.Where(x => x.Mandatorio).All(x => x.Conectado) && ModulosMandatorios.Any(x => x.Mandatorio)) ||
|
||||||
|
(ModulosMandatorios.All(x => !x.Mandatorio) && ModulosMandatorios.Any(x => x.Conectado));
|
||||||
|
|
||||||
|
|
||||||
|
return _modulosConectados;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool OperacaoLiberada
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
bool _operacaoLiberada = ModulosConectados;
|
||||||
|
if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.CameraSolo && x.Mandatorio) && CamerasSolo.Count(x => x.Iniciada) < QuantidadeCamerasSolo) _operacaoLiberada = false;
|
||||||
|
if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.CameraCaminho && x.Mandatorio) && (CameraCaminho == null || !CameraCaminho.Iniciada)) _operacaoLiberada = false;
|
||||||
|
if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Mapa && x.Mandatorio) && !Mapa.mapaService.Carregado) _operacaoLiberada = false;
|
||||||
|
if (ParametrosMandatorios.Any(x => x.Parametro == ParametrosOperacao.Joystick && x.Mandatorio && GeneralJoystick.JoystickConectado == null)) _operacaoLiberada = false;
|
||||||
|
|
||||||
|
if (frmInstancial.frmPrincipal.chbDebugMode.Checked) _operacaoLiberada = true;
|
||||||
|
|
||||||
|
return _operacaoLiberada;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public string ErroOperacaoLiberada
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
string MensagemErro = "Para iniciar a operação " + Enum.GetName(typeof(ModoOperacao), Modo) +
|
||||||
|
", é necessário que todos os módulos mandatórios estejam devidamente conectados ao equipamento, ou pelo menos um dos módulos:\r\n";
|
||||||
|
ModulosMandatorios.ForEach(Modulo =>
|
||||||
|
{
|
||||||
|
MensagemErro += Enum.GetName(typeof(T_Code), Modulo.Dispositivo) + ": ( " + (Modulo.Conectado ? "OK" : " ") + " ) - Mandatório: " + (Modulo.Mandatorio ? "Sim" : "Não") + "\r\n";
|
||||||
|
});
|
||||||
|
return MensagemErro;
|
||||||
|
}
|
||||||
|
}
|
||||||
public string frmOperacaoNome { get; set; }
|
public string frmOperacaoNome { get; set; }
|
||||||
public bool Iniciado { get; set; }
|
public bool Iniciado { get; set; }
|
||||||
public long TimestampInicio { get; set; }
|
public long TimestampInicio { get; set; }
|
||||||
public long TimestampFim { get; set; }
|
public long TimestampFim { get; set; }
|
||||||
public TimeSpan Tempo { get; set; }
|
public TimeSpan Tempo
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return TimeSpan.FromTicks(Variaveis.OperacaoEmAndamento.Iniciado ? ((Variaveis.OperacaoEmAndamento.TimestampFim > 0 ? Variaveis.OperacaoEmAndamento.TimestampFim : DateTime.Now.Ticks) - Variaveis.OperacaoEmAndamento.TimestampInicio) : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public DateTime TempoAguardando { get; set; }
|
||||||
public OperacaoControleModel Controle { get; set; } = new OperacaoControleModel();
|
public OperacaoControleModel Controle { get; set; } = new OperacaoControleModel();
|
||||||
public OperacaoControleModel ControleAnterior { get; set; } = new OperacaoControleModel();
|
public OperacaoControleModel ControleAnterior { get; set; } = new OperacaoControleModel();
|
||||||
public List<OperacaoModulosMandatoriosModel> ModulosMandatorios { get; set; } = new List<OperacaoModulosMandatoriosModel>();
|
public List<OperacaoModulosMandatoriosModel> ModulosMandatorios { get; set; } = new List<OperacaoModulosMandatoriosModel>();
|
||||||
|
public List<OperacaoParametrosMandatoriosModel> ParametrosMandatorios { get; set; } = new List<OperacaoParametrosMandatoriosModel>();
|
||||||
public OperacaoSensoriamentoModel Sensoriamento { get; set; } = new OperacaoSensoriamentoModel();
|
public OperacaoSensoriamentoModel Sensoriamento { get; set; } = new OperacaoSensoriamentoModel();
|
||||||
public List<OperacaoSensoriamentoModel> Logs { get; set; } = new List<OperacaoSensoriamentoModel>();
|
public List<OperacaoSensoriamentoModel> Logs { get; set; } = new List<OperacaoSensoriamentoModel>();
|
||||||
public List<GPSModel> GPSTrajetoria { get; set; } = new List<GPSModel>();
|
public List<GPSModel> GPSTrajetoria { get; set; } = new List<GPSModel>();
|
||||||
public List<List<GPSModel>> GPSTrajetoriaRua { get; set; } = new List<List<GPSModel>>();
|
public List<List<GPSModel>> GPSTrajetoriaRua { get; set; } = new List<List<GPSModel>>();
|
||||||
public OperacaoRefRuaGPS ReferencialRuaGPS { get; set; } = new OperacaoRefRuaGPS();
|
public OperacaoRefRuaGPS ReferencialRuaGPS { get; set; } = new OperacaoRefRuaGPS();
|
||||||
|
public int QuantidadeCamerasSolo { get; set; } = 2;
|
||||||
|
public List<CameraSoloModel> CamerasSolo { get; set; } = new List<CameraSoloModel>();
|
||||||
|
public CameraCaminhoModel CameraCaminho { get; set; }
|
||||||
public int TempoIniciarOperacao { get; set; } = 10;
|
public int TempoIniciarOperacao { get; set; } = 10;
|
||||||
public string PastaSaida { get; set; } = "Operacoes/";
|
public string PastaSaida { get; } = "Operacoes/";
|
||||||
public string ID { get; set; }
|
public string ID { get; set; }
|
||||||
public Timer tmrLogs = new Timer() { Interval = 5000 };
|
public Timer tmrLogs = new Timer() { Interval = 5000 };
|
||||||
public Timer tmrParametrizacao = new Timer() { Interval = 1000 };
|
public List<StatusOperacao> StatusOperacoesPararCarro { get; set; } = new List<StatusOperacao>() { StatusOperacao.Parametrizando, StatusOperacao.Aguardando, StatusOperacao.Parado, StatusOperacao.Concluida };
|
||||||
|
|
||||||
|
|
||||||
public static OperacaoModel CarregarParametrosOperacaoPadrao(ModoOperacao Modo)
|
public static OperacaoModel CarregarParametrosOperacaoPadrao(ModoOperacao Modo)
|
||||||
{
|
{
|
||||||
var MovConectado = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov && (x._Porta.IsOpen));
|
var SenConectado = (DispositivosService<SensoriamentoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Sen);
|
||||||
var DirConectado = (DispositivosService<DirecionalModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Dir && (x._Porta.IsOpen));
|
var MovConectado = (DispositivosService<MovimentacaoModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Mov);
|
||||||
var AtuConectado = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu && (x._Porta.IsOpen));
|
var DirConectado = (DispositivosService<DirecionalModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Dir);
|
||||||
|
var AtuConectado = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu);
|
||||||
|
|
||||||
OperacaoModel OperacaoCarregar = new OperacaoModel(Modo)
|
OperacaoModel OperacaoCarregar = new OperacaoModel(Modo)
|
||||||
{
|
{
|
||||||
|
|
@ -117,6 +184,7 @@ namespace AgroBase.Models
|
||||||
DispAtu = AtuConectado,
|
DispAtu = AtuConectado,
|
||||||
DispDir = DirConectado,
|
DispDir = DirConectado,
|
||||||
DispMov = MovConectado,
|
DispMov = MovConectado,
|
||||||
|
DispSen = SenConectado,
|
||||||
Sensoriamento = new OperacaoSensoriamentoModel(),
|
Sensoriamento = new OperacaoSensoriamentoModel(),
|
||||||
Logs = new List<OperacaoSensoriamentoModel>(),
|
Logs = new List<OperacaoSensoriamentoModel>(),
|
||||||
};
|
};
|
||||||
|
|
@ -165,6 +233,14 @@ namespace AgroBase.Models
|
||||||
Mandatorio = false,
|
Mandatorio = false,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
OperacaoCarregar.ParametrosMandatorios = new List<OperacaoParametrosMandatoriosModel>()
|
||||||
|
{
|
||||||
|
new OperacaoParametrosMandatoriosModel()
|
||||||
|
{
|
||||||
|
Parametro = ParametrosOperacao.Joystick,
|
||||||
|
Mandatorio = false,
|
||||||
|
}
|
||||||
|
};
|
||||||
break;
|
break;
|
||||||
case ModoOperacao.MapaGPS:
|
case ModoOperacao.MapaGPS:
|
||||||
OperacaoCarregar.frmOperacao = new frmOperacaoMapaGPS();
|
OperacaoCarregar.frmOperacao = new frmOperacaoMapaGPS();
|
||||||
|
|
@ -228,6 +304,24 @@ namespace AgroBase.Models
|
||||||
Mandatorio = false,
|
Mandatorio = false,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
OperacaoCarregar.ParametrosMandatorios = new List<OperacaoParametrosMandatoriosModel>()
|
||||||
|
{
|
||||||
|
new OperacaoParametrosMandatoriosModel()
|
||||||
|
{
|
||||||
|
Parametro = ParametrosOperacao.CameraSolo,
|
||||||
|
Mandatorio = true,
|
||||||
|
},
|
||||||
|
new OperacaoParametrosMandatoriosModel()
|
||||||
|
{
|
||||||
|
Parametro = ParametrosOperacao.CameraCaminho,
|
||||||
|
Mandatorio = true,
|
||||||
|
},
|
||||||
|
new OperacaoParametrosMandatoriosModel()
|
||||||
|
{
|
||||||
|
Parametro = ParametrosOperacao.Mapa,
|
||||||
|
Mandatorio = true,
|
||||||
|
}
|
||||||
|
};
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -246,9 +340,10 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
Operacao.frmOperacaoNome = Operacao.frmOperacao.Name;
|
Operacao.frmOperacaoNome = Operacao.frmOperacao.Name;
|
||||||
Form frm = Operacao.frmOperacao;
|
Form frm = Operacao.frmOperacao;
|
||||||
|
|
||||||
Operacao.frmOperacao = null;
|
Operacao.frmOperacao = null;
|
||||||
|
|
||||||
File.WriteAllText("operacao" + Enum.GetName(typeof(ModoOperacao), Operacao.Modo) + ".opr", JsonConvert.SerializeObject(Operacao));
|
//File.WriteAllText("operacao" + Enum.GetName(typeof(ModoOperacao), Operacao.Modo) + ".opr", JsonConvert.SerializeObject(Operacao));
|
||||||
|
|
||||||
Operacao.frmOperacao = frm;
|
Operacao.frmOperacao = frm;
|
||||||
}
|
}
|
||||||
|
|
@ -257,6 +352,8 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
string modoOpStr = nomeArquivo.Split('\\')[nomeArquivo.Split('\\').Length - 1].Replace("operacao", "").Split('.')[0];
|
string modoOpStr = nomeArquivo.Split('\\')[nomeArquivo.Split('\\').Length - 1].Replace("operacao", "").Split('.')[0];
|
||||||
ModoOperacao modo = (ModoOperacao)Enum.Parse(typeof(ModoOperacao), modoOpStr);
|
ModoOperacao modo = (ModoOperacao)Enum.Parse(typeof(ModoOperacao), modoOpStr);
|
||||||
|
return CarregarParametrosOperacaoPadrao(modo);
|
||||||
|
|
||||||
OperacaoModel Operacao = new OperacaoModel(modo);
|
OperacaoModel Operacao = new OperacaoModel(modo);
|
||||||
if (!File.Exists(nomeArquivo))
|
if (!File.Exists(nomeArquivo))
|
||||||
{
|
{
|
||||||
|
|
@ -281,6 +378,7 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
Iniciado = true;
|
Iniciado = true;
|
||||||
TimestampInicio = DateTime.Now.Ticks;
|
TimestampInicio = DateTime.Now.Ticks;
|
||||||
|
TempoAguardando = DateTime.Now;
|
||||||
TimestampFim = 0;
|
TimestampFim = 0;
|
||||||
Mapa.IdxRuaAtual = 0;
|
Mapa.IdxRuaAtual = 0;
|
||||||
if (DispMov != null)
|
if (DispMov != null)
|
||||||
|
|
@ -306,17 +404,26 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
//Controle = new OperacaoControleModel();
|
//Controle = new OperacaoControleModel();
|
||||||
//ControleAnterior = new OperacaoControleModel();
|
//ControleAnterior = new OperacaoControleModel();
|
||||||
|
Controle.PIDdirecional = new PIDModel()
|
||||||
|
{
|
||||||
|
LimiteSaida = Controle.Angulo_Max,
|
||||||
|
SetPoint = 0,
|
||||||
|
Kp = 1.0,
|
||||||
|
Ki = 0.1,
|
||||||
|
Kd = 0.01,
|
||||||
|
};
|
||||||
if (controle != null)
|
if (controle != null)
|
||||||
{
|
{
|
||||||
Controle = controle;
|
Controle = controle;
|
||||||
}
|
}
|
||||||
if (DaIHM)
|
if (DaIHM)
|
||||||
{
|
{
|
||||||
|
frmOperacao = new frmOperacaoMapaGPS();
|
||||||
frmOperacao.Show();
|
frmOperacao.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
tmrLogs.Start();
|
tmrLogs.Start();
|
||||||
tmrParametrizacao.Stop();
|
//tmrParametrizacao.Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FinalizarOperacao()
|
public void FinalizarOperacao()
|
||||||
|
|
@ -329,7 +436,7 @@ namespace AgroBase.Models
|
||||||
TimestampFim = DateTime.Now.Ticks;
|
TimestampFim = DateTime.Now.Ticks;
|
||||||
|
|
||||||
tmrLogs.Stop();
|
tmrLogs.Stop();
|
||||||
tmrParametrizacao.Start();
|
//tmrParametrizacao.Start();
|
||||||
|
|
||||||
SalvarLog(true);
|
SalvarLog(true);
|
||||||
|
|
||||||
|
|
@ -368,7 +475,7 @@ namespace AgroBase.Models
|
||||||
ControleAtu.UltimoComando = Agora;
|
ControleAtu.UltimoComando = Agora;
|
||||||
ControleAtu.Comandos.AddRange(Protocolos);
|
ControleAtu.Comandos.AddRange(Protocolos);
|
||||||
|
|
||||||
ControleAnterior.BicosAtuados = Controle.BicosAtuados.ToList();
|
ControleAnterior.BicosAtuados = new List<AtuadorBicoModel>(Controle.BicosAtuados);
|
||||||
}
|
}
|
||||||
|
|
||||||
AtualizarDadosOperacao();
|
AtualizarDadosOperacao();
|
||||||
|
|
@ -382,9 +489,14 @@ namespace AgroBase.Models
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
Sensoriamento.ErvasIdentificadas = Sensoriamento.AtuacoesPorBico.Sum();
|
||||||
Sensoriamento.VelocidadeMedia = DispMov.Dados.Motores.Average(x => x.VelocidadeInstantanea);
|
Sensoriamento.VelocidadeMedia = DispMov.Dados.Motores.Average(x => x.VelocidadeInstantanea);
|
||||||
//Sensoriamento.DistanciaPercorrida = DispMov.Dados.DistanciaPercorridaOperacao;
|
//Sensoriamento.DistanciaPercorrida = DispMov.Dados.DistanciaPercorridaOperacao;
|
||||||
Sensoriamento.ProgressoTrajeto = Mapa == null ? 0 : Sensoriamento.DistanciaPercorrida.Sum() / Mapa.DistanciaTotal * 100;
|
Sensoriamento.ProgressoTrajeto = Mapa.mapaService.pythonProcess == null ? 0 : Sensoriamento.DistanciaPercorrida.Sum() / Mapa.DistanciaTotal * 100;
|
||||||
|
if (Sensoriamento.ProgressoTrajeto < 0 && Sensoriamento.ProgressoTrajeto >= 0)
|
||||||
|
{
|
||||||
|
Sensoriamento.ProgressoTrajeto = 0;
|
||||||
|
}
|
||||||
Sensoriamento.ProgressoRua =
|
Sensoriamento.ProgressoRua =
|
||||||
Mapa == null ? 0 :
|
Mapa == null ? 0 :
|
||||||
(ReferencialRuaGPS.Direcao == DirecaoCarroRua.Ida ? ((double)ReferencialRuaGPS.IdxPontoAproximadoRua / (double)(Mapa.Trajetoria[Mapa.IdxRuaAtual].Count - 1)) :
|
(ReferencialRuaGPS.Direcao == DirecaoCarroRua.Ida ? ((double)ReferencialRuaGPS.IdxPontoAproximadoRua / (double)(Mapa.Trajetoria[Mapa.IdxRuaAtual].Count - 1)) :
|
||||||
|
|
@ -528,67 +640,83 @@ namespace AgroBase.Models
|
||||||
GPSTrajetoriaRua[Mapa.IdxRuaAtual].Add(GPSTrajetoria[GPSTrajetoria.Count - 1]);
|
GPSTrajetoriaRua[Mapa.IdxRuaAtual].Add(GPSTrajetoria[GPSTrajetoria.Count - 1]);
|
||||||
if (GPSTrajetoria.Count > 1)
|
if (GPSTrajetoria.Count > 1)
|
||||||
{
|
{
|
||||||
if (ReferencialRuaGPS.DentroDaRua || true)
|
if (Sensoriamento.DistanciaPercorrida.Count - 1 < Mapa.IdxRuaAtual)
|
||||||
{
|
{
|
||||||
if (Sensoriamento.DistanciaPercorrida.Count - 1 < Mapa.IdxRuaAtual)
|
Sensoriamento.DistanciaPercorrida.Add(0);
|
||||||
{
|
|
||||||
Sensoriamento.DistanciaPercorrida.Add(0);
|
|
||||||
}
|
|
||||||
Sensoriamento.DistanciaPercorrida[Mapa.IdxRuaAtual] += GPSService.DistanciaEntrePontos(GPSTrajetoria[GPSTrajetoria.Count - 1], GPSTrajetoria[GPSTrajetoria.Count - 2]);
|
|
||||||
//Sensoriamento.DistanciaPercorrida[Mapa.IdxRuaAtual] = GPSService.DistanciaEntrePontos(Mapa.Trajetoria[Mapa.IdxRuaAtual][0], Mapa.Trajetoria[Mapa.IdxRuaAtual][ReferencialRuaGPS.IdxPontoAproximadoRua]);
|
|
||||||
}
|
}
|
||||||
|
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));
|
File.WriteAllText(PastaSaida + ID + "/trajetoria.json", JsonConvert.SerializeObject(GPSTrajetoria, Formatting.None));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void AtualizarControleAtuadores()
|
||||||
public void CalculaDadosMovimentacaoAutonoma()
|
|
||||||
{
|
{
|
||||||
#region Calculo do angulo de inclinacao
|
Controle.BicosAtuados = DispAtu.Dados.BicosPulverizadores;
|
||||||
double Angulo = 0;
|
}
|
||||||
|
|
||||||
|
public void CalcularAnguloInclinacao()
|
||||||
|
{
|
||||||
|
double erroOrientacao = 0.0;
|
||||||
double anguloCarro = ReferencialRuaGPS.AnguloCarro;
|
double anguloCarro = ReferencialRuaGPS.AnguloCarro;
|
||||||
double anguloOposto = (anguloCarro + 180) % 360;
|
double anguloOposto = (anguloCarro + 180) % 360;
|
||||||
double anguloRua = ReferencialRuaGPS.AnguloRua;
|
double anguloRua = ReferencialRuaGPS.AnguloRua;
|
||||||
|
double anguloCamera = Sensoriamento.AnguloRuaCamera;
|
||||||
|
|
||||||
|
// Calcula o erro de orientação
|
||||||
if ((anguloCarro + ReferencialRuaGPS.MargemErroAngulo) >= anguloRua && (anguloCarro - ReferencialRuaGPS.MargemErroAngulo) <= anguloRua)
|
if ((anguloCarro + ReferencialRuaGPS.MargemErroAngulo) >= anguloRua && (anguloCarro - ReferencialRuaGPS.MargemErroAngulo) <= anguloRua)
|
||||||
{
|
{
|
||||||
Angulo = anguloCarro - ReferencialRuaGPS.AnguloRua;
|
erroOrientacao = anguloCarro - anguloRua;
|
||||||
}
|
}
|
||||||
else if ((anguloOposto + ReferencialRuaGPS.MargemErroAngulo) >= anguloRua && (anguloOposto - ReferencialRuaGPS.MargemErroAngulo) <= anguloRua)
|
else if ((anguloOposto + ReferencialRuaGPS.MargemErroAngulo) >= anguloRua && (anguloOposto - ReferencialRuaGPS.MargemErroAngulo) <= anguloRua)
|
||||||
{
|
{
|
||||||
Angulo = anguloOposto - ReferencialRuaGPS.AnguloRua;
|
erroOrientacao = anguloOposto - anguloRua;
|
||||||
}
|
}
|
||||||
Sensoriamento.AnguloDif = Angulo;
|
Sensoriamento.AnguloDif = erroOrientacao;
|
||||||
|
|
||||||
Controle.Angulo =
|
// Assume-se que o anguloCamera reflete o desvio lateral.
|
||||||
Angulo > Controle.Angulo_Max ? Controle.Angulo_Max :
|
// Isso pode precisar de ajuste dependendo de como o ângulo é medido.
|
||||||
Angulo < Controle.Angulo_Min ? Controle.Angulo_Min :
|
double erroPosicaoLateral = anguloCamera;
|
||||||
Angulo;
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
if (ReferencialRuaGPS.StatusAtual == StatusOperacao.Aguardando || ReferencialRuaGPS.StatusAtual == StatusOperacao.Concluida)
|
// Combina os erros. Ajuste os pesos conforme necessário para o seu caso específico.
|
||||||
|
double pesoOrientacao = 0.3;
|
||||||
|
double pesoPosicaoLateral = 0.7;
|
||||||
|
double erroCombinado = (erroOrientacao * pesoOrientacao) + (erroPosicaoLateral * pesoPosicaoLateral);
|
||||||
|
|
||||||
|
var statusAtual = ReferencialRuaGPS.StatusAtual;
|
||||||
|
// Atualiza o PID com o erro combinado
|
||||||
|
if (!StatusOperacoesPararCarro.Contains(statusAtual) && statusAtual != StatusOperacao.Manobrando)
|
||||||
{
|
{
|
||||||
var BicosNaoAtuados = new List<AtuadorBicoModel>();
|
Controle.PIDdirecional.Atualizar(erroCombinado);
|
||||||
DispAtu.Dados.BicosPulverizadores.ForEach(x =>
|
}
|
||||||
{
|
double correcaoAngulo = Controle.PIDdirecional.Saida;
|
||||||
BicosNaoAtuados.Add(x);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
// Aplica a correção. Isso pode incluir limites para evitar comandos excessivos.
|
||||||
|
Controle.Angulo = correcaoAngulo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CalculaDadosMovimentacaoAutonoma()
|
||||||
|
{
|
||||||
|
CalcularAnguloInclinacao();
|
||||||
|
|
||||||
|
var statusAtual = ReferencialRuaGPS.StatusAtual;
|
||||||
|
|
||||||
|
if (StatusOperacoesPararCarro.Contains(statusAtual))
|
||||||
|
{
|
||||||
|
var BicosNaoAtuados = new List<AtuadorBicoModel>(DispAtu.Dados.BicosPulverizadores);
|
||||||
Controle.BicosAtuados = BicosNaoAtuados.ToList();
|
Controle.BicosAtuados = BicosNaoAtuados.ToList();
|
||||||
Controle.RPM = 0;
|
Controle.RPM = 0;
|
||||||
Controle.Angulo = 0;
|
Controle.Angulo = 0;
|
||||||
}
|
}
|
||||||
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.EntrandoRua)
|
else if (statusAtual == StatusOperacao.EntrandoRua)
|
||||||
{
|
{
|
||||||
Controle.RPM = Controle.RPM_Min;
|
Controle.RPM = Controle.RPM_Min;
|
||||||
}
|
}
|
||||||
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.SaindoRua)
|
else if (statusAtual == StatusOperacao.SaindoRua)
|
||||||
{
|
{
|
||||||
Controle.RPM = Controle.RPM_Min;
|
Controle.RPM = Controle.RPM_Min;
|
||||||
}
|
}
|
||||||
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.CaminhandoRua)
|
else if (statusAtual == StatusOperacao.CaminhandoRua)
|
||||||
{
|
{
|
||||||
if (Sensoriamento.ErvasNoRadar == 0)
|
if (Sensoriamento.ErvasNoRadar == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -605,7 +733,7 @@ namespace AgroBase.Models
|
||||||
Controle.RPM = Controle.RPM_Min;
|
Controle.RPM = Controle.RPM_Min;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ReferencialRuaGPS.StatusAtual == StatusOperacao.Manobrando)
|
else if (statusAtual == StatusOperacao.Manobrando)
|
||||||
{
|
{
|
||||||
Controle.RPM = 0;
|
Controle.RPM = 0;
|
||||||
CalcularManobra();
|
CalcularManobra();
|
||||||
|
|
@ -625,14 +753,25 @@ namespace AgroBase.Models
|
||||||
SalvarLog(false);
|
SalvarLog(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TmrParametrizacao_Tick(object sender, EventArgs e)
|
public void AtualizarRuasSelecionadas()
|
||||||
{
|
{
|
||||||
if (Mapa != null)
|
List<string> ids = new List<string>();
|
||||||
|
var Topico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa);
|
||||||
|
var Mensagem = Topico.Mensagens.LastOrDefault();
|
||||||
|
if (Mensagem != null && !Mensagem.Mensagem.Contains("[]"))
|
||||||
{
|
{
|
||||||
APIService.AtualizarRuasSelecionadas();
|
Mensagem.Mensagem = Mensagem.Mensagem.Replace("\n", "");
|
||||||
|
Mensagem.Mensagem = Mensagem.Mensagem.Replace("\"", "");
|
||||||
|
ids = JsonConvert.DeserializeObject<int[]>(Mensagem.Mensagem).Select(x => x.ToString()).ToList();
|
||||||
|
}
|
||||||
|
if (ids.Count != Mapa.RuasPercorrer.Count)
|
||||||
|
{
|
||||||
|
Mapa.RuasPercorrer = ids;
|
||||||
|
Mapa.PopularTrajetoria();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class OperacaoControleModel
|
public class OperacaoControleModel
|
||||||
|
|
@ -641,14 +780,15 @@ namespace AgroBase.Models
|
||||||
public int RPM_Min { get; set; } = 15;
|
public int RPM_Min { get; set; } = 15;
|
||||||
public double Angulo_Max { get; set; } = 30;
|
public double Angulo_Max { get; set; } = 30;
|
||||||
public double Angulo_Min { get; set; } = -30;
|
public double Angulo_Min { get; set; } = -30;
|
||||||
|
public double VelocidadeMP { get; set; } = 50;
|
||||||
|
|
||||||
public double Angulo { get; set; } = 0;
|
public double Angulo { get; set; } = 0;
|
||||||
public int RPM { get; set; } = 0;
|
public int RPM { get; set; } = 0;
|
||||||
public Direcao Direcao { get; set; } = Direcao.Parado;
|
public Direcao Direcao { get; set; } = Direcao.Parado;
|
||||||
public double VelocidadeMP { get; set; } = 50;
|
|
||||||
public List<AtuadorBicoModel> BicosAtuados { get; set; } = new List<AtuadorBicoModel>();
|
public List<AtuadorBicoModel> BicosAtuados { get; set; } = new List<AtuadorBicoModel>();
|
||||||
|
|
||||||
public List<OperacaoControleTipoModel> TiposControle { get; set; }
|
public List<OperacaoControleTipoModel> TiposControle { get; set; }
|
||||||
|
public PIDModel PIDdirecional { get; set; } = new PIDModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class OperacaoControleTipoModel
|
public class OperacaoControleTipoModel
|
||||||
|
|
@ -667,6 +807,14 @@ namespace AgroBase.Models
|
||||||
public bool Conectado { get; set; }
|
public bool Conectado { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class OperacaoParametrosMandatoriosModel
|
||||||
|
{
|
||||||
|
public ParametrosOperacao Parametro { get; set; }
|
||||||
|
public bool Mandatorio { get; set; }
|
||||||
|
public bool Utilizar { get; set; }
|
||||||
|
public bool Pronto { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class OperacaoSensoriamentoModel
|
public class OperacaoSensoriamentoModel
|
||||||
{
|
{
|
||||||
public DateTime Momento { get; set; }
|
public DateTime Momento { get; set; }
|
||||||
|
|
@ -699,11 +847,13 @@ namespace AgroBase.Models
|
||||||
{
|
{
|
||||||
public bool ManobraConcluida { get; set; } = false;
|
public bool ManobraConcluida { get; set; } = false;
|
||||||
private StatusOperacao _EtapaAtual;
|
private StatusOperacao _EtapaAtual;
|
||||||
|
private StatusOperacao _EtapaAnteriorParada = StatusOperacao.Parado;
|
||||||
public StatusOperacao StatusAtual
|
public StatusOperacao StatusAtual
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
StatusOperacao etapaAtual = _EtapaAtual;
|
StatusOperacao etapaAtual = _EtapaAtual;
|
||||||
|
|
||||||
// Se a operação não estiver iniciada
|
// Se a operação não estiver iniciada
|
||||||
if (!Variaveis.OperacaoEmAndamento.Iniciado)
|
if (!Variaveis.OperacaoEmAndamento.Iniciado)
|
||||||
{
|
{
|
||||||
|
|
@ -716,16 +866,37 @@ namespace AgroBase.Models
|
||||||
// Operação em andamento
|
// Operação em andamento
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Se a operação tiver algum item mandatório interrompido
|
||||||
|
if (!Variaveis.OperacaoEmAndamento.OperacaoLiberada)
|
||||||
|
{
|
||||||
|
// Da primeira vez, salva a etapa atual anterior à parada para possível retomada
|
||||||
|
if (etapaAtual != StatusOperacao.Parado)
|
||||||
|
{
|
||||||
|
_EtapaAnteriorParada = etapaAtual;
|
||||||
|
}
|
||||||
|
etapaAtual = StatusOperacao.Parado;
|
||||||
|
}
|
||||||
|
// Se a etapa atual for parado, mas a operação foi liberada, retoma de onde parou
|
||||||
|
else if (etapaAtual == StatusOperacao.Parado && Variaveis.OperacaoEmAndamento.OperacaoLiberada)
|
||||||
|
{
|
||||||
|
Variaveis.OperacaoEmAndamento.TempoAguardando = DateTime.Now;
|
||||||
|
etapaAtual = StatusOperacao.Aguardando;
|
||||||
|
}
|
||||||
// Etapa atual é finalizada, então finaliza a operação
|
// Etapa atual é finalizada, então finaliza a operação
|
||||||
if (_EtapaAtual == StatusOperacao.Concluida)
|
else if (_EtapaAtual == StatusOperacao.Concluida)
|
||||||
{
|
{
|
||||||
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
Variaveis.OperacaoEmAndamento.FinalizarOperacao();
|
||||||
}
|
}
|
||||||
// Contagem regressiva para iniciar a operação
|
// Contagem regressiva para iniciar a operação
|
||||||
else if (Variaveis.OperacaoEmAndamento.Tempo.Minutes == 0 && Variaveis.OperacaoEmAndamento.Tempo.Seconds < Variaveis.OperacaoEmAndamento.TempoIniciarOperacao)
|
else if (Variaveis.OperacaoEmAndamento.TempoAguardando.AddSeconds(Variaveis.OperacaoEmAndamento.TempoIniciarOperacao) > DateTime.Now)
|
||||||
{
|
{
|
||||||
etapaAtual = StatusOperacao.Aguardando;
|
etapaAtual = StatusOperacao.Aguardando;
|
||||||
}
|
}
|
||||||
|
else if (_EtapaAnteriorParada != StatusOperacao.Parado)
|
||||||
|
{
|
||||||
|
etapaAtual = _EtapaAnteriorParada;
|
||||||
|
_EtapaAnteriorParada = StatusOperacao.Parado;
|
||||||
|
}
|
||||||
// Robô está manobrando para seguir a próxima rota do mapa
|
// Robô está manobrando para seguir a próxima rota do mapa
|
||||||
else if (_EtapaAtual == StatusOperacao.Manobrando)
|
else if (_EtapaAtual == StatusOperacao.Manobrando)
|
||||||
{
|
{
|
||||||
|
|
@ -798,7 +969,8 @@ namespace AgroBase.Models
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
double somaAngulo = 0;
|
double somaAngulo = 0;
|
||||||
var Pontos = Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].Count > PontosConsiderarAngulo ?
|
var Pontos = !Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua.Any() ? new List<GPSModel>() :
|
||||||
|
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].Count > PontosConsiderarAngulo ?
|
||||||
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() :
|
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() :
|
||||||
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).ToList();
|
Variaveis.OperacaoEmAndamento.GPSTrajetoriaRua[Variaveis.OperacaoEmAndamento.Mapa.IdxRuaAtual].OrderByDescending(x => x.DataHora).ToList();
|
||||||
Pontos = Pontos.OrderBy(x => x.DataHora).ToList();
|
Pontos = Pontos.OrderBy(x => x.DataHora).ToList();
|
||||||
|
|
@ -828,7 +1000,7 @@ namespace AgroBase.Models
|
||||||
|
|
||||||
var PontosRua = IdxPontoAproximadoRua + PontosConsiderarAngulo < Rua.Count ?
|
var PontosRua = IdxPontoAproximadoRua + PontosConsiderarAngulo < Rua.Count ?
|
||||||
Rua.Skip(IdxPontoAproximadoRua).Take(PontosConsiderarAngulo).ToList() :
|
Rua.Skip(IdxPontoAproximadoRua).Take(PontosConsiderarAngulo).ToList() :
|
||||||
Rua.Skip(PontosConsiderarAngulo).Take(IdxPontoAproximadoRua).ToList();
|
Rua.Skip(IdxPontoAproximadoRua - PontosConsiderarAngulo).ToList();
|
||||||
|
|
||||||
/*var Pontos = Rua.Count > PontosConsiderarAngulo ?
|
/*var Pontos = Rua.Count > PontosConsiderarAngulo ?
|
||||||
Rua.OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() :
|
Rua.OrderByDescending(x => x.DataHora).Take(PontosConsiderarAngulo).ToList() :
|
||||||
|
|
|
||||||
|
|
@ -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 string CaminhoSistema { get; set; } = AppDomain.CurrentDomain.BaseDirectory;
|
||||||
public static List<IDispositivosService> DispositivosConectados { get; set; } = new List<IDispositivosService>();
|
public static List<IDispositivosService> DispositivosConectados { get; set; } = new List<IDispositivosService>();
|
||||||
public static OperacaoModel OperacaoEmAndamento { get; set; } = new OperacaoModel(ModoOperacao.Manual);
|
public static OperacaoModel OperacaoEmAndamento { get; set; } = new OperacaoModel(ModoOperacao.Manual);
|
||||||
|
public static MqttService MqttService { get; set; } = new MqttService("localhost", 1883);
|
||||||
|
public static List<T_Code> DispositivosConexaoInicial = new List<T_Code>() { T_Code.Dir, T_Code.Mov, T_Code.Atu, T_Code.Sen };
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class FuncoesGlobais
|
public static class FuncoesGlobais
|
||||||
|
|
@ -44,4 +46,5 @@ namespace AgroBase.Models
|
||||||
public static int SocketCaminho { get; } = 6588;
|
public static int SocketCaminho { get; } = 6588;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -20,8 +20,8 @@ pathFiles = sys.argv[1]
|
||||||
fileName = sys.argv[2]
|
fileName = sys.argv[2]
|
||||||
outputName = sys.argv[3]
|
outputName = sys.argv[3]
|
||||||
outputMapName = sys.argv[4]
|
outputMapName = sys.argv[4]
|
||||||
marcadorEndpoit = sys.argv[5]
|
topico_gps = sys.argv[5]
|
||||||
ruasEndpoit = sys.argv[6]
|
topico_ruas = sys.argv[6]
|
||||||
pastaSaida = 'Python/Output/'
|
pastaSaida = 'Python/Output/'
|
||||||
|
|
||||||
# Carregar o arquivo shapefile contendo a geometria
|
# Carregar o arquivo shapefile contendo a geometria
|
||||||
|
|
@ -130,6 +130,7 @@ with open(caminho_completo_html, 'r+') as arquivo_html:
|
||||||
|
|
||||||
# Script JavaScript para adicionar ao HTML, com o ID do mapa substituído
|
# Script JavaScript para adicionar ao HTML, com o ID do mapa substituído
|
||||||
script_atualizacao_marcador = f"""
|
script_atualizacao_marcador = f"""
|
||||||
|
<script src="folium/mqtt.min.js"></script>
|
||||||
<script>
|
<script>
|
||||||
var marcadorDinamico = L.marker([0, 0], {{
|
var marcadorDinamico = L.marker([0, 0], {{
|
||||||
icon: L.AwesomeMarkers.icon({{
|
icon: L.AwesomeMarkers.icon({{
|
||||||
|
|
@ -139,26 +140,35 @@ with open(caminho_completo_html, 'r+') as arquivo_html:
|
||||||
}})
|
}})
|
||||||
}}).addTo({id_mapa});
|
}}).addTo({id_mapa});
|
||||||
|
|
||||||
function atualizarMarcador() {{
|
// Conectar ao broker MQTT
|
||||||
fetch('{marcadorEndpoit}')
|
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
|
||||||
.then(function(response) {{
|
|
||||||
return response.json();
|
// Quando conectado, inscreva-se no tópico desejado
|
||||||
}})
|
client.on('connect', function () {{
|
||||||
.then(function(dados) {{
|
console.log('Conectado ao broker MQTT');
|
||||||
var novaLatitude = dados.latitude;
|
|
||||||
var novaLongitude = dados.longitude;
|
// Inscrever-se no tópico
|
||||||
var novaPosicao = [novaLatitude, novaLongitude];
|
client.subscribe('{topico_gps}', function (err) {{
|
||||||
marcadorDinamico.setLatLng(novaPosicao);
|
if (!err) {{
|
||||||
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
|
console.log("Inscrição bem-sucedida no tópico");
|
||||||
{id_mapa}.setView(novaPosicao, {id_mapa}.getZoom());
|
}} else {{
|
||||||
}})
|
console.error("Falha na inscrição do tópico", err);
|
||||||
.catch(function(error) {{
|
}}
|
||||||
console.error('Erro ao atualizar o marcador:', error);
|
}});
|
||||||
}});
|
}});
|
||||||
}}
|
|
||||||
|
// Lidar com mensagens recebidas para o tópico inscrito
|
||||||
// Atualiza o marcador a cada 2 segundos
|
client.on('message', function (topic, message) {{
|
||||||
setInterval(atualizarMarcador, 2000);
|
// 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>
|
</script>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
@ -167,16 +177,13 @@ with open(caminho_completo_html, 'r+') as arquivo_html:
|
||||||
var trajetosSelecionados = {{}};
|
var trajetosSelecionados = {{}};
|
||||||
var RuasSelecionadas = [];
|
var RuasSelecionadas = [];
|
||||||
function enviarSelecaoParaServidor() {{
|
function enviarSelecaoParaServidor() {{
|
||||||
fetch('{ruasEndpoit}', {{
|
client.publish("{topico_ruas}", JSON.stringify(RuasSelecionadas), function (err) {{
|
||||||
method: 'POST',
|
/*if (!err) {{
|
||||||
headers: {{
|
console.log("Mensagem publicada com sucesso");
|
||||||
'Content-Type': 'application/json',
|
}} else {{
|
||||||
}},
|
console.error("Falha ao publicar mensagem", err);
|
||||||
body: JSON.stringify({{ids: RuasSelecionadas}}),
|
}}*/
|
||||||
}})
|
}});
|
||||||
.then(response => response.json())
|
|
||||||
.then(data => console.log('Sucesso:', data))
|
|
||||||
.catch((error) => console.error('Erro:', error));
|
|
||||||
}}
|
}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,11 @@ import socket
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
import paho.mqtt.client as mqtt
|
||||||
|
mqtt_client = mqtt.Client(f"client_street_detector_{uuid.uuid4()}")
|
||||||
|
mqtt_client.connect("localhost", port=1883)
|
||||||
|
|
||||||
|
|
||||||
json_reading_data = None
|
json_reading_data = None
|
||||||
output_folder = 'Python/Output/'
|
output_folder = 'Python/Output/'
|
||||||
|
|
@ -20,7 +25,7 @@ port = sys.argv[2]
|
||||||
url = sys.argv[3]
|
url = sys.argv[3]
|
||||||
output_file = sys.argv[4]
|
output_file = sys.argv[4]
|
||||||
show_lines = sys.argv[5] == "1"
|
show_lines = sys.argv[5] == "1"
|
||||||
socket_port = int(sys.argv[6])
|
mqtt_topic = sys.argv[6]
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
|
@ -88,19 +93,9 @@ def generate_and_save_json(image):
|
||||||
detected_classes = set(np.unique(image))
|
detected_classes = set(np.unique(image))
|
||||||
|
|
||||||
global json_reading_data
|
global json_reading_data
|
||||||
contours_info = []
|
|
||||||
|
|
||||||
output_path = output_folder + output_file
|
|
||||||
|
|
||||||
# Carregar os dados existentes se o arquivo já existir
|
# Caminho completo para o arquivo de saída
|
||||||
if os.path.exists(output_path):
|
output_path = output_folder + output_file
|
||||||
with open(output_path, 'r') as f:
|
|
||||||
try:
|
|
||||||
existing_data = json.load(f)
|
|
||||||
if type(existing_data) is list:
|
|
||||||
contours_info.extend(existing_data)
|
|
||||||
except json.JSONDecodeError:
|
|
||||||
print("Erro ao decodificar o JSON existente. Um novo arquivo será criado.")
|
|
||||||
|
|
||||||
timestamp = time.time()
|
timestamp = time.time()
|
||||||
json_data = {'timestamp': timestamp, 'Classes': []}
|
json_data = {'timestamp': timestamp, 'Classes': []}
|
||||||
|
|
@ -117,19 +112,21 @@ def generate_and_save_json(image):
|
||||||
for point in contour:
|
for point in contour:
|
||||||
class_entry['Contornos'].append(point.squeeze().tolist())
|
class_entry['Contornos'].append(point.squeeze().tolist())
|
||||||
json_data['Classes'].append(class_entry)
|
json_data['Classes'].append(class_entry)
|
||||||
contours_info.append(json_data)
|
|
||||||
|
|
||||||
# Limita a quantidade de registros a serem salvos com base em max_readings
|
# Garante que o diretório de saída exista
|
||||||
contours_info = contours_info[-max_readings:]
|
|
||||||
|
|
||||||
if not os.path.exists(output_folder):
|
if not os.path.exists(output_folder):
|
||||||
os.makedirs(output_folder)
|
os.makedirs(output_folder)
|
||||||
|
|
||||||
# Salva os dados em um arquivo JSON
|
# Salva os dados em um arquivo JSON, sobrescrevendo o arquivo existente
|
||||||
with open(output_path, 'w') as f:
|
try:
|
||||||
json.dump(contours_info, f, indent=4)
|
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
|
json_reading_data = json_data
|
||||||
|
mqtt_client.publish(mqtt_topic, json.dumps(json_data).encode('utf-8'))
|
||||||
|
|
||||||
|
|
||||||
# Função para decodificar e aplicar o mapa de segmentação em um frame
|
# Função para decodificar e aplicar o mapa de segmentação em um frame
|
||||||
|
|
@ -161,7 +158,7 @@ def detect_and_stream(camera_index):
|
||||||
if not ret:
|
if not ret:
|
||||||
break
|
break
|
||||||
|
|
||||||
frame = cv2.imread(model_folder + "dataset/images/81.jpeg")
|
#frame = cv2.imread(model_folder + "dataset/images/81.jpeg")
|
||||||
|
|
||||||
# Processa o frame com seu modelo
|
# Processa o frame com seu modelo
|
||||||
output_predictions = segment_frame(frame)
|
output_predictions = segment_frame(frame)
|
||||||
|
|
@ -177,44 +174,9 @@ def detect_and_stream(camera_index):
|
||||||
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
|
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
|
||||||
|
|
||||||
|
|
||||||
# Função para lidar com a conexão de cada cliente
|
# Esta função é para confirmar que script está pronto para execução
|
||||||
def handle_client_connection(client_socket):
|
def send_script_ready():
|
||||||
try:
|
mqtt_client.publish(mqtt_topic, "OK")
|
||||||
while True:
|
|
||||||
# Enviar o dicionário serializado em JSON
|
|
||||||
client_socket.send(json.dumps(json_reading_data).encode('utf-8'))
|
|
||||||
|
|
||||||
# Aguardar um pouco antes de enviar os próximos dados
|
|
||||||
time.sleep(0.2)
|
|
||||||
except socket.error:
|
|
||||||
print(f"Cliente desconectado.")
|
|
||||||
finally:
|
|
||||||
# Fechar a conexão do socket ao sair do loop
|
|
||||||
client_socket.close()
|
|
||||||
|
|
||||||
# Configuração inicial do servidor de socket
|
|
||||||
def start_server(address='localhost', port=socket_port):
|
|
||||||
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
server.bind((address, socket_port))
|
|
||||||
server.listen()
|
|
||||||
print(f"Servidor iniciado. Aguardando conexões em {address}:{socket_port}...")
|
|
||||||
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
client_sock, address = server.accept()
|
|
||||||
print(f"Aceitando conexão de {address[0]}:{address[1]}")
|
|
||||||
client_handler = threading.Thread(
|
|
||||||
target=handle_client_connection,
|
|
||||||
args=(client_sock,)
|
|
||||||
)
|
|
||||||
client_handler.start()
|
|
||||||
finally:
|
|
||||||
server.close()
|
|
||||||
|
|
||||||
|
|
||||||
# Esta função é para iniciar o servidor de socket em uma thread separada
|
|
||||||
def run_socket_server():
|
|
||||||
start_server()
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/' + url, methods=['GET'])
|
@app.route('/' + url, methods=['GET'])
|
||||||
|
|
@ -228,9 +190,9 @@ def run_flask_server():
|
||||||
|
|
||||||
# Iniciar o servidor
|
# Iniciar o servidor
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# Inicia o servidor de socket em uma thread separada
|
# Cria trhead separada para informar que o script iniciou com sucesso
|
||||||
socket_server_thread = threading.Thread(target=run_socket_server)
|
mqtt_thread = threading.Thread(target=send_script_ready)
|
||||||
socket_server_thread.start()
|
mqtt_thread.start()
|
||||||
|
|
||||||
# Inicia o servidor Flask na thread principal
|
# Inicia o servidor Flask na thread principal
|
||||||
run_flask_server()
|
run_flask_server()
|
||||||
|
|
@ -3,11 +3,15 @@ import numpy as np
|
||||||
from flask import Flask, Response, request
|
from flask import Flask, Response, request
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
import socket
|
|
||||||
import threading
|
import threading
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
import paho.mqtt.client as mqtt
|
||||||
|
mqtt_client = mqtt.Client(f"client_weed_detector_{uuid.uuid4()}")
|
||||||
|
mqtt_client.connect("localhost", port=1883)
|
||||||
|
|
||||||
# Adiciona as configurações do modelo YOLO
|
# Adiciona as configurações do modelo YOLO
|
||||||
model_config = 'C:\\train\\models\\ervas\\ervas.cfg'
|
model_config = 'C:\\train\\models\\ervas\\ervas.cfg'
|
||||||
model_weights = 'C:\\train\\models\\ervas\\backup\\ervas_final.weights'
|
model_weights = 'C:\\train\\models\\ervas\\backup\\ervas_final.weights'
|
||||||
|
|
@ -30,7 +34,7 @@ porta = sys.argv[2]
|
||||||
url = sys.argv[3]
|
url = sys.argv[3]
|
||||||
arquivoSaida = sys.argv[4]
|
arquivoSaida = sys.argv[4]
|
||||||
mostrar_linhas = sys.argv[5] == "1"
|
mostrar_linhas = sys.argv[5] == "1"
|
||||||
socket_porta = int(sys.argv[6])
|
mqtt_topic = sys.argv[6]
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
|
@ -84,6 +88,8 @@ def detect_objects(conf_threshold, nms_threshold, _camera_index):
|
||||||
timestamp = time.time()
|
timestamp = time.time()
|
||||||
json_data = {'timestamp': timestamp, 'x_max': width, 'y_max': height, 'objetos': current_readings}
|
json_data = {'timestamp': timestamp, 'x_max': width, 'y_max': height, 'objetos': current_readings}
|
||||||
readings.append(json_data)
|
readings.append(json_data)
|
||||||
|
|
||||||
|
mqtt_client.publish(mqtt_topic, json.dumps(json_data).encode('utf-8'))
|
||||||
|
|
||||||
if not os.path.exists(output_folder):
|
if not os.path.exists(output_folder):
|
||||||
os.makedirs(output_folder)
|
os.makedirs(output_folder)
|
||||||
|
|
@ -100,44 +106,10 @@ def detect_objects(conf_threshold, nms_threshold, _camera_index):
|
||||||
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
|
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')
|
||||||
|
|
||||||
|
|
||||||
# Função para lidar com a conexão de cada cliente
|
|
||||||
def handle_client_connection(client_socket):
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
# Enviar o dicionário serializado em JSON
|
|
||||||
client_socket.send(json.dumps(json_data).encode('utf-8'))
|
|
||||||
|
|
||||||
# Aguardar um pouco antes de enviar os próximos dados
|
# Esta função é para confirmar que script está pronto para execução
|
||||||
time.sleep(0.2)
|
def send_script_ready():
|
||||||
except socket.error:
|
mqtt_client.publish(mqtt_topic, "OK")
|
||||||
print(f"Cliente desconectado.")
|
|
||||||
finally:
|
|
||||||
# Fechar a conexão do socket ao sair do loop
|
|
||||||
client_socket.close()
|
|
||||||
|
|
||||||
# Configuração inicial do servidor de socket
|
|
||||||
def start_server(address='localhost', port=socket_porta):
|
|
||||||
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
server.bind((address, port))
|
|
||||||
server.listen()
|
|
||||||
print(f"Servidor iniciado. Aguardando conexões em {address}:{port}...")
|
|
||||||
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
client_sock, address = server.accept()
|
|
||||||
print(f"Aceitando conexão de {address[0]}:{address[1]}")
|
|
||||||
client_handler = threading.Thread(
|
|
||||||
target=handle_client_connection,
|
|
||||||
args=(client_sock,)
|
|
||||||
)
|
|
||||||
client_handler.start()
|
|
||||||
finally:
|
|
||||||
server.close()
|
|
||||||
|
|
||||||
|
|
||||||
# Esta função é para iniciar o servidor de socket em uma thread separada
|
|
||||||
def run_socket_server():
|
|
||||||
start_server()
|
|
||||||
|
|
||||||
# Iniciar o servidor Flask em uma thread separada
|
# Iniciar o servidor Flask em uma thread separada
|
||||||
def run_flask_server():
|
def run_flask_server():
|
||||||
|
|
@ -153,9 +125,9 @@ def video_feed():
|
||||||
|
|
||||||
# Iniciar o servidor
|
# Iniciar o servidor
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# Inicia o servidor de socket em uma thread separada
|
# Cria trhead separada para informar que o script iniciou com sucesso
|
||||||
socket_server_thread = threading.Thread(target=run_socket_server)
|
mqtt_thread = threading.Thread(target=send_script_ready)
|
||||||
socket_server_thread.start()
|
mqtt_thread.start()
|
||||||
|
|
||||||
# Inicia o servidor Flask na thread principal
|
# Inicia o servidor Flask na thread principal
|
||||||
run_flask_server()
|
run_flask_server()
|
||||||
|
|
|
||||||
|
|
@ -61,11 +61,23 @@ namespace AgroBase.Services
|
||||||
var json = JsonConvert.SerializeObject(localizacao);
|
var json = JsonConvert.SerializeObject(localizacao);
|
||||||
var data = new StringContent(json, Encoding.UTF8, "application/json");
|
var data = new StringContent(json, Encoding.UTF8, "application/json");
|
||||||
|
|
||||||
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.Forms;
|
||||||
using AgroBase.Models;
|
using AgroBase.Models;
|
||||||
|
using CefSharp.WinForms;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
@ -10,13 +11,19 @@ using System.Management;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using static MqttService;
|
||||||
|
|
||||||
namespace AgroBase.Services
|
namespace AgroBase.Services
|
||||||
{
|
{
|
||||||
public class CameraService<T>
|
public class CameraService
|
||||||
{
|
{
|
||||||
|
public static Dictionary<string, string> CamerasConectadas = new Dictionary<string, string>();
|
||||||
|
|
||||||
public Process pythonProcess;
|
public Process pythonProcess;
|
||||||
public SocketService<T> socket;
|
public DateTime? IniciadoEm = null;
|
||||||
|
public DateTime? ProntoEm = null;
|
||||||
|
public DateTime? FinalizadoEm = null;
|
||||||
|
public MqttTopicosModel _mqttTopico;
|
||||||
|
|
||||||
private string Endereco = "localhost";
|
private string Endereco = "localhost";
|
||||||
public string ArquivoLeitura = "leitura.json";
|
public string ArquivoLeitura = "leitura.json";
|
||||||
|
|
@ -26,83 +33,59 @@ namespace AgroBase.Services
|
||||||
public string URLcamera = "";
|
public string URLcamera = "";
|
||||||
|
|
||||||
|
|
||||||
public void IniciarCamera(string Script, string[] Argumentos, string FlaskPorta, string FlaskUrl, bool AtivaSocket, string SocketPorta)
|
public void IniciarCamera(string Script, string[] Argumentos, string FlaskPorta, string FlaskUrl, string MqttTopico, Timer tmrProcesso)
|
||||||
{
|
{
|
||||||
|
if (_mqttTopico == null)
|
||||||
|
{
|
||||||
|
_mqttTopico = new MqttTopicosModel()
|
||||||
|
{
|
||||||
|
Topico = MqttTopico,
|
||||||
|
Mensagens = new List<MqttTopicosMensagensModel>(),
|
||||||
|
Inscrever = true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Variaveis.MqttService.Topicos.Add(_mqttTopico);
|
||||||
|
Variaveis.MqttService.SubscribeAsync(_mqttTopico).ConfigureAwait(false);
|
||||||
|
|
||||||
|
tmrProcesso.Start();
|
||||||
pythonProcess = PythonService.RunScript(Script, Argumentos);
|
pythonProcess = PythonService.RunScript(Script, Argumentos);
|
||||||
|
pythonProcess.Exited += PythonProcess_Exited;
|
||||||
|
IniciadoEm = DateTime.Now;
|
||||||
|
|
||||||
URLcamera = "http://" + Endereco + ":" + FlaskPorta + "/" + FlaskUrl +
|
URLcamera = "http://" + Endereco + ":" + FlaskPorta + "/" + FlaskUrl +
|
||||||
"?conf_threshold=" + conf_threshold.ToString().Replace(",", ".") +
|
"?conf_threshold=" + conf_threshold.ToString().Replace(",", ".") +
|
||||||
"&nms_threshold=" + nms_threshold.ToString().Replace(",", ".") +
|
"&nms_threshold=" + nms_threshold.ToString().Replace(",", ".") +
|
||||||
"&camera_index=" + (selectedCamera - 1);
|
"&camera_index=" + (selectedCamera - 1);
|
||||||
|
|
||||||
socket = new SocketService<T>();
|
|
||||||
if (AtivaSocket)
|
|
||||||
{
|
|
||||||
socket.Connect(Endereco, Convert.ToInt32(SocketPorta));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public T AferirDadosJson()
|
private void PythonProcess_Exited(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
T Coordenadas = default(T);
|
FinalizadoEm = DateTime.Now;
|
||||||
|
|
||||||
if (File.Exists(PythonService.CaminhoGeral + PythonService.CaminhoLeitura + ArquivoLeitura))
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<string> AtualizaListaCameras()
|
public static Dictionary<string, string> AtualizaListaCameras()
|
||||||
{
|
{
|
||||||
List<string> Cameras = new List<string>() { "Sem vídeo" };
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//Variaveis.videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
|
CamerasConectadas.Clear();
|
||||||
|
CamerasConectadas.Add("Sem vídeo", "0");
|
||||||
var cameraNames = new List<string>();
|
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE (PNPClass = 'Camera')")) // PNPClass = 'Image' OR PNPClass = 'Camera')
|
||||||
var camerasList = new Dictionary<string, string>();
|
|
||||||
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE (PNPClass = 'Image' OR PNPClass = 'Camera')"))
|
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
foreach (var device in searcher.Get())
|
foreach (var device in searcher.Get())
|
||||||
{
|
{
|
||||||
string cameraDesc = i.ToString() + " - " + device["Caption"].ToString();
|
string cameraDesc = i.ToString() + " - " + device["Caption"].ToString();
|
||||||
camerasList.Add(device["DeviceID"].ToString(), cameraDesc);
|
CamerasConectadas.Add(cameraDesc, device["DeviceID"].ToString());
|
||||||
cameraNames.Add(cameraDesc);
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//cameraNames = camerasList.OrderByDescending(x => x.Key).Select(x => x.Value).ToList();
|
|
||||||
|
|
||||||
foreach (string device in cameraNames)
|
|
||||||
{
|
|
||||||
Cameras.Add(device);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (ApplicationException)
|
catch (ApplicationException)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Cameras;
|
return CamerasConectadas;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,24 +80,30 @@ namespace AgroBase.Comum
|
||||||
|
|
||||||
public void AtualizarPortas()
|
public void AtualizarPortas()
|
||||||
{
|
{
|
||||||
cmbPorta.Items.Clear();
|
|
||||||
cmbPorta.Text = "";
|
|
||||||
var DispositivosTipo = SerialService.DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).ToList();
|
var DispositivosTipo = SerialService.DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).ToList();
|
||||||
for (int i = 0; i < DispositivosTipo.Count(); i++)
|
for (int i = 0; i < DispositivosTipo.Count(); i++)
|
||||||
{
|
{
|
||||||
string PortaCom = DispositivosTipo[i].PortaCOM;
|
if (!cmbPorta.Items.Contains(DispositivosTipo[i].PortaCOM))
|
||||||
SerialPort _Porta = new SerialPort() { PortName = PortaCom };
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
_Porta.Open();
|
string PortaCom = DispositivosTipo[i].PortaCOM;
|
||||||
_Porta.Close();
|
SerialPort _Porta = new SerialPort() { PortName = PortaCom };
|
||||||
cmbPorta.Items.Add(PortaCom);
|
try
|
||||||
}
|
{
|
||||||
catch (Exception ex)
|
_Porta.Open();
|
||||||
{
|
_Porta.Close();
|
||||||
Console.WriteLine(ex.Message);
|
cmbPorta.Items.Add(PortaCom);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine(ex.Message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!DispositivosTipo.Any())
|
||||||
|
{
|
||||||
|
cmbPorta.Items.Clear();
|
||||||
|
cmbPorta.Text = "";
|
||||||
|
}
|
||||||
if (cmbPorta.Items.Count > 1)
|
if (cmbPorta.Items.Count > 1)
|
||||||
cmbPorta.SelectedIndex = 1;
|
cmbPorta.SelectedIndex = 1;
|
||||||
else if (cmbPorta.Items.Count > 0)
|
else if (cmbPorta.Items.Count > 0)
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,8 @@ namespace AgroBase.Services
|
||||||
UltimaLeitura.PrecisaoHorizontal = double.TryParse(parts[8], NumberStyles.Float, CultureInfo.InvariantCulture, out double hdop) ? hdop : 0;
|
UltimaLeitura.PrecisaoHorizontal = double.TryParse(parts[8], NumberStyles.Float, CultureInfo.InvariantCulture, out double hdop) ? hdop : 0;
|
||||||
UltimaLeitura.Altitude = ConvertToDouble(parts[9]);
|
UltimaLeitura.Altitude = ConvertToDouble(parts[9]);
|
||||||
|
|
||||||
APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo);
|
//APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo);
|
||||||
|
AtualizarCoordenadasGPS();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Recommended minimum specific GPS/Transit data
|
// Recommended minimum specific GPS/Transit data
|
||||||
|
|
@ -240,7 +241,18 @@ namespace AgroBase.Services
|
||||||
return Math.PI / 180 * angle;
|
return Math.PI / 180 * angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void AtualizarCoordenadasGPS()
|
||||||
|
{
|
||||||
|
var Coordenadas = new
|
||||||
|
{
|
||||||
|
latitude = UltimaLeitura.Latitude,
|
||||||
|
longitude = UltimaLeitura.Longitude
|
||||||
|
};
|
||||||
|
Variaveis.MqttService.PublishAsync(
|
||||||
|
Variaveis.MqttService.Topicos.First(x => x.Topico == MapasVariaveisModel.TopicoCoordenadasGPS),
|
||||||
|
JsonConvert.SerializeObject(Coordenadas)
|
||||||
|
).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private static MapaFeatureCollectionModel TrajetoFake = new MapaFeatureCollectionModel();
|
private static MapaFeatureCollectionModel TrajetoFake = new MapaFeatureCollectionModel();
|
||||||
|
|
@ -296,9 +308,10 @@ namespace AgroBase.Services
|
||||||
Longitude = TrajetoFake.features[idxRuaA].geometry.coordinates[idxPonto][0],
|
Longitude = TrajetoFake.features[idxRuaA].geometry.coordinates[idxPonto][0],
|
||||||
Latitude = TrajetoFake.features[idxRuaA].geometry.coordinates[idxPonto][1],
|
Latitude = TrajetoFake.features[idxRuaA].geometry.coordinates[idxPonto][1],
|
||||||
};
|
};
|
||||||
APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo);
|
//APIService.AtualizarCoordenadasGPS(UltimaLeitura, APIService.GPS_IDcoordenadasRobo);
|
||||||
|
AtualizarCoordenadasGPS();
|
||||||
|
|
||||||
if (Variaveis.OperacaoEmAndamento.Tempo.Minutes == 0 && Variaveis.OperacaoEmAndamento.Tempo.Seconds < Variaveis.OperacaoEmAndamento.TempoIniciarOperacao)
|
if (Variaveis.OperacaoEmAndamento.StatusOperacoesPararCarro.Contains(Variaveis.OperacaoEmAndamento.ReferencialRuaGPS.StatusAtual))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ namespace AgroBase.Services
|
||||||
int TempoConectado { get; set; }
|
int TempoConectado { get; set; }
|
||||||
GroupBox gpbItem { get; set; }
|
GroupBox gpbItem { get; set; }
|
||||||
|
|
||||||
|
void AtualizarPortas();
|
||||||
string PortaCOM();
|
string PortaCOM();
|
||||||
string StatusPorta();
|
string StatusPorta();
|
||||||
Control InstanciarDispositivo(int index);
|
Control InstanciarDispositivo(int index);
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@ namespace AgroBase.Services
|
||||||
public static string NomeArquivoMapaInterativo = "mapa_interativo.html";
|
public static string NomeArquivoMapaInterativo = "mapa_interativo.html";
|
||||||
public static string NomeArquivoMapaInterativoSaida = "GeoJson.json";
|
public static string NomeArquivoMapaInterativoSaida = "GeoJson.json";
|
||||||
public static string NomeArquivoMapaGPS = "mapa_gps.html";
|
public static string NomeArquivoMapaGPS = "mapa_gps.html";
|
||||||
|
public static string TopicoCoordenadasGPS = "coordenadas_gps";
|
||||||
|
public static string TopicoSelecaoRuasMapa = "selecao_ruas_mapa";
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MapasService
|
public class MapasService
|
||||||
|
|
@ -28,6 +30,7 @@ namespace AgroBase.Services
|
||||||
public string MapaUrl = "";
|
public string MapaUrl = "";
|
||||||
public string CaminhoDadosMapa = "";
|
public string CaminhoDadosMapa = "";
|
||||||
public MapaFeatureCollectionModel DadosMapa;
|
public MapaFeatureCollectionModel DadosMapa;
|
||||||
|
public bool Carregado = false;
|
||||||
|
|
||||||
|
|
||||||
public void CarregarMapa(string nomeArquivoMapa, string nomeArquivoSaida)
|
public void CarregarMapa(string nomeArquivoMapa, string nomeArquivoSaida)
|
||||||
|
|
@ -52,8 +55,8 @@ namespace AgroBase.Services
|
||||||
NomeArquivos,
|
NomeArquivos,
|
||||||
ArquivoSaida,
|
ArquivoSaida,
|
||||||
NomeArquivoMapa,
|
NomeArquivoMapa,
|
||||||
APIService.ApiBase() + APIService.GPS_getCoordenadasEndpoint.Replace("<id>", APIService.GPS_IDcoordenadasRobo.ToString()),
|
MapasVariaveisModel.TopicoCoordenadasGPS,
|
||||||
APIService.ApiBase() + APIService.Mapa_setRuasSelecionadasEndpoint
|
MapasVariaveisModel.TopicoSelecaoRuasMapa
|
||||||
});
|
});
|
||||||
|
|
||||||
MapaUrl = new Uri(CaminhoSaida + NomeArquivoMapa).AbsoluteUri;
|
MapaUrl = new Uri(CaminhoSaida + NomeArquivoMapa).AbsoluteUri;
|
||||||
|
|
@ -65,7 +68,14 @@ namespace AgroBase.Services
|
||||||
{
|
{
|
||||||
NomeArquivoMapa = nomeArquivoMapa;
|
NomeArquivoMapa = nomeArquivoMapa;
|
||||||
|
|
||||||
pythonProcess = PythonService.RunScript(PythonService.ScriptMapGPS, new string[] { CaminhoMapa, NomeArquivos, ArquivoSaida, NomeArquivoMapa, APIService.ApiBase() + APIService.GPS_getCoordenadasEndpoint.Replace("<id>", APIService.GPS_IDcoordenadasRobo.ToString()) });
|
pythonProcess = PythonService.RunScript(PythonService.ScriptMapGPS, new string[] {
|
||||||
|
CaminhoMapa,
|
||||||
|
NomeArquivos,
|
||||||
|
ArquivoSaida,
|
||||||
|
NomeArquivoMapa,
|
||||||
|
MapasVariaveisModel.TopicoCoordenadasGPS,
|
||||||
|
MapasVariaveisModel.TopicoSelecaoRuasMapa
|
||||||
|
});
|
||||||
|
|
||||||
MapaUrl = new Uri(CaminhoSaida + NomeArquivoMapa).AbsoluteUri;
|
MapaUrl = new Uri(CaminhoSaida + NomeArquivoMapa).AbsoluteUri;
|
||||||
CaminhoDadosMapa = CaminhoSaida + ArquivoSaida;
|
CaminhoDadosMapa = CaminhoSaida + ArquivoSaida;
|
||||||
|
|
|
||||||
|
|
@ -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.RedirectStandardOutput = true;
|
||||||
pythonProcess.StartInfo.CreateNoWindow = true;
|
pythonProcess.StartInfo.CreateNoWindow = true;
|
||||||
|
|
||||||
|
pythonProcess.Exited += PythonProcess_Exited;
|
||||||
|
pythonProcess.OutputDataReceived += PythonProcess_OutputDataReceived;
|
||||||
|
|
||||||
pythonProcess.Start();
|
pythonProcess.Start();
|
||||||
|
|
||||||
processosIniciados.Add(pythonProcess);
|
processosIniciados.Add(pythonProcess);
|
||||||
|
|
@ -44,6 +47,17 @@ namespace AgroBase.Services
|
||||||
return pythonProcess;
|
return pythonProcess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void PythonProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Dados recebidos: " + e.Data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void PythonProcess_Exited(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Processo finalizado");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void EncerrarProcessos()
|
public static void EncerrarProcessos()
|
||||||
{
|
{
|
||||||
foreach (var processo in processosIniciados)
|
foreach (var processo in processosIniciados)
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,12 @@
|
||||||
using System;
|
using AgroBase.Forms;
|
||||||
|
using AgroBase.Models;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.IO.Ports;
|
using System.IO.Ports;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.NetworkInformation;
|
using System.Net.NetworkInformation;
|
||||||
|
using System.Windows.Forms;
|
||||||
using static AgroBase.Models.Enuns;
|
using static AgroBase.Models.Enuns;
|
||||||
|
|
||||||
namespace AgroBase.Services
|
namespace AgroBase.Services
|
||||||
|
|
@ -21,7 +25,7 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
public static List<DispositivoDetalhesModel> DispositivosMapeados = new List<DispositivoDetalhesModel>();
|
public static List<DispositivoDetalhesModel> DispositivosMapeados = new List<DispositivoDetalhesModel>();
|
||||||
|
|
||||||
public static void AtualizarDispositivos()
|
public static void RealizarVarreduraPortasUSB()
|
||||||
{
|
{
|
||||||
var Portas = SerialPort.GetPortNames();
|
var Portas = SerialPort.GetPortNames();
|
||||||
var PortasNaoMapeadas = Portas.Where(x => !DispositivosMapeados.Select(y => y.PortaCOM).Contains(x)).ToList();
|
var PortasNaoMapeadas = Portas.Where(x => !DispositivosMapeados.Select(y => y.PortaCOM).Contains(x)).ToList();
|
||||||
|
|
@ -44,7 +48,8 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
_Porta.Close();
|
||||||
|
Console.WriteLine(ex.Message.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var DispositivosRemovidos = DispositivosMapeados.Where(x => !Portas.Contains(x.PortaCOM)).ToList();
|
var DispositivosRemovidos = DispositivosMapeados.Where(x => !Portas.Contains(x.PortaCOM)).ToList();
|
||||||
|
|
@ -52,6 +57,57 @@ namespace AgroBase.Services
|
||||||
{
|
{
|
||||||
DispositivosMapeados.Remove(Dispositivo);
|
DispositivosMapeados.Remove(Dispositivo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AtualizarDispositivos();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AtualizarDispositivos()
|
||||||
|
{
|
||||||
|
Variaveis.DispositivosConexaoInicial.ForEach(Dispositivo =>
|
||||||
|
{
|
||||||
|
bool DispositivoConectado = false;
|
||||||
|
|
||||||
|
if (Dispositivo == T_Code.Gps)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!GPSService.PortaGPS.IsOpen)
|
||||||
|
{
|
||||||
|
GPSService.IniciarRecepcaoDados();
|
||||||
|
}
|
||||||
|
DispositivoConectado = GPSService.PortaGPS.IsOpen;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
DispositivoConectado = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
|
||||||
|
if (dispositivoService == null)
|
||||||
|
{
|
||||||
|
dispositivoService = DispositivosServiceFactory.CreateDispositivoService(
|
||||||
|
Dispositivo,
|
||||||
|
"Nome: " + Enum.GetName(typeof(T_Code), Dispositivo),
|
||||||
|
"Descrição: " + Enum.GetName(typeof(T_Code), Dispositivo),
|
||||||
|
new SerialPort()
|
||||||
|
);
|
||||||
|
Variaveis.DispositivosConectados.Add(dispositivoService);
|
||||||
|
Control controle = dispositivoService.InstanciarDispositivo(Variaveis.DispositivosConectados.Count - 1);
|
||||||
|
controle.Location = new System.Drawing.Point(controle.Location.X, controle.Location.Y + (Variaveis.DispositivosConectados.Count * 50));
|
||||||
|
frmInstancial.frmPrincipal.pnlLateral.Controls.Add(controle);
|
||||||
|
frmInstancial.frmPrincipal.cmbDispositivos.Items.Add(dispositivoService._Descricao);
|
||||||
|
}
|
||||||
|
dispositivoService.AtualizarPortas();
|
||||||
|
if (dispositivoService.PortaCOM() != "" && !dispositivoService._Porta.IsOpen && frmInstancial.frmPrincipal.chbConexaoautomatica.Checked)
|
||||||
|
{
|
||||||
|
dispositivoService.btnConectar_Click(new object(), new EventArgs());
|
||||||
|
}
|
||||||
|
|
||||||
|
DispositivoConectado = dispositivoService._Porta.IsOpen;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void _Porta_DataReceived(object sender, SerialDataReceivedEventArgs e)
|
private static void _Porta_DataReceived(object sender, SerialDataReceivedEventArgs e)
|
||||||
|
|
|
||||||
Binary file not shown.
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