Skip to content

Commit

Permalink
Restructured communication to depend on only two shared UDP clients.
Browse files Browse the repository at this point in the history
  • Loading branch information
Jan Scholtyssek committed Jan 25, 2020
1 parent 1485f90 commit 74ca897
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 51 deletions.
20 changes: 16 additions & 4 deletions CentralMonitorGUI/App.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using System;
using System.Net.Sockets;
using System.Threading;
using System.Windows;
using CentralMonitorGUI.Properties;
using CentralMonitorGUI.ViewModels;
using CentralMonitorGUI.Views;
using NetworkCommunication;
using NetworkCommunication.Communicators;
using NetworkCommunication.DataProcessing;
using NetworkCommunication.DataStorage;
Expand Down Expand Up @@ -32,13 +34,19 @@ private void App_OnStartup(object sender, StartupEventArgs e)
var discoveryMessageReceiver = new DiscoveryMessageReceiver(discoveryMessageParser);
var network = new MonitorNetwork(discoveryMessageReceiver, connectionLostTimeout);
var dataRequestGenerator = new DataRequestGenerator();
var dataRequestSender = new DataRequestSender(dataRequestGenerator);
var vitalSignsUdpClient = new UdpClient(Informations.VitalSignsRequestOutboundPort);
var waveformUdpClient = new UdpClient(Informations.WaveformRequestOutboundPort);
var dataRequestSender = new DataRequestSender(dataRequestGenerator, vitalSignsUdpClient, waveformUdpClient);
var vitalSignPacketParser = new VitalSignPacketParser();
var waveformPacketParser = new WaveformPacketParser();
var waveformAndVitalSignReceiver = new WaveformAndVitalSignReceiver(dataRequestSender, vitalSignPacketParser, waveformPacketParser);
var waveformAndVitalSignReceiver = new WaveformAndVitalSignReceiver(
vitalSignPacketParser,
waveformPacketParser,
vitalSignsUdpClient,
waveformUdpClient);
var alarmMessageParser = new AlarmMessageParser();
var alarmReceiver = new AlarmReceiver(alarmMessageParser);
var dataConnectionManager = new DataConnectionManager(network, waveformAndVitalSignReceiver, alarmReceiver);
var dataConnectionManager = new DataConnectionManager(network, waveformAndVitalSignReceiver, dataRequestSender, alarmReceiver);
var updateTrigger = new UpdateTrigger(waveformUpdateInterval);
var availableDataFinder = new AvailableDataFinder(fileManager, newRangeThreshold);
var vitalSignFileLoader = new VitalSignFileLoader(fileManager);
Expand All @@ -53,8 +61,9 @@ private void App_OnStartup(object sender, StartupEventArgs e)
{
waveformAndVitalSignReceiver.NewWaveformData += (receiver, data) => waveformStorer.Store(data);
waveformAndVitalSignReceiver.NewVitalSignData += (receiver, data) => vitalSignsStorer.Store(data);
discoveryMessageReceiver.StartReceiving(mainCancellationTokenSource.Token);
waveformAndVitalSignReceiver.StartReceiving(mainCancellationTokenSource.Token);
alarmReceiver.StartReceiving(mainCancellationTokenSource.Token);
discoveryMessageReceiver.StartReceiving(mainCancellationTokenSource.Token);
updateTrigger.Start();

mainWindow.ShowDialog();
Expand All @@ -63,6 +72,9 @@ private void App_OnStartup(object sender, StartupEventArgs e)
updateTrigger.Stop();
dataConnectionManager.Dispose();
mainCancellationTokenSource.Cancel();
waveformAndVitalSignReceiver.Dispose();
vitalSignsUdpClient.Dispose();
waveformUdpClient.Dispose();
}
}
}
Expand Down
15 changes: 8 additions & 7 deletions NetworkCommunication/Communicators/DataConnectionManager.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Threading;
using Commons;
using Commons.Extensions;
using NetworkCommunication.Objects;

