iniciado weed worker

This commit is contained in:
Diego Freitas 2025-07-21 15:36:04 -03:00
parent 0a4e1ba698
commit 4811e24d9f
61 changed files with 480 additions and 224 deletions

Binary file not shown.

View File

@ -536,6 +536,7 @@
<Compile Include="Models\Operadores\ManagerWorkerModel.cs" />
<Compile Include="Models\Operadores\OperadoresModels.cs" />
<Compile Include="Models\Operadores\VisualWorkerModel.cs" />
<Compile Include="Models\Operadores\WeedWorkerModel.cs" />
<Compile Include="Models\PerformanceModel.cs" />
<Compile Include="Models\PIDModel.cs" />
<Compile Include="Models\PZEMModel.cs" />
@ -586,6 +587,7 @@
<Compile Include="Services\Operadores\ManagerWorkerService.cs" />
<Compile Include="Services\Operadores\OperadoresService.cs" />
<Compile Include="Services\Operadores\VisualWorkerService.cs" />
<Compile Include="Services\Operadores\WeedWorkerService.cs" />
<Compile Include="Services\PythonService.cs" />
<Compile Include="Services\PZEMService.cs" />
<Compile Include="Services\RedisService.cs" />

View File

@ -266,10 +266,14 @@ namespace AgroBase.Forms.IHM
cmbCameraCaminho.Items.Clear();
cmbCameraCaminho.Items.AddRange(ListaCameras.Select(x => x.Description).ToArray());
string cameraSelecionada = ListaCameras.FirstOrDefault(x => x.Id == CameraCaminho.Id)?.Description ?? "";
var cameraSelecionada = ListaCameras.FirstOrDefault(x => x.Id == CameraCaminho.Id);
if (cameraSelecionada != null)
{
cmbCameraCaminho.SelectedIndex = cmbCameraCaminho.Items.IndexOf(cameraSelecionada);
cmbCameraCaminho.SelectedIndex = cmbCameraCaminho.Items.IndexOf(cameraSelecionada.Description);
}
else
{
cmbCameraCaminho.Text = CameraCaminho.Id;
}
}
@ -325,15 +329,15 @@ namespace AgroBase.Forms.IHM
CamerasSolo.Add(new OAKCameraModel());
}
string cameraSelecionada = ListaCameras.FirstOrDefault(x => x.Id == CamerasSolo[idx].Id)?.Description ?? "";
var cameraSelecionada = ListaCameras.FirstOrDefault(x => x.Id == CamerasSolo[idx].Id);
if (ListaCameras.Any(x => x.Id == cameraSelecionada))
if (cameraSelecionada != null)
{
cmbCamera.SelectedIndex = cmbCamera.Items.IndexOf(cameraSelecionada);
cmbCamera.SelectedIndex = cmbCamera.Items.IndexOf(cameraSelecionada.Description);
}
else
{
cmbCamera.Text = cameraSelecionada;
cmbCamera.Text = CamerasSolo[idx].Id;
}
}

View File

