agrobot_base/AgroBase/AgroBase/Services/CANService.cs

174 lines
4.6 KiB
C#

using System;
using System.IO.Ports;
using static AgroBase.Models.Enums;
namespace AgroBase.Services
{
public class CanManager
{
public static bool UseCanSerial = true;
private static CanServiceWaveshare CanWaveshare = new CanServiceWaveshare();
private static CanServiceSerial CanSerial = new CanServiceSerial();
public static ICanService CanService
{
get
{
if (UseCanSerial)
{
return CanSerial;
}
else
{
return CanWaveshare;
}
}
}
}
public class CanMessage
{
public DateTime Momento { get; set; }
public T_Code Dispositivo { get; set; }
public byte IdTx { get; set; }
public byte IdRx { get; set; }
public byte funcCodeTx { get; set; }
public byte funcCodeRx { get; set; }
public byte[] DataTx { get; set; }
public byte[] DataRx { get; set; }
public bool Enviado { get; set; }
public DateTime EnviadoEm { get; set; }
public bool ComResposta { get; set; }
public bool Respondido { get; set; }
public DateTime RespondidoEm { get; set; }
public string ChaveInterna { get; set; }
}
public class CanCommandFreqModel<T>
{
private T _valor;
public T valor
{
get
{
return _valor;
}
set
{
_valor = value;
CalcularFrequencia();
AtualizarExtremos();
}
}
public DateTime lidoEm { get; set; } = DateTime.MinValue;
public double frequencia { get; private set; }
public double dt { get; private set; }
public double ValorMaximo { get; private set; } = double.MinValue;
public double ValorMinimo { get; private set; } = double.MaxValue;
private void CalcularFrequencia()
{
if (lidoEm == DateTime.MinValue)
{
frequencia = 0;
}
else
{
DateTime agora = DateTime.Now;
dt = (agora - lidoEm).TotalSeconds;
if (dt > 0)
frequencia = 1.0 / dt;
else
frequencia = 0;
}
lidoEm = DateTime.Now;
}
private void AtualizarExtremos()
{
try
{
double v = Convert.ToDouble(valor);
if (v > ValorMaximo)
ValorMaximo = v;
if (v < ValorMinimo)
ValorMinimo = v;
}
catch
{
// Não é um número válido: ignora
}
}
public CanCommandFreqModel<T> Clone()
{
return new CanCommandFreqModel<T>()
{
_valor = _valor,
lidoEm = lidoEm,
frequencia = frequencia,
dt = dt,
ValorMaximo = ValorMaximo,
ValorMinimo = ValorMinimo
};
}
}
public enum CanMessagePosicaoDados
{
Status = 0,
DadosAll = 1,
Dados1 = 2,
Dados2 = 3,
Dados3 = 4,
Dados4 = 5,
Dados5 = 6,
Dados6 = 7,
Config1 = 51,
Config2 = 52,
Config3 = 53,
Config4 = 54,
Config5 = 55,
Command1 = 101,
Command2 = 102,
Command3 = 103,
Command4 = 104,
Command5 = 105,
Command6 = 106,
Command7 = 107,
Command8 = 108,
Command9 = 109,
Command10 = 110,
Command11 = 111,
}
public interface ICanMessageHandler
{
T_Code Dispositivo { get; set; }
void ProcessarMensagem(CanMessage mensagem);
}
public interface ICanService : IDisposable
{
bool PortaIsCan(SerialPort Porta = null);
void RegistrarHandler(byte endereco_rx, ICanMessageHandler handler);
bool Inicializar(int BitRate = 250);
void AdicionarMensagemNaFila(T_Code Dispositivo, byte idTx, byte idRx, byte funcCodeTx, byte funcCodeRx, byte[] payload = null, bool get = true);
void Fechar();
string _portName { get; set; }
bool Iniciado { get; }
bool IsConnected { get; }
double UltimoTx { get; set; }
double FreqTx { get; set; }
double UltimoRx { get; set; }
double FreqRx { get; set; }
int ErrosCriticos { get; set; }
double UltimoErroCritico { get; set; }
}
}