119 lines
4.1 KiB
C#
119 lines
4.1 KiB
C#
using AgroBase.Models;
|
|
using AgroBase.Models.Modules;
|
|
using static AgroBase.Models.Enums;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace AgroBase.Services
|
|
{
|
|
public class LoRaEspService
|
|
{
|
|
public string ID { get; set; }
|
|
public int ID_Num { get; set; }
|
|
public S_Code Componente { get; set; }
|
|
public bool Conectado { get; set; }
|
|
public bool Configurado { get; set; }
|
|
public bool Iniciado
|
|
{
|
|
get
|
|
{
|
|
return Conectado && Configurado;
|
|
}
|
|
}
|
|
public LoRaParametrosModel Parametros { get; set; }
|
|
public List<FuncoesPinout> Funcoes { get; set; }
|
|
|
|
public List<(int, CanMessagePosicaoDados, byte[])> ProtocoloConfiguracao(PinoutDataModel Pinout, bool conectar)
|
|
{
|
|
List<byte> config1 = new List<byte>()
|
|
{
|
|
Variaveis.OperacaoEmAndamento.DispSen?.Dados?.LoRaParametrosBase?.address ?? 0x01
|
|
};
|
|
var _pinout = Pinout.Clone();
|
|
_pinout.Pinos = _pinout.Pinos.Where(x => x.ComponenteID == ID).ToList();
|
|
if (_pinout.Pinos.Count > 0)
|
|
{
|
|
byte[] pinos = PinoutModel.PinoProtocolo(_pinout, Funcoes, false);
|
|
config1.AddRange(pinos);
|
|
}
|
|
|
|
List<byte> config2 = new List<byte>
|
|
{
|
|
Parametros.address,
|
|
Parametros.baudAndAirRate,
|
|
Parametros.packetSizeAndPower,
|
|
Parametros.channel,
|
|
Parametros.tranModeAndWorCycle
|
|
};
|
|
|
|
return new List<(int, CanMessagePosicaoDados, byte[])>()
|
|
{
|
|
(ID_Num, CanMessagePosicaoDados.Config1, config1.ToArray()),
|
|
(ID_Num, CanMessagePosicaoDados.Config2, config2.ToArray()),
|
|
};
|
|
}
|
|
|
|
public async Task<(bool, LoRaParametrosModel)> RequisitarParametrosModulo()
|
|
{
|
|
DateTime inicio = DateTime.Now;
|
|
bool sucesso = false;
|
|
Variaveis.OperacaoEmAndamento.DispSen?.Dados?.RequisitarDadosModulo(Variaveis.ID_Num_sLRA, CanMessagePosicaoDados.Command1, CanMessagePosicaoDados.Dados1, true);
|
|
while (!sucesso && inicio.AddMilliseconds(2000) > DateTime.Now)
|
|
{
|
|
await Task.Delay(10);
|
|
sucesso = Parametros.UltimaLeitura < inicio;
|
|
}
|
|
return (sucesso, Parametros);
|
|
}
|
|
|
|
public async Task<(bool, LoRaParametrosModel)> RedefinirParametros(LoRaParametrosModel parametros)
|
|
{
|
|
Parametros = parametros.Clone();
|
|
Configurado = false;
|
|
|
|
DateTime inicio = DateTime.Now;
|
|
Variaveis.OperacaoEmAndamento.DispSen?.EnviarProtocolosConfiguracao(true);
|
|
while (!Configurado && inicio.AddMilliseconds(2000) > DateTime.Now)
|
|
{
|
|
await Task.Delay(10);
|
|
}
|
|
return (Configurado, Parametros);
|
|
}
|
|
|
|
public bool EnviarDadosLoRaViaCAN(byte[] payload)
|
|
{
|
|
if (payload == null) return false;
|
|
|
|
if (payload.Length > 8) return false;
|
|
|
|
CanMessagePosicaoDados posicao = ((CanMessagePosicaoDados)payload[0]);
|
|
byte idNum = payload[1];
|
|
|
|
Variaveis.OperacaoEmAndamento.DispSen?.AdicionarMensagemFila(idNum, posicao, posicao, payload.Skip(2).ToArray(), false);
|
|
return true;
|
|
}
|
|
|
|
public enum DadosLoRaParse
|
|
{
|
|
DadosLivre = (int)CanMessagePosicaoDados.Command2,
|
|
GpsQualidade = (int)CanMessagePosicaoDados.Command3,
|
|
GpsLatitude = (int)CanMessagePosicaoDados.Command4,
|
|
GpsLongitude = (int)CanMessagePosicaoDados.Command5,
|
|
GpsGerais = (int)CanMessagePosicaoDados.Command6,
|
|
ComandoControle = (int)CanMessagePosicaoDados.Command7,
|
|
DadosControle = (int)CanMessagePosicaoDados.Command8,
|
|
}
|
|
|
|
public enum LoRaCaracteresEspeciais
|
|
{
|
|
BeginMsg = 0xAA,
|
|
BreakLine = 0xBB,
|
|
EndMsg = 0x55
|
|
}
|
|
|
|
|
|
}
|
|
}
|