forked from capocchi/DEVSimPy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInteractionSocket.py
More file actions
131 lines (107 loc) · 4.46 KB
/
InteractionSocket.py
File metadata and controls
131 lines (107 loc) · 4.46 KB
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
# -*- coding: utf-8 -*-
import json
import threading
import socketserver
import traceback
import sys
from numpy import Infinity
if sys.platform == "win32":
Server = socketserver.TCPServer
else:
Server = socketserver.UnixStreamServer
def log(s):
sys.stdout.write(s)
class MySocketHandler(socketserver.BaseRequestHandler):
"""
The RequestHandler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""
def handle(self):
# request is the socket connected to the client
self.data = self.request.recv(1024).strip()
log("*** reception " + self.data)
response = {}
if self.data == "PAUSE":
self.server.simulation_thread.suspend()
#while not self.server.simulation_thread.suspension_applied: pass TODO? modif Strategy needed
response['status'] = 'PAUSED'
# Simulation time is not reliable before thread is actually suspended
# Infinity might be returned
response['simulation_time'] = self.server.simulation_thread.model.myTimeAdvance
if response['simulation_time'] == Infinity:
response['simulation_time'] = 'undefined'
elif self.data == "RESUME":
response['simulation_time'] = self.server.simulation_thread.model.myTimeAdvance
self.server.simulation_thread.resume_thread()
#while self.server.simulation_thread.suspension_applied:pass TODO? modif Strategy needed
response['status'] = 'RESUMED'
else:
data = json.loads(self.data)
model_name = data['block_label']
params = data['block']
if self.server.simulation_thread.thread_suspend:
response['status'] = 'OK'
response['simulation_time'] = self.server.simulation_thread.model.myTimeAdvance
if model_name in self.server._componentSet:
for param_name, param_value in list(params.items()) :
if param_name in dir(self.server._componentSet[model_name]):
setattr(self.server._componentSet[model_name], param_name, param_value)
else:
response['status'] += ' - UNKNOWN_PARAM ' + param_name
else:
response['status'] = 'UNKNOWN_MODEL_NAME ' + model_name
else:
response['status'] = 'SIM_NOT_PAUSED'
self.request.send(json.dumps(response))
class MySocketServer(Server):
"""
"""
def __init__(self, server_address, RequestHandlerClass, simulation_thread):
"""
"""
if sys.platform == "win32":
socketserver.TCPServer.__init__(self, server_address, RequestHandlerClass)
else:
socketserver.UnixStreamServer.__init__(self, server_address, RequestHandlerClass)
self.simulation_thread = simulation_thread
self._componentSet = self.simulation_thread.model.getFlatComponentSet()
def handle_error(self, request, client_address):
sys.stderr.write('*** EXCEPTION handling msg in InteractionManager')
sys.stderr.write(client_address)
sys.stderr.write(traceback.format_exc())
sys.stderr.write(' ***')
class InteractionManager(threading.Thread):
"""
"""
def __init__(self, socket_id, simulation_thread):
"""
"""
threading.Thread.__init__(self)
self.daemon = True
log('SocketServer thread init ** ')
try:
# TCP socket server initialization
#self.server = MySocketServer(('localhost', 5555), MySocketHandler, simulation_thread)
# UNIX socket server initialization
self.server = MySocketServer('\0' + socket_id, MySocketHandler, simulation_thread)
log('SocketServer created ** ')
except:
self.server = None
log ('SocketServer creation failed ** ')
#log (traceback.format_exc())
raise
def run(self):
"""
"""
if self.server:
log('SocketServer serve_forever ** ')
self.server.serve_forever()
def stop(self):
"""
"""
if self.server:
log('SocketSserver shutdown')
self.server.shutdown()
self.server.server_close()