blob: d5ce0d1452ff724733b703133455277e2bb63c0f (
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
|
using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Tango.Integration.ExternalBridge.Web;
namespace Tango.MachineService.Hubs
{
public class ExternalBridgeHub : Hub
{
private static List<ExternalBridgeInfo> _externalBridges;
private static List<MachineSession> _sessions;
public class ExternalBridgeInfo
{
public String ConnectionID { get; set; }
public MachineInfo MachineInfo { get; set; }
}
public class MachineSession
{
public String SessionID { get; set; }
public String ReceiverConnectionID { get; set; }
public String ControllerConnectionID { get; set; }
public ExternalBridgeInfo ExternalBridge { get; set; }
public MachineSession()
{
SessionID = Guid.NewGuid().ToString();
}
}
static ExternalBridgeHub()
{
_externalBridges = new List<ExternalBridgeInfo>();
_sessions = new List<MachineSession>();
}
public void RegisterMachine(MachineInfo machineInfo)
{
_externalBridges.RemoveAll(x => x.MachineInfo.SerialNumber == machineInfo.SerialNumber);
_externalBridges.Add(new ExternalBridgeInfo()
{
MachineInfo = machineInfo,
ConnectionID = Context.ConnectionId,
});
}
public void UnregisterMachine()
{
_externalBridges.RemoveAll(x => x.ConnectionID == Context.ConnectionId);
}
public List<MachineInfo> GetAvailableMachines()
{
return _externalBridges.Select(x => x.MachineInfo).ToList();
}
public String CreateSession(String serialNumber)
{
var externalBridge = _externalBridges.SingleOrDefault(x => x.MachineInfo.SerialNumber == serialNumber);
if (externalBridge != null)
{
MachineSession session = new MachineSession();
session.ControllerConnectionID = Context.ConnectionId;
session.ExternalBridge = externalBridge;
_sessions.Add(session);
Clients.Client(externalBridge.ConnectionID).OnSessionCreated(session.SessionID);
return session.SessionID;
}
return null;
}
//public void NotifySessionCreated()
//{
// var session = _sessions.SingleOrDefault(x => x.ReceiverConnectionID == Context.ConnectionId);
// if (session != null)
// {
// Clients.Client(session.ControllerConnectionID).SessionCreated();
// }
//}
public void JoinSession(String sessionID)
{
var session = _sessions.SingleOrDefault(x => x.SessionID == sessionID);
if (session != null)
{
session.ReceiverConnectionID = Context.ConnectionId;
Clients.Client(session.ControllerConnectionID).SessionCreated();
}
}
public void Write(List<byte[]> dataCollection)
{
var session = _sessions.SingleOrDefault(x => x.ReceiverConnectionID == Context.ConnectionId || x.ControllerConnectionID == Context.ConnectionId);
if (session != null)
{
String connectionID = String.Empty;
if (session.ReceiverConnectionID == Context.ConnectionId)
{
connectionID = session.ControllerConnectionID;
}
else
{
connectionID = session.ReceiverConnectionID;
}
Clients.Client(connectionID).DataAvailable(dataCollection);
}
}
public override Task OnDisconnected(bool stopCalled)
{
_externalBridges.RemoveAll(x => x.ConnectionID == Context.ConnectionId);
_sessions.RemoveAll(x => x.ControllerConnectionID == Context.ConnectionId || x.ReceiverConnectionID == Context.ConnectionId);
return base.OnDisconnected(stopCalled);
}
}
}
|