agrobot_base/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs

179 lines
6.0 KiB
C#
Raw Normal View History

2024-01-03 10:52:37 +00:00
using AgroBase.Comum;
using AgroBase.Models.Modules;
using AgroBase.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AgroBase.Models.Enuns;
namespace AgroBase.Models
{
public class OperacaoModel
{
public OperacaoModel(ModoOperacao Modo, DispositivosService<MovimentacaoModel> Mov = null, DispositivosService<DirecionalModel> Dir = null, DispositivosService<AtuadorModel> Atu = null)
{
this.Modo = Modo;
this.Controle = new OperacaoControleModel();
this.ControleAnterior = new OperacaoControleModel();
this.DispMov = Mov;
this.DispDir = Dir;
this.DispAtu = Atu;
AtuacoesPorBico = new List<int>();
if (DispAtu != null)
{
for (int i = 0; i < DispAtu.Dados.QuantidadeBicos; i++)
{
AtuacoesPorBico.Add(0);
}
}
}
public ModoOperacao Modo { get; set; }
public DispositivosService<MovimentacaoModel> DispMov { get; set; }
public DispositivosService<DirecionalModel> DispDir { get; set; }
public DispositivosService<AtuadorModel> DispAtu { get; set; }
public bool Iniciado { get; set; }
public long TimestampInicio { get; set; }
public long TimestampFim { get; set; }
public OperacaoControleModel Controle { get; set; }
public OperacaoControleModel ControleAnterior { get; set; }
public int ErvasNoRadar { get; set; } = 0;
public double VelocidadeMedia { get; set; } = 0;
public double HerbicidaConsumido { get; set; } = 0;
public double HerbicidaPorErva { get; set; } = 0;
public double BateriaConsumida { get; set; } = 0;
public int ErvasIdentificadas { get; set; } = 0;
public List<int> AtuacoesPorBico { get; set; } = new List<int>();
public double DistanciaPercorrida { get; set; } = 0;
public double ProgressoPercurso { get; set; } = 0;
public void IniciarOperacao(OperacaoControleModel controle = null)
{
Iniciado = true;
TimestampInicio = DateTime.Now.Ticks;
TimestampFim = 0;
if (controle != null)
{
Controle = controle;
}
}
public void FinalizarOperacao()
{
Controle.Angulo = 0;
Controle.RPM = 0;
AtualizarDadosControle();
Iniciado = false;
TimestampFim = DateTime.Now.Ticks;
}
public void AtualizarDadosControle()
{
if (Controle.RPM != ControleAnterior.RPM)
{
// Enviar comando MOV
EnviarProtocoloComando(DispMov);
}
if (Controle.Angulo != ControleAnterior.Angulo)
{
// Enviar comando
EnviarProtocoloComando(DispDir);
}
if (Controle.BicosAtuados.Select(x => x.Atuado).ToList() != ControleAnterior.BicosAtuados.Select(x => x.Atuado).ToList())
{
// Enviar comando ATU
EnviarProtocoloComando(DispAtu);
}
ControleAnterior = Controle;
AtualizarDadosOperacao();
}
private void AtualizarDadosOperacao()
{
if (DispMov == null)
{
return;
}
VelocidadeMedia = DispMov.Dados.Motores.Average(x => x.VelocidadeInstantanea);
DistanciaPercorrida = DispMov.Dados.DistanciaPercorridaTotal;
}
public void EnviarProtocoloComando(IDispositivosService Dispositivo)
{
if (Dispositivo == null)
{
return;
}
Direcao DirecaoAtual = Direcao.Parado;
if (Dispositivo.Dispositivo == T_Code.Mov)
{
if (Controle.RPM == 0)
{
DirecaoAtual = Direcao.Parado;
}
else
{
GeneralJoystick.RPM = Controle.RPM;
}
}
else if (Dispositivo.Dispositivo == T_Code.Dir)
{
GeneralJoystick.Angulo = Controle.Angulo;
if (Controle.Angulo < 0)
{
GeneralJoystick.Angulo *= -1;
DirecaoAtual = Direcao.Baixo;
}
else
{
DirecaoAtual = Direcao.Cima;
}
}
var Protocolos =
Dispositivo.Dados is MovimentacaoModel ? ((MovimentacaoModel)Dispositivo.Dados).Motores.Select(x => x.ProtocoloComando(DirecaoAtual)) :
Dispositivo.Dados is DirecionalModel ? ((DirecionalModel)Dispositivo.Dados).Motores.Select(x => x.ProtocoloComando(DirecaoAtual)) :
Dispositivo.Dados is AtuadorModel ? ((AtuadorModel)Dispositivo.Dados).BicosPulverizadores.Select(x => x.ProtocoloComando()) :
null;
foreach (var ProtocoloMotor in Protocolos)
{
Dispositivo.EnviarDadosSerial(ProtocoloMotor);
Task.Delay(10);
}
}
}
public class OperacaoControleModel
{
public int RPM_Max { get; set; } = 45;
public int RPM_Min { get; set; } = 15;
public double Angulo_Max { get; set; } = 30;
public double Angulo_Min { get; set; } = -30;
public double Angulo { get; set; } = 0;
public int RPM { get; set; } = 0;
public Direcao Direcao { get; set; } = Direcao.Parado;
public double VelocidadeMP { get; set; } = 50;
public List<AtuadorBicoModel> BicosAtuados { get; set; } = new List<AtuadorBicoModel>();
}
public class OperacaoGraficoModel
{
public double Velocidade { get; set; }
public double Temperatura { get; set; }
}
}