##// END OF EJS Templates
nada
José Chávez -
r913:66816cdd4da4
parent child
Show More
@@ -1,422 +1,420
1 '''
1 '''
2 @author: Juan C. Espinoza
2 @author: Juan C. Espinoza
3 '''
3 '''
4
4
5 import time
5 import time
6 import json
6 import json
7 import numpy
7 import numpy
8 import paho.mqtt.client as mqtt
8 import paho.mqtt.client as mqtt
9 import zmq
9 import zmq
10 import cPickle as pickle
10 import cPickle as pickle
11 import datetime
11 import datetime
12 from zmq.utils.monitor import recv_monitor_message
12 from zmq.utils.monitor import recv_monitor_message
13 from functools import wraps
13 from functools import wraps
14 from threading import Thread
14 from threading import Thread
15 from multiprocessing import Process
15 from multiprocessing import Process
16
16
17 from schainpy.model.proc.jroproc_base import Operation, ProcessingUnit
17 from schainpy.model.proc.jroproc_base import Operation, ProcessingUnit
18
18
19 MAXNUMX = 100
19 MAXNUMX = 100
20 MAXNUMY = 100
20 MAXNUMY = 100
21
21
22 class PrettyFloat(float):
22 class PrettyFloat(float):
23 def __repr__(self):
23 def __repr__(self):
24 return '%.2f' % self
24 return '%.2f' % self
25
25
26 def roundFloats(obj):
26 def roundFloats(obj):
27 if isinstance(obj, list):
27 if isinstance(obj, list):
28 return map(roundFloats, obj)
28 return map(roundFloats, obj)
29 elif isinstance(obj, float):
29 elif isinstance(obj, float):
30 return round(obj, 2)
30 return round(obj, 2)
31
31
32 def decimate(z):
32 def decimate(z):
33 # dx = int(len(self.x)/self.__MAXNUMX) + 1
33 # dx = int(len(self.x)/self.__MAXNUMX) + 1
34 dy = int(len(z[0])/MAXNUMY) + 1
34 dy = int(len(z[0])/MAXNUMY) + 1
35 return z[::, ::dy]
35 return z[::, ::dy]
36
36
37 class throttle(object):
37 class throttle(object):
38 """Decorator that prevents a function from being called more than once every
38 """Decorator that prevents a function from being called more than once every
39 time period.
39 time period.
40 To create a function that cannot be called more than once a minute, but
40 To create a function that cannot be called more than once a minute, but
41 will sleep until it can be called:
41 will sleep until it can be called:
42 @throttle(minutes=1)
42 @throttle(minutes=1)
43 def foo():
43 def foo():
44 pass
44 pass
45
45
46 for i in range(10):
46 for i in range(10):
47 foo()
47 foo()
48 print "This function has run %s times." % i
48 print "This function has run %s times." % i
49 """
49 """
50
50
51 def __init__(self, seconds=0, minutes=0, hours=0):
51 def __init__(self, seconds=0, minutes=0, hours=0):
52 self.throttle_period = datetime.timedelta(
52 self.throttle_period = datetime.timedelta(
53 seconds=seconds, minutes=minutes, hours=hours
53 seconds=seconds, minutes=minutes, hours=hours
54 )
54 )
55
55
56 self.time_of_last_call = datetime.datetime.min
56 self.time_of_last_call = datetime.datetime.min
57
57
58 def __call__(self, fn):
58 def __call__(self, fn):
59 @wraps(fn)
59 @wraps(fn)
60 def wrapper(*args, **kwargs):
60 def wrapper(*args, **kwargs):
61 now = datetime.datetime.now()
61 now = datetime.datetime.now()
62 time_since_last_call = now - self.time_of_last_call
62 time_since_last_call = now - self.time_of_last_call
63 time_left = self.throttle_period - time_since_last_call
63 time_left = self.throttle_period - time_since_last_call
64
64
65 if time_left > datetime.timedelta(seconds=0):
65 if time_left > datetime.timedelta(seconds=0):
66 return
66 return
67
67
68 self.time_of_last_call = datetime.datetime.now()
68 self.time_of_last_call = datetime.datetime.now()
69 return fn(*args, **kwargs)
69 return fn(*args, **kwargs)
70
70
71 return wrapper
71 return wrapper
72
72
73
73
74 class PublishData(Operation):
74 class PublishData(Operation):
75 """Clase publish."""
75 """Clase publish."""
76
76
77 def __init__(self, **kwargs):
77 def __init__(self, **kwargs):
78 """Inicio."""
78 """Inicio."""
79 Operation.__init__(self, **kwargs)
79 Operation.__init__(self, **kwargs)
80 self.isConfig = False
80 self.isConfig = False
81 self.client = None
81 self.client = None
82 self.zeromq = None
82 self.zeromq = None
83 self.mqtt = None
83 self.mqtt = None
84
84
85 def on_disconnect(self, client, userdata, rc):
85 def on_disconnect(self, client, userdata, rc):
86 if rc != 0:
86 if rc != 0:
87 print("Unexpected disconnection.")
87 print("Unexpected disconnection.")
88 self.connect()
88 self.connect()
89
89
90 def connect(self):
90 def connect(self):
91 print 'trying to connect'
91 print 'trying to connect'
92 try:
92 try:
93 self.client.connect(
93 self.client.connect(
94 host=self.host,
94 host=self.host,
95 port=self.port,
95 port=self.port,
96 keepalive=60*10,
96 keepalive=60*10,
97 bind_address='')
97 bind_address='')
98 self.client.loop_start()
98 self.client.loop_start()
99 # self.client.publish(
99 # self.client.publish(
100 # self.topic + 'SETUP',
100 # self.topic + 'SETUP',
101 # json.dumps(setup),
101 # json.dumps(setup),
102 # retain=True
102 # retain=True
103 # )
103 # )
104 except:
104 except:
105 print "MQTT Conection error."
105 print "MQTT Conection error."
106 self.client = False
106 self.client = False
107
107
108 def setup(self, port=1883, username=None, password=None, clientId="user", zeromq=1, **kwargs):
108 def setup(self, port=1883, username=None, password=None, clientId="user", zeromq=1, **kwargs):
109 self.counter = 0
109 self.counter = 0
110 self.topic = kwargs.get('topic', 'schain')
110 self.topic = kwargs.get('topic', 'schain')
111 self.delay = kwargs.get('delay', 0)
111 self.delay = kwargs.get('delay', 0)
112 self.plottype = kwargs.get('plottype', 'spectra')
112 self.plottype = kwargs.get('plottype', 'spectra')
113 self.host = kwargs.get('host', "10.10.10.82")
113 self.host = kwargs.get('host', "10.10.10.82")
114 self.port = kwargs.get('port', 3000)
114 self.port = kwargs.get('port', 3000)
115 self.clientId = clientId
115 self.clientId = clientId
116 self.cnt = 0
116 self.cnt = 0
117 self.zeromq = zeromq
117 self.zeromq = zeromq
118 self.mqtt = kwargs.get('plottype', 0)
118 self.mqtt = kwargs.get('plottype', 0)
119 self.client = None
119 self.client = None
120 setup = []
120 setup = []
121 if mqtt is 1:
121 if mqtt is 1:
122 self.client = mqtt.Client(
122 self.client = mqtt.Client(
123 client_id=self.clientId + self.topic + 'SCHAIN',
123 client_id=self.clientId + self.topic + 'SCHAIN',
124 clean_session=True)
124 clean_session=True)
125 self.client.on_disconnect = self.on_disconnect
125 self.client.on_disconnect = self.on_disconnect
126 self.connect()
126 self.connect()
127 for plot in self.plottype:
127 for plot in self.plottype:
128 setup.append({
128 setup.append({
129 'plot': plot,
129 'plot': plot,
130 'topic': self.topic + plot,
130 'topic': self.topic + plot,
131 'title': getattr(self, plot + '_' + 'title', False),
131 'title': getattr(self, plot + '_' + 'title', False),
132 'xlabel': getattr(self, plot + '_' + 'xlabel', False),
132 'xlabel': getattr(self, plot + '_' + 'xlabel', False),
133 'ylabel': getattr(self, plot + '_' + 'ylabel', False),
133 'ylabel': getattr(self, plot + '_' + 'ylabel', False),
134 'xrange': getattr(self, plot + '_' + 'xrange', False),
134 'xrange': getattr(self, plot + '_' + 'xrange', False),
135 'yrange': getattr(self, plot + '_' + 'yrange', False),
135 'yrange': getattr(self, plot + '_' + 'yrange', False),
136 'zrange': getattr(self, plot + '_' + 'zrange', False),
136 'zrange': getattr(self, plot + '_' + 'zrange', False),
137 })
137 })
138 if zeromq is 1:
138 if zeromq is 1:
139 context = zmq.Context()
139 context = zmq.Context()
140 self.zmq_socket = context.socket(zmq.PUSH)
140 self.zmq_socket = context.socket(zmq.PUSH)
141 server = kwargs.get('server', 'zmq.pipe')
141 server = kwargs.get('server', 'zmq.pipe')
142
142
143 if 'tcp://' in server:
143 if 'tcp://' in server:
144 address = server
144 address = server
145 else:
145 else:
146 address = 'ipc:///tmp/%s' % server
146 address = 'ipc:///tmp/%s' % server
147
147
148 self.zmq_socket.connect(address)
148 self.zmq_socket.connect(address)
149 time.sleep(1)
149 time.sleep(1)
150
150
151
151
152
152
153 def publish_data(self):
153 def publish_data(self):
154 self.dataOut.finished = False
154 self.dataOut.finished = False
155 if self.mqtt is 1:
155 if self.mqtt is 1:
156 yData = self.dataOut.heightList[:2].tolist()
156 yData = self.dataOut.heightList[:2].tolist()
157 if self.plottype == 'spectra':
157 if self.plottype == 'spectra':
158 data = getattr(self.dataOut, 'data_spc')
158 data = getattr(self.dataOut, 'data_spc')
159 z = data/self.dataOut.normFactor
159 z = data/self.dataOut.normFactor
160 zdB = 10*numpy.log10(z)
160 zdB = 10*numpy.log10(z)
161 xlen, ylen = zdB[0].shape
161 xlen, ylen = zdB[0].shape
162 dx = int(xlen/MAXNUMX) + 1
162 dx = int(xlen/MAXNUMX) + 1
163 dy = int(ylen/MAXNUMY) + 1
163 dy = int(ylen/MAXNUMY) + 1
164 Z = [0 for i in self.dataOut.channelList]
164 Z = [0 for i in self.dataOut.channelList]
165 for i in self.dataOut.channelList:
165 for i in self.dataOut.channelList:
166 Z[i] = zdB[i][::dx, ::dy].tolist()
166 Z[i] = zdB[i][::dx, ::dy].tolist()
167 payload = {
167 payload = {
168 'timestamp': self.dataOut.utctime,
168 'timestamp': self.dataOut.utctime,
169 'data': roundFloats(Z),
169 'data': roundFloats(Z),
170 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
170 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
171 'interval': self.dataOut.getTimeInterval(),
171 'interval': self.dataOut.getTimeInterval(),
172 'type': self.plottype,
172 'type': self.plottype,
173 'yData': yData
173 'yData': yData
174 }
174 }
175 # print payload
175 # print payload
176
176
177 elif self.plottype in ('rti', 'power'):
177 elif self.plottype in ('rti', 'power'):
178 data = getattr(self.dataOut, 'data_spc')
178 data = getattr(self.dataOut, 'data_spc')
179 z = data/self.dataOut.normFactor
179 z = data/self.dataOut.normFactor
180 avg = numpy.average(z, axis=1)
180 avg = numpy.average(z, axis=1)
181 avgdB = 10*numpy.log10(avg)
181 avgdB = 10*numpy.log10(avg)
182 xlen, ylen = z[0].shape
182 xlen, ylen = z[0].shape
183 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
183 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
184 AVG = [0 for i in self.dataOut.channelList]
184 AVG = [0 for i in self.dataOut.channelList]
185 for i in self.dataOut.channelList:
185 for i in self.dataOut.channelList:
186 AVG[i] = avgdB[i][::dy].tolist()
186 AVG[i] = avgdB[i][::dy].tolist()
187 payload = {
187 payload = {
188 'timestamp': self.dataOut.utctime,
188 'timestamp': self.dataOut.utctime,
189 'data': roundFloats(AVG),
189 'data': roundFloats(AVG),
190 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
190 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
191 'interval': self.dataOut.getTimeInterval(),
191 'interval': self.dataOut.getTimeInterval(),
192 'type': self.plottype,
192 'type': self.plottype,
193 'yData': yData
193 'yData': yData
194 }
194 }
195 elif self.plottype == 'noise':
195 elif self.plottype == 'noise':
196 noise = self.dataOut.getNoise()/self.dataOut.normFactor
196 noise = self.dataOut.getNoise()/self.dataOut.normFactor
197 noisedB = 10*numpy.log10(noise)
197 noisedB = 10*numpy.log10(noise)
198 payload = {
198 payload = {
199 'timestamp': self.dataOut.utctime,
199 'timestamp': self.dataOut.utctime,
200 'data': roundFloats(noisedB.reshape(-1, 1).tolist()),
200 'data': roundFloats(noisedB.reshape(-1, 1).tolist()),
201 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
201 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
202 'interval': self.dataOut.getTimeInterval(),
202 'interval': self.dataOut.getTimeInterval(),
203 'type': self.plottype,
203 'type': self.plottype,
204 'yData': yData
204 'yData': yData
205 }
205 }
206 elif self.plottype == 'snr':
206 elif self.plottype == 'snr':
207 data = getattr(self.dataOut, 'data_SNR')
207 data = getattr(self.dataOut, 'data_SNR')
208 avgdB = 10*numpy.log10(data)
208 avgdB = 10*numpy.log10(data)
209
209
210 ylen = data[0].size
210 ylen = data[0].size
211 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
211 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
212 AVG = [0 for i in self.dataOut.channelList]
212 AVG = [0 for i in self.dataOut.channelList]
213 for i in self.dataOut.channelList:
213 for i in self.dataOut.channelList:
214 AVG[i] = avgdB[i][::dy].tolist()
214 AVG[i] = avgdB[i][::dy].tolist()
215 payload = {
215 payload = {
216 'timestamp': self.dataOut.utctime,
216 'timestamp': self.dataOut.utctime,
217 'data': roundFloats(AVG),
217 'data': roundFloats(AVG),
218 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
218 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
219 'type': self.plottype,
219 'type': self.plottype,
220 'yData': yData
220 'yData': yData
221 }
221 }
222 else:
222 else:
223 print "Tipo de grafico invalido"
223 print "Tipo de grafico invalido"
224 payload = {
224 payload = {
225 'data': 'None',
225 'data': 'None',
226 'timestamp': 'None',
226 'timestamp': 'None',
227 'type': None
227 'type': None
228 }
228 }
229 # print 'Publishing data to {}'.format(self.host)
229 # print 'Publishing data to {}'.format(self.host)
230 self.client.publish(self.topic + self.plottype, json.dumps(payload), qos=0)
230 self.client.publish(self.topic + self.plottype, json.dumps(payload), qos=0)
231
231
232 if self.zeromq is 1:
232 if self.zeromq is 1:
233 print '[Sending] {} - {}'.format(self.dataOut.type, self.dataOut.datatime)
233 print '[Sending] {} - {}'.format(self.dataOut.type, self.dataOut.datatime)
234 self.zmq_socket.send_pyobj(self.dataOut)
234 self.zmq_socket.send_pyobj(self.dataOut)
235
235
236 def run(self, dataOut, **kwargs):
236 def run(self, dataOut, **kwargs):
237 self.dataOut = dataOut
237 self.dataOut = dataOut
238 if not self.isConfig:
238 if not self.isConfig:
239 self.setup(**kwargs)
239 self.setup(**kwargs)
240 self.isConfig = True
240 self.isConfig = True
241
241
242 self.publish_data()
242 self.publish_data()
243 time.sleep(self.delay)
243 time.sleep(self.delay)
244
244
245 def close(self):
245 def close(self):
246 if self.zeromq is 1:
246 if self.zeromq is 1:
247 self.dataOut.finished = True
247 self.dataOut.finished = True
248 self.zmq_socket.send_pyobj(self.dataOut)
248 self.zmq_socket.send_pyobj(self.dataOut)
249
249
250 if self.client:
250 if self.client:
251 self.client.loop_stop()
251 self.client.loop_stop()
252 self.client.disconnect()
252 self.client.disconnect()
253
253
254
254
255 class ReceiverData(ProcessingUnit, Process):
255 class ReceiverData(ProcessingUnit, Process):
256
256
257 throttle_value = 5
257 throttle_value = 5
258
258
259 def __init__(self, **kwargs):
259 def __init__(self, **kwargs):
260
260
261 ProcessingUnit.__init__(self, **kwargs)
261 ProcessingUnit.__init__(self, **kwargs)
262 Process.__init__(self)
262 Process.__init__(self)
263 self.mp = False
263 self.mp = False
264 self.isConfig = False
264 self.isConfig = False
265 self.isWebConfig = False
265 self.isWebConfig = False
266 self.plottypes =[]
266 self.plottypes =[]
267 self.connections = 0
267 self.connections = 0
268 server = kwargs.get('server', 'zmq.pipe')
268 server = kwargs.get('server', 'zmq.pipe')
269 plot_server = kwargs.get('plot_server', 'zmq.web')
269 plot_server = kwargs.get('plot_server', 'zmq.web')
270 if 'tcp://' in server:
270 if 'tcp://' in server:
271 address = server
271 address = server
272 else:
272 else:
273 address = 'ipc:///tmp/%s' % server
273 address = 'ipc:///tmp/%s' % server
274
274
275 if 'tcp://' in plot_server:
275 if 'tcp://' in plot_server:
276 plot_address = plot_server
276 plot_address = plot_server
277 else:
277 else:
278 plot_address = 'ipc:///tmp/%s' % plot_server
278 plot_address = 'ipc:///tmp/%s' % plot_server
279
279
280 self.address = address
280 self.address = address
281 self.plot_address = plot_address
281 self.plot_address = plot_address
282 self.plottypes = [s.strip() for s in kwargs.get('plottypes', 'rti').split(',')]
282 self.plottypes = [s.strip() for s in kwargs.get('plottypes', 'rti').split(',')]
283 self.realtime = kwargs.get('realtime', False)
283 self.realtime = kwargs.get('realtime', False)
284 self.throttle_value = kwargs.get('throttle', 10)
284 self.throttle_value = kwargs.get('throttle', 10)
285 self.sendData = self.initThrottle(self.throttle_value)
285 self.sendData = self.initThrottle(self.throttle_value)
286 self.setup()
286 self.setup()
287
287
288 def setup(self):
288 def setup(self):
289
289
290 self.data = {}
290 self.data = {}
291 self.data['times'] = []
291 self.data['times'] = []
292 for plottype in self.plottypes:
292 for plottype in self.plottypes:
293 self.data[plottype] = {}
293 self.data[plottype] = {}
294 self.data['noise'] = {}
294 self.data['noise'] = {}
295 self.data['throttle'] = self.throttle_value
295 self.data['throttle'] = self.throttle_value
296 self.data['ENDED'] = False
296 self.data['ENDED'] = False
297 self.isConfig = True
297 self.isConfig = True
298 self.data_web = {}
298 self.data_web = {}
299
299
300 def event_monitor(self, monitor):
300 def event_monitor(self, monitor):
301
301
302 events = {}
302 events = {}
303
303
304 for name in dir(zmq):
304 for name in dir(zmq):
305 if name.startswith('EVENT_'):
305 if name.startswith('EVENT_'):
306 value = getattr(zmq, name)
306 value = getattr(zmq, name)
307 events[value] = name
307 events[value] = name
308
308
309 while monitor.poll():
309 while monitor.poll():
310 evt = recv_monitor_message(monitor)
310 evt = recv_monitor_message(monitor)
311 if evt['event'] == 32:
311 if evt['event'] == 32:
312 self.connections += 1
312 self.connections += 1
313 if evt['event'] == 512:
313 if evt['event'] == 512:
314 pass
314 pass
315 if self.connections == 0 and self.started is True:
315 if self.connections == 0 and self.started is True:
316 self.ended = True
316 self.ended = True
317 # send('ENDED')
317 # send('ENDED')
318 evt.update({'description': events[evt['event']]})
318 evt.update({'description': events[evt['event']]})
319
319
320 if evt['event'] == zmq.EVENT_MONITOR_STOPPED:
320 if evt['event'] == zmq.EVENT_MONITOR_STOPPED:
321 break
321 break
322 monitor.close()
322 monitor.close()
323 print("event monitor thread done!")
323 print("event monitor thread done!")
324
324
325 def initThrottle(self, throttle_value):
325 def initThrottle(self, throttle_value):
326
326
327 @throttle(seconds=throttle_value)
327 @throttle(seconds=throttle_value)
328 def sendDataThrottled(fn_sender, data):
328 def sendDataThrottled(fn_sender, data):
329 fn_sender(data)
329 fn_sender(data)
330
330
331 return sendDataThrottled
331 return sendDataThrottled
332
332
333 def send(self, data):
333 def send(self, data):
334 # print '[sending] data=%s size=%s' % (data.keys(), len(data['times']))
334 # print '[sending] data=%s size=%s' % (data.keys(), len(data['times']))
335 self.sender.send_pyobj(data)
335 self.sender.send_pyobj(data)
336
336
337 def update(self):
337 def update(self):
338
339 t = self.dataOut.ltctime
338 t = self.dataOut.ltctime
340 self.data['times'].append(t)
339 self.data['times'].append(t)
341 self.data['dataOut'] = self.dataOut
340 self.data['dataOut'] = self.dataOut
342 for plottype in self.plottypes:
341 for plottype in self.plottypes:
343 if plottype == 'spc':
342 if plottype == 'spc':
344 z = self.dataOut.data_spc/self.dataOut.normFactor
343 z = self.dataOut.data_spc/self.dataOut.normFactor
345 self.data[plottype] = 10*numpy.log10(z)
344 self.data[plottype] = 10*numpy.log10(z)
346 self.data['noise'][t] = 10*numpy.log10(self.dataOut.getNoise()/self.dataOut.normFactor)
345 self.data['noise'][t] = 10*numpy.log10(self.dataOut.getNoise()/self.dataOut.normFactor)
347 if plottype == 'rti':
346 if plottype == 'rti':
348 self.data[plottype][t] = self.dataOut.getPower()
347 self.data[plottype][t] = self.dataOut.getPower()
349 if plottype == 'snr':
348 if plottype == 'snr':
350 self.data[plottype][t] = 10*numpy.log10(self.dataOut.data_SNR)
349 self.data[plottype][t] = 10*numpy.log10(self.dataOut.data_SNR)
351 if plottype == 'dop':
350 if plottype == 'dop':
352 self.data[plottype][t] = 10*numpy.log10(self.dataOut.data_DOP)
351 self.data[plottype][t] = 10*numpy.log10(self.dataOut.data_DOP)
353 if plottype == 'coh':
352 if plottype == 'coh':
354 self.data[plottype][t] = self.dataOut.getCoherence()
353 self.data[plottype][t] = self.dataOut.getCoherence()
355 if plottype == 'phase':
354 if plottype == 'phase':
356 self.data[plottype][t] = self.dataOut.getCoherence(phase=True)
355 self.data[plottype][t] = self.dataOut.getCoherence(phase=True)
357 if self.realtime:
356 if self.realtime:
358 self.data_web[plottype] = roundFloats(decimate(self.data[plottype][t]).tolist())
357 self.data_web[plottype] = roundFloats(decimate(self.data[plottype][t]).tolist())
359 self.data_web['time'] = t
358 self.data_web['timestamp'] = t
360 self.data_web['interval'] = self.dataOut.getTimeInterval()
359 self.data_web['interval'] = self.dataOut.getTimeInterval()
361 self.data_web['type'] = plottype
360 self.data_web['type'] = plottype
362 def run(self):
361 def run(self):
363
362
364 print '[Starting] {} from {}'.format(self.name, self.address)
363 print '[Starting] {} from {}'.format(self.name, self.address)
365
364
366 self.context = zmq.Context()
365 self.context = zmq.Context()
367 self.receiver = self.context.socket(zmq.PULL)
366 self.receiver = self.context.socket(zmq.PULL)
368 self.receiver.bind(self.address)
367 self.receiver.bind(self.address)
369 monitor = self.receiver.get_monitor_socket()
368 monitor = self.receiver.get_monitor_socket()
370 self.sender = self.context.socket(zmq.PUB)
369 self.sender = self.context.socket(zmq.PUB)
371 if self.realtime:
370 if self.realtime:
372 self.sender_web = self.context.socket(zmq.PUB)
371 self.sender_web = self.context.socket(zmq.PUB)
373 self.sender_web.bind(self.plot_address)
372 self.sender_web.bind(self.plot_address)
374 self.sender.bind("ipc:///tmp/zmq.plots")
373 self.sender.bind("ipc:///tmp/zmq.plots")
375
374
376 t = Thread(target=self.event_monitor, args=(monitor,))
375 t = Thread(target=self.event_monitor, args=(monitor,))
377 t.start()
376 t.start()
378
377
379 while True:
378 while True:
380 self.dataOut = self.receiver.recv_pyobj()
379 self.dataOut = self.receiver.recv_pyobj()
381 # print '[Receiving] {} - {}'.format(self.dataOut.type,
380 # print '[Receiving] {} - {}'.format(self.dataOut.type,
382 # self.dataOut.datatime.ctime())
381 # self.dataOut.datatime.ctime())
383
382
384 self.update()
383 self.update()
385
384
386 if self.dataOut.finished is True:
385 if self.dataOut.finished is True:
387 self.send(self.data)
386 self.send(self.data)
388 self.connections -= 1
387 self.connections -= 1
389 if self.connections == 0 and self.started:
388 if self.connections == 0 and self.started:
390 self.ended = True
389 self.ended = True
391 self.data['ENDED'] = True
390 self.data['ENDED'] = True
392 self.send(self.data)
391 self.send(self.data)
393 self.setup()
392 self.setup()
394 else:
393 else:
395 if self.realtime:
394 if self.realtime:
396 self.send(self.data)
395 self.send(self.data)
397 self.sender_web.send_string(json.dumps(self.data_web))
396 self.sender_web.send_string(json.dumps(self.data_web))
398 else:
397 else:
399 self.sendData(self.send, self.data)
398 self.sendData(self.send, self.data)
400 self.started = True
399 self.started = True
401
400
402 return
401 return
403
402
404 def sendToWeb(self):
403 def sendToWeb(self):
405
404
406 if not self.isWebConfig:
405 if not self.isWebConfig:
407 context = zmq.Context()
406 context = zmq.Context()
408 sender_web_config = context.socket(zmq.PUB)
407 sender_web_config = context.socket(zmq.PUB)
409 if 'tcp://' in self.plot_address:
408 if 'tcp://' in self.plot_address:
410 print self.plot_address
409 print self.plot_address
411 dum, address, port = self.plot_address.split(':')
410 dum, address, port = self.plot_address.split(':')
412 conf_address = '{}:{}:{}'.format(dum, address, int(port)+1)
411 conf_address = '{}:{}:{}'.format(dum, address, int(port)+1)
413 else:
412 else:
414 conf_address = self.plot_address + '.config'
413 conf_address = self.plot_address + '.config'
415 sender_web_config.bind(conf_address)
414 sender_web_config.bind(conf_address)
416
415
417 for kwargs in self.operationKwargs.values():
416 for kwargs in self.operationKwargs.values():
418 if 'plot' in kwargs:
417 if 'plot' in kwargs:
419 sender_web_config.send_string(json.dumps(kwargs))
418 sender_web_config.send_string(json.dumps(kwargs))
420 print kwargs
419 print kwargs
421 self.isWebConfig = True
420 self.isWebConfig = True
422
@@ -1,86 +1,87
1 import argparse
1 import argparse
2
2
3 from schainpy.controller import Project, multiSchain
3 from schainpy.controller import Project, multiSchain
4
4
5 desc = "HF_EXAMPLE"
5 desc = "HF_EXAMPLE"
6
6
7 def fiber(cursor, skip, q, dt):
7 def fiber(cursor, skip, q, dt):
8
8
9 controllerObj = Project()
9 controllerObj = Project()
10
10
11 controllerObj.setup(id='191', name='test01', description=desc)
11 controllerObj.setup(id='191', name='test01', description=desc)
12
12
13 readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader',
13 readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader',
14 path='/home/nanosat/data/hysell_data20/pdata',
14 path='/home/nanosat/data/hysell_data20/pdata',
15 startDate=dt,
15 startDate=dt,
16 endDate=dt,
16 endDate=dt,
17 startTime="00:00:00",
17 startTime="00:00:00",
18 endTime="23:59:59",
18 endTime="23:59:59",
19 online=0,
19 online=0,
20 #set=1426485881,
20 #set=1426485881,
21 delay=10,
21 delay=10,
22 walk=1,
22 walk=1,
23 queue=q,
23 queue=q,
24 cursor=cursor,
24 cursor=cursor,
25 skip=skip,
25 skip=skip,
26 #timezone=-5*3600
26 #timezone=-5*3600
27 )
27 )
28
28
29 # #opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
29 # #opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock')
30 #
30 #
31 procUnitConfObj2 = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId())
31 procUnitConfObj2 = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId())
32 # opObj11 = procUnitConfObj2.addParameter(name='pairsList', value='(0,1)', format='pairslist')
32 # opObj11 = procUnitConfObj2.addParameter(name='pairsList', value='(0,1)', format='pairslist')
33 #
33 #
34 # procUnitConfObj3 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=readUnitConfObj.getId())
34 # procUnitConfObj3 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=readUnitConfObj.getId())
35 # opObj11 = procUnitConfObj3.addOperation(name='SpectralMoments', optype='other')
35 # opObj11 = procUnitConfObj3.addOperation(name='SpectralMoments', optype='other')
36
36
37 #
37 #
38 # opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other')
38 # opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other')
39 # opObj11.addParameter(name='id', value='1000', format='int')
39 # opObj11.addParameter(name='id', value='1000', format='int')
40 # opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str')
40 # opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str')
41 # opObj11.addParameter(name='channelList', value='0', format='intlist')
41 # opObj11.addParameter(name='channelList', value='0', format='intlist')
42 # opObj11.addParameter(name='zmin', value='-120', format='float')
42 # opObj11.addParameter(name='zmin', value='-120', format='float')
43 # opObj11.addParameter(name='zmax', value='-70', format='float')
43 # opObj11.addParameter(name='zmax', value='-70', format='float')
44 # opObj11.addParameter(name='save', value='1', format='int')
44 # opObj11.addParameter(name='save', value='1', format='int')
45 # opObj11.addParameter(name='figpath', value=figpath, format='str')
45 # opObj11.addParameter(name='figpath', value=figpath, format='str')
46
46
47 # opObj11 = procUnitConfObj2.addOperation(name='RTIPlot', optype='other')
47 # opObj11 = procUnitConfObj2.addOperation(name='RTIPlot', optype='other')
48 # opObj11.addParameter(name='id', value='2000', format='int')
48 # opObj11.addParameter(name='id', value='2000', format='int')
49 # opObj11.addParameter(name='wintitzmaxle', value='HF_Jicamarca', format='str')
49 # opObj11.addParameter(name='wintitzmaxle', value='HF_Jicamarca', format='str')
50 # opObj11.addParameter(name='showprofile', value='0', format='int')
50 # opObj11.addParameter(name='showprofile', value='0', format='int')
51 # # opObj11.addParameter(name='channelList', value='0', format='intlist')
51 # # opObj11.addParameter(name='channelList', value='0', format='intlist')
52 # # opObj11.addParameter(name='xmin', value='0', format='float')
52 # # opObj11.addParameter(name='xmin', value='0', format='float')
53 # opObj11.addParameter(name='xmin', value='0', format='float')
53 # opObj11.addParameter(name='xmin', value='0', format='float')
54 # opObj11.addParameter(name='xmax', value='24', format='float')
54 # opObj11.addParameter(name='xmax', value='24', format='float')
55
55
56 # opObj11.addParameter(name='zmin', value='-110', format='float')
56 # opObj11.addParameter(name='zmin', value='-110', format='float')
57 # opObj11.addParameter(name='zmax', value='-70', format='float')
57 # opObj11.addParameter(name='zmax', value='-70', format='float')
58 # opObj11.addParameter(name='save', value='0', format='int')
58 # opObj11.addParameter(name='save', value='0', format='int')
59 # # opObj11.addParameter(name='figpath', value='/tmp/', format='str')
59 # # opObj11.addParameter(name='figpath', value='/tmp/', format='str')
60 #
60 #
61 opObj12 = procUnitConfObj2.addOperation(name='PublishData', optype='other')
61 opObj12 = procUnitConfObj2.addOperation(name='PublishData', optype='other')
62 opObj12.addParameter(name='zeromq', value=1, format='int')
62 opObj12.addParameter(name='zeromq', value=1, format='int')
63
63
64
64 # opObj13 = procUnitConfObj3.addOperation(name='PublishData', optype='other')
65 # opObj13 = procUnitConfObj3.addOperation(name='PublishData', optype='other')
65 # opObj13.addParameter(name='zeromq', value=1, format='int')
66 # opObj13.addParameter(name='zeromq', value=1, format='int')
66 # opObj13.addParameter(name='server', value="juanca", format='str')
67 # opObj13.addParameter(name='server', value="juanca", format='str')
67
68
68 opObj12.addParameter(name='delay', value=1, format='int')
69 opObj12.addParameter(name='delay', value=1, format='int')
69
70
70
71
71 # print "Escribiendo el archivo XML"
72 # print "Escribiendo el archivo XML"
72 # controllerObj.writeXml(filename)
73 # controllerObj.writeXml(filename)
73 # print "Leyendo el archivo XML"
74 # print "Leyendo el archivo XML"
74 # controllerObj.readXml(filename)
75 # controllerObj.readXml(filename)
75
76
76
77
77 # timeit.timeit('controllerObj.run()', number=2)
78 # timeit.timeit('controllerObj.run()', number=2)
78
79
79 controllerObj.start()
80 controllerObj.start()
80
81
81
82
82 if __name__ == '__main__':
83 if __name__ == '__main__':
83 parser = argparse.ArgumentParser(description='Set number of parallel processes')
84 parser = argparse.ArgumentParser(description='Set number of parallel processes')
84 parser.add_argument('--nProcess', default=1, type=int)
85 parser.add_argument('--nProcess', default=1, type=int)
85 args = parser.parse_args()
86 args = parser.parse_args()
86 multiSchain(fiber, nProcess=args.nProcess, startDate='2015/09/26', endDate='2015/09/26')
87 multiSchain(fiber, nProcess=args.nProcess, startDate='2015/09/26', endDate='2015/09/26')
General Comments 0
You need to be logged in to leave comments. Login now