agrobot_base/AgroBase/AgroBase/Services/LoRaSerializer.cs

232 lines
10 KiB
C#

using AgroBase.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Services
{
public class LoRaSerializer
{
public static byte[] SerializeLoRaProtocoloTransmissaoModel(LoRaProtocoloTransmissaoModel model)
{
List<byte> bytes = new List<byte>();
// Serializar Momento (DateTime)
bytes.AddRange(BitConverter.GetBytes(model.Momento.ToBinary()));
// Serializar EnderecoCarro (byte)
bytes.Add(model.EnderecoCarro);
// Serializar Coordenadas (LoRaProtocoloTransmissaoCoordenadasModel)
bytes.AddRange(BitConverter.GetBytes(model.Coordenadas.Latitude));
bytes.AddRange(BitConverter.GetBytes(model.Coordenadas.Longitude));
bytes.AddRange(BitConverter.GetBytes(model.Coordenadas.Orientacao));
// Serializar Sensores (LoRaProtocoloTransmissaoSensoresModel)
bytes.AddRange(BitConverter.GetBytes(model.Sensores.PercentualBateria));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.PercentualReservatorio));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.PressaoLinha));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.DistanciaPercorrida));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.OrientacaoCaminho));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.Velocidade));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.ErvasIdentificadas));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.TemperaturaMotores));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.TemperaturaCampo));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.HerbicidaConsumido));
bytes.AddRange(BitConverter.GetBytes(model.Sensores.HerbicidaPorErva));
// Serializar Operacao (LoRaProtocoloTransmissaoOperacaoModel)
bytes.Add((byte)model.Operacao.statusOperacao);
bytes.Add((byte)model.Operacao.statusCarro);
bytes.AddRange(BitConverter.GetBytes(model.Operacao.idxRuaAtual));
bytes.AddRange(BitConverter.GetBytes(model.Operacao.PercentualOperacao));
bytes.AddRange(BitConverter.GetBytes(model.Operacao.PercentualRua));
bytes.AddRange(BitConverter.GetBytes(model.Operacao.TempoOperacao));
// Serializar TempoEstimado (string)
byte[] tempoEstimadoBytes = Encoding.UTF8.GetBytes(model.Operacao.TempoEstimado);
bytes.AddRange(BitConverter.GetBytes(tempoEstimadoBytes.Length)); // Adiciona o comprimento da string
bytes.AddRange(tempoEstimadoBytes); // Adiciona a string
return bytes.ToArray();
}
public static LoRaProtocoloTransmissaoModel DeserializeLoRaProtocoloTransmissaoModel(byte[] bytes)
{
LoRaProtocoloTransmissaoModel model = new LoRaProtocoloTransmissaoModel();
int index = 0;
// Desserializar Momento (DateTime)
model.Momento = DateTime.FromBinary(BitConverter.ToInt64(bytes, index));
index += sizeof(long);
// Desserializar EnderecoCarro (byte)
model.EnderecoCarro = bytes[index];
index += sizeof(byte);
// Desserializar Coordenadas (LoRaProtocoloTransmissaoCoordenadasModel)
model.Coordenadas = new LoRaProtocoloTransmissaoCoordenadasModel
{
Latitude = BitConverter.ToDouble(bytes, index),
Longitude = BitConverter.ToDouble(bytes, index + sizeof(double)),
Orientacao = BitConverter.ToDouble(bytes, index + 2 * sizeof(double))
};
index += 3 * sizeof(double);
// Desserializar Sensores (LoRaProtocoloTransmissaoSensoresModel)
model.Sensores = new LoRaProtocoloTransmissaoSensoresModel
{
PercentualBateria = BitConverter.ToDouble(bytes, index),
PercentualReservatorio = BitConverter.ToDouble(bytes, index + sizeof(double)),
PressaoLinha = BitConverter.ToDouble(bytes, index + 2 * sizeof(double)),
DistanciaPercorrida = BitConverter.ToDouble(bytes, index + 3 * sizeof(double)),
OrientacaoCaminho = BitConverter.ToDouble(bytes, index + 4 * sizeof(double)),
Velocidade = BitConverter.ToDouble(bytes, index + 5 * sizeof(double)),
ErvasIdentificadas = BitConverter.ToDouble(bytes, index + 6 * sizeof(double)),
TemperaturaMotores = BitConverter.ToDouble(bytes, index + 7 * sizeof(double)),
TemperaturaCampo = BitConverter.ToDouble(bytes, index + 8 * sizeof(double)),
HerbicidaConsumido = BitConverter.ToDouble(bytes, index + 9 * sizeof(double)),
HerbicidaPorErva = BitConverter.ToDouble(bytes, index + 10 * sizeof(double))
};
index += 11 * sizeof(double);
// Desserializar Operacao (LoRaProtocoloTransmissaoOperacaoModel)
model.Operacao = new LoRaProtocoloTransmissaoOperacaoModel
{
statusOperacao = (StatusOperacao)bytes[index],
statusCarro = (StatusCarroMapa)bytes[index + 1],
idxRuaAtual = BitConverter.ToInt32(bytes, index + 2),
PercentualOperacao = BitConverter.ToDouble(bytes, index + 2 + sizeof(int)),
PercentualRua = BitConverter.ToDouble(bytes, index + 2 + sizeof(int) + sizeof(double)),
TempoOperacao = BitConverter.ToInt32(bytes, index + 2 + sizeof(int) + 2 * sizeof(double))
};
index += 2 + sizeof(int) + 2 * sizeof(double) + sizeof(int);
// Desserializar TempoEstimado (string)
int stringLength = BitConverter.ToInt32(bytes, index);
index += sizeof(int);
model.Operacao.TempoEstimado = Encoding.UTF8.GetString(bytes, index, stringLength);
return model;
}
public static byte[] SerializeGPSModel(byte Endereco, GPSModel model)
{
List<byte> bytes = new List<byte>();
// Serializar Momento (DateTime)
bytes.AddRange(BitConverter.GetBytes(model.Momento.ToBinary()));
// Serializar EnderecoCarro (byte)
bytes.Add(Endereco);
// Serializar Coordenadas (LoRaProtocoloTransmissaoCoordenadasModel)
bytes.AddRange(BitConverter.GetBytes(model.Latitude));
bytes.AddRange(BitConverter.GetBytes(model.Longitude));
bytes.AddRange(BitConverter.GetBytes(model.Orientacao));
return bytes.ToArray();
}
public static (byte, GPSModel) DeserializeGPSModel(byte[] bytes)
{
GPSModel model = new GPSModel();
int index = 0;
// Desserializar Momento (DateTime)
model.Momento = DateTime.FromBinary(BitConverter.ToInt64(bytes, index));
index += sizeof(long);
// Desserializar EnderecoCarro (byte)
byte Endereco = bytes[index];
index += sizeof(byte);
// Desserializar Coordenadas (LoRaProtocoloTransmissaoCoordenadasModel)
model.Latitude = BitConverter.ToDouble(bytes, index);
model.Longitude = BitConverter.ToDouble(bytes, index + sizeof(double));
model.Orientacao = BitConverter.ToDouble(bytes, index + 2 * sizeof(double));
return (Endereco, model);
}
public static byte[] SerializeControleModel(OperacaoControleBaseModel model)
{
List<byte> bytes = new List<byte>();
// Serializar Momento (DateTime)
bytes.AddRange(BitConverter.GetBytes(model.Momento.ToBinary()));
// Serializar Tecla (int)
bytes.AddRange(BitConverter.GetBytes((int)model.Tecla));
// Serializar Dispositivo (int)
bytes.AddRange(BitConverter.GetBytes((int)model.Dispositivo));
// Serializar RPM
bytes.AddRange(BitConverter.GetBytes(model.RPM));
// Serializar AnguloMP
bytes.AddRange(BitConverter.GetBytes(model.AnguloMP));
// Serializar VelocidadeMP
bytes.AddRange(BitConverter.GetBytes(model.VelocidadeMP));
// Serializar Emergencia
bytes.AddRange(BitConverter.GetBytes(model.Emergencia));
// Serializar TipoMovimento (int)
bytes.AddRange(BitConverter.GetBytes((int)model.TipoMovimento));
return bytes.ToArray();
}
public static OperacaoControleBaseModel DeserializeControleModel(byte[] bytes)
{
OperacaoControleBaseModel model = new OperacaoControleBaseModel();
int index = 0;
// Desserializar Momento (DateTime)
model.Momento = DateTime.FromBinary(BitConverter.ToInt64(bytes, index));
index += sizeof(long);
// Desserializar Tecla (int)
model.Tecla = (Keys)BitConverter.ToInt32(bytes, index);
index += sizeof(int);
// Desserializar Dispositivo (int)
model.Dispositivo = (T_Code)BitConverter.ToInt32(bytes, index);
index += sizeof(int);
// Desserializar RPM
model.RPM = BitConverter.ToInt32(bytes, index);
index += sizeof(int);
// Desserializar AnguloMP
model.AnguloMP = BitConverter.ToDouble(bytes, index);
index += sizeof(double);
// Desserializar VelocidadeMP
model.VelocidadeMP = BitConverter.ToDouble(bytes, index);
index += sizeof(double);
// Desserializar Emergencia
model.Emergencia = BitConverter.ToBoolean(bytes, index);
index += sizeof(bool);
// Desserializar TipoMovimento (int)
model.TipoMovimento = (TipoMovimentoDirecional)BitConverter.ToInt32(bytes, index);
index += sizeof(int);
return model;
}
}
}