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