agrobot_base/AgroBase/AgroBase/Services/LoRaEspService.cs

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
}
}
}