@ -230,7 +230,7 @@ namespace AgroBase.Forms.IHM
Task.Run(async () =>
{
ReqFrameSnr = true;
OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(VisualWorkerFrameType.Rgb);
OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(CameraFrameType.Rgb);
pnlCameraCaminho.BackgroundImage?.Dispose();
try { pnlCameraCaminho.BackgroundImage = frame?.image(); } catch { }
lblUltimaLeituraCaminho.Text = $"Última Leitura Caminho: " + frame?.timestamp.ToString("HH:mm:ss");

View File

@ -36,7 +36,7 @@
this.lblMqtt = new System.Windows.Forms.Label();
this.lblD_Sen_sCOR_36V = new System.Windows.Forms.Label();
this.lblD_Sen_sLRA = new System.Windows.Forms.Label();
this.lblD_Sen_sIMU = new System.Windows.Forms.Label();
this.lblD_Imu = new System.Windows.Forms.Label();
this.lblD_Mov_DT = new System.Windows.Forms.Label();
this.lblD_Dir_DF = new System.Windows.Forms.Label();
this.lblD_Dir_EF = new System.Windows.Forms.Label();
@ -45,7 +45,6 @@
this.lblD_Dir_ET = new System.Windows.Forms.Label();
this.lblD_Mov_ET = new System.Windows.Forms.Label();
this.lblD_Cam_0 = new System.Windows.Forms.Label();
this.lblD_Cam_1 = new System.Windows.Forms.Label();
this.lblD_Snr = new System.Windows.Forms.Label();
this.lblDiagnosticos = new System.Windows.Forms.Label();
this.lblOperacao = new System.Windows.Forms.Label();
@ -104,7 +103,7 @@
//
this.lblD_Atu.AutoSize = true;
this.lblD_Atu.Cursor = System.Windows.Forms.Cursors.Hand;
this.lblD_Atu.Location = new System.Drawing.Point(210, 547);
this.lblD_Atu.Location = new System.Drawing.Point(211, 483);
this.lblD_Atu.Name = "lblD_Atu";
this.lblD_Atu.Size = new System.Drawing.Size(48, 24);
this.lblD_Atu.TabIndex = 4;
@ -163,24 +162,24 @@
this.lblD_Sen_sLRA.AutoSize = true;
this.lblD_Sen_sLRA.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
this.lblD_Sen_sLRA.Cursor = System.Windows.Forms.Cursors.Hand;
this.lblD_Sen_sLRA.Location = new System.Drawing.Point(213, 417);
this.lblD_Sen_sLRA.Location = new System.Drawing.Point(213, 418);
this.lblD_Sen_sLRA.Name = "lblD_Sen_sLRA";
this.lblD_Sen_sLRA.Size = new System.Drawing.Size(46, 24);
this.lblD_Sen_sLRA.TabIndex = 15;
this.lblD_Sen_sLRA.Text = "LRA";
this.lblD_Sen_sLRA.Click += new System.EventHandler(this.lblModulo_Click);
//
// lblD_Sen_sIMU
// lblD_Imu
//
this.lblD_Sen_sIMU.AutoSize = true;
this.lblD_Sen_sIMU.BackColor = System.Drawing.Color.Lavender;
this.lblD_Sen_sIMU.Cursor = System.Windows.Forms.Cursors.Hand;
this.lblD_Sen_sIMU.Location = new System.Drawing.Point(14, 547);
this.lblD_Sen_sIMU.Name = "lblD_Sen_sIMU";
this.lblD_Sen_sIMU.Size = new System.Drawing.Size(43, 24);
this.lblD_Sen_sIMU.TabIndex = 16;
this.lblD_Sen_sIMU.Text = "IMU";
this.lblD_Sen_sIMU.Click += new System.EventHandler(this.lblModulo_Click);
this.lblD_Imu.AutoSize = true;
this.lblD_Imu.BackColor = System.Drawing.Color.Lavender;
this.lblD_Imu.Cursor = System.Windows.Forms.Cursors.Hand;
this.lblD_Imu.Location = new System.Drawing.Point(14, 547);
this.lblD_Imu.Name = "lblD_Imu";
this.lblD_Imu.Size = new System.Drawing.Size(43, 24);
this.lblD_Imu.TabIndex = 16;
this.lblD_Imu.Text = "IMU";
this.lblD_Imu.Click += new System.EventHandler(this.lblModulo_Click);
//
// lblD_Mov_DT
//
@ -269,26 +268,15 @@
// lblD_Cam_0
//
this.lblD_Cam_0.AutoSize = true;
this.lblD_Cam_0.BackColor = System.Drawing.Color.Lavender;
this.lblD_Cam_0.BackColor = System.Drawing.Color.White;
this.lblD_Cam_0.Cursor = System.Windows.Forms.Cursors.Hand;
this.lblD_Cam_0.Location = new System.Drawing.Point(85, 470);
this.lblD_Cam_0.Location = new System.Drawing.Point(210, 547);
this.lblD_Cam_0.Name = "lblD_Cam_0";
this.lblD_Cam_0.Size = new System.Drawing.Size(52, 24);
this.lblD_Cam_0.TabIndex = 29;
this.lblD_Cam_0.Text = "CAM";
this.lblD_Cam_0.Click += new System.EventHandler(this.lblModulo_Click);
//
// lblD_Cam_1
//
this.lblD_Cam_1.AutoSize = true;
this.lblD_Cam_1.Cursor = System.Windows.Forms.Cursors.Hand;
this.lblD_Cam_1.Location = new System.Drawing.Point(334, 470);
this.lblD_Cam_1.Name = "lblD_Cam_1";
this.lblD_Cam_1.Size = new System.Drawing.Size(52, 24);
this.lblD_Cam_1.TabIndex = 30;
this.lblD_Cam_1.Text = "CAM";
this.lblD_Cam_1.Click += new System.EventHandler(this.lblModulo_Click);
//
// lblD_Snr
//
this.lblD_Snr.AutoSize = true;
@ -698,7 +686,6 @@
this.Controls.Add(this.picOperacao);
this.Controls.Add(this.lblD_Snr);
this.Controls.Add(this.picAjustes);
this.Controls.Add(this.lblD_Cam_1);
this.Controls.Add(this.lblD_Cam_0);
this.Controls.Add(this.picDesligar);
this.Controls.Add(this.lblD_Dir_ET);
@ -708,7 +695,7 @@
this.Controls.Add(this.lblD_Mov_EF);
this.Controls.Add(this.lblD_Dir_DF);
this.Controls.Add(this.lblD_Mov_DT);
this.Controls.Add(this.lblD_Sen_sIMU);
this.Controls.Add(this.lblD_Imu);
this.Controls.Add(this.lblD_Sen_sLRA);
this.Controls.Add(this.lblD_Sen_sCOR_36V);
this.Controls.Add(this.lblMqtt);
@ -747,7 +734,7 @@
private System.Windows.Forms.Label lblMqtt;
private System.Windows.Forms.Label lblD_Sen_sCOR_36V;
private System.Windows.Forms.Label lblD_Sen_sLRA;
private System.Windows.Forms.Label lblD_Sen_sIMU;
private System.Windows.Forms.Label lblD_Imu;
private System.Windows.Forms.Label lblD_Mov_DT;
private System.Windows.Forms.Label lblD_Dir_DF;
private System.Windows.Forms.Label lblD_Dir_EF;
@ -759,7 +746,6 @@
private System.Windows.Forms.PictureBox picOperacao;
private System.Windows.Forms.PictureBox picDesligar;
private System.Windows.Forms.Label lblD_Cam_0;
private System.Windows.Forms.Label lblD_Cam_1;
private System.Windows.Forms.Label lblD_Snr;
private System.Windows.Forms.PictureBox picAjustes;
private System.Windows.Forms.Label lblDiagnosticos;

View File

@ -188,6 +188,20 @@ namespace AgroBase.Forms.IHM
? Color.DarkRed
: Color.DarkGreen;
}
else if (Dispositivo == T_Code.Imu)
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == T_Code.Snr);
bool modDesconectado = Modulo == null || Modulo.Status == StatusModulo.Desconectado;
var saudeImu = HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == Dispositivo);
var CameraCaminho = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho;
lbl.ForeColor =
modDesconectado || saudeImu == null ? Color.Black
: saudeImu.status == StatusModulo.Conectado ? Color.Blue
: saudeImu.status == StatusModulo.Falha ? Color.DarkRed
: saudeImu.status == StatusModulo.Alerta ? Color.Gold
: saudeImu.status == StatusModulo.Operante ? Color.DarkGreen
: Color.Black;
}
else if (Dispositivo == T_Code.Sen)
{
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
@ -195,15 +209,12 @@ namespace AgroBase.Forms.IHM
if (Mod_ID.ToLower() == Dispositivo.ToString().ToLower())
{
lbl.ForeColor =
modDesconectado
? Color.Black
: Modulo.Status == StatusModulo.Conectado
? Color.Blue
: Modulo.Status == StatusModulo.Alerta ?
Color.Gold :
Modulo.Status == StatusModulo.Operante
? Color.DarkGreen
: Color.DarkRed;
modDesconectado ? Color.Black :
Modulo.Status == StatusModulo.Conectado ? Color.Blue :
Modulo.Status == StatusModulo.Falha ? Color.DarkRed :
Modulo.Status == StatusModulo.Alerta ? Color.Gold :
Modulo.Status == StatusModulo.Operante ? Color.DarkGreen
: Color.Black;
}
else
{

View File

@ -40,7 +40,7 @@ namespace AgroBase.Forms
Task.Run(async () =>
{
await VariaveisOperacao.Operadores.IniciarProcessamento();
await VariaveisOperacao.Operadores.IniciarProcessamento(false);
});
}

View File

@ -79,46 +79,46 @@ namespace AgroBase.Forms
private async void btnLeituraRGB_Click(object sender, EventArgs e)
{
EnviarComandoReqFrame(VisualWorkerFrameType.Rgb);
EnviarComandoReqFrame(CameraFrameType.Rgb);
}
private void btnLeituraHeatmap_Click(object sender, EventArgs e)
{
EnviarComandoReqFrame(VisualWorkerFrameType.Heatmap);
EnviarComandoReqFrame(CameraFrameType.Heatmap);
}
private void btnLeituraRadar2D_Click(object sender, EventArgs e)
{
EnviarComandoReqFrame(VisualWorkerFrameType.RadarTopDown);
EnviarComandoReqFrame(CameraFrameType.RadarTopDown);
}
private void btnLeituraSegmentacaoSemantica_Click(object sender, EventArgs e)
{
EnviarComandoReqFrame(VisualWorkerFrameType.Segmentacao);
EnviarComandoReqFrame(CameraFrameType.Segmentacao);
}
private async void EnviarComandoReqFrame(VisualWorkerFrameType tipo)
private async void EnviarComandoReqFrame(CameraFrameType tipo)
{
OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(tipo);
PictureBox pic =
tipo == VisualWorkerFrameType.Rgb ? picRGB :
tipo == VisualWorkerFrameType.Heatmap ? picHeatmap :
tipo == VisualWorkerFrameType.RadarTopDown ? picRadar2D :
tipo == VisualWorkerFrameType.Segmentacao ? picSegmentacaoSemantica :
tipo == CameraFrameType.Rgb ? picRGB :
tipo == CameraFrameType.Heatmap ? picHeatmap :
tipo == CameraFrameType.RadarTopDown ? picRadar2D :
tipo == CameraFrameType.Segmentacao ? picSegmentacaoSemantica :
new PictureBox();
Label lbl =
tipo == VisualWorkerFrameType.Rgb ? lblLeituraRGB :
tipo == VisualWorkerFrameType.Heatmap ? lblLeituraHeatmap :
tipo == VisualWorkerFrameType.RadarTopDown ? lblLeituraRadar2D :
tipo == VisualWorkerFrameType.Segmentacao ? lblLeituraSegmentacaoSemantica :
tipo == CameraFrameType.Rgb ? lblLeituraRGB :
tipo == CameraFrameType.Heatmap ? lblLeituraHeatmap :
tipo == CameraFrameType.RadarTopDown ? lblLeituraRadar2D :
tipo == CameraFrameType.Segmentacao ? lblLeituraSegmentacaoSemantica :
new Label();
pic.Image?.Dispose();
try { pic.Image = frame?.image(); } catch { }
lbl.Text = $"Leitura em: " + frame?.timestamp.ToString("dd/MM/yyyy HH:mm:ss");
if (tipo == VisualWorkerFrameType.RadarTopDown && VisualWorkerService.DadosLeitura.Analises != null)
if (tipo == CameraFrameType.RadarTopDown && VisualWorkerService.DadosLeitura.Analises != null)
{
//pic.Image = VariaveisOperacao.Operadores.VisualWorker.DadosLeitura.Leitura.obj.radar_2d.PlotarAnalsie(frame.image);
@ -152,7 +152,7 @@ namespace AgroBase.Forms
var analise = VisualWorkerService.DadosLeitura.Analises;
lblLeituraDebug.Text = $"Leitura em: " + (analise?.timestamp ?? DateTime.MinValue).ToString("dd/MM/yyyy HH:mm:ss");
OAKCameraFrameModel frame = VisualWorkerService.DadosLeitura.CameraFrames[VisualWorkerFrameType.Heatmap];
OAKCameraFrameModel frame = VisualWorkerService.DadosLeitura.CameraFrames[CameraFrameType.Heatmap];
picDebug.Image?.Dispose();
picDebug.Image = analise.PlotarAnalise(frame);

View File

@ -687,6 +687,7 @@ namespace AgroBase
var Bico = DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.ID == ID);
if (Bico != null)
{
Console.WriteLine($"Bico {Bico.Posicao} atualizado de {Bico.ComandoAtuar} para {Status}");
Bico.ComandoAtuar = Status;
(id_num, posicao, data) = Bico.ProtocoloComando();
}

View File

@ -18,7 +18,7 @@ namespace AgroBase.Models
{
get
{
return $"({Index}) {Name}";
return $"({Index}) {Name ?? Id}";
}
}
public string State { get; set; }
@ -36,7 +36,7 @@ namespace AgroBase.Models
public double DistanciaMinimaVisao { get; set; } = 500;
public double PercentualAlturaSolo { get; set; } = 30;
public Dictionary<VisualWorkerFrameType, OAKCameraFrameModel> frames
public Dictionary<CameraFrameType, OAKCameraFrameModel> frames
{
get
{
@ -44,14 +44,16 @@ namespace AgroBase.Models
{
case T_Code.Snr:
return VisualWorkerService.DadosLeitura.CameraFrames;
case T_Code.Cam:
return WeedWorkerService.DadosLeitura.CameraFrames;
default:
return new Dictionary<VisualWorkerFrameType, OAKCameraFrameModel>();
return new Dictionary<CameraFrameType, OAKCameraFrameModel>();
}
}
}
public async Task<Bitmap> GetNewFrame(VisualWorkerFrameType tipo = VisualWorkerFrameType.Rgb)
public async Task<Bitmap> GetNewFrame(CameraFrameType tipo = CameraFrameType.Rgb)
{
OAKCameraFrameModel frame = null;
switch (Dispositivo)
@ -59,18 +61,24 @@ namespace AgroBase.Models
case T_Code.Snr:
frame = await VisualWorkerService.GetCameraFrame(tipo);
break;
case T_Code.Cam:
frame = await WeedWorkerService.GetCameraFrame(tipo);
break;
}
Bitmap bmp = frame?.image();
return bmp;
}
public void SaveFrames(List<VisualWorkerFrameType> frames, string nome, string caminho)
public void SaveFrames(List<CameraFrameType> frames, string nome, string caminho)
{
switch (Dispositivo)
{
case T_Code.Snr:
VisualWorkerService.SaveCameraFrames(frames, nome, caminho);
break;
case T_Code.Cam:
WeedWorkerService.SaveCameraFrames(frames, nome, caminho);
break;
}
}

View File

@ -648,6 +648,8 @@ namespace AgroBase.Models
GPSTrajetoria = new List<GPSModel>();
Controle.BicosAtuados = DispAtu.Dados.BicosPulverizadores.Select(x => x.Clone()).ToList();
await RealizarCalibragemInicialAsync();
if (Modo == ModoOperacao.Manual)
@ -832,30 +834,45 @@ namespace AgroBase.Models
{
if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.MapaGPS)
{
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(false);
Variaveis.OperacaoEmAndamento.AtualizarDadosControleMovimento(false);
}
if (Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico)
{
Variaveis.OperacaoEmAndamento.AtualizarDadosControleAtuador(false);
}
}
public void AtualizarDadosControle(bool ForcarEnvio)
public void AtualizarDadosControleAtuador(bool ForcarEnvio)
{
DateTime Agora = DateTime.Now;
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
foreach (var Ctrl in _Controle.TiposControle)
if (!_Controle.PulverizadorAutomatico)
return;
foreach (var Ctrl in _Controle.TiposControle.Where(x => x.Tipo == T_Code.Atu))
{
if (ForcarEnvio || ((Agora - Ctrl.UltimoComando).TotalMilliseconds > Ctrl.DelayEnvioComando))
{
if (Ctrl.Tipo == T_Code.Atu && !_Controle.PulverizadorAutomatico)
{
return;
var Protocolos = EnviarProtocoloComando(Variaveis.OperacaoEmAndamento.DispAtu, Ctrl.Tipo, ForcarEnvio);
Ctrl.UltimoComando = Agora;
Ctrl.Comandos.AddRange(Protocolos);
}
}
}
IDispositivosService disp = Ctrl.Tipo == T_Code.Atu ?
(IDispositivosService)Variaveis.OperacaoEmAndamento.DispAtu :
(IDispositivosService)Variaveis.OperacaoEmAndamento.DispMvd;
public void AtualizarDadosControleMovimento(bool ForcarEnvio)
{
DateTime Agora = DateTime.Now;
var Protocolos = EnviarProtocoloComando(disp, Ctrl.Tipo, ForcarEnvio);
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
foreach (var Ctrl in _Controle.TiposControle.Where(x => x.Tipo != T_Code.Atu))
{
if (ForcarEnvio || ((Agora - Ctrl.UltimoComando).TotalMilliseconds > Ctrl.DelayEnvioComando))
{
var Protocolos = EnviarProtocoloComando(Variaveis.OperacaoEmAndamento.DispMvd, Ctrl.Tipo, ForcarEnvio);
Ctrl.UltimoComando = Agora;
Ctrl.Comandos.AddRange(Protocolos);
}
@ -942,7 +959,17 @@ namespace AgroBase.Models
}
else if (Dispositivo.Dados is AtuadorModel)
{
if (ForcarEnvio || _ControleAnterior.BicosAtuados.Count() >= _Controle.BicosAtuados.Count())
bool AlteracaoDeEstado = false;
for (int i = 0; i < _Controle.BicosAtuados.Count; i++)
{
if (_Controle.BicosAtuados[i].ComandoAtuar != _ControleAnterior.BicosAtuados[i].ComandoAtuar)
{
AlteracaoDeEstado = true;
break;
}
}
if (ForcarEnvio || AlteracaoDeEstado)
{
for (int i = 0; i < _Controle.BicosAtuados.Count; i++)
{
@ -1202,7 +1229,7 @@ namespace AgroBase.Models
string nome = Variaveis.OperacaoEmAndamento.idxLog.ToString();
Camera.SaveFrames(new List<VisualWorkerFrameType>() { VisualWorkerFrameType.Rgb, VisualWorkerFrameType.Heatmap, VisualWorkerFrameType.RadarTopDown, VisualWorkerFrameType.Segmentacao }, nome, Caminho);
Camera.SaveFrames(new List<CameraFrameType>() { CameraFrameType.Rgb, CameraFrameType.Heatmap, CameraFrameType.RadarTopDown, CameraFrameType.Segmentacao }, nome, Caminho);
}
@ -1418,7 +1445,7 @@ namespace AgroBase.Models
Angulo = Angulo,
Angulo_Max = Angulo_Max,
Angulo_Min = Angulo_Min,
BicosAtuados = new List<AtuadorBicoModel>(BicosAtuados),
BicosAtuados = BicosAtuados.Select(x => x.Clone()).ToList(),
Direcao = Direcao,
PercentualInicioPulverizacao = PercentualInicioPulverizacao,
PercentualVelocidadeSP = PercentualVelocidadeSP,

View File

@ -55,5 +55,14 @@ namespace AgroBase.Models.Operadores
{
ScriptCarregado = 1,
}
public enum CameraFrameType
{
Rgb = 1,
Heatmap = 2,
RadarTopDown = 3,
Segmentacao = 4,
Debug = 5
}
}

View File

@ -12,7 +12,7 @@ namespace AgroBase.Models.Operadores
public bool Pronto { get; set; }
public DateTime ProntoEm { get; set; }
public DateTime UltimaMensagem { get; set; }
public Dictionary<VisualWorkerFrameType, OAKCameraFrameModel> CameraFrames { get; set; }
public Dictionary<CameraFrameType, OAKCameraFrameModel> CameraFrames { get; set; } = new Dictionary<CameraFrameType, OAKCameraFrameModel>();
//public WorkerMessageModel<VisualWorkerMessageResponseModel> Leitura { get; set; } = new WorkerMessageModel<VisualWorkerMessageResponseModel>();
public VisualWorkerMessageAnaliseModel Analises { get; set; } = new VisualWorkerMessageAnaliseModel();
public VisualWorkerMessageIMUModel Imu { get; set; } = new VisualWorkerMessageIMUModel();
@ -26,7 +26,7 @@ namespace AgroBase.Models.Operadores
IniciadoEm = IniciadoEm,
Pronto = Pronto,
ProntoEm = ProntoEm,
CameraFrames = new Dictionary<VisualWorkerFrameType, OAKCameraFrameModel>(CameraFrames ?? new Dictionary<VisualWorkerFrameType, OAKCameraFrameModel>()),
CameraFrames = new Dictionary<CameraFrameType, OAKCameraFrameModel>(CameraFrames ?? new Dictionary<CameraFrameType, OAKCameraFrameModel>()),
Analises = Analises.Clone(),
Imu = Imu.Clone(),
//Leitura = Leitura.Clone(),
@ -40,7 +40,7 @@ namespace AgroBase.Models.Operadores
IniciadoEm = DateTime.MinValue;
Pronto = false;
ProntoEm = DateTime.MinValue;
CameraFrames = new Dictionary<VisualWorkerFrameType, OAKCameraFrameModel>();
CameraFrames = new Dictionary<CameraFrameType, OAKCameraFrameModel>();
Analises = new VisualWorkerMessageAnaliseModel();
Imu = new VisualWorkerMessageIMUModel();
//Leitura = new WorkerMessageModel<VisualWorkerMessageResponseModel>();
@ -522,13 +522,6 @@ namespace AgroBase.Models.Operadores
SaveCameraFrames = 6,
}
public enum VisualWorkerFrameType
{
Rgb = 1,
Heatmap = 2,
RadarTopDown = 3,
Segmentacao = 4,
Debug = 5
}
}

View File

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
namespace AgroBase.Models.Operadores
{
public class WeedWorkerModel
{
public bool Iniciado { get; set; }
public DateTime IniciadoEm { get; set; }
public bool Pronto { get; set; }
public DateTime ProntoEm { get; set; }
public DateTime UltimaMensagem { get; set; }
public Dictionary<CameraFrameType, OAKCameraFrameModel> CameraFrames { get; set; } = new Dictionary<CameraFrameType, OAKCameraFrameModel>();
public WeedWorkerModel Clone()
{
return new WeedWorkerModel()
{
Iniciado = Iniciado,
IniciadoEm = IniciadoEm,
Pronto = Pronto,
ProntoEm = ProntoEm,
CameraFrames = new Dictionary<CameraFrameType, OAKCameraFrameModel>(CameraFrames ?? new Dictionary<CameraFrameType, OAKCameraFrameModel>()),
};
}
public void ReiniciarEstado()
{
Iniciado = false;
IniciadoEm = DateTime.MinValue;
Pronto = false;
ProntoEm = DateTime.MinValue;
CameraFrames = new Dictionary<CameraFrameType, OAKCameraFrameModel>();
}
}
public enum WeedWorkerCommandType
{
ScriptCarregado = 1,
IniciarCameraManager = 2,
AtualizarSaudeCamera = 3,
GetCameraFrame = 4,
SaveCameraFrames = 5,
EnviarDadosControle = 6,
}
}

View File

@ -153,7 +153,9 @@ namespace AgroBase.Services.Operadores
("largura", VariaveisEquipamento.LarguraEquipamentoMm / 1000.0),
("distancia_entre_eixos", VariaveisEquipamento.DistanciaEntreEixos / 100.0),
("percentual_reservatorio_min", VariaveisEquipamento.PercentualReservatorioMin),
("percentual_tensao_bateria_min", VariaveisEquipamento.PercentualTensaoBateriaMin)
("percentual_tensao_bateria_min", VariaveisEquipamento.PercentualTensaoBateriaMin),
("camera_caminho_id", Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.Id),
("camera_solo_id", Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo.FirstOrDefault()?.Id ?? "")
);
}
@ -218,7 +220,6 @@ namespace AgroBase.Services.Operadores
),
("Snr", new
{
mx_id = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.Id,
percentual_altura_solo = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.PercentualAlturaSolo,
distancia_maxima = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.DistanciaMaximaVisao,
distancia_minima = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.DistanciaMinimaVisao

View File

@ -59,6 +59,7 @@ namespace AgroBase.Services.Operadores
DadosLeitura.ProntoEm = DateTime.Now;
MostrarLog($"Comando recebido: cmd = {cmd.ToString()}");
break;
case ManagerWorkerCommandType.EnviarDadosControle:
if (Variaveis.OperacaoEmAndamento.Modo == Enums.ModoOperacao.MapaGPS)
{
@ -83,6 +84,7 @@ namespace AgroBase.Services.Operadores
}
}
break;
case ManagerWorkerCommandType.FinalizarOperacao:
Task.Run(async () =>
{

View File

@ -18,6 +18,7 @@ namespace AgroBase.Services.Operadores
new VisualWorkerService(),
new HealthWorkerService(),
new CameraWorkerService(),
new WeedWorkerService(),
};
private bool iniciarScript = false;
@ -96,7 +97,7 @@ namespace AgroBase.Services.Operadores
("velocidade_sp", _Controle.PercentualVelocidadeSP)
);
Variaveis.OperacaoEmAndamento.AtualizarDadosControle(false);
Variaveis.OperacaoEmAndamento.AtualizaInformacoesControleOperacao();
}
RedisService.DefinirEquipamentoDesconectado();

