174 lines
4.6 KiB
C#
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; }
|
|
}
|
|
|
|
} |