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