View File

@ -63,7 +63,7 @@ namespace AgroBase.Services.Operadores
break;
case VisualWorkerCommandType.GetCameraFrame:
VisualWorkerFrameType tipo = (VisualWorkerFrameType)Convert.ToInt32(comando.@params["tipo"].ToString());
CameraFrameType tipo = (CameraFrameType)Convert.ToInt32(comando.@params["tipo"].ToString());
DadosLeitura.CameraFrames[tipo] = new OAKCameraFrameModel()
{
frame = comando.@params["frame"].ToString(),
@ -101,7 +101,7 @@ namespace AgroBase.Services.Operadores
RedisService.Publish(CmdKey.VisualWorkerRx, JsonConvert.SerializeObject(comando));
}
public static async Task<OAKCameraFrameModel> GetCameraFrame(VisualWorkerFrameType tipo = VisualWorkerFrameType.Rgb)
public static async Task<OAKCameraFrameModel> GetCameraFrame(CameraFrameType tipo = CameraFrameType.Rgb)
{
DateTime Inicio = DateTime.Now;
@ -121,7 +121,7 @@ namespace AgroBase.Services.Operadores
return _frame;
}
public static void SaveCameraFrames(List<VisualWorkerFrameType> frames, string nome, string caminho)
public static void SaveCameraFrames(List<CameraFrameType> frames, string nome, string caminho)
{
var comando = new
{

View File

@ -0,0 +1,158 @@
using AgroBase.Models.Operadores;
using AgroBase.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static AgroBase.Models.Operadores.OperadoresModels;
namespace AgroBase.Services.Operadores
{
public class WeedWorkerService : IWorkerModel
{
public static WeedWorkerModel DadosLeitura = new WeedWorkerModel();
public SaudeWorkerModel Saude { get; set; } = new SaudeWorkerModel();
private bool DebugMode = true;
public void MostrarLog(string message, int limite = 500)
{
if (DebugMode)
{
Console.WriteLine($"[WeedWorker] {message.Substring(0, Math.Min(limite, message.Length))}{(message.Length > limite ? "..." : "")}");
}
}
public async Task<bool> IniciarProcessamento()
{
RedisService.Subscribe(CmdKey.WeedWorkerTx, RedisCallback);
DadosLeitura.IniciadoEm = DateTime.Now;
DadosLeitura.Iniciado = true;
bool pronto() => DadosLeitura.Pronto;
await FuncoesGlobais.AguardarCondicaoAsync(pronto, 5000);
if (pronto())
{
MostrarLog("Processamento iniciado com sucesso");
return true;
}
MostrarLog("Timeout ao iniciar script");
DadosLeitura.ReiniciarEstado();
return false;
}
public void RedisCallback(string mensagem)
{
try
{
var comando = JsonConvert.DeserializeObject<ComandoRedis>(mensagem);
var cmd = (WeedWorkerCommandType)comando.cmd;
//MostrarLog($"Comando recebido: cmd = {cmd.ToString()}");
switch (cmd)
{
case WeedWorkerCommandType.ScriptCarregado:
DadosLeitura.Pronto = true;
DadosLeitura.ProntoEm = DateTime.Now;
MostrarLog($"Comando recebido: cmd = {cmd.ToString()}");
break;
case WeedWorkerCommandType.GetCameraFrame:
CameraFrameType tipo = (CameraFrameType)Convert.ToInt32(comando.@params["tipo"].ToString());
DadosLeitura.CameraFrames[tipo] = new OAKCameraFrameModel()
{
frame = comando.@params["frame"].ToString(),
timestamp = FuncoesGlobais.UnixToDateTime(comando.@params["timestamp"].ToString()),
};
break;
case WeedWorkerCommandType.EnviarDadosControle:
if (Variaveis.OperacaoEmAndamento.Controle.PulverizadorAutomatico)
{
if (comando.@params == null)
break;
var _Controle = Variaveis.OperacaoEmAndamento.Controle;
if (comando.@params is Dictionary<string, object> dictParams)
{
var novoComando = dictParams
.Select(kv => new
{
Key = int.TryParse(kv.Key, out var i) ? (i + 1) : -1,
Value = Convert.ToBoolean(kv.Value)
})
.Where(x => x.Key >= 0)
.ToDictionary(x => x.Key, x => x.Value);
foreach (var bico in _Controle.BicosAtuados)
{
novoComando.TryGetValue(bico.Posicao, out bool atuado);
bico.ComandoAtuar = atuado;
}
Variaveis.OperacaoEmAndamento.AtualizaInformacoesControleOperacao();
}
}
break;
default:
MostrarLog($"Comando não reconhecido: {comando.cmd}");
break;
}
}
catch (Exception ex)
{
MostrarLog($"Erro ao deserializar resposta: {ex.Message}");
}
finally
{
DadosLeitura.UltimaMensagem = DateTime.Now;
}
}
public void AtualizarSaude()
{
Saude = OperadoresModels.AtualizarSaude(CtxKey.DadosWeedWorker);
}
public static async Task<OAKCameraFrameModel> GetCameraFrame(CameraFrameType tipo = CameraFrameType.Rgb)
{
DateTime Inicio = DateTime.Now;
var comando = new
{
cmd = WeedWorkerCommandType.GetCameraFrame,
@params = tipo,
};
RedisService.Publish(CmdKey.WeedWorkerRx, JsonConvert.SerializeObject(comando));
bool Frame() => DadosLeitura.CameraFrames.TryGetValue(tipo, out var frame) && (frame?.timestamp ?? DateTime.MinValue) > Inicio;
await FuncoesGlobais.AguardarCondicaoAsync(Frame, 1000, 100);
DadosLeitura.CameraFrames.TryGetValue(tipo, out OAKCameraFrameModel _frame);
return _frame;
}
public static void SaveCameraFrames(List<CameraFrameType> frames, string nome, string caminho)
{
var comando = new
{
cmd = WeedWorkerCommandType.SaveCameraFrames,
@params = new
{
nome = nome,
caminho = caminho,
tipos = frames.Select(x => (int)x).ToArray(),
},
};
RedisService.Publish(CmdKey.WeedWorkerRx, JsonConvert.SerializeObject(comando));
}
}
}

View File

@ -187,6 +187,7 @@ namespace AgroBase.Services
public const string DadosControle = "ctx:dados_controle";
public const string DadosEquipamento = "ctx:dados_equipamento";
public const string DadosVisualWorker = "ctx:dados_visual_worker";
public const string DadosWeedWorker = "ctx:dados_weed_worker";
public const string DadosManagerWorker = "ctx:dados_manager_worker";
public const string DadosHealthWorker = "ctx:dados_health_worker";
public const string DadosCameraWorker = "ctx:dados_camera_worker";
@ -202,5 +203,7 @@ namespace AgroBase.Services
public const string CameraWorkerTx = "cmd_tx:camera_worker";
public const string ManagerWorkerRx = "cmd_rx:manager_worker";
public const string ManagerWorkerTx = "cmd_tx:manager_worker";
public const string WeedWorkerRx = "cmd_rx:weed_worker";
public const string WeedWorkerTx = "cmd_tx:weed_worker";
}
}

