using System;
using System.Net;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using RobotClientWpf.Utilities;
using RobotLib;
namespace RobotClientWpf
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
private ChallengeFactory challenge;
private bool manualDisconnect;
public MainWindow()
{
InitializeComponent();
this.challenge = new ChallengeFactory();
this.challenge.PublisherSubscriber.ConnectionStateChanged += PublisherSubscriber_ConnectionStateChanged;
}
private void PublisherSubscriber_ConnectionStateChanged(object? sender, bool e)
{
if(e == false)
{
if (manualDisconnect == true) manualDisconnect = false; return;
this.DisplayBottomMessage(MessageSeverity.Error, "Connection to MQTT broker lost.");
this.SetIpFieldsState(true, true, "Connect");
}
}
private void BatteryChanged(object? sender, BatteryEventArgs e)
{
if (!Dispatcher.CheckAccess())
{
EventHandler eventDelegate = BatteryChanged;
Dispatcher.Invoke(eventDelegate, sender, e);
}
else
{
//labelBattery.Content = $"Battery: {e.Voltage} V";
}
}
private void buttonBuzz_Click(object sender, RoutedEventArgs e)
{
//Robot.Instance.Buzzer.Beep(300, 500);
}
private void btnConnectDisconnect_Click(object sender, RoutedEventArgs e)
{
Task.Run(delegate ()
{
this.ClearBottomMessage();
if (this.challenge.PublisherSubscriber.IsConnected) // is connected => disconnect
{
manualDisconnect = true; // prevent wrong message
this.challenge.PublisherSubscriber.Disconnect();
this.DisplayBottomMessage(MessageSeverity.Success, "Disconnected from MQTT broker.");
this.SetIpFieldsState(true, true, "Connect");
}
else // is not yet connected => connect
{
this.SetIpFieldsState(false, false, "Connecting...");
string ipAddress = UIAccessHelpers.GetTextboxText(tbIp);
if (IPAddress.TryParse(ipAddress, out _))
{
var connectionSuccess = this.challenge.PublisherSubscriber.Connect(ipAddress);
if (connectionSuccess)
{
this.DisplayBottomMessage(MessageSeverity.Success, "Successfully connected to MQTT broker.");
this.SetIpFieldsState(false, true, "Disconnect");
}
else
{
this.DisplayBottomMessage(MessageSeverity.Error, $"Failed to connect to MQTT broker on address {ipAddress}.");
this.SetIpFieldsState(true, true, "Connect");
}
}
else
{
this.DisplayBottomMessage(MessageSeverity.Error, $"Unable to parse MQTT Broker IP address {ipAddress}.");
this.SetIpFieldsState(true, true, "Connect");
}
}
});
}
private void SetIpFieldsState(bool ipTextbox, bool connectDisconnectButton, string buttonText)
{
UIAccessHelpers.SetButtonState(btnConnectDisconnect, connectDisconnectButton);
UIAccessHelpers.SetTextboxState(tbIp, ipTextbox);
UIAccessHelpers.SetButtonContent(btnConnectDisconnect, buttonText);
}
public void DisplayBottomMessage(MessageSeverity severity, string message)
{
Brush col;
switch (severity)
{
case MessageSeverity.Success:
col = Brushes.Green;
break;
case MessageSeverity.Warning:
col = Brushes.Orange;
break;
case MessageSeverity.Error:
col = Brushes.Red;
break;
case MessageSeverity.Information:
col = Brushes.Blue;
break;
case MessageSeverity.Unknown:
default:
col = Brushes.DarkGray;
break;
}
UIAccessHelpers.SetTextblockTextAndForegroundColor(tbBottomMessage, message, col);
}
private void ClearBottomMessage()
{
this.DisplayBottomMessage(MessageSeverity.Information, "");
}
}
}