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