View File

@ -1,12 +1,5 @@
{
"epochs": [ {
"calculation_time": "13395172669289149",
"config_version": 0,
"model_version": "0",
"padded_top_topics_start_index": 0,
"taxonomy_version": 0,
"top_topics_and_observing_domains": [ ]
}, {
"calculation_time": "13395881044629269",
"config_version": 0,
"model_version": "0",
@ -29,5 +22,5 @@
"top_topics_and_observing_domains": [ ]
} ],
"hex_encoded_hmac_key": "40F346D3248C3AFDF2BEE1FE496DBD32F7CED6E5AE98B881ABC421AA7E7B5642",
"next_scheduled_calculation_time": "13397830127957632"
"next_scheduled_calculation_time": "13397830127957680"
}

View File

@ -1,3 +1,3 @@
2025/07/18-16:42:45.122 990 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
2025/07/18-16:42:45.129 990 Recovering log #3
2025/07/18-16:42:45.133 990 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log
2025/07/21-15:21:17.549 8344 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
2025/07/21-15:21:17.555 8344 Recovering log #3
2025/07/21-15:21:17.558 8344 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log

View File

@ -1,3 +1,3 @@
2025/07/18-16:10:16.297 1248 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
2025/07/18-16:10:16.303 1248 Recovering log #3
2025/07/18-16:10:16.306 1248 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log
2025/07/21-15:10:12.398 7cc4 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
2025/07/21-15:10:12.406 7cc4 Recovering log #3
2025/07/21-15:10:12.409 7cc4 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log

