Initial work for WhackerLink Master connection; add support to send Reg request and Aff request

pull/1/head
php 1 year ago
parent 61df187dcd
commit 6f9e59f80d

@ -28,7 +28,12 @@ using WhackerLinkLib.Models.Radio;
using YamlDotNet.Serialization; using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NamingConventions;
using WhackerLinkConsoleV2.Controls; using WhackerLinkConsoleV2.Controls;
using System.Collections.Generic; using WebSocketManager = WhackerLinkLib.Managers.WebSocketManager;
using System.Windows.Media;
using WhackerLinkLib.Utils;
using WhackerLinkLib.Models;
using WhackerLinkLib.Handlers;
using System.Net;
namespace WhackerLinkConsoleV2 namespace WhackerLinkConsoleV2
{ {
@ -45,6 +50,7 @@ namespace WhackerLinkConsoleV2
private SettingsManager _settingsManager = new SettingsManager(); private SettingsManager _settingsManager = new SettingsManager();
private SelectedChannelsManager _selectedChannelsManager; private SelectedChannelsManager _selectedChannelsManager;
private WebSocketManager _webSocketManager = new WebSocketManager();
public MainWindow() public MainWindow()
{ {
@ -52,6 +58,7 @@ namespace WhackerLinkConsoleV2
_settingsManager.LoadSettings(); _settingsManager.LoadSettings();
_selectedChannelsManager = new SelectedChannelsManager(); _selectedChannelsManager = new SelectedChannelsManager();
_selectedChannelsManager.SelectedChannelsChanged += SelectedChannelsChanged;
Loaded += MainWindow_Loaded; Loaded += MainWindow_Loaded;
} }
@ -131,6 +138,43 @@ namespace WhackerLinkConsoleV2
offsetX = 20; offsetX = 20;
offsetY += 140; offsetY += 140;
} }
_webSocketManager.AddWebSocketHandler(system.Name);
Task.Factory.StartNew(() =>
{
WebSocketHandler handler = _webSocketManager.GetWebSocketHandler(system.Name);
handler.Connect(system.Address, system.Port);
handler.OnUnitRegistrationResponse += (response) =>
{
Dispatcher.Invoke(() =>
{
if (response.Status == (int)ResponseType.GRANT)
{
systemStatusBox.Background = new SolidColorBrush(Colors.Green);
systemStatusBox.ConnectionState = "Connected";
}
else
{
systemStatusBox.Background = new SolidColorBrush(Colors.Red);
systemStatusBox.ConnectionState = "Disconnected";
}
});
};
handler.OnGroupAffiliationResponse += (response) => { /* TODO */ };
if (handler.IsConnected)
{
handler.SendMessage(PacketFactory.CreateUnitRegistrationRequest(system.Rid, system.Site));
}
else
{
systemStatusBox.Background = new SolidColorBrush(Colors.Red);
systemStatusBox.ConnectionState = "Disconnected";
}
});
} }
} }
@ -199,6 +243,40 @@ namespace WhackerLinkConsoleV2
AdjustCanvasHeight(); AdjustCanvasHeight();
} }
private void HandleChannelUpdate(ChannelBox channelBox, string lastSrc = "0", bool receiving = false)
{
if (receiving)
{
Dispatcher.Invoke(() =>
{
channelBox.LastSrcId = lastSrc;
if (channelBox.IsSelected)
channelBox.Background = new SolidColorBrush(Colors.Green);
});
} else
{
Dispatcher.Invoke(() =>
{
channelBox.LastSrcId = lastSrc;
if (channelBox.IsSelected)
channelBox.Background = new SolidColorBrush(Colors.Blue);
});
}
}
private void SelectedChannelsChanged()
{
foreach (ChannelBox channel in _selectedChannelsManager.GetSelectedChannels())
{
Codeplug.System system = Codeplug.GetSystemForChannel(channel.ChannelName);
Codeplug.Channel cpgChannel = Codeplug.GetChannelByName(channel.ChannelName);
WebSocketHandler handler = _webSocketManager.GetWebSocketHandler(system.Name);
if (channel.IsSelected)
handler.SendMessage(PacketFactory.CreateAffiliationRequest(system.Rid, cpgChannel.Tgid, system.Site));
}
}
private void SelectWidgets_Click(object sender, RoutedEventArgs e) private void SelectWidgets_Click(object sender, RoutedEventArgs e)
{ {
var widgetSelectionWindow = new WidgetSelectionWindow(); var widgetSelectionWindow = new WidgetSelectionWindow();

@ -26,6 +26,8 @@ namespace WhackerLinkConsoleV2
{ {
private readonly HashSet<ChannelBox> _selectedChannels; private readonly HashSet<ChannelBox> _selectedChannels;
public event Action SelectedChannelsChanged;
public SelectedChannelsManager() public SelectedChannelsManager()
{ {
_selectedChannels = new HashSet<ChannelBox>(); _selectedChannels = new HashSet<ChannelBox>();
@ -36,6 +38,7 @@ namespace WhackerLinkConsoleV2
if (_selectedChannels.Add(channel)) if (_selectedChannels.Add(channel))
{ {
channel.IsSelected = true; channel.IsSelected = true;
SelectedChannelsChanged.Invoke();
} }
} }
@ -44,6 +47,7 @@ namespace WhackerLinkConsoleV2
if (_selectedChannels.Remove(channel)) if (_selectedChannels.Remove(channel))
{ {
channel.IsSelected = false; channel.IsSelected = false;
SelectedChannelsChanged.Invoke();
} }
} }
@ -54,6 +58,7 @@ namespace WhackerLinkConsoleV2
channel.IsSelected = false; channel.IsSelected = false;
} }
_selectedChannels.Clear(); _selectedChannels.Clear();
SelectedChannelsChanged.Invoke();
} }
public IReadOnlyCollection<ChannelBox> GetSelectedChannels() => _selectedChannels; public IReadOnlyCollection<ChannelBox> GetSelectedChannels() => _selectedChannels;

@ -17,16 +17,31 @@
* Copyright (C) 2024 Caleb, K4PHP * Copyright (C) 2024 Caleb, K4PHP
* *
*/ */
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Controls; using System.Windows.Controls;
namespace WhackerLinkConsoleV2.Controls namespace WhackerLinkConsoleV2.Controls
{ {
public partial class SystemStatusBox : UserControl public partial class SystemStatusBox : UserControl, INotifyPropertyChanged
{ {
private string _connectionState = "Disconnected";
public string SystemName { get; set; } public string SystemName { get; set; }
public string AddressPort { get; set; } public string AddressPort { get; set; }
public string ConnectionState { get; set; } = "Disconnected";
public string ConnectionState
{
get => _connectionState;
set
{
if (_connectionState != value)
{
_connectionState = value;
NotifyPropertyChanged();
}
}
}
public SystemStatusBox() public SystemStatusBox()
{ {
@ -39,5 +54,12 @@ namespace WhackerLinkConsoleV2.Controls
SystemName = systemName; SystemName = systemName;
AddressPort = $"Address: {address}:{port}"; AddressPort = $"Address: {address}:{port}";
} }
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
} }
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.