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

View File

@ -266,10 +266,14 @@ namespace AgroBase.Forms.IHM
cmbCameraCaminho.Items.Clear(); cmbCameraCaminho.Items.Clear();
cmbCameraCaminho.Items.AddRange(ListaCameras.Select(x => x.Description).ToArray()); 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) 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()); 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 else
{ {
cmbCamera.Text = cameraSelecionada; cmbCamera.Text = CamerasSolo[idx].Id;
} }
} }

View File

@ -230,7 +230,7 @@ namespace AgroBase.Forms.IHM
Task.Run(async () => Task.Run(async () =>
{ {
ReqFrameSnr = true; ReqFrameSnr = true;
OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(VisualWorkerFrameType.Rgb); OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(CameraFrameType.Rgb);
pnlCameraCaminho.BackgroundImage?.Dispose(); pnlCameraCaminho.BackgroundImage?.Dispose();
try { pnlCameraCaminho.BackgroundImage = frame?.image(); } catch { } try { pnlCameraCaminho.BackgroundImage = frame?.image(); } catch { }
lblUltimaLeituraCaminho.Text = $"Última Leitura Caminho: " + frame?.timestamp.ToString("HH:mm:ss"); 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.lblMqtt = new System.Windows.Forms.Label();
this.lblD_Sen_sCOR_36V = 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_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_Mov_DT = new System.Windows.Forms.Label();
this.lblD_Dir_DF = new System.Windows.Forms.Label(); this.lblD_Dir_DF = new System.Windows.Forms.Label();
this.lblD_Dir_EF = 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_Dir_ET = new System.Windows.Forms.Label();
this.lblD_Mov_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_0 = new System.Windows.Forms.Label();
this.lblD_Cam_1 = new System.Windows.Forms.Label();
this.lblD_Snr = new System.Windows.Forms.Label(); this.lblD_Snr = new System.Windows.Forms.Label();
this.lblDiagnosticos = new System.Windows.Forms.Label(); this.lblDiagnosticos = new System.Windows.Forms.Label();
this.lblOperacao = new System.Windows.Forms.Label(); this.lblOperacao = new System.Windows.Forms.Label();
@ -104,7 +103,7 @@
// //
this.lblD_Atu.AutoSize = true; this.lblD_Atu.AutoSize = true;
this.lblD_Atu.Cursor = System.Windows.Forms.Cursors.Hand; 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.Name = "lblD_Atu";
this.lblD_Atu.Size = new System.Drawing.Size(48, 24); this.lblD_Atu.Size = new System.Drawing.Size(48, 24);
this.lblD_Atu.TabIndex = 4; this.lblD_Atu.TabIndex = 4;
@ -163,24 +162,24 @@
this.lblD_Sen_sLRA.AutoSize = true; 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.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.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.Name = "lblD_Sen_sLRA";
this.lblD_Sen_sLRA.Size = new System.Drawing.Size(46, 24); this.lblD_Sen_sLRA.Size = new System.Drawing.Size(46, 24);
this.lblD_Sen_sLRA.TabIndex = 15; this.lblD_Sen_sLRA.TabIndex = 15;
this.lblD_Sen_sLRA.Text = "LRA"; this.lblD_Sen_sLRA.Text = "LRA";
this.lblD_Sen_sLRA.Click += new System.EventHandler(this.lblModulo_Click); this.lblD_Sen_sLRA.Click += new System.EventHandler(this.lblModulo_Click);
// //
// lblD_Sen_sIMU // lblD_Imu
// //
this.lblD_Sen_sIMU.AutoSize = true; this.lblD_Imu.AutoSize = true;
this.lblD_Sen_sIMU.BackColor = System.Drawing.Color.Lavender; this.lblD_Imu.BackColor = System.Drawing.Color.Lavender;
this.lblD_Sen_sIMU.Cursor = System.Windows.Forms.Cursors.Hand; this.lblD_Imu.Cursor = System.Windows.Forms.Cursors.Hand;
this.lblD_Sen_sIMU.Location = new System.Drawing.Point(14, 547); this.lblD_Imu.Location = new System.Drawing.Point(14, 547);
this.lblD_Sen_sIMU.Name = "lblD_Sen_sIMU"; this.lblD_Imu.Name = "lblD_Imu";
this.lblD_Sen_sIMU.Size = new System.Drawing.Size(43, 24); this.lblD_Imu.Size = new System.Drawing.Size(43, 24);
this.lblD_Sen_sIMU.TabIndex = 16; this.lblD_Imu.TabIndex = 16;
this.lblD_Sen_sIMU.Text = "IMU"; this.lblD_Imu.Text = "IMU";
this.lblD_Sen_sIMU.Click += new System.EventHandler(this.lblModulo_Click); this.lblD_Imu.Click += new System.EventHandler(this.lblModulo_Click);
// //
// lblD_Mov_DT // lblD_Mov_DT
// //
@ -269,26 +268,15 @@
// lblD_Cam_0 // lblD_Cam_0
// //
this.lblD_Cam_0.AutoSize = true; 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.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.Name = "lblD_Cam_0";
this.lblD_Cam_0.Size = new System.Drawing.Size(52, 24); this.lblD_Cam_0.Size = new System.Drawing.Size(52, 24);
this.lblD_Cam_0.TabIndex = 29; this.lblD_Cam_0.TabIndex = 29;
this.lblD_Cam_0.Text = "CAM"; this.lblD_Cam_0.Text = "CAM";
this.lblD_Cam_0.Click += new System.EventHandler(this.lblModulo_Click); 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 // lblD_Snr
// //
this.lblD_Snr.AutoSize = true; this.lblD_Snr.AutoSize = true;
@ -698,7 +686,6 @@
this.Controls.Add(this.picOperacao); this.Controls.Add(this.picOperacao);
this.Controls.Add(this.lblD_Snr); this.Controls.Add(this.lblD_Snr);
this.Controls.Add(this.picAjustes); this.Controls.Add(this.picAjustes);
this.Controls.Add(this.lblD_Cam_1);
this.Controls.Add(this.lblD_Cam_0); this.Controls.Add(this.lblD_Cam_0);
this.Controls.Add(this.picDesligar); this.Controls.Add(this.picDesligar);
this.Controls.Add(this.lblD_Dir_ET); this.Controls.Add(this.lblD_Dir_ET);
@ -708,7 +695,7 @@
this.Controls.Add(this.lblD_Mov_EF); this.Controls.Add(this.lblD_Mov_EF);
this.Controls.Add(this.lblD_Dir_DF); this.Controls.Add(this.lblD_Dir_DF);
this.Controls.Add(this.lblD_Mov_DT); 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_sLRA);
this.Controls.Add(this.lblD_Sen_sCOR_36V); this.Controls.Add(this.lblD_Sen_sCOR_36V);
this.Controls.Add(this.lblMqtt); this.Controls.Add(this.lblMqtt);
@ -747,7 +734,7 @@
private System.Windows.Forms.Label lblMqtt; private System.Windows.Forms.Label lblMqtt;
private System.Windows.Forms.Label lblD_Sen_sCOR_36V; private System.Windows.Forms.Label lblD_Sen_sCOR_36V;
private System.Windows.Forms.Label lblD_Sen_sLRA; 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_Mov_DT;
private System.Windows.Forms.Label lblD_Dir_DF; private System.Windows.Forms.Label lblD_Dir_DF;
private System.Windows.Forms.Label lblD_Dir_EF; private System.Windows.Forms.Label lblD_Dir_EF;
@ -759,7 +746,6 @@
private System.Windows.Forms.PictureBox picOperacao; private System.Windows.Forms.PictureBox picOperacao;
private System.Windows.Forms.PictureBox picDesligar; private System.Windows.Forms.PictureBox picDesligar;
private System.Windows.Forms.Label lblD_Cam_0; 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.Label lblD_Snr;
private System.Windows.Forms.PictureBox picAjustes; private System.Windows.Forms.PictureBox picAjustes;
private System.Windows.Forms.Label lblDiagnosticos; private System.Windows.Forms.Label lblDiagnosticos;

View File

@ -188,6 +188,20 @@ namespace AgroBase.Forms.IHM
? Color.DarkRed ? Color.DarkRed
: Color.DarkGreen; : 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) else if (Dispositivo == T_Code.Sen)
{ {
var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo); var Modulo = SerialService.DispositivosMapeados.FirstOrDefault(x => x.Dispositivo == Dispositivo);
@ -195,15 +209,12 @@ namespace AgroBase.Forms.IHM
if (Mod_ID.ToLower() == Dispositivo.ToString().ToLower()) if (Mod_ID.ToLower() == Dispositivo.ToString().ToLower())
{ {
lbl.ForeColor = lbl.ForeColor =
modDesconectado modDesconectado ? Color.Black :
? Color.Black Modulo.Status == StatusModulo.Conectado ? Color.Blue :
: Modulo.Status == StatusModulo.Conectado Modulo.Status == StatusModulo.Falha ? Color.DarkRed :
? Color.Blue Modulo.Status == StatusModulo.Alerta ? Color.Gold :
: Modulo.Status == StatusModulo.Alerta ? Modulo.Status == StatusModulo.Operante ? Color.DarkGreen
Color.Gold : : Color.Black;
Modulo.Status == StatusModulo.Operante
? Color.DarkGreen
: Color.DarkRed;
} }
else else
{ {

View File

@ -40,7 +40,7 @@ namespace AgroBase.Forms
Task.Run(async () => 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) private async void btnLeituraRGB_Click(object sender, EventArgs e)
{ {
EnviarComandoReqFrame(VisualWorkerFrameType.Rgb); EnviarComandoReqFrame(CameraFrameType.Rgb);
} }
private void btnLeituraHeatmap_Click(object sender, EventArgs e) private void btnLeituraHeatmap_Click(object sender, EventArgs e)
{ {
EnviarComandoReqFrame(VisualWorkerFrameType.Heatmap); EnviarComandoReqFrame(CameraFrameType.Heatmap);
} }
private void btnLeituraRadar2D_Click(object sender, EventArgs e) private void btnLeituraRadar2D_Click(object sender, EventArgs e)
{ {
EnviarComandoReqFrame(VisualWorkerFrameType.RadarTopDown); EnviarComandoReqFrame(CameraFrameType.RadarTopDown);
} }
private void btnLeituraSegmentacaoSemantica_Click(object sender, EventArgs e) 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); OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(tipo);
PictureBox pic = PictureBox pic =
tipo == VisualWorkerFrameType.Rgb ? picRGB : tipo == CameraFrameType.Rgb ? picRGB :
tipo == VisualWorkerFrameType.Heatmap ? picHeatmap : tipo == CameraFrameType.Heatmap ? picHeatmap :
tipo == VisualWorkerFrameType.RadarTopDown ? picRadar2D : tipo == CameraFrameType.RadarTopDown ? picRadar2D :
tipo == VisualWorkerFrameType.Segmentacao ? picSegmentacaoSemantica : tipo == CameraFrameType.Segmentacao ? picSegmentacaoSemantica :
new PictureBox(); new PictureBox();
Label lbl = Label lbl =
tipo == VisualWorkerFrameType.Rgb ? lblLeituraRGB : tipo == CameraFrameType.Rgb ? lblLeituraRGB :
tipo == VisualWorkerFrameType.Heatmap ? lblLeituraHeatmap : tipo == CameraFrameType.Heatmap ? lblLeituraHeatmap :
tipo == VisualWorkerFrameType.RadarTopDown ? lblLeituraRadar2D : tipo == CameraFrameType.RadarTopDown ? lblLeituraRadar2D :
tipo == VisualWorkerFrameType.Segmentacao ? lblLeituraSegmentacaoSemantica : tipo == CameraFrameType.Segmentacao ? lblLeituraSegmentacaoSemantica :
new Label(); new Label();
pic.Image?.Dispose(); pic.Image?.Dispose();
try { pic.Image = frame?.image(); } catch { } try { pic.Image = frame?.image(); } catch { }
lbl.Text = $"Leitura em: " + frame?.timestamp.ToString("dd/MM/yyyy HH:mm:ss"); 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); //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; var analise = VisualWorkerService.DadosLeitura.Analises;
lblLeituraDebug.Text = $"Leitura em: " + (analise?.timestamp ?? DateTime.MinValue).ToString("dd/MM/yyyy HH:mm:ss"); 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?.Dispose();
picDebug.Image = analise.PlotarAnalise(frame); picDebug.Image = analise.PlotarAnalise(frame);

View File

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

View File

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

View File

@ -648,6 +648,8 @@ namespace AgroBase.Models
GPSTrajetoria = new List<GPSModel>(); GPSTrajetoria = new List<GPSModel>();
Controle.BicosAtuados = DispAtu.Dados.BicosPulverizadores.Select(x => x.Clone()).ToList();
await RealizarCalibragemInicialAsync(); await RealizarCalibragemInicialAsync();
if (Modo == ModoOperacao.Manual) if (Modo == ModoOperacao.Manual)
@ -832,30 +834,45 @@ namespace AgroBase.Models
{ {
if (Variaveis.OperacaoEmAndamento.Modo == ModoOperacao.MapaGPS) 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; DateTime Agora = DateTime.Now;
var _Controle = Variaveis.OperacaoEmAndamento.Controle; 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 (ForcarEnvio || ((Agora - Ctrl.UltimoComando).TotalMilliseconds > Ctrl.DelayEnvioComando))
{ {
if (Ctrl.Tipo == T_Code.Atu && !_Controle.PulverizadorAutomatico) var Protocolos = EnviarProtocoloComando(Variaveis.OperacaoEmAndamento.DispAtu, Ctrl.Tipo, ForcarEnvio);
{ Ctrl.UltimoComando = Agora;
return; Ctrl.Comandos.AddRange(Protocolos);
}
}
} }
IDispositivosService disp = Ctrl.Tipo == T_Code.Atu ? public void AtualizarDadosControleMovimento(bool ForcarEnvio)
(IDispositivosService)Variaveis.OperacaoEmAndamento.DispAtu : {
(IDispositivosService)Variaveis.OperacaoEmAndamento.DispMvd; 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.UltimoComando = Agora;
Ctrl.Comandos.AddRange(Protocolos); Ctrl.Comandos.AddRange(Protocolos);
} }
@ -942,7 +959,17 @@ namespace AgroBase.Models
} }
else if (Dispositivo.Dados is AtuadorModel) 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++) for (int i = 0; i < _Controle.BicosAtuados.Count; i++)
{ {
@ -1202,7 +1229,7 @@ namespace AgroBase.Models
string nome = Variaveis.OperacaoEmAndamento.idxLog.ToString(); 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 = Angulo,
Angulo_Max = Angulo_Max, Angulo_Max = Angulo_Max,
Angulo_Min = Angulo_Min, Angulo_Min = Angulo_Min,
BicosAtuados = new List<AtuadorBicoModel>(BicosAtuados), BicosAtuados = BicosAtuados.Select(x => x.Clone()).ToList(),
Direcao = Direcao, Direcao = Direcao,
PercentualInicioPulverizacao = PercentualInicioPulverizacao, PercentualInicioPulverizacao = PercentualInicioPulverizacao,
PercentualVelocidadeSP = PercentualVelocidadeSP, PercentualVelocidadeSP = PercentualVelocidadeSP,

View File

@ -55,5 +55,14 @@ namespace AgroBase.Models.Operadores
{ {
ScriptCarregado = 1, 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 bool Pronto { get; set; }
public DateTime ProntoEm { get; set; } public DateTime ProntoEm { get; set; }
public DateTime UltimaMensagem { 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 WorkerMessageModel<VisualWorkerMessageResponseModel> Leitura { get; set; } = new WorkerMessageModel<VisualWorkerMessageResponseModel>();
public VisualWorkerMessageAnaliseModel Analises { get; set; } = new VisualWorkerMessageAnaliseModel(); public VisualWorkerMessageAnaliseModel Analises { get; set; } = new VisualWorkerMessageAnaliseModel();
public VisualWorkerMessageIMUModel Imu { get; set; } = new VisualWorkerMessageIMUModel(); public VisualWorkerMessageIMUModel Imu { get; set; } = new VisualWorkerMessageIMUModel();
@ -26,7 +26,7 @@ namespace AgroBase.Models.Operadores
IniciadoEm = IniciadoEm, IniciadoEm = IniciadoEm,
Pronto = Pronto, Pronto = Pronto,
ProntoEm = ProntoEm, 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(), Analises = Analises.Clone(),
Imu = Imu.Clone(), Imu = Imu.Clone(),
//Leitura = Leitura.Clone(), //Leitura = Leitura.Clone(),
@ -40,7 +40,7 @@ namespace AgroBase.Models.Operadores
IniciadoEm = DateTime.MinValue; IniciadoEm = DateTime.MinValue;
Pronto = false; Pronto = false;
ProntoEm = DateTime.MinValue; ProntoEm = DateTime.MinValue;
CameraFrames = new Dictionary<VisualWorkerFrameType, OAKCameraFrameModel>(); CameraFrames = new Dictionary<CameraFrameType, OAKCameraFrameModel>();
Analises = new VisualWorkerMessageAnaliseModel(); Analises = new VisualWorkerMessageAnaliseModel();
Imu = new VisualWorkerMessageIMUModel(); Imu = new VisualWorkerMessageIMUModel();
//Leitura = new WorkerMessageModel<VisualWorkerMessageResponseModel>(); //Leitura = new WorkerMessageModel<VisualWorkerMessageResponseModel>();
@ -522,13 +522,6 @@ namespace AgroBase.Models.Operadores
SaveCameraFrames = 6, 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), ("largura", VariaveisEquipamento.LarguraEquipamentoMm / 1000.0),
("distancia_entre_eixos", VariaveisEquipamento.DistanciaEntreEixos / 100.0), ("distancia_entre_eixos", VariaveisEquipamento.DistanciaEntreEixos / 100.0),
("percentual_reservatorio_min", VariaveisEquipamento.PercentualReservatorioMin), ("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 ("Snr", new
{ {
mx_id = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.Id,
percentual_altura_solo = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.PercentualAlturaSolo, percentual_altura_solo = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.PercentualAlturaSolo,
distancia_maxima = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.DistanciaMaximaVisao, distancia_maxima = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.DistanciaMaximaVisao,
distancia_minima = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.DistanciaMinimaVisao distancia_minima = Variaveis.OperacaoEmAndamento.DispSen.Dados.CameraCaminho.DistanciaMinimaVisao

View File

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

View File

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

View File

@ -63,7 +63,7 @@ namespace AgroBase.Services.Operadores
break; break;
case VisualWorkerCommandType.GetCameraFrame: 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() DadosLeitura.CameraFrames[tipo] = new OAKCameraFrameModel()
{ {
frame = comando.@params["frame"].ToString(), frame = comando.@params["frame"].ToString(),
@ -101,7 +101,7 @@ namespace AgroBase.Services.Operadores
RedisService.Publish(CmdKey.VisualWorkerRx, JsonConvert.SerializeObject(comando)); 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; DateTime Inicio = DateTime.Now;
@ -121,7 +121,7 @@ namespace AgroBase.Services.Operadores
return _frame; 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 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 DadosControle = "ctx:dados_controle";
public const string DadosEquipamento = "ctx:dados_equipamento"; public const string DadosEquipamento = "ctx:dados_equipamento";
public const string DadosVisualWorker = "ctx:dados_visual_worker"; 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 DadosManagerWorker = "ctx:dados_manager_worker";
public const string DadosHealthWorker = "ctx:dados_health_worker"; public const string DadosHealthWorker = "ctx:dados_health_worker";
public const string DadosCameraWorker = "ctx:dados_camera_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 CameraWorkerTx = "cmd_tx:camera_worker";
public const string ManagerWorkerRx = "cmd_rx:manager_worker"; public const string ManagerWorkerRx = "cmd_rx:manager_worker";
public const string ManagerWorkerTx = "cmd_tx: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": [ { "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", "calculation_time": "13395881044629269",
"config_version": 0, "config_version": 0,
"model_version": "0", "model_version": "0",
@ -29,5 +22,5 @@
"top_topics_and_observing_domains": [ ] "top_topics_and_observing_domains": [ ]
} ], } ],
"hex_encoded_hmac_key": "40F346D3248C3AFDF2BEE1FE496DBD32F7CED6E5AE98B881ABC421AA7E7B5642", "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/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/18-16:42:45.129 990 Recovering log #3 2025/07/21-15:21:17.555 8344 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.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/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/18-16:10:16.303 1248 Recovering log #3 2025/07/21-15:10:12.406 7cc4 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.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/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/18-16:56:03.154 990 Recovering log #3 2025/07/21-15:34:33.517 8344 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.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/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/18-16:17:14.847 1248 Recovering log #3 2025/07/21-15:18:09.338 7cc4 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.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/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/18-16:42:45.039 6640 Recovering log #7 2025/07/21-15:21:17.474 813c 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.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/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/18-16:10:16.229 5b90 Recovering log #7 2025/07/21-15:10:12.320 189c 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.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, <meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style> <style>
#map_da5e1542c7ab541155af4f4c041e9c23 { #map_9167a3f59236bbe3ca57b08de1d97258 {
position: relative; position: relative;
width: 100.0%; width: 100.0%;
height: 100.0%; height: 100.0%;
@ -54,14 +54,14 @@
<body> <body>
<div class="folium-map" id="map_da5e1542c7ab541155af4f4c041e9c23" ></div> <div class="folium-map" id="map_9167a3f59236bbe3ca57b08de1d97258" ></div>
</body> </body>
<script> <script>
var map_da5e1542c7ab541155af4f4c041e9c23 = L.map( var map_9167a3f59236bbe3ca57b08de1d97258 = L.map(
"map_da5e1542c7ab541155af4f4c041e9c23", "map_9167a3f59236bbe3ca57b08de1d97258",
{ {
center: [0.0, 0.0], center: [0.0, 0.0],
crs: L.CRS.EPSG3857, 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", "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
{ {
"minZoom": 0, "minZoom": 0,
@ -95,7 +95,7 @@
); );
tile_layer_3635f6a14539c3f382434fa86536d4f3.addTo(map_da5e1542c7ab541155af4f4c041e9c23); tile_layer_d32108711f97218804be105ee489826b.addTo(map_9167a3f59236bbe3ca57b08de1d97258);
</script> </script>
@ -116,7 +116,7 @@
} }
trajeto_json_add({"features": []}); trajeto_json_add({"features": []});
trajeto_json.addTo(map_da5e1542c7ab541155af4f4c041e9c23); trajeto_json.addTo(map_9167a3f59236bbe3ca57b08de1d97258);
function adicionarGeometria(novaGeometria) { function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria); trajeto_json.addData(novaGeometria);
@ -179,9 +179,9 @@
var marcadorEquipamento = L.marker([0, 0], { var marcadorEquipamento = L.marker([0, 0], {
icon: customIcon 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( var icon = L.AwesomeMarkers.icon(
{"extraClasses": "fa-rotate-0", "icon": "info-sign", "iconColor": "white", "markerColor": "red", "prefix": "glyphicon"} {"extraClasses": "fa-rotate-0", "icon": "info-sign", "iconColor": "white", "markerColor": "red", "prefix": "glyphicon"}
); );
@ -246,7 +246,7 @@
} }
if (foco) { if (foco) {
map_da5e1542c7ab541155af4f4c041e9c23.setView(novaPosicao, map_da5e1542c7ab541155af4f4c041e9c23.getZoom()); map_9167a3f59236bbe3ca57b08de1d97258.setView(novaPosicao, map_9167a3f59236bbe3ca57b08de1d97258.getZoom());
} }
} }
@ -268,7 +268,7 @@
marcadorDinamico.setRotationAngle(angulo); marcadorDinamico.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]); adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
map_da5e1542c7ab541155af4f4c041e9c23.setView(novaPosicao, map_da5e1542c7ab541155af4f4c041e9c23.getZoom());*/ map_9167a3f59236bbe3ca57b08de1d97258.setView(novaPosicao, map_9167a3f59236bbe3ca57b08de1d97258.getZoom());*/
}); });
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) { function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {

View File

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

View File

@ -1,6 +1,6 @@
import time import time
import depthai as dai 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 from shared.contexto_global_redis import ContextoGlobalRedis, CtxKey, CmdKey
class CameraManager: class CameraManager:
@ -45,10 +45,15 @@ class CameraManager:
for cam in cameras_mapeadas.values(): for cam in cameras_mapeadas.values():
if cam.get("dispositivo", T_Code.Vzo.value) == T_Code.Snr.value: if cam.get("dispositivo", T_Code.Vzo.value) == T_Code.Snr.value:
ContextoGlobalRedis.publicar_comando(CmdKey.VisualWorkerRx, { "cmd": VisualWorkerCommandType.AtualizarSaudeCamera.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: 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 } ) 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): 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 health_worker.main import main as iniciar_health_worker
from visual_worker.main import main as iniciar_visual_worker from visual_worker.main import main as iniciar_visual_worker
from camera_worker.main import main as iniciar_camera_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 from shared.contexto_global_redis import ContextoGlobalRedis
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') #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_health_worker, name="HealthWorker"),
Process(target=iniciar_visual_worker, name="VisualWorker"), Process(target=iniciar_visual_worker, name="VisualWorker"),
Process(target=iniciar_camera_worker, name="CameraWorker"), Process(target=iniciar_camera_worker, name="CameraWorker"),
Process(target=iniciar_weed_worker, name="WeedWorker"),
] ]
for p in processos: for p in processos:

View File

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

View File

@ -23,6 +23,14 @@ class ManagerWorkerCommandType(IntEnum):
EnviarDadosControle = 4 EnviarDadosControle = 4
FinalizarOperacao = 5 FinalizarOperacao = 5
class WeedWorkerCommandType(IntEnum):
ScriptCarregado = 1
IniciarCameraManager = 2
AtualizarSaudeCamera = 3
GetCameraFrame = 4
SaveCameraFrames = 5
EnviarDadosControle = 6
class ModoOperacao(IntEnum): class ModoOperacao(IntEnum):
NaoDefinido = 0 NaoDefinido = 0
Manual = 1 Manual = 1
@ -146,26 +154,9 @@ class TipoPontoRua(IntEnum):
CruvaEntreCorredores = 6 CruvaEntreCorredores = 6
Desvio = 7 Desvio = 7
# Visual Worker class CameraFrameType(IntEnum):
class VisualWorkerFrameType(IntEnum):
Rgb = 1 Rgb = 1
Heatmap = 2 Heatmap = 2
RadarTopDown = 3 RadarTopDown = 3
Segmentacao = 4 Segmentacao = 4
Debug = 5 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.analise_anomalias import AnaliseAnomaliasManager
from visual_worker.processamento.radar_top_down import Radar2DManager from visual_worker.processamento.radar_top_down import Radar2DManager
from visual_worker.processamento.segmentacao_semantica import ClassesSegmentacao, SegmentacaoManager 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.utils import analisar_linhas_por_profundidade, decode_image_base64, encode_image_base64
from shared.gps_handler import GPSHandler from shared.gps_handler import GPSHandler
from camera_worker.camera_oak import CameraOak 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 gerar_heatmap(frame, self.camera.parametros["distancia_maxima"]), timestamp, res
return None, None, None return None, None, None
def get_select_frame(self, tipo: VisualWorkerFrameType): def get_select_frame(self, tipo: CameraFrameType):
f = None f = None
t = None t = None
if tipo == VisualWorkerFrameType.Rgb: if tipo == CameraFrameType.Rgb:
f, t, _ = self.get_rgb_frame() f, t, _ = self.get_rgb_frame()
f = encode_image_base64(f) f = encode_image_base64(f)
elif tipo == VisualWorkerFrameType.Heatmap: elif tipo == CameraFrameType.Heatmap:
f, t, _ = self.get_heatmap_frame() f, t, _ = self.get_heatmap_frame()
f = encode_image_base64(f) f = encode_image_base64(f)
elif tipo == VisualWorkerFrameType.RadarTopDown: elif tipo == CameraFrameType.RadarTopDown:
f = self._ultima_analise_radar.get("frame", {}).get("frame") f = self._ultima_analise_radar.get("frame", {}).get("frame")
t = self._ultima_analise_radar.get("timestamp") t = self._ultima_analise_radar.get("timestamp")
elif tipo == VisualWorkerFrameType.Segmentacao: elif tipo == CameraFrameType.Segmentacao:
f = self._ultima_analise_segmentacao.get("frame", {}).get("frame") f = self._ultima_analise_segmentacao.get("frame", {}).get("frame")
t = self._ultima_analise_segmentacao.get("timestamp") t = self._ultima_analise_segmentacao.get("timestamp")
return f, t return f, t
def _iniciar_loop_analise_continua(self, freq): def _iniciar_loop_analise_continua(self, freq):
def loop(): def loop():
ultima_atualizacao = 0 ultima_atualizacao_saude = 0
while True: while True:
if self.camera is None: if self.camera is None:
time.sleep(5) time.sleep(5)
continue continue
t0 = time.time() t0 = time.time()
if (t0 - ultima_atualizacao) >= 1: if (t0 - ultima_atualizacao_saude) >= 1:
self.camera.atualizar_saude() self.camera.atualizar_saude()
ultima_atualizacao = time.time() ultima_atualizacao_saude = time.time()
try: try:
status = StatusModulo((self.camera.ultima_saude or {}).get("status", StatusModulo.DESCONECTADO.value)) status = StatusModulo((self.camera.ultima_saude or {}).get("status", StatusModulo.DESCONECTADO.value))
if status == StatusModulo.DESCONECTADO: if status == StatusModulo.DESCONECTADO:
@ -506,7 +506,7 @@ class CameraManager:
if nome is not None and nome != "": if nome is not None and nome != "":
frame_name = 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() rgb_frame, rgb_ts, rgb_res = self.get_rgb_frame()
if rgb_frame is not None and rgb_res["frame_valido"]: if rgb_frame is not None and rgb_res["frame_valido"]:
nome_rgb = f"{frame_name}_rgb.jpeg" nome_rgb = f"{frame_name}_rgb.jpeg"
@ -514,7 +514,7 @@ class CameraManager:
cv2.imwrite(caminho_rgb, rgb_frame) cv2.imwrite(caminho_rgb, rgb_frame)
frames_salvos.append(caminho_rgb) 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() heatmap_frame, heatmap_ts, heatmap_res = self.get_heatmap_frame()
if heatmap_frame is not None and heatmap_res["frame_valido"]: if heatmap_frame is not None and heatmap_res["frame_valido"]:
nome_heatmap = f"{frame_name}_heatmap.jpeg" nome_heatmap = f"{frame_name}_heatmap.jpeg"
@ -522,12 +522,12 @@ class CameraManager:
cv2.imwrite(caminho_heatmap, heatmap_frame) cv2.imwrite(caminho_heatmap, heatmap_frame)
frames_salvos.append(caminho_heatmap) 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) frame = self._salvar_frame_analise(frame_name, self._ultima_analise_radar, "radar", pasta)
if frame is not None: if frame is not None:
frames_salvos.append(frame) 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) frame = self._salvar_frame_analise(frame_name, self._ultima_analise_segmentacao, "segmentacao", pasta)
if frame is not None: if frame is not None:
frames_salvos.append(frame) 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__), ".."))) 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") 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 visual_worker.config import mostrar_log, get_camera_manager, iniciar_camera_manager
from shared.contexto_global_redis import ContextoGlobalRedis, CmdKey, CtxKey from shared.contexto_global_redis import ContextoGlobalRedis, CmdKey, CtxKey
@ -49,7 +49,7 @@ def main():
elif acao == VisualWorkerCommandType.AtualizarSaudeCamera: elif acao == VisualWorkerCommandType.AtualizarSaudeCamera:
get_camera_manager().atualizar_saude_camera() get_camera_manager().atualizar_saude_camera()
elif acao == VisualWorkerCommandType.GetCameraFrame: 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) base64_img, ts = get_camera_manager().get_select_frame(tipo)
if base64_img is not None: if base64_img is not None:
resposta = { resposta = {