View File

@ -1 +1 @@
{"net":{"http_server_properties":{"servers":[{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13397427789769984","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":13901},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:69b:cf00:d5cb:d183:c651:2afa","used_quic":true},"version":5},"network_qualities":{"CAASABiAgICA+P////8B":"4G","CAESABiAgICA+P////8B":"4G","CAISABiAgICA+P////8B":"4G","CAYSABiAgICA+P////8B":"Offline"}}}
{"net":{"http_server_properties":{"servers":[{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13397682078167259","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":58184},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:69b:cf00:e1c9:9847:8945:20fe","used_quic":true},"version":5},"network_qualities":{"CAASABiAgICA+P////8B":"4G","CAESABiAgICA+P////8B":"4G","CAISABiAgICA+P////8B":"4G","CAYSABiAgICA+P////8B":"Offline"}}}

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,3 @@
2025/07/18-16:56:03.153 990 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
2025/07/18-16:56:03.154 990 Recovering log #3
2025/07/18-16:56:03.157 990 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log
2025/07/21-15:34:33.516 8344 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
2025/07/21-15:34:33.517 8344 Recovering log #3
2025/07/21-15:34:33.520 8344 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log

View File

@ -1,3 +1,3 @@
2025/07/18-16:17:14.846 1248 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
2025/07/18-16:17:14.847 1248 Recovering log #3
2025/07/18-16:17:14.850 1248 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log
2025/07/21-15:18:09.336 7cc4 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
2025/07/21-15:18:09.338 7cc4 Recovering log #3
2025/07/21-15:18:09.342 7cc4 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log

View File

@ -1,3 +1,3 @@
2025/07/18-16:42:45.037 6640 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
2025/07/18-16:42:45.039 6640 Recovering log #7
2025/07/18-16:42:45.040 6640 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log
2025/07/21-15:21:17.473 813c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
2025/07/21-15:21:17.474 813c Recovering log #7
2025/07/21-15:21:17.475 813c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log

View File

@ -1,3 +1,3 @@
2025/07/18-16:10:16.228 5b90 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
2025/07/18-16:10:16.229 5b90 Recovering log #7
2025/07/18-16:10:16.230 5b90 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log
2025/07/21-15:10:12.318 189c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
2025/07/21-15:10:12.320 189c Recovering log #7
2025/07/21-15:10:12.320 189c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,7 @@
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style>
#map_da5e1542c7ab541155af4f4c041e9c23 {
#map_9167a3f59236bbe3ca57b08de1d97258 {
position: relative;
width: 100.0%;
height: 100.0%;
@ -54,14 +54,14 @@
<body>
<div class="folium-map" id="map_da5e1542c7ab541155af4f4c041e9c23" ></div>
<div class="folium-map" id="map_9167a3f59236bbe3ca57b08de1d97258" ></div>
</body>
<script>
var map_da5e1542c7ab541155af4f4c041e9c23 = L.map(
"map_da5e1542c7ab541155af4f4c041e9c23",
var map_9167a3f59236bbe3ca57b08de1d97258 = L.map(
"map_9167a3f59236bbe3ca57b08de1d97258",
{
center: [0.0, 0.0],
crs: L.CRS.EPSG3857,
@ -78,7 +78,7 @@
var tile_layer_3635f6a14539c3f382434fa86536d4f3 = L.tileLayer(
var tile_layer_d32108711f97218804be105ee489826b = L.tileLayer(
"https://tile.openstreetmap.org/{z}/{x}/{y}.png",
{
"minZoom": 0,
@ -95,7 +95,7 @@
);
tile_layer_3635f6a14539c3f382434fa86536d4f3.addTo(map_da5e1542c7ab541155af4f4c041e9c23);
tile_layer_d32108711f97218804be105ee489826b.addTo(map_9167a3f59236bbe3ca57b08de1d97258);
</script>
@ -116,7 +116,7 @@
}
trajeto_json_add({"features": []});
trajeto_json.addTo(map_da5e1542c7ab541155af4f4c041e9c23);
trajeto_json.addTo(map_9167a3f59236bbe3ca57b08de1d97258);
function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria);
@ -179,9 +179,9 @@
var marcadorEquipamento = L.marker([0, 0], {
icon: customIcon
}).addTo(map_da5e1542c7ab541155af4f4c041e9c23);
}).addTo(map_9167a3f59236bbe3ca57b08de1d97258);
var marcadorBase = L.marker([0, 0], {}).addTo(map_da5e1542c7ab541155af4f4c041e9c23);
var marcadorBase = L.marker([0, 0], {}).addTo(map_9167a3f59236bbe3ca57b08de1d97258);
var icon = L.AwesomeMarkers.icon(
{"extraClasses": "fa-rotate-0", "icon": "info-sign", "iconColor": "white", "markerColor": "red", "prefix": "glyphicon"}
);
@ -246,7 +246,7 @@
}
if (foco) {
map_da5e1542c7ab541155af4f4c041e9c23.setView(novaPosicao, map_da5e1542c7ab541155af4f4c041e9c23.getZoom());
map_9167a3f59236bbe3ca57b08de1d97258.setView(novaPosicao, map_9167a3f59236bbe3ca57b08de1d97258.getZoom());
}
}
@ -268,7 +268,7 @@
marcadorDinamico.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
map_da5e1542c7ab541155af4f4c041e9c23.setView(novaPosicao, map_da5e1542c7ab541155af4f4c041e9c23.getZoom());*/
map_9167a3f59236bbe3ca57b08de1d97258.setView(novaPosicao, map_9167a3f59236bbe3ca57b08de1d97258.getZoom());*/
});
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {

View File

@ -74,6 +74,12 @@ class CameraOak:
if self.tem_depth:
self.q_depth = self.device.getOutputQueue(name="depth", maxSize=1, blocking=False)
if self.tem_imu:
self.q_imu = self.device.getOutputQueue(name="imu", maxSize=50, blocking=False)
self.imu = IMUCamera(self.q_imu)
if self.dispositivo == T_Code.Snr:
self.parametros = {
"rgb_width": 1920,
"rgb_height": 1080,
@ -90,10 +96,12 @@ class CameraOak:
}
self._set_calib()
_camera["parametros"] = self.parametros
if self.tem_imu:
self.q_imu = self.device.getOutputQueue(name="imu", maxSize=50, blocking=False)
self.imu = IMUCamera(self.q_imu)
elif self.dispositivo == T_Code.Cam:
self.parametros = {
"rgb_width": 1920,
"rgb_height": 1080,
}
_camera["parametros"] = self.parametros
self.iniciado = True
_camera["iniciado"] = True
@ -243,6 +251,7 @@ class CameraOak:
"executando": False,
"velocidade": ""
}
if conectado:
try:
dev = self.device
temp = dev.getChipTemperature().average
@ -286,13 +295,13 @@ class CameraOak:
if speed.lower() not in ["super", "superplus"]: # USB 3.x
motivos.append(f"USB lenta: {speed}")
saude -= 15
frame, resultado = self.requisitar_frame_rgb()
except Exception as e:
self.mostrar_log(f"Erro ao requisitar dados da camera para atualizar saude")
if "Communication exception" in str(e) or "X_LINK_ERROR" in str(e):
conectado = False
frame, resultado = self.requisitar_frame_rgb()
if not conectado:
motivos.append("desconectado")
saude = 0