Expand All @@ -10,18 +10,17 @@ namespace NetworkCommunication.Communicators
public class DataConnectionManager : IDisposable
{
private readonly MonitorNetwork network;
private readonly WaveformAndVitalSignReceiver waveformAndVitalSignReceiver;
private readonly AlarmReceiver alarmReceiver;
private readonly DataRequestSender dataRequestSender;
private readonly Dictionary<PatientMonitor, CancellationTokenSource> cancellationTokenSources = new Dictionary<PatientMonitor, CancellationTokenSource>();

public DataConnectionManager(
MonitorNetwork network,
WaveformAndVitalSignReceiver waveformAndVitalSignReceiver,
DataRequestSender dataRequestSender,
AlarmReceiver alarmReceiver)
{
this.network = network;
this.waveformAndVitalSignReceiver = waveformAndVitalSignReceiver;
this.alarmReceiver = alarmReceiver;
this.dataRequestSender = dataRequestSender;

network.NewMonitorDiscovered += Network_NewMonitorDiscovered;
network.MonitorDisappeared += Network_MonitorDisappeared;
Expand All @@ -40,8 +39,10 @@ private void Network_NewMonitorDiscovered(object sender, PatientMonitor newMonit
}
var cancellationTokenSource = new CancellationTokenSource();
cancellationTokenSources.Add(newMonitor, cancellationTokenSource);
waveformAndVitalSignReceiver.StartReceiving(
newMonitor.IPAddress,
var target = new IPEndPoint(newMonitor.IPAddress, Informations.DataRequestPort);
dataRequestSender.StartRequesting(
target,
TimeSpan.FromSeconds(5),
cancellationTokenSource.Token);
}

Expand Down
11 changes: 8 additions & 3 deletions NetworkCommunication/Communicators/DataRequestSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,21 @@ namespace NetworkCommunication.Communicators
public class DataRequestSender
{
private readonly DataRequestGenerator dataRequestGenerator;
private readonly UdpClient metadataUdpClient;
private readonly UdpClient waveformUdpClient;

public DataRequestSender(DataRequestGenerator dataRequestGenerator)
public DataRequestSender(
DataRequestGenerator dataRequestGenerator,
UdpClient metadataUdpClient,
UdpClient waveformUdpClient)
{
this.dataRequestGenerator = dataRequestGenerator;
this.metadataUdpClient = metadataUdpClient;
this.waveformUdpClient = waveformUdpClient;
}

public async void StartRequesting(
IPEndPoint target,
UdpClient metadataUdpClient,
UdpClient waveformUdpClient,
TimeSpan interval,
CancellationToken cancellationToken)
{
Expand Down
66 changes: 31 additions & 35 deletions NetworkCommunication/Communicators/WaveformAndVitalSignReceiver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,57 +8,47 @@

namespace NetworkCommunication.Communicators
{
public class WaveformAndVitalSignReceiver
public class WaveformAndVitalSignReceiver : IDisposable
{
private readonly DataRequestSender dataRequestSender;
private readonly VitalSignPacketParser vitalSignPacketParser;
private readonly WaveformPacketParser waveformPacketParser;
private readonly UdpClient vitalSignsUdpClient;
private readonly UdpClient waveformUdpClient;

public WaveformAndVitalSignReceiver(
DataRequestSender dataRequestSender,
VitalSignPacketParser vitalSignPacketParser,
WaveformPacketParser waveformPacketParser)
WaveformPacketParser waveformPacketParser,
UdpClient vitalSignsUdpClient,
UdpClient waveformUdpClient)
{
this.dataRequestSender = dataRequestSender;
this.vitalSignPacketParser = vitalSignPacketParser;
this.waveformPacketParser = waveformPacketParser;
this.vitalSignsUdpClient = vitalSignsUdpClient;
this.waveformUdpClient = waveformUdpClient;
}

public event EventHandler<WaveformCollection> NewWaveformData;
public event EventHandler<VitalSignData> NewVitalSignData;

public async void StartReceiving(
IPAddress targetAddress,
CancellationToken cancellationToken)
public async void StartReceiving(CancellationToken cancellationToken)
{
var target = new IPEndPoint(targetAddress, Informations.DataRequestPort);
using (var vitalSignsUdpClient = new UdpClient(Informations.VitalSignsRequestOutboundPort))
using (var waveformUdpClient = new UdpClient(Informations.WaveformRequestOutboundPort))
var vitalSignsTask = Task.Factory.StartNew(
() => ReceiveVitalSignData(vitalSignsUdpClient, cancellationToken),
cancellationToken,
TaskCreationOptions.LongRunning,
TaskScheduler.Current);
var waveformTask = Task.Factory.StartNew(
() => ReceiveWaveforms(waveformUdpClient, cancellationToken),
cancellationToken,
TaskCreationOptions.LongRunning,
TaskScheduler.Current);
try
{
dataRequestSender.StartRequesting(
target,
vitalSignsUdpClient,
waveformUdpClient,
TimeSpan.FromSeconds(5),
cancellationToken);
var vitalSignsTask = Task.Factory.StartNew(
() => ReceiveVitalSignData(vitalSignsUdpClient, cancellationToken),
cancellationToken,
TaskCreationOptions.LongRunning,
TaskScheduler.Current);
var waveformTask = Task.Factory.StartNew(
() => ReceiveWaveforms(waveformUdpClient, cancellationToken),
cancellationToken,
TaskCreationOptions.LongRunning,
TaskScheduler.Current);
try
{
await Task.WhenAll(vitalSignsTask, waveformTask);
}
catch (OperationCanceledException)
{
// Ignore
}
await Task.WhenAll(vitalSignsTask, waveformTask);
}
catch (OperationCanceledException)
{
// Ignore
}
}

Expand Down Expand Up @@ -110,5 +100,11 @@ private void ReceiveWaveforms(UdpClient udpClient, CancellationToken cancellatio
}
}
}

public void Dispose()
{
vitalSignsUdpClient.Dispose();
waveformUdpClient.Dispose();
}
}
}
11 changes: 9 additions & 2 deletions NetworkCommunication/Program.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using NetworkCommunication.Communicators;
using NetworkCommunication.DataProcessing;
Expand Down Expand Up @@ -50,7 +51,9 @@ public static void Main(string[] args)
var alarmMessageParser = new AlarmMessageParser();
var alarmReceiver = new AlarmReceiver(alarmMessageParser);
var dataRequestGenerator = new DataRequestGenerator();
var dataRequestSender = new DataRequestSender(dataRequestGenerator);
var vitalSignsUdpClient = new UdpClient(Informations.VitalSignsRequestOutboundPort);
var waveformUdpClient = new UdpClient(Informations.WaveformRequestOutboundPort);
var dataRequestSender = new DataRequestSender(dataRequestGenerator, vitalSignsUdpClient, waveformUdpClient);
var waveformMessageBuilder = new WaveformMessageBuilder(simulatedSensors, simulators);
var vitalSignMessageBuilder = new VitalSignMessageBuilder(simulatedSensors, simulators, ourIpAddress);
var waveformMessageParser = new WaveformPacketParser();
Expand All @@ -60,15 +63,19 @@ public static void Main(string[] args)
using(var waveformStreamer = new WaveformStreamer(waveformMessageBuilder))
{
var dataRequestReceiver = new DataRequestReceiver(waveformStreamer, vitalSignStreamer);
var waveformReceiver = new WaveformAndVitalSignReceiver(dataRequestSender, vitalSignMessageParser, waveformMessageParser);
var waveformReceiver = new WaveformAndVitalSignReceiver(vitalSignMessageParser, waveformMessageParser, vitalSignsUdpClient, waveformUdpClient);

discoveryMessageSender.StartSending(cancellationTokenSource.Token);
discoveryMessageReceiver.StartReceiving(cancellationTokenSource.Token);
alarmReceiver.StartReceiving(cancellationTokenSource.Token);
dataRequestReceiver.StartListening(cancellationTokenSource.Token);
waveformReceiver.StartReceiving(cancellationTokenSource.Token);

Console.ReadLine();
cancellationTokenSource.Cancel();
waveformReceiver.Dispose();
vitalSignsUdpClient.Dispose();
waveformUdpClient.Dispose();
}
}
}
Expand Down

0 comments on commit 74ca897

Please sign in to comment.