##// END OF EJS Templates
merge from graphics branch
Juan C. Valdez -
r863:2444bfa6a546
parent child
Show More
@@ -1,152 +1,182
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 from pymongo import MongoClient
9
10
10 from schainpy.model.proc.jroproc_base import Operation
11 from schainpy.model.proc.jroproc_base import Operation
11
12
12 class PrettyFloat(float):
13 class PrettyFloat(float):
13 def __repr__(self):
14 def __repr__(self):
14 return '%.2f' % self
15 return '%.2f' % self
15
16
17 def roundFloats(obj):
18 if isinstance(obj, list):
19 return map(roundFloats, obj)
20 elif isinstance(obj, float):
21 return round(obj, 2)
16
22
17 def pretty_floats(obj):
23 def pretty_floats(obj):
18 if isinstance(obj, float):
24 if isinstance(obj, float):
19 return PrettyFloat(obj)
25 return PrettyFloat(obj)
20 elif isinstance(obj, dict):
26 elif isinstance(obj, dict):
21 return dict((k, pretty_floats(v)) for k, v in obj.items())
27 return dict((k, pretty_floats(v)) for k, v in obj.items())
22 elif isinstance(obj, (list, tuple)):
28 elif isinstance(obj, (list, tuple)):
23 return map(pretty_floats, obj)
29 return map(pretty_floats, obj)
24 return obj
30 return obj
25
31
26
32
27 class PublishData(Operation):
33 class PublishData(Operation):
28 """Clase publish."""
34 """Clase publish."""
29
35
30 __MAXNUMX = 80
36 __MAXNUMX = 80
31 __MAXNUMY = 80
37 __MAXNUMY = 80
32
38
33 def __init__(self):
39 def __init__(self):
34 """Inicio."""
40 """Inicio."""
35 Operation.__init__(self)
41 Operation.__init__(self)
36 self.isConfig = False
42 self.isConfig = False
37 self.client = None
43 self.client = None
38
44
39 def on_disconnect(self, client, userdata, rc):
45 def on_disconnect(self, client, userdata, rc):
40 if rc != 0:
46 if rc != 0:
41 print("Unexpected disconnection.")
47 print("Unexpected disconnection.")
42 self.connect()
48 self.connect()
43
49
44 def connect(self):
50 def connect(self):
45 print 'trying to connect'
51 print 'trying to connect'
46 try:
52 try:
47 self.client.connect(
53 self.client.connect(
48 host=self.host,
54 host=self.host,
49 port=self.port,
55 port=self.port,
50 keepalive=60*10,
56 keepalive=60*10,
51 bind_address='')
57 bind_address='')
52 print "connected"
58 print "connected"
53 self.client.loop_start()
59 self.client.loop_start()
54 # self.client.publish(
60 # self.client.publish(
55 # self.topic + 'SETUP',
61 # self.topic + 'SETUP',
56 # json.dumps(setup),
62 # json.dumps(setup),
57 # retain=True
63 # retain=True
58 # )
64 # )
59 except:
65 except:
60 print "MQTT Conection error."
66 print "MQTT Conection error."
61 self.client = False
67 self.client = False
62
68
63 def setup(self, host, port=1883, username=None, password=None, **kwargs):
69 def setup(self, host, port=1883, username=None, password=None, mongo=0, clientId="user", **kwargs):
64
70
71 self.mongo = mongo
65 self.topic = kwargs.get('topic', 'schain')
72 self.topic = kwargs.get('topic', 'schain')
66 self.delay = kwargs.get('delay', 0)
73 self.delay = kwargs.get('delay', 0)
67 self.plottype = kwargs.get('plottype', 'spectra')
74 self.plottype = kwargs.get('plottype', 'spectra')
68 self.host = host
75 self.host = host
69 self.port = port
76 self.port = port
77 self.clientId = clientId
70 self.cnt = 0
78 self.cnt = 0
71 setup = []
79 setup = []
80 if (self.mongo):
81 self.MongoClient = MongoClient("mongodb://127.0.0.1:3003")
82 self.MongoDB = self.MongoClient['meteor']
72 for plot in self.plottype:
83 for plot in self.plottype:
73 setup.append({
84 setup.append({
74 'plot': plot,
85 'plot': plot,
75 'topic': self.topic + plot,
86 'topic': self.topic + plot,
76 'title': getattr(self, plot + '_' + 'title', False),
87 'title': getattr(self, plot + '_' + 'title', False),
77 'xlabel': getattr(self, plot + '_' + 'xlabel', False),
88 'xlabel': getattr(self, plot + '_' + 'xlabel', False),
78 'ylabel': getattr(self, plot + '_' + 'ylabel', False),
89 'ylabel': getattr(self, plot + '_' + 'ylabel', False),
79 'xrange': getattr(self, plot + '_' + 'xrange', False),
90 'xrange': getattr(self, plot + '_' + 'xrange', False),
80 'yrange': getattr(self, plot + '_' + 'yrange', False),
91 'yrange': getattr(self, plot + '_' + 'yrange', False),
81 'zrange': getattr(self, plot + '_' + 'zrange', False),
92 'zrange': getattr(self, plot + '_' + 'zrange', False),
82 })
93 })
83 self.client = mqtt.Client(
94 self.client = mqtt.Client(
84 client_id='jc'+self.topic + 'SCHAIN',
95 client_id=self.clientId + self.topic + 'SCHAIN',
85 clean_session=True)
96 clean_session=True)
86 self.client.on_disconnect = self.on_disconnect
97 self.client.on_disconnect = self.on_disconnect
87 self.connect()
98 self.connect()
88
99
89 def publish_data(self, plottype):
100 def publish_data(self, plottype):
90 data = getattr(self.dataOut, 'data_spc')
101 data = getattr(self.dataOut, 'data_spc')
102 yData = self.dataOut.heightList[:2].tolist()
91 if plottype == 'spectra':
103 if plottype == 'spectra':
92 z = data/self.dataOut.normFactor
104 z = data/self.dataOut.normFactor
93 zdB = 10*numpy.log10(z)
105 zdB = 10*numpy.log10(z)
94 xlen, ylen = zdB[0].shape
106 xlen, ylen = zdB[0].shape
95 dx = numpy.floor(xlen/self.__MAXNUMX) + 1
107 dx = numpy.floor(xlen/self.__MAXNUMX) + 1
96 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
108 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
97 Z = [0 for i in self.dataOut.channelList]
109 Z = [0 for i in self.dataOut.channelList]
98 for i in self.dataOut.channelList:
110 for i in self.dataOut.channelList:
99 Z[i] = zdB[i][::dx, ::dy].tolist()
111 Z[i] = zdB[i][::dx, ::dy].tolist()
100 payload = {
112 payload = {
101 'timestamp': self.dataOut.utctime,
113 'timestamp': self.dataOut.utctime,
102 'data': pretty_floats(Z),
114 'data': roundFloats(Z),
103 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
115 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
104 'interval': self.dataOut.getTimeInterval(),
116 'interval': self.dataOut.getTimeInterval(),
105 'xRange': [0, 80]
117 'xRange': [0, 80],
118 'type': plottype,
119 'yData': yData
106 }
120 }
121 # print payload
107
122
108 elif plottype in ('rti', 'power'):
123 elif plottype in ('rti', 'power'):
109 z = data/self.dataOut.normFactor
124 z = data/self.dataOut.normFactor
110 avg = numpy.average(z, axis=1)
125 avg = numpy.average(z, axis=1)
111 avgdB = 10*numpy.log10(avg)
126 avgdB = 10*numpy.log10(avg)
112 xlen, ylen = z[0].shape
127 xlen, ylen = z[0].shape
113 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
128 dy = numpy.floor(ylen/self.__MAXNUMY) + 1
114 AVG = [0 for i in self.dataOut.channelList]
129 AVG = [0 for i in self.dataOut.channelList]
115 for i in self.dataOut.channelList:
130 for i in self.dataOut.channelList:
116 AVG[i] = avgdB[i][::dy].tolist()
131 AVG[i] = avgdB[i][::dy].tolist()
117 payload = {
132 payload = {
118 'timestamp': self.dataOut.utctime,
133 'timestamp': self.dataOut.utctime,
119 'data': pretty_floats(AVG),
134 'data': roundFloats(AVG),
120 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
135 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
121 'interval': self.dataOut.getTimeInterval(),
136 'interval': self.dataOut.getTimeInterval(),
122 'xRange': [0, 80]
137 'xRange': [0, 80],
138 'type': plottype,
139 'yData': yData
123 }
140 }
124 elif plottype == 'noise':
141 elif plottype == 'noise':
125 noise = self.dataOut.getNoise()/self.dataOut.normFactor
142 noise = self.dataOut.getNoise()/self.dataOut.normFactor
126 noisedB = 10*numpy.log10(noise)
143 noisedB = 10*numpy.log10(noise)
127 payload = {
144 payload = {
128 'timestamp': self.dataOut.utctime,
145 'timestamp': self.dataOut.utctime,
129 'data': pretty_floats(noisedB.reshape(-1, 1).tolist()),
146 'data': roundFloats(noisedB.reshape(-1, 1).tolist()),
130 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
147 'channels': ['Ch %s' % ch for ch in self.dataOut.channelList],
131 'interval': self.dataOut.getTimeInterval(),
148 'interval': self.dataOut.getTimeInterval(),
132 'xRange': [0, 80]
149 'xRange': [0, 80],
150 'type': plottype,
151 'yData': yData
152 }
153 else:
154 print "Tipo de grafico invalido"
155 payload = {
156 'data': 'None',
157 'timestamp': 'None',
158 'type': None
133 }
159 }
134
135 print 'Publishing data to {}'.format(self.host)
160 print 'Publishing data to {}'.format(self.host)
136 print '*************************'
161 print '*************************'
162 print self.client
137 self.client.publish(self.topic + plottype, json.dumps(payload), qos=0)
163 self.client.publish(self.topic + plottype, json.dumps(payload), qos=0)
164 if (self.mongo):
165 print 'Publishing data to Mongo'
166 result = self.MongoDB.realtime.insert_one(payload)
167 print result.inserted_id
138
168
139
169
140 def run(self, dataOut, host, **kwargs):
170 def run(self, dataOut, host, **kwargs):
141 self.dataOut = dataOut
171 self.dataOut = dataOut
142 if not self.isConfig:
172 if not self.isConfig:
143 self.setup(host, **kwargs)
173 self.setup(host, **kwargs)
144 self.isConfig = True
174 self.isConfig = True
145
175
146 map(self.publish_data, self.plottype)
176 map(self.publish_data, self.plottype)
147 time.sleep(self.delay)
177 time.sleep(self.delay)
148
178
149 def close(self):
179 def close(self):
150 if self.client:
180 if self.client:
151 self.client.loop_stop()
181 self.client.loop_stop()
152 self.client.disconnect()
182 self.client.disconnect()
General Comments 0
You need to be logged in to leave comments. Login now