View File

@ -1,6 +1,6 @@
import time
import depthai as dai
from shared.enums import StatusModulo, T_Code, VisualWorkerCommandType
from shared.enums import StatusModulo, T_Code, VisualWorkerCommandType, WeedWorkerCommandType
from shared.contexto_global_redis import ContextoGlobalRedis, CtxKey, CmdKey
class CameraManager:
@ -45,10 +45,15 @@ class CameraManager:
for cam in cameras_mapeadas.values():
if cam.get("dispositivo", T_Code.Vzo.value) == T_Code.Snr.value:
ContextoGlobalRedis.publicar_comando(CmdKey.VisualWorkerRx, { "cmd": VisualWorkerCommandType.AtualizarSaudeCamera.value } )
elif cam.get("dispositivo", T_Code.Vzo.value) == T_Code.Cam.value:
ContextoGlobalRedis.publicar_comando(CmdKey.WeedWorkerRx, { "cmd": WeedWorkerCommandType.AtualizarSaudeCamera.value } )
visual_worker_camera_id = ContextoGlobalRedis.get_operacao().get("Snr", {}).get("mx_id")
visual_worker_camera_id = ContextoGlobalRedis.get_equipamento().get("camera_caminho_id")
if visual_worker_camera_id is not None and visual_worker_camera_id in dispositivos_serializados:
ContextoGlobalRedis.publicar_comando(CmdKey.VisualWorkerRx, { "cmd": VisualWorkerCommandType.IniciarCameraManager.value, "params": visual_worker_camera_id } )
weed_worker_camera_id = ContextoGlobalRedis.get_equipamento().get("camera_solo_id")
if weed_worker_camera_id is not None and weed_worker_camera_id in dispositivos_serializados:
ContextoGlobalRedis.publicar_comando(CmdKey.WeedWorkerRx, { "cmd": WeedWorkerCommandType.IniciarCameraManager.value, "params": weed_worker_camera_id } )
def definir_saude_camera(mx_id: str, status: StatusModulo, saude: int, motivos: list, rodando: bool, performance: dict):

