232 lines
10 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|