185 lines
7.2 KiB
C#
185 lines
7.2 KiB
C#
using AgroBase.Models;
|
|
using Newtonsoft.Json;
|
|
using System.Diagnostics;
|
|
using System.Windows;
|
|
using OperationControl.Services;
|
|
|
|
namespace OperationControl.Models
|
|
{
|
|
public class Variaveis
|
|
{
|
|
public static MqttService MqttService;
|
|
public static GpsService GpsService;
|
|
|
|
public static void MostrarLog(string message)
|
|
{
|
|
Debug.WriteLine(message);
|
|
}
|
|
|
|
public static async void IniciarMQTT()
|
|
{
|
|
if (MqttService != null)
|
|
{
|
|
foreach (var topico in MqttService.Topicos.Where(x => x.Inscrever))
|
|
{
|
|
await MqttService.UnsubscribeAsync(topico);
|
|
}
|
|
MqttService.Topicos.Clear();
|
|
}
|
|
|
|
MqttService = new MqttService("localhost", 1883, "base", true, msg => MostrarLog($"[MQTT localhost:1883] - {msg}"));
|
|
|
|
await MqttService.AdicionarNovoTopico(VariaveisControleOperacao.TopicoMqttRTCM);
|
|
await MqttService.AdicionarNovoTopico(VariaveisControleOperacao.TopicoMqttDispositivos, true, 1, async (message) =>
|
|
{
|
|
try
|
|
{
|
|
string device_id = message.Mensagem;
|
|
VariaveisControleOperacao.AdicionarNovoRoverNaRede(message.Mensagem);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MostrarLog($"Erro ao deserializar ping do rover: {ex.Message}");
|
|
}
|
|
});
|
|
|
|
GpsService = new GpsService();
|
|
}
|
|
|
|
}
|
|
|
|
public class VariaveisControleOperacao
|
|
{
|
|
public static double LeverArmFrontal { get; } = 0.0;
|
|
public static double LeverArmLateral { get; } = 0.0;
|
|
|
|
public static readonly string BaseMarkerID = "BASE";
|
|
public static string TopicoMqttDispositivos { get; } = $"agrobot/v1/base/devices";
|
|
public static string TopicoMqttPosicao { get; } = $"agrobot/v1/base/position";
|
|
public static string TopicoMqttRTCM { get; } = $"agrobot/v1/base/rtcm";
|
|
private static readonly object _RoversLock = new object();
|
|
public static Dictionary<string, OperacaoSensoriamentoLogModel> RoversNaRede { get; set; } = new Dictionary<string, OperacaoSensoriamentoLogModel>();
|
|
public static string SelectedRoverId { get; set; } = BaseMarkerID;
|
|
|
|
public static async void AdicionarNovoRoverNaRede(string device_id)
|
|
{
|
|
if (string.IsNullOrEmpty(device_id))
|
|
return;
|
|
|
|
bool rover_ja_adicionado = false;
|
|
lock (_RoversLock)
|
|
{
|
|
rover_ja_adicionado = RoversNaRede.ContainsKey(device_id);
|
|
}
|
|
|
|
if (!rover_ja_adicionado)
|
|
{
|
|
lock (_RoversLock)
|
|
{
|
|
RoversNaRede.Add(device_id, new OperacaoSensoriamentoLogModel() { Momento = DateTime.Now });
|
|
}
|
|
|
|
await Variaveis.MqttService.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttComandos.Replace("<id>", device_id));
|
|
await Variaveis.MqttService.AdicionarNovoTopico(VariaveisEquipamento.TopicoMqttTelemetria.Replace("<id>", device_id), true, 1, async (message) =>
|
|
{
|
|
try
|
|
{
|
|
string json = message.Mensagem;
|
|
var obj = JsonConvert.DeserializeObject<OperacaoSensoriamentoLogModel>(json);
|
|
lock (_RoversLock)
|
|
{
|
|
RoversNaRede[device_id] = obj;
|
|
|
|
((App)Application.Current).Shell.Main.AtualizarDadosTela_Telemetria(device_id);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao deserializar dados de telemetria do rover {device_id}: {ex.Message}");
|
|
}
|
|
});
|
|
|
|
await Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
{
|
|
try
|
|
{
|
|
List<string> dispositivos_ids = new List<string>() { "BASE" };
|
|
dispositivos_ids.Union(RoversNaRede.Select(x => x.Key).ToList());
|
|
((App)Application.Current).Shell.Main.AtualizarListaDispositivos(dispositivos_ids);
|
|
}
|
|
catch (Exception exUi)
|
|
{
|
|
Variaveis.MostrarLog($"Erro ao atualizar UI lista dispositivos: {exUi.Message}");
|
|
}
|
|
}));
|
|
}
|
|
}
|
|
|
|
public static async void AtualizarListaRoversNaRede()
|
|
{
|
|
List<string> rovers_desconectados = new List<string>();
|
|
var rovers_atual = new Dictionary<string, OperacaoSensoriamentoLogModel>();
|
|
lock (_RoversLock)
|
|
{
|
|
rovers_atual = new Dictionary<string, OperacaoSensoriamentoLogModel>(RoversNaRede);
|
|
}
|
|
foreach (var rover in rovers_atual)
|
|
{
|
|
double tempo_sem_resposta = (DateTime.Now - rover.Value.Momento).TotalSeconds;
|
|
if (tempo_sem_resposta > 5.0)
|
|
{
|
|
rovers_desconectados.Add(rover.Key);
|
|
}
|
|
}
|
|
foreach (var device_id in rovers_desconectados)
|
|
{
|
|
lock (_RoversLock)
|
|
{
|
|
RoversNaRede.Remove(device_id);
|
|
|
|
if (SelectedRoverId == device_id)
|
|
{
|
|
((App)Application.Current).Shell.Main.LimparDadosTela_Telemetria();
|
|
}
|
|
}
|
|
var topicos_rover = Variaveis.MqttService.Topicos.Where(x => x.Topico.Contains(device_id)).ToList();
|
|
foreach (var topico in topicos_rover)
|
|
{
|
|
await Variaveis.MqttService.UnsubscribeAsync(topico);
|
|
Variaveis.MqttService.Topicos.Remove(topico);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static async void EnviarDadosControle(string rover_id, OperacaoControleBaseModel controle)
|
|
{
|
|
var topico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == VariaveisEquipamento.TopicoMqttComandos.Replace("<id>", rover_id));
|
|
if (topico != null)
|
|
{
|
|
string json = JsonConvert.SerializeObject(controle);
|
|
await Variaveis.MqttService.PublishAsync(topico, json);
|
|
}
|
|
}
|
|
|
|
public static async void EnviarDadosPosicao(GPSModel posicao)
|
|
{
|
|
var topico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoMqttPosicao);
|
|
if (topico != null)
|
|
{
|
|
string json = JsonConvert.SerializeObject(posicao);
|
|
await Variaveis.MqttService.PublishAsync(topico, json);
|
|
}
|
|
}
|
|
|
|
public static async void EnviarDadosCorrecaoRTCM(byte[] correcao)
|
|
{
|
|
var topico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoMqttRTCM);
|
|
if (topico != null)
|
|
{
|
|
await Variaveis.MqttService.PublishAsync(topico, correcao);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|