View File

@ -6,6 +6,7 @@ from manager_worker.main import main as iniciar_manager_worker
from health_worker.main import main as iniciar_health_worker
from visual_worker.main import main as iniciar_visual_worker
from camera_worker.main import main as iniciar_camera_worker
from weed_worker.main import main as iniciar_weed_worker
from shared.contexto_global_redis import ContextoGlobalRedis
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
@ -18,6 +19,7 @@ def main():
Process(target=iniciar_health_worker, name="HealthWorker"),
Process(target=iniciar_visual_worker, name="VisualWorker"),
Process(target=iniciar_camera_worker, name="CameraWorker"),
Process(target=iniciar_weed_worker, name="WeedWorker"),
]
for p in processos:

View File

@ -15,6 +15,7 @@ class CtxKey(str, Enum):
DadosControle = "ctx:dados_controle"
DadosEquipamento = "ctx:dados_equipamento"
DadosVisualWorker = "ctx:dados_visual_worker"
DadosWeedWorker = "ctx:dados_weed_worker"
DadosManagerWorker = "ctx:dados_manager_worker"
DadosHealthWorker = "ctx:dados_health_worker"
DadosCameraWorker = "ctx:dados_camera_worker"
@ -29,6 +30,8 @@ class CmdKey(str, Enum):
CameraWorkerRx = "cmd_rx:camera_worker"
ManagerWorkerTx = "cmd_tx:manager_worker"
ManagerWorkerRx = "cmd_rx:manager_worker"
WeedWorkerTx = "cmd_tx:weed_worker"
WeedWorkerRx = "cmd_rx:weed_worker"
def mostrar_log(mensagem):

