blob: cbb5f00f9e1c61e7180b0a5c639bc4239b565525 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
using Google.Protobuf;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tango.Integration.Adapters;
using Tango.Integration.TCP;
using Tango.Integration.Transport;
using Tango.Logging;
using Tango.PMR;
using Tango.PMR.Common;
using Tango.PMR.Stubs;
using Tango.SharedUI;
using Tango.SharedUI.Commands;
namespace Tango.Integration.Emulators
{
public class MachineEmulator : ExtendedObject
{
private ITransporter _transporter;
#region Properties
private bool _isStarted;
/// <summary>
/// Gets or sets a value indicating whether the emulator is started.
/// </summary>
public bool IsStarted
{
get { return _isStarted; }
set { _isStarted = value; RaisePropertyChanged(nameof(IsStarted)); InvalidateRelayCommands(); }
}
#endregion
#region Commands
/// <summary>
/// Gets or sets the start command.
/// </summary>
public RelayCommand StartCommand { get; set; }
/// <summary>
/// Gets or sets the stop command.
/// </summary>
public RelayCommand StopCommand { get; set; }
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="MachineEmulator"/> class.
/// </summary>
public MachineEmulator(ITransporter transporter)
{
_transporter = transporter;
_transporter.SubscribeForRequests().Subscribe(HandleRequest);
_transporter.SubscribeForDisconnection().Subscribe((x) => {}, (ex) =>
{
LogManager.Log("Transporter disconnected.");
});
StartCommand = new RelayCommand(Start, (x) => !IsStarted);
StopCommand = new RelayCommand(Stop, (x) => IsStarted);
}
#endregion
#region Public Methods
/// <summary>
/// Stops this instance.
/// </summary>
public void Stop()
{
if (IsStarted)
{
_transporter.Disconnect().Subscribe(x =>
{
IsStarted = false;
}, ex => { throw ex; });
}
}
/// <summary>
/// Starts this instance.
/// </summary>
public void Start()
{
if (!IsStarted)
{
_transporter.Connect().Subscribe(x =>
{
IsStarted = true;
}, ex => { throw ex; });
}
}
#endregion
#region Virtual Methods
/// <summary>
/// Handles the request.
/// </summary>
/// <param name="container">The container.</param>
protected void HandleRequest(MessageContainer container)
{
switch (container.Type)
{
case MessageType.Stub1Request:
Task.Factory.StartNew(() =>
{
Thread.Sleep(5000);
var request = MessageFactory.ParseContainer<Stub1Request>(container);
var response = MessageFactory.CreateContainer<Stub1Response>(container.Token);
response.Message.Sum = request.A + request.B;
response.Container.Token = container.Token;
_transporter.SendResponse(response);
});
break;
}
}
#endregion
}
}
|