179 lines
6.0 KiB
C#
179 lines
6.0 KiB
C#
|
|
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; }
|
|||
|
|
}
|
|||
|
|
}
|