View File

@ -23,6 +23,14 @@ class ManagerWorkerCommandType(IntEnum):
EnviarDadosControle = 4
FinalizarOperacao = 5
class WeedWorkerCommandType(IntEnum):
ScriptCarregado = 1
IniciarCameraManager = 2
AtualizarSaudeCamera = 3
GetCameraFrame = 4
SaveCameraFrames = 5
EnviarDadosControle = 6
class ModoOperacao(IntEnum):
NaoDefinido = 0
Manual = 1
@ -146,26 +154,9 @@ class TipoPontoRua(IntEnum):
CruvaEntreCorredores = 6
Desvio = 7
# Visual Worker
class VisualWorkerFrameType(IntEnum):
class CameraFrameType(IntEnum):
Rgb = 1
Heatmap = 2
RadarTopDown = 3
Segmentacao = 4
Debug = 5
class VisualWorkerTipoDeteccao(IntEnum):
SEGURO = 1
OBSTACULO = 2
DEPRESSAO = 3
class VisualWorkerTipoRegiaoRadar(IntEnum):
SOLO = 1
AEREO = 2
class VisualWorkerTipoAnalise(IntEnum):
ANOMALIA = 1
SOLO = 2
RADAR_2D = 3
SEGMENTACAO_SEMANTICA = 4
MATRIZ_CONFIANCA = 5

View File

@ -12,7 +12,7 @@ from visual_worker.processamento.analise_solo import AnaliseSoloManager
from visual_worker.processamento.analise_anomalias import AnaliseAnomaliasManager
from visual_worker.processamento.radar_top_down import Radar2DManager
from visual_worker.processamento.segmentacao_semantica import ClassesSegmentacao, SegmentacaoManager
from shared.enums import StatusModulo, T_Code, VisualWorkerFrameType
from shared.enums import StatusModulo, T_Code, CameraFrameType
from shared.utils import analisar_linhas_por_profundidade, decode_image_base64, encode_image_base64
from shared.gps_handler import GPSHandler
from camera_worker.camera_oak import CameraOak
@ -130,35 +130,35 @@ class CameraManager:
return gerar_heatmap(frame, self.camera.parametros["distancia_maxima"]), timestamp, res
return None, None, None
def get_select_frame(self, tipo: VisualWorkerFrameType):
def get_select_frame(self, tipo: CameraFrameType):
f = None
t = None
if tipo == VisualWorkerFrameType.Rgb:
if tipo == CameraFrameType.Rgb:
f, t, _ = self.get_rgb_frame()
f = encode_image_base64(f)
elif tipo == VisualWorkerFrameType.Heatmap:
elif tipo == CameraFrameType.Heatmap:
f, t, _ = self.get_heatmap_frame()
f = encode_image_base64(f)
elif tipo == VisualWorkerFrameType.RadarTopDown:
elif tipo == CameraFrameType.RadarTopDown:
f = self._ultima_analise_radar.get("frame", {}).get("frame")
t = self._ultima_analise_radar.get("timestamp")
elif tipo == VisualWorkerFrameType.Segmentacao:
elif tipo == CameraFrameType.Segmentacao:
f = self._ultima_analise_segmentacao.get("frame", {}).get("frame")
t = self._ultima_analise_segmentacao.get("timestamp")
return f, t
def _iniciar_loop_analise_continua(self, freq):
def loop():
ultima_atualizacao = 0
ultima_atualizacao_saude = 0
while True:
if self.camera is None:
time.sleep(5)
continue
t0 = time.time()
if (t0 - ultima_atualizacao) >= 1:
if (t0 - ultima_atualizacao_saude) >= 1:
self.camera.atualizar_saude()
ultima_atualizacao = time.time()
ultima_atualizacao_saude = time.time()
try:
status = StatusModulo((self.camera.ultima_saude or {}).get("status", StatusModulo.DESCONECTADO.value))
if status == StatusModulo.DESCONECTADO:
@ -506,7 +506,7 @@ class CameraManager:
if nome is not None and nome != "":
frame_name = nome
if VisualWorkerFrameType.Rgb.value in tipos:
if CameraFrameType.Rgb.value in tipos:
rgb_frame, rgb_ts, rgb_res = self.get_rgb_frame()
if rgb_frame is not None and rgb_res["frame_valido"]:
nome_rgb = f"{frame_name}_rgb.jpeg"
@ -514,7 +514,7 @@ class CameraManager:
cv2.imwrite(caminho_rgb, rgb_frame)
frames_salvos.append(caminho_rgb)
if VisualWorkerFrameType.Heatmap.value in tipos:
if CameraFrameType.Heatmap.value in tipos:
heatmap_frame, heatmap_ts, heatmap_res = self.get_heatmap_frame()
if heatmap_frame is not None and heatmap_res["frame_valido"]:
nome_heatmap = f"{frame_name}_heatmap.jpeg"
@ -522,12 +522,12 @@ class CameraManager:
cv2.imwrite(caminho_heatmap, heatmap_frame)
frames_salvos.append(caminho_heatmap)
if VisualWorkerFrameType.RadarTopDown.value in tipos:
if CameraFrameType.RadarTopDown.value in tipos:
frame = self._salvar_frame_analise(frame_name, self._ultima_analise_radar, "radar", pasta)
if frame is not None:
frames_salvos.append(frame)
if VisualWorkerFrameType.Segmentacao.value in tipos:
if CameraFrameType.Segmentacao.value in tipos:
frame = self._salvar_frame_analise(frame_name, self._ultima_analise_segmentacao, "segmentacao", pasta)
if frame is not None:
frames_salvos.append(frame)

View File

@ -7,7 +7,7 @@ def main():
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
print("🔎 Caminho sys.path:", os.path.abspath(os.path.join(os.path.dirname(__file__), "..")), "VisualWorker")
from shared.enums import VisualWorkerCommandType, VisualWorkerFrameType
from shared.enums import VisualWorkerCommandType, CameraFrameType
from visual_worker.config import mostrar_log, get_camera_manager, iniciar_camera_manager
from shared.contexto_global_redis import ContextoGlobalRedis, CmdKey, CtxKey
@ -49,7 +49,7 @@ def main():
elif acao == VisualWorkerCommandType.AtualizarSaudeCamera:
get_camera_manager().atualizar_saude_camera()
elif acao == VisualWorkerCommandType.GetCameraFrame:
tipo = VisualWorkerFrameType(dados.get("params", VisualWorkerFrameType.Rgb.value))
tipo = CameraFrameType(dados.get("params", CameraFrameType.Rgb.value))
base64_img, ts = get_camera_manager().get_select_frame(tipo)
if base64_img is not None:
resposta = {