aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs
blob: a41501f7fbcbd55a581657b072c4d2c82107b026 (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
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.Transport.Servers;
using Tango.Logging;
using Tango.PMR;
using Tango.PMR.Common;
using Tango.PMR.Stubs;
using Tango.Core.Commands;
using Tango.Transport;

namespace Tango.Emulations.Emulators
{
    public class MachineEmulator : EmulatorBase
    {
        #region Constructors

        /// <summary>
        /// Initializes a new instance of the <see cref="MachineEmulator"/> class.
        /// </summary>
        public MachineEmulator() : base()
        {

        }

        /// <summary>
        /// Initializes a new instance of the <see cref="MachineEmulator"/> class.
        /// </summary>
        /// <param name="transporter">The transporter.</param>
        public MachineEmulator(ITransporter transporter) : base(transporter)
        {

        }

        #endregion

        #region Override Methods

        /// <summary>
        /// Called on new request message.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="container">The container.</param>
        protected override void OnTransporterRequestReceived(object sender, MessageContainer container)
        {
            switch (container.Type)
            {
                case MessageType.CalculateRequest:
                    Task.Factory.StartNew(() =>
                    {
                        var request = MessageFactory.ParseMessageFromContainer<CalculateRequest>(container);
                        var response = MessageFactory.CreateTangoMessage<CalculateResponse>(container.Token);
                        response.Message.Sum = request.A + request.B;
                        Transporter.SendResponse(response);
                    });
                    break;
                case MessageType.ProgressRequest:

                    var r = MessageFactory.ParseMessageFromContainer<ProgressRequest>(container);

                    Task.Factory.StartNew(() => 
                    {
                        for (int i = 0; i < r.Amount; i++)
                        {
                            Thread.Sleep(r.Delay * 10);
                            var res = MessageFactory.CreateTangoMessage<ProgressResponse>(container.Token);
                            res.Message.Progress = i;

                            if (i == r.Amount - 1) res.Container.Completed = true;

                            Transporter.SendResponse(res);
                        }
                    });

                    break;
            }
        } 

        #endregion
    }
}