##// END OF EJS Templates
Task #714: Modulo Web ABS...
Fiorella Quino -
r182:7e17a44bea6b
parent child
Show More
@@ -1,56 +1,56
1 from django import forms
1 from django import forms
2 from .models import ABSConfiguration, ABSBeam
2 from .models import ABSConfiguration, ABSBeam
3 from .widgets import UpDataWidget, DownDataWidget, EditUpDataWidget, EditDownDataWidget
3 from .widgets import UpDataWidget, DownDataWidget, EditUpDataWidget, EditDownDataWidget
4 from apps.main.models import Configuration
4 from apps.main.models import Configuration
5
5
6 class ABSConfigurationForm(forms.ModelForm):
6 class ABSConfigurationForm(forms.ModelForm):
7 def __init__(self, *args, **kwargs):
7 def __init__(self, *args, **kwargs):
8 super(ABSConfigurationForm, self).__init__(*args, **kwargs)
8 super(ABSConfigurationForm, self).__init__(*args, **kwargs)
9 #instance = getattr(self, 'instance', None)
9 #instance = getattr(self, 'instance', None)
10
10
11 #if instance and instance.pk:
11 #if instance and instance.pk:
12 # devices = Device.objects.filter(device_type__name='abs')
12 # devices = Device.objects.filter(device_type__name='abs')
13
13
14 #if instance.experiment:
14 #if instance.experiment:
15 # experiments = Experiment.objects.filter(pk=instance.experiment.id)
15 # experiments = Experiment.objects.filter(pk=instance.experiment.id)
16 # self.fields['experiment'].widget.choices = [(experiment.id, experiment) for experiment in experiments]
16 # self.fields['experiment'].widget.choices = [(experiment.id, experiment) for experiment in experiments]
17
17
18 class Meta:
18 class Meta:
19 model = ABSConfiguration
19 model = ABSConfiguration
20 exclude = ('type', 'status', 'parameters', 'beams', 'module_status')
20 exclude = ('type', 'status', 'parameters', 'active_beam', 'module_status')
21
21
22 class ABSBeamAddForm(forms.Form):
22 class ABSBeamAddForm(forms.Form):
23
23
24 #abs_conf = forms.CharField(widget=forms.HiddenInput)
24 #abs_conf = forms.CharField(widget=forms.HiddenInput)
25 #name = forms.CharField(max_length=60)
25 #name = forms.CharField(max_length=60)
26 up_data = forms.CharField(widget=UpDataWidget, label='')
26 up_data = forms.CharField(widget=UpDataWidget, label='')
27 down_data = forms.CharField(widget=DownDataWidget, label='')
27 down_data = forms.CharField(widget=DownDataWidget, label='')
28
28
29 def __init__(self, *args, **kwargs):
29 def __init__(self, *args, **kwargs):
30 super(ABSBeamAddForm, self).__init__(*args, **kwargs)
30 super(ABSBeamAddForm, self).__init__(*args, **kwargs)
31 #if 'abs_conf' in self.initial:
31 #if 'abs_conf' in self.initial:
32 # self.fields['abs_conf'].initial = self.initial['abs_conf']
32 # self.fields['abs_conf'].initial = self.initial['abs_conf']
33 #self.fields['name'].initial = 'Beam'
33 #self.fields['name'].initial = 'Beam'
34 # self.fields['up_data'].initial = self.initial['abs_conf']
34 # self.fields['up_data'].initial = self.initial['abs_conf']
35 # self.fields['down_data'].initial = self.initial['abs_conf']
35 # self.fields['down_data'].initial = self.initial['abs_conf']
36 #self.fields['abs_conf'].initial = self.initial['abs_conf']
36 #self.fields['abs_conf'].initial = self.initial['abs_conf']
37 #self.fields['name'].initial = 'Beam'
37 #self.fields['name'].initial = 'Beam'
38 #self.fields['up_data'].initial = self.initial['abs_conf']
38 #self.fields['up_data'].initial = self.initial['abs_conf']
39 #self.fields['down_data'].initial = self.initial['abs_conf']
39 #self.fields['down_data'].initial = self.initial['abs_conf']
40
40
41
41
42
42
43 class ABSBeamEditForm(forms.Form):
43 class ABSBeamEditForm(forms.Form):
44
44
45 #abs_conf = forms.CharField(widget=forms.HiddenInput)
45 #abs_conf = forms.CharField(widget=forms.HiddenInput)
46 up_data = forms.CharField(widget=EditUpDataWidget, label='')
46 up_data = forms.CharField(widget=EditUpDataWidget, label='')
47 down_data = forms.CharField(widget=EditDownDataWidget, label='')
47 down_data = forms.CharField(widget=EditDownDataWidget, label='')
48
48
49 def __init__(self, *args, **kwargs):
49 def __init__(self, *args, **kwargs):
50 super(ABSBeamEditForm, self).__init__(*args, **kwargs)
50 super(ABSBeamEditForm, self).__init__(*args, **kwargs)
51
51
52 if 'initial' in kwargs:
52 if 'initial' in kwargs:
53 if 'beam' in self.initial:
53 if 'beam' in self.initial:
54 #self.fields['abs_conf'].initial = self.initial['beam'].abs_conf
54 #self.fields['abs_conf'].initial = self.initial['beam'].abs_conf
55 self.fields['up_data'].initial = self.initial['beam']
55 self.fields['up_data'].initial = self.initial['beam']
56 self.fields['down_data'].initial = self.initial['beam']
56 self.fields['down_data'].initial = self.initial['beam']
@@ -1,1077 +1,967
1 from django.db import models
1 from django.db import models
2 from apps.main.models import Configuration
2 from apps.main.models import Configuration
3 from django.core.urlresolvers import reverse
3 from django.core.urlresolvers import reverse
4 # Create your models here.
4 # Create your models here.
5
5
6 import ast
6 import ast
7 import socket
7 import socket
8 import json
8 import json
9 import requests
9 import requests
10 import struct
10 import struct
11 import sys, time
11 import sys, time
12
12
13 import multiprocessing
13 import multiprocessing
14
14
15
15
16 antenna_default = json.dumps({
16 antenna_default = json.dumps({
17 "antenna_up": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
17 "antenna_up": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
18 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
18 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
19 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
19 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
20 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
20 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
21 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
21 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
22 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
22 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
23 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
23 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
24 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0]
24 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0]
25 ]
25 ]
26 ,
26 ,
27 "antenna_down": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
27 "antenna_down": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
28 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
28 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
29 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
29 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
30 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
30 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
31 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
31 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
32 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
32 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
33 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
33 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
34 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0]],
34 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0]],
35 })
35 })
36
36
37
37
38 tx_default = json.dumps({
38 tx_default = json.dumps({
39 "up": [[1,1,1,1,0,0,0,0],
39 "up": [[1,1,1,1,0,0,0,0],
40 [1,1,1,1,0,0,0,0],
40 [1,1,1,1,0,0,0,0],
41 [1,1,1,1,0,0,0,0],
41 [1,1,1,1,0,0,0,0],
42 [1,1,1,1,0,0,0,0],
42 [1,1,1,1,0,0,0,0],
43 [0,0,0,0,1,1,1,1],
43 [0,0,0,0,1,1,1,1],
44 [0,0,0,0,1,1,1,1],
44 [0,0,0,0,1,1,1,1],
45 [0,0,0,0,1,1,1,1],
45 [0,0,0,0,1,1,1,1],
46 [0,0,0,0,1,1,1,1]],
46 [0,0,0,0,1,1,1,1]],
47
47
48 "down": [[1,1,1,1,0,0,0,0],
48 "down": [[1,1,1,1,0,0,0,0],
49 [1,1,1,1,0,0,0,0],
49 [1,1,1,1,0,0,0,0],
50 [1,1,1,1,0,0,0,0],
50 [1,1,1,1,0,0,0,0],
51 [1,1,1,1,0,0,0,0],
51 [1,1,1,1,0,0,0,0],
52 [0,0,0,0,1,1,1,1],
52 [0,0,0,0,1,1,1,1],
53 [0,0,0,0,1,1,1,1],
53 [0,0,0,0,1,1,1,1],
54 [0,0,0,0,1,1,1,1],
54 [0,0,0,0,1,1,1,1],
55 [0,0,0,0,1,1,1,1]],
55 [0,0,0,0,1,1,1,1]],
56 })
56 })
57
57
58 rx_default = json.dumps({
58 rx_default = json.dumps({
59 "up": [[1,1,1,1,0,0,0,0],
59 "up": [[1,1,1,1,0,0,0,0],
60 [1,1,1,1,0,0,0,0],
60 [1,1,1,1,0,0,0,0],
61 [1,1,1,1,0,0,0,0],
61 [1,1,1,1,0,0,0,0],
62 [1,1,1,1,0,0,0,0],
62 [1,1,1,1,0,0,0,0],
63 [0,0,0,0,1,1,1,1],
63 [0,0,0,0,1,1,1,1],
64 [0,0,0,0,1,1,1,1],
64 [0,0,0,0,1,1,1,1],
65 [0,0,0,0,1,1,1,1],
65 [0,0,0,0,1,1,1,1],
66 [0,0,0,0,1,1,1,1]],
66 [0,0,0,0,1,1,1,1]],
67
67
68 "down": [[1,1,1,1,0,0,0,0],
68 "down": [[1,1,1,1,0,0,0,0],
69 [1,1,1,1,0,0,0,0],
69 [1,1,1,1,0,0,0,0],
70 [1,1,1,1,0,0,0,0],
70 [1,1,1,1,0,0,0,0],
71 [1,1,1,1,0,0,0,0],
71 [1,1,1,1,0,0,0,0],
72 [0,0,0,0,1,1,1,1],
72 [0,0,0,0,1,1,1,1],
73 [0,0,0,0,1,1,1,1],
73 [0,0,0,0,1,1,1,1],
74 [0,0,0,0,1,1,1,1],
74 [0,0,0,0,1,1,1,1],
75 [0,0,0,0,1,1,1,1]],
75 [0,0,0,0,1,1,1,1]],
76 })
76 })
77
77
78 conf_default = {}
78 conf_default = {}
79 status_default = {}
79 status_default = {}
80 for i in range(1,65):
80 for i in range(1,65):
81 conf_default[str(i)] = ""
81 conf_default[str(i)] = ""
82 status_default[str(i)] = 0
82 status_default[str(i)] = 0
83
83
84 ues_default = json.dumps({
84 ues_default = json.dumps({
85 "up": [0.533333,0.00000,1.06667,0.00000],
85 "up": [0.533333,0.00000,1.06667,0.00000],
86 "down": [0.533333,0.00000,1.06667,0.00000]
86 "down": [0.533333,0.00000,1.06667,0.00000]
87 })
87 })
88
88
89 onlyrx_default = json.dumps({
89 onlyrx_default = json.dumps({
90 "up": False,
90 "up": False,
91 "down": False
91 "down": False
92 })
92 })
93
93
94 def up_convertion(cadena):
94 def up_convertion(cadena):
95 valores = []
95 valores = []
96 for c in cadena:
96 for c in cadena:
97 if c == 1.0: valores=valores+['000']
97 if c == 1.0: valores=valores+['000']
98 if c == 2.0: valores=valores+['001']
98 if c == 2.0: valores=valores+['001']
99 if c == 3.0: valores=valores+['010']
99 if c == 3.0: valores=valores+['010']
100 if c == 0.0: valores=valores+['011']
100 if c == 0.0: valores=valores+['011']
101 if c == 0.5: valores=valores+['100']
101 if c == 0.5: valores=valores+['100']
102 if c == 1.5: valores=valores+['101']
102 if c == 1.5: valores=valores+['101']
103 if c == 2.5: valores=valores+['110']
103 if c == 2.5: valores=valores+['110']
104 if c == 3.5: valores=valores+['111']
104 if c == 3.5: valores=valores+['111']
105
105
106 return valores
106 return valores
107
107
108 def up_conv_bits(value):
108 def up_conv_bits(value):
109
109
110 if value == 1.0: bits="000"
110 if value == 1.0: bits="000"
111 if value == 2.0: bits="001"
111 if value == 2.0: bits="001"
112 if value == 3.0: bits="010"
112 if value == 3.0: bits="010"
113 if value == 0.0: bits="011"
113 if value == 0.0: bits="011"
114 if value == 0.5: bits="100"
114 if value == 0.5: bits="100"
115 if value == 1.5: bits="101"
115 if value == 1.5: bits="101"
116 if value == 2.5: bits="110"
116 if value == 2.5: bits="110"
117 if value == 3.5: bits="111"
117 if value == 3.5: bits="111"
118
118
119 return bits
119 return bits
120
120
121 def down_convertion(cadena):
121 def down_convertion(cadena):
122 valores = []
122 valores = []
123 for c in cadena:
123 for c in cadena:
124 if c == 1.0: valores=valores+['000']
124 if c == 1.0: valores=valores+['000']
125 if c == 2.0: valores=valores+['001']
125 if c == 2.0: valores=valores+['001']
126 if c == 3.0: valores=valores+['010']
126 if c == 3.0: valores=valores+['010']
127 if c == 0.0: valores=valores+['011']
127 if c == 0.0: valores=valores+['011']
128 if c == 0.5: valores=valores+['100']
128 if c == 0.5: valores=valores+['100']
129 if c == 1.5: valores=valores+['101']
129 if c == 1.5: valores=valores+['101']
130 if c == 2.5: valores=valores+['110']
130 if c == 2.5: valores=valores+['110']
131 if c == 3.5: valores=valores+['111']
131 if c == 3.5: valores=valores+['111']
132
132
133 return valores
133 return valores
134
134
135 def down_conv_bits(value):
135 def down_conv_bits(value):
136
136
137 if value == 1.0: bits="000"
137 if value == 1.0: bits="000"
138 if value == 2.0: bits="001"
138 if value == 2.0: bits="001"
139 if value == 3.0: bits="010"
139 if value == 3.0: bits="010"
140 if value == 0.0: bits="011"
140 if value == 0.0: bits="011"
141 if value == 0.5: bits="100"
141 if value == 0.5: bits="100"
142 if value == 1.5: bits="101"
142 if value == 1.5: bits="101"
143 if value == 2.5: bits="110"
143 if value == 2.5: bits="110"
144 if value == 3.5: bits="111"
144 if value == 3.5: bits="111"
145
145
146 return bits
146 return bits
147
147
148 def ip2position(module_number):
148 def ip2position(module_number):
149 j=0
149 j=0
150 i=0
150 i=0
151 for x in range(0,module_number-1):
151 for x in range(0,module_number-1):
152 j=j+1
152 j=j+1
153 if j==8:
153 if j==8:
154 i=i+1
154 i=i+1
155 j=0
155 j=0
156
156
157 pos = [i,j]
157 pos = [i,j]
158 return pos
158 return pos
159
159
160
160
161 def fromBinary2Char(binary_string):
161 def fromBinary2Char(binary_string):
162 number = int(binary_string, 2)
162 number = int(binary_string, 2)
163 #Plus 33 to avoid more than 1 characters values such as: '\x01'-'\x1f'
163 #Plus 33 to avoid more than 1 characters values such as: '\x01'-'\x1f'
164 number = number + 33
164 number = number + 33
165 char = chr(number)
165 char = chr(number)
166 return char
166 return char
167
167
168 def fromChar2Binary(char):
168 def fromChar2Binary(char):
169 number = ord(char) - 33
169 number = ord(char) - 33
170 #Minus 33 to get the real value
170 #Minus 33 to get the real value
171 bits = bin(number)[2:]
171 bits = bin(number)[2:]
172 #To ensure we have a string with 6bits
172 #To ensure we have a string with 6bits
173 if len(bits) < 6:
173 if len(bits) < 6:
174 bits = bits.zfill(6)
174 bits = bits.zfill(6)
175 return bits
175 return bits
176
176
177
177
178 def change_beam_for_multiprocessing(module):
179
180 for i in range (1,50):
181 beam_pos = 0
182 module_address = ('192.168.1.'+str(module), 5500)
183 header = 'JROABSCeCnModCnMod0100000'
184 numbers = len(str(beam_pos))
185 function = 'CHGB'
186
187 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
188
189 # Create the datagram socket
190 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
191 sock.connect(module_address)
192
193 sock.send(message_tx)
194 #t = sock.recv(1024)
195 sock.close()
196 sock = None
197
198
199 time.sleep(0.2)
200
201
202 beam_pos = 1
203 numbers = len(str(beam_pos))
204
205 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
206
207 # Create the datagram socket
208 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
209 sock.connect(module_address)
210 sock.send(message_tx)
211 sock.close()
212 sock = None
213
214 time.sleep(0.2)
215
216
217
218 class ABSConfiguration(Configuration):
178 class ABSConfiguration(Configuration):
219 beams = models.CharField(verbose_name='Beams', max_length=20000, default="{}")
179 active_beam = models.CharField(verbose_name='Active Beam', max_length=20000, default="{}")
220 module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=json.dumps(status_default))
180 module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=json.dumps(status_default))
221
181
222 class Meta:
182 class Meta:
223 db_table = 'abs_configurations'
183 db_table = 'abs_configurations'
224
184
225 def get_absolute_url_plot(self):
185 def get_absolute_url_plot(self):
226 return reverse('url_plot_abs_patterns', args=[str(self.id)])
186 return reverse('url_plot_abs_patterns', args=[str(self.id)])
227
187
228
188
229 def parms_to_dict(self):
189 def parms_to_dict(self):
230
190
231 parameters = {}
191 parameters = {}
232
192
233 parameters['device_id'] = self.device.id
193 parameters['device_id'] = self.device.id
234 parameters['name'] = self.name
194 parameters['name'] = self.name
235 parameters['beams'] = {}
195 parameters['beams'] = {}
236
196
237 beams = ast.literal_eval(self.beams)
197 beams = ABSBeam.objects.get(pk=self.id)
238 b=1
198 b=1
239 for beam in beams:
199 for beam in beams:
240 absbeam = ABSBeam.objects.get(pk=beams[beam])
200 #absbeam = ABSBeam.objects.get(pk=beams[beam])
241 parameters['beams']['beam'+str(b)] = absbeam.parms_to_dict()
201 parameters['beams']['beam'+str(b)] = beam.parms_to_dict()#absbeam.parms_to_dict()
242 b+=1
202 b+=1
243
203
244 return parameters
204 return parameters
245
205
246 def get_beams(self, **kwargs):
206 def get_beams(self, **kwargs):
247 '''
207 '''
248 This function returns ABS Configuration beams
208 This function returns ABS Configuration beams
249 '''
209 '''
250 return ABSBeam.objects.filter(abs_conf=self.pk, **kwargs)
210 return ABSBeam.objects.filter(abs_conf=self.pk, **kwargs)
251
211
252 def clone(self, **kwargs):
212 def clone(self, **kwargs):
253
213
254 beams = self.get_beams()
214 beams = self.get_beams()
255 self.pk = None
215 self.pk = None
256 self.id = None
216 self.id = None
257 for attr, value in kwargs.items():
217 for attr, value in kwargs.items():
258 setattr(self, attr, value)
218 setattr(self, attr, value)
259 self.save()
219 self.save()
260
220
261 for beam in beams:
221 for beam in beams:
262 beam.clone(abs_conf=self)
222 beam.clone(abs_conf=self)
263
223
264 return self
224 return self
265
225
266
226
267 def module_conf(self, module_num, beams):
227 def module_conf(self, module_num, beams):
268 """
228 """
269 This function creates beam configurations for one abs module.
229 This function creates beam configurations for one abs module.
270 """
230 """
271 ip_address = self.device.ip_address
231 ip_address = self.device.ip_address
272 ip_address = ip_address.split('.')
232 ip_address = ip_address.split('.')
273 module_seq = (ip_address[0],ip_address[1],ip_address[2])
233 module_seq = (ip_address[0],ip_address[1],ip_address[2])
274 dot = '.'
234 dot = '.'
275 module_ip = dot.join(module_seq)+'.'+str(module_num)
235 module_ip = dot.join(module_seq)+'.'+str(module_num)
276 module_port = self.device.port_address
236 module_port = self.device.port_address
277 write_route = 'http://'+module_ip+':'+str(module_port)+'/configure'
237 write_route = 'http://'+module_ip+':'+str(module_port)+'/configure'
278
238
279 header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1'
239 header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1'
280 module = 'ABS_'+str(module_num)
240 module = 'ABS_'+str(module_num)
281 bs = '' #{}
241 bs = '' #{}
282 i=1
242 i=1
283 #beams = {1: '001000', 2: '010001', 3: '010010', 4: '000011', 5: '101100', 6: '101101',
243 #beams = {1: '001000', 2: '010001', 3: '010010', 4: '000011', 5: '101100', 6: '101101',
284 # 7: '110110', 8: '111111', 9: '000000', 10: '001001', 11: '010010', 12: '011011'}
244 # 7: '110110', 8: '111111', 9: '000000', 10: '001001', 11: '010010', 12: '011011'}
285 for beam in beams:
245 for beam in beams:
286 #bs[i] = fromBinary2Char(beam.module_6bits(module_num))
246 #bs[i] = fromBinary2Char(beam.module_6bits(module_num))
287 bs = bs + fromBinary2Char(beam.module_6bits(module_num))
247 bs = bs + fromBinary2Char(beam.module_6bits(module_num))
288 i=i+1
248 i=i+1
289
249
290 beams = bs
250 beams = bs
291
251
292 parameters = {}
252 parameters = {}
293 parameters['header'] = header
253 parameters['header'] = header
294 parameters['module'] = module
254 parameters['module'] = module
295 parameters['beams'] = beams #json.dumps(beams)
255 parameters['beams'] = beams #json.dumps(beams)
296 print parameters['beams']
256 print parameters['beams']
297 answer = ''
257 answer = ''
298
258
299 try:
259 try:
300 r_write = requests.post(write_route, parameters, timeout=0.5)
260 r_write = requests.post(write_route, parameters, timeout=0.5)
301 answer = r_write.json()
261 answer = r_write.json()
302 self.message = answer['message']
262 self.message = answer['message']
303 except:
263 except:
304 self.message = "Could not write ABS parameters"
264 self.message = "Could not write ABS parameters"
305 return 0
265 return 0
306 return 1
266 return 1
307
267
308 def read_module(self, module):
268 def read_module(self, module):
309
269
310 """
270 """
311 Read out-bits (up-down) of 1 abs module NOT for Configuration
271 Read out-bits (up-down) of 1 abs module NOT for Configuration
312 """
272 """
313
273
314 parameters = {}
274 parameters = {}
315 ip_address = self.device.ip_address
275 ip_address = self.device.ip_address
316 ip_address = ip_address.split('.')
276 ip_address = ip_address.split('.')
317 module_seq = (ip_address[0],ip_address[1],ip_address[2])
277 module_seq = (ip_address[0],ip_address[1],ip_address[2])
318 dot = '.'
278 dot = '.'
319 module_ip = dot.join(module_seq)+'.'+str(module)
279 module_ip = dot.join(module_seq)+'.'+str(module)
320 module_port = self.device.port_address
280 module_port = self.device.port_address
321 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
281 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
322
282
323 print(read_route)
283 print(read_route)
324
284
325 answer = ''
285 answer = ''
326 module_bits = ''
286 module_bits = ''
327
287
328 try:
288 try:
329 r_write = requests.get(read_route, timeout=0.7)
289 r_write = requests.get(read_route, timeout=0.7)
330 answer = r_write.json()
290 answer = r_write.json()
331 self.message = answer['message']
291 self.message = answer['message']
332 module_bits = answer['allbits']
292 module_bits = answer['allbits']
333 except:
293 except:
334 #message = "Could not read ABS parameters"
294 #message = "Could not read ABS parameters"
335 return 0
295 return 0
336
296
337 return module_bits
297 return module_bits
338
298
299 def status_device(self):
300 """
301 This function gets the status of each abs module. It sends GET method to Web Application
302 in Python Bottle.
303 """
304 ip_address = self.device.ip_address
305 ip_address = ip_address.split('.')
306 module_seq = (ip_address[0],ip_address[1],ip_address[2])
307 dot = '.'
308 module_port = self.device.port_address
309
310 modules_status = json.loads(self.module_status)
311
312 for i in range(1,65):
313 module_ip = dot.join(module_seq)+'.'+str(i)
314 print module_ip
315
316 route = 'http://'+module_ip+':'+str(module_port)+'/hello'
317
318 try:
319 r = requests.get(route, timeout=0.7)
320 modules_status[str(i)] = 1
321 except:
322 modules_status[str(i)] = 0
323 pass
324
325 self.message = 'ABS modules Status have been updated.'
326 self.module_status=json.dumps(modules_status)
327 self.save()
328
329 return
330
339
331
340 def write_device(self):
332 def write_device(self):
341 """
333 """
342 This function sends the beams list to every abs module.
334 This function sends the beams list to every abs module.
343 It needs 'module_conf' function
335 It needs 'module_conf' function
344 """
336 """
345
337
346 ###beams_list = ast.literal_eval(self.beams)
338 ###beams_list = ast.literal_eval(self.beams)
347 ###beams = []
339 ###beams = []
348 beams = ABSBeam.objects.filter(abs_conf=self)
340 beams = ABSBeam.objects.filter(abs_conf=self)
349 ###for bl in range(1,len(beams_list)+1):
341 ###for bl in range(1,len(beams_list)+1):
350 ### b = ABSBeam.objects.get(pk=beams_list['beam'+str(bl)])
342 ### b = ABSBeam.objects.get(pk=beams_list['beam'+str(bl)])
351 ### beams.append(b)
343 ### beams.append(b)
352
344
353 #---Write each abs module---
345 #---Write each abs module---
354 if beams:
346 if beams:
355 beams_status = ast.literal_eval(self.module_status)
347 beams_status = ast.literal_eval(self.module_status)
356 for i in range(62,65): #(62,65)
348 for i in range(62,65): #(62,65)
357 try:
349 try:
358 answer = self.module_conf(i, beams)
350 answer = self.module_conf(i, beams)
359 beams_status[str(i)] = 1
351 beams_status[str(i)] = 1
360 self.module_status = json.dumps(beams_status)
352 self.module_status = json.dumps(beams_status)
361 self.save()
353 self.save()
362 #self.module_conf(63,beams)
354 #self.module_conf(63,beams)
363 #beams_status[str(63)] = 1
355 #beams_status[str(63)] = 1
364 #self.module_status = json.dumps(beams_status)
356 #self.module_status = json.dumps(beams_status)
365 except:
357 except:
366 beams_status[str(i)] = 0
358 beams_status[str(i)] = 0
367 self.module_status = json.dumps(beams_status)
359 self.module_status = json.dumps(beams_status)
368 self.save()
360 self.save()
369 answer = 0
361 answer = 0
370 return 0
362 return 0
371 else:
363 else:
372 self.message = "ABS Configuration does not have beams"
364 self.message = "ABS Configuration does not have beams"
373 return 0
365 return 0
374
366
375 #self.device.status = 1
367 #self.device.status = 1
376 ##
368 ##
377 if answer==1:
369 if answer==1:
378 self.message = "ABS Beams List have been sent to ABS Modules"
370 self.message = "ABS Beams List have been sent to ABS Modules"
379 else:
371 else:
380 self.message = "Could not read ABS parameters"
372 self.message = "Could not read ABS parameters"
381
373
382 ##
374 ##
383 self.save()
375 self.save()
384 return 1
376 return 1
385
377
386
378
387 def write_module(self, module):
379 def write_module(self, module):
388
380
389 """
381 """
390 Send configuration to one abs module
382 Send configuration to one abs module
391 """
383 """
392
384
393 parameters = {}
385 parameters = {}
394 ip_address = self.abs_conf.device.ip_address
386 ip_address = self.abs_conf.device.ip_address
395 ip_address = ip_address.split('.')
387 ip_address = ip_address.split('.')
396 module_seq = (ip_address[0],ip_address[1],ip_address[2])
388 module_seq = (ip_address[0],ip_address[1],ip_address[2])
397 dot = '.'
389 dot = '.'
398 module_ip = dot.join(module_seq)+'.'+str(module)
390 module_ip = dot.join(module_seq)+'.'+str(module)
399 module_port = self.abs_conf.device.port_address
391 module_port = self.abs_conf.device.port_address
400 write_route = 'http://'+module_ip+':'+str(module_port)+'/configure'
392 write_route = 'http://'+module_ip+':'+str(module_port)+'/configure'
401
393
402 #print write_route
394 #print write_route
403
395
404 header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1'
396 header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1'
405 module = 'ABS_'+str(module)
397 module = 'ABS_'+str(module)
406 beams = {1: '001000', 2: '010001', 3: '010010', 4: '000011', 5: '101100', 6: '101101',
398 beams = {1: '001000', 2: '010001', 3: '010010', 4: '000011', 5: '101100', 6: '101101',
407 7: '110110', 8: '111111', 9: '000000', 10: '001001', 11: '010010', 12: '011011'}
399 7: '110110', 8: '111111', 9: '000000', 10: '001001', 11: '010010', 12: '011011'}
408
400
409 parameters['header'] = header
401 parameters['header'] = header
410 parameters['module'] = module
402 parameters['module'] = module
411 parameters['beams'] = json.dumps(beams)
403 parameters['beams'] = json.dumps(beams)
412
404
413 answer = ''
405 answer = ''
414
406
415 try:
407 try:
416 r_write = requests.post(write_route, parameters, timeout=0.5)
408 r_write = requests.post(write_route, parameters, timeout=0.5)
417 answer = r_write.json()
409 answer = r_write.json()
418 self.message = answer['message']
410 self.message = answer['message']
419 except:
411 except:
420 self.message = "Could not write ABS parameters"
412 self.message = "Could not write ABS parameters"
421 return 0
413 return 0
422
414
423
415
424 #self.device.status = int(answer['status'])
416 #self.device.status = int(answer['status'])
425
417
426 return 1
418 return 1
427
419
428
420
429 def beam_selector(self, module, beam_pos):
421 def beam_selector(self, module, beam_pos):
430 """
422 """
431 This function selects the beam number for one absmodule.
423 This function selects the beam number for one absmodule.
432 """
424 """
433
425
434 if beam_pos > 0:
426 if beam_pos > 0:
435 beam_pos = beam_pos - 1
427 beam_pos = beam_pos - 1
436 else:
428 else:
437 beam_pos = 0
429 beam_pos = 0
438
430
439 #El indice del apunte debe ser menor que el numero total de apuntes
431 #El indice del apunte debe ser menor que el numero total de apuntes
440 #El servidor tcp en el embebido comienza a contar desde 0
432 #El servidor tcp en el embebido comienza a contar desde 0
441 beams_list = ast.literal_eval(self.beams)
433 beams_list = ABSBeam.objects.filter(abs_conf=self)
442 if len(beams_list) < beam_pos:
434 if len(beams_list) < beam_pos:
443 return 0
435 return 0
444
436
445 flag = 1
437 flag = 1
446 if beam_pos>9:
438 if beam_pos>9:
447 flag = 2
439 flag = 2
448
440
449 module_address = ('192.168.1.'+str(module), 5500)
441 module_address = ('192.168.1.'+str(module), 5500)
450 header = 'JROABSCeCnModCnMod0100000'
442 header = 'JROABSCeCnModCnMod0100000'
451 numbers = len(str(beam_pos))
443 numbers = len(str(beam_pos))
452 function = 'CHGB'
444 function = 'CHGB'
453
445
454 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
446 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
455
447
456 # Create the datagram socket
448 # Create the datagram socket
457 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
449 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
458 #sock.connect(module_address)
450 #sock.connect(module_address)
459 try:
451 try:
460 sock.connect(module_address)
452 sock.connect(module_address)
461 sock.send(message_tx)
453 sock.send(message_tx)
462 sock.close()
454 sock.close()
463 print("Writing abs module:"+module_address[0]+"...")
455 print("Writing abs module:"+module_address[0]+"...")
464 except:
456 except:
465 sock = None
457 sock = None
466 print("Problem writing abs module:"+module_address[0])
458 print("Problem writing abs module:"+module_address[0])
467 return 0
459 return 0
468
460
469 return 1
461 return 1
470
462
471
463
472 def change_beam(self, beam_pos):
464 def change_beam(self, beam_pos):
473 """
465 """
474 This function selects the beam number for all absmodules.
466 This function selects the beam number for all absmodules.
475 """
467 """
476 for i in range(1,65):
468 for i in range(1,65):
477 try:
469 try:
478 self.beam_selector(i,beam_pos)
470 self.beam_selector(i,beam_pos)
479 except:
471 except:
480 print("Problem with module: 192.168.1."+str(i))
472 print("Problem with module: 192.168.1."+str(i))
481 self.message = "Problem with module: 192.168.1."+str(i)
473 self.message = "Problem with module: 192.168.1."+str(i)
482 #return 0
474 #return 0
483 return 1
475 return 1
484
476
485
477
486 def send_beam_num(self, beam_pos):
478 def send_beam_num(self, beam_pos):
487 """
479 """
488 This function connects to a multicast group and sends the beam number
480 This function connects to a multicast group and sends the beam number
489 to all abs modules.
481 to all abs modules.
490 """
482 """
491
483
492 if beam_pos > 0:
484 if beam_pos > 0:
493 beam_pos = beam_pos - 1
485 beam_pos = beam_pos - 1
494 else:
486 else:
495 beam_pos = 0
487 beam_pos = 0
496
488
497 #El indice del apunte debe ser menor que el numero total de apuntes
489 #El indice del apunte debe ser menor que el numero total de apuntes
498 #El servidor tcp en el embebido comienza a contar desde 0
490 #El servidor tcp en el embebido comienza a contar desde 0
499 beams_list = ast.literal_eval(self.beams)
491 beams_list = ABSBeam.objects.filter(abs_conf=self)
500 if len(beams_list) < beam_pos:
492 if len(beams_list) < beam_pos:
501 return 0
493 return 0
502
494
503 flag = 1
495 flag = 1
504 if beam_pos>9:
496 if beam_pos>9:
505 flag = 2
497 flag = 2
506
498
507 header = 'JROABSCeCnModCnMod0100000'
499 header = 'JROABSCeCnModCnMod0100000'
508 flag = str(flag)
500 flag = str(flag)
509 function = 'CHGB'
501 function = 'CHGB'
510 message_tx = header+flag+function+str(beam_pos)+'0'
502 message_tx = header+flag+function+str(beam_pos)+'0'
511
503
512 multicast_group = '224.3.29.71'
504 multicast_group = '224.3.29.71'
513 server_address = ('',10000)
505 server_address = ('',10000)
514
506
515 # Create the socket
507 # Create the socket
516 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
508 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
517 # Bind to the server address
509 # Bind to the server address
518 sock.bind(server_address)
510 sock.bind(server_address)
519 # Telling the OS add the socket to the multicast on all interfaces
511 # Telling the OS add the socket to the multicast on all interfaces
520 group = socket.inet_aton(multicast_group)
512 group = socket.inet_aton(multicast_group)
521 mreq = struct.pack('4sL', group, socket.INADDR_ANY)
513 mreq = struct.pack('4sL', group, socket.INADDR_ANY)
522 sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
514 sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
523
515
524 #print 'sending acknowledgement to all: \n' + message_tx
516 #print 'sending acknowledgement to all: \n' + message_tx
525 sock.sendto(message_tx, (multicast_group, 10000))
517 sock.sendto(message_tx, (multicast_group, 10000))
526 sock.close()
518 sock.close()
527 sock = None
519 sock = None
528
520
529 return 1
521 return 1
530
522
531 def test1(self):
523 def test1(self):
532 t1 = time.time()
524 t1 = time.time()
533 t2 = 0
525 t2 = 0
534 while (t2-t1)<100:#300
526 while (t2-t1)<100:#300
535 t2 = time.time()
527 t2 = time.time()
536 self.send_beam_num(2)
528 self.send_beam_num(2)
537 time.sleep(0.04)
529 time.sleep(0.04)
538 self.send_beam_num(1)
530 self.send_beam_num(1)
539 time.sleep(0.04)
531 time.sleep(0.04)
540 return
532 return
541
533
542 def change_procs_test1(self, module):
534 def change_procs_test1(self, module):
543
535
544 for i in range (1,300):#300
536 for i in range (1,300):#300
545 beam_pos = 1
537 beam_pos = 1
546 module_address = ('192.168.1.'+str(module), 5500)
538 module_address = ('192.168.1.'+str(module), 5500)
547 header = 'JROABSCeCnModCnMod0100000'
539 header = 'JROABSCeCnModCnMod0100000'
548 numbers = len(str(beam_pos))
540 numbers = len(str(beam_pos))
549 function = 'CHGB'
541 function = 'CHGB'
550
542
551 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
543 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
552
544
553 # Create the datagram socket
545 # Create the datagram socket
554 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
546 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
555 sock.connect(module_address)
547 sock.connect(module_address)
556
548
557 sock.send(message_tx)
549 sock.send(message_tx)
558 #t = sock.recv(1024)
550 #t = sock.recv(1024)
559 sock.close()
551 sock.close()
560 sock = None
552 sock = None
561
553
562
554
563 time.sleep(0.04)
555 time.sleep(0.04)
564
556
565
557
566 beam_pos = 0
558 beam_pos = 0
567 numbers = len(str(beam_pos))
559 numbers = len(str(beam_pos))
568
560
569 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
561 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
570
562
571 # Create the datagram socket
563 # Create the datagram socket
572 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
564 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
573 sock.connect(module_address)
565 sock.connect(module_address)
574 sock.send(message_tx)
566 sock.send(message_tx)
575 sock.close()
567 sock.close()
576 sock = None
568 sock = None
577
569
578 time.sleep(0.04)
570 time.sleep(0.04)
579
571
580
572
581 def multi_procs_test1(self):
573 def multi_procs_test1(self):
582
574
583 """
575 """
584 This function sends the beam number to all abs modules using multiprocessing.
576 This function sends the beam number to all abs modules using multiprocessing.
585 """
577 """
586
578
587 #if __name__ == "__main__":
579 #if __name__ == "__main__":
588 size = 10000000 # Number of random numbers to add
580 size = 10000000 # Number of random numbers to add
589 procs = 65 # (Number-1) of processes to create (absmodule)
581 procs = 65 # (Number-1) of processes to create (absmodule)
590
582
591 # Create a list of jobs and then iterate through
583 # Create a list of jobs and then iterate through
592 # the number of processes appending each process to
584 # the number of processes appending each process to
593 # the job list
585 # the job list
594 jobs = []
586 jobs = []
595 for i in range(1, procs):
587 for i in range(1, procs):
596
588
597 process = multiprocessing.Process(target=self.change_procs_test1,args=(i,))
589 process = multiprocessing.Process(target=self.change_procs_test1,args=(i,))
598 jobs.append(process)
590 jobs.append(process)
599 #print jobs
591 #print jobs
600
592
601 # Start the processes (i.e. calculate the random number lists)
593 # Start the processes (i.e. calculate the random number lists)
602 for j in jobs:
594 for j in jobs:
603 #time.sleep(0.4)
595 #time.sleep(0.4)
604 #print j
596 #print j
605 j.start()
597 j.start()
606
598
607 # Ensure all of the processes have finished
599 # Ensure all of the processes have finished
608 for j in jobs:
600 for j in jobs:
609 j.join()
601 j.join()
610
602
611 print("List processing complete.")
603 print("List processing complete.")
612 return 1
604 return 1
613
605
614
606
615
607
616 def multi_procs_test2(self):
608 def multi_procs_test2(self):
617 """
609 """
618 This function use multiprocessing python library. Importing Pool we can select
610 This function use multiprocessing python library. Importing Pool we can select
619 the number of cores we want to use
611 the number of cores we want to use
620 After 'nproc' linux command, we know how many cores computer has.
612 After 'nproc' linux command, we know how many cores computer has.
621 NOT WORKING
613 NOT WORKING
622 """
614 """
623 import multiprocessing
615 import multiprocessing
624 pool = multiprocessing.Pool(3) # cores
616 pool = multiprocessing.Pool(3) # cores
625
617
626 tasks = []
618 tasks = []
627 procs = 65
619 procs = 65
628 for i in range(62, procs):
620 for i in range(62, procs):
629 tasks.append( (i,))
621 tasks.append( (i,))
630 #print tasks
622 #print tasks
631 #pool.apply_async(self.change_procs_test1, 62)
623 #pool.apply_async(self.change_procs_test1, 62)
632 results = [pool.apply( self.change_procs_test1, t ) for t in tasks]
624 results = [pool.apply( self.change_procs_test1, t ) for t in tasks]
633 #for result in results:
625 #for result in results:
634 #result.get()
626 #result.get()
635 #(plotNum, plotFilename) = result.get()
627 #(plotNum, plotFilename) = result.get()
636 #print("Result: plot %d written to %s" % (plotNum, plotFilename) )
628 #print("Result: plot %d written to %s" % (plotNum, plotFilename) )
637
629
638 return 1
630 return 1
639
631
640
632
641 def multi_procs_test3(self):
633 def multi_procs_test3(self):
642 """
634 """
643 This function use multiprocessing python library. Importing Pool we can select
635 This function use multiprocessing python library. Importing Pool we can select
644 the number of cores we want to use
636 the number of cores we want to use
645 After 'nproc' linux command, we know how many cores computer has.
637 After 'nproc' linux command, we know how many cores computer has.
646 """
638 """
647 from multiprocessing import Pool
639 from multiprocessing import Pool
648 import time
640 import time
649
641
650 def f(x):
642 def f(x):
651 return x*x
643 return x*x
652
644
653 tasks = []
645 tasks = []
654 procs = 65
646 procs = 65
655 pool = Pool(processes=4)
647 pool = Pool(processes=4)
656
648
657 #for i in range(62, procs):
649 #for i in range(62, procs):
658 #result = pool.map(f, range(62,65))
650 #result = pool.map(f, range(62,65))
659 it = pool.imap(self.change_procs_test1, range(62,65))
651 it = pool.imap(self.change_procs_test1, range(62,65))
660 #result.get(timeout=5)
652 #result.get(timeout=5)
661
653
662 return 1
654 return 1
663
655
664
656
665 def f(x):
657 def f(x):
666 print x
658 print x
667 return
659 return
668
660
669 def multi_procs_test4(self):
661 def multi_procs_test4(self):
670 import multiprocessing as mp
662 import multiprocessing as mp
671
663
672
664
673 num_workers = mp.cpu_count()
665 num_workers = mp.cpu_count()
674
666
675 pool = mp.Pool(num_workers)
667 pool = mp.Pool(num_workers)
676 procs = 65
668 procs = 65
677 for i in range(62, procs):
669 for i in range(62, procs):
678 #for task in tasks:
670 #for task in tasks:
679 pool.apply_async(self.f, args = (i,))
671 pool.apply_async(self.f, args = (i,))
680
672
681 pool.close()
673 pool.close()
682 pool.join()
674 pool.join()
683
675
684 return 1
676 return 1
685
677
686
678
687 def status_device(self):
688
689 return 1
690
691
679
692
680
693 class ABSBeam(models.Model):
681 class ABSBeam(models.Model):
694
682
695 name = models.CharField(max_length=60, default='Beam')
683 name = models.CharField(max_length=60, default='Beam')
696 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
684 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
697 abs_conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration')
685 abs_conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration')
698 tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default)
686 tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default)
699 rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default)
687 rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default)
700 s_time = models.TimeField(verbose_name='Star Time', default='00:00:00')
688 s_time = models.TimeField(verbose_name='Star Time', default='00:00:00')
701 e_time = models.TimeField(verbose_name='End Time', default='23:59:59')
689 e_time = models.TimeField(verbose_name='End Time', default='23:59:59')
702 modules_conf = models.CharField(verbose_name='Modules', max_length=2000, default=json.dumps(conf_default))
690 modules_conf = models.CharField(verbose_name='Modules', max_length=2000, default=json.dumps(conf_default))
703 ues = models.CharField(verbose_name='Ues', max_length=100, default=ues_default)
691 ues = models.CharField(verbose_name='Ues', max_length=100, default=ues_default)
704 only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default)
692 only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default)
705
693
706 class Meta:
694 class Meta:
707 db_table = 'abs_beams'
695 db_table = 'abs_beams'
708
696
709 def __unicode__(self):
697 def __unicode__(self):
710 return u'%s' % (self.name)
698 return u'%s' % (self.name)
711
699
712 def parms_to_dict(self):
700 def parms_to_dict(self):
713
701
714 #Update data
702 #Update data
715 self.modules_6bits()
703 self.modules_6bits()
716
704
717 parameters = {}
705 parameters = {}
718
706
719 parameters['name'] = self.name
707 parameters['name'] = self.name
720 parameters['antenna'] = ast.literal_eval(self.antenna)
708 parameters['antenna'] = ast.literal_eval(self.antenna)
721 parameters['abs_conf'] = self.abs_conf.name
709 parameters['abs_conf'] = self.abs_conf.name
722 parameters['tx'] = ast.literal_eval(self.tx)
710 parameters['tx'] = ast.literal_eval(self.tx)
723 parameters['rx'] = ast.literal_eval(self.rx)
711 parameters['rx'] = ast.literal_eval(self.rx)
724 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
712 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
725 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
713 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
726 parameters['configuration'] = ast.literal_eval(self.modules_conf)
714 parameters['configuration'] = ast.literal_eval(self.modules_conf)
727 parameters['ues'] = ast.literal_eval(self.ues)
715 parameters['ues'] = ast.literal_eval(self.ues)
728 parameters['only_rx'] = json.loads(self.only_rx)
716 parameters['only_rx'] = json.loads(self.only_rx)
729
717
730 return parameters
718 return parameters
731
719
732 def dict_to_parms(self, parameters):
720 def dict_to_parms(self, parameters):
733
721
734 self.name = parameters['name']
722 self.name = parameters['name']
735 self.antenna = json.dumps(parameters['antenna'])
723 self.antenna = json.dumps(parameters['antenna'])
736 #self.abs_conf = parameters['abs_conf']
724 #self.abs_conf = parameters['abs_conf']
737 self.tx = json.dumps(parameters['tx'])
725 self.tx = json.dumps(parameters['tx'])
738 self.rx = json.dumps(parameters['rx'])
726 self.rx = json.dumps(parameters['rx'])
739 #parameters['s_time']
727 #parameters['s_time']
740 #parameters['e_time']
728 #parameters['e_time']
741 self.ues = json.dumps(parameters['ues'])
729 self.ues = json.dumps(parameters['ues'])
742 self.only_rx = json.dumps(parameters['only_rx'])
730 self.only_rx = json.dumps(parameters['only_rx'])
743
731
744 self.modules_6bits()
732 self.modules_6bits()
745 self.save()
733 self.save()
746
734
747 return parameters
735 return parameters
748
736
749 def clone(self, **kwargs):
737 def clone(self, **kwargs):
750
738
751 self.pk = None
739 self.pk = None
752 self.id = None
740 self.id = None
753 for attr, value in kwargs.items():
741 for attr, value in kwargs.items():
754 setattr(self, attr, value)
742 setattr(self, attr, value)
755
743
756 self.save()
744 self.save()
757
745
758 return self
746 return self
759
747
760
748
761 def change_beam(self, beam_pos=0):
749
762
763 module_63 = ('192.168.1.63', 5500)
764 header = 'JROABSCeCnModCnMod0100000'
765 numbers = len(str(beam_pos))
766 function = 'CHGB'
767
768 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
769
770 # Create the datagram socket
771 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
772 sock.connect(module_63)
773 sock.send(message_tx)
774 sock.close()
775 return message_tx
776
777 def change_module_beam(self, module=61,beam_pos=0):
778
779 module_address = ('192.168.1.'+str(module), 5500)
780 header = 'JROABSCeCnModCnMod0100000'
781 numbers = len(str(beam_pos))
782 function = 'CHGB'
783
784 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
785
786 # Create the datagram socket
787 try:
788 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
789 sock.connect(module_address)
790 sock.send(message_tx)
791 sock.close()
792 except:
793 return 0
794 return message_tx
795
796 def write_device(self):
797
798 parameters = {}
799
800 module_ip = '192.168.1.63'
801 write_route = 'http://192.168.1.63:8080/configure'
802
803 header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1'
804 module = 'ABS_63'
805 beams = {1: '001000', 2: '010001', 3: '010010', 4: '000011', 5: '101100', 6: '101101',
806 7: '110110', 8: '111111', 9: '000000', 10: '001001', 11: '010010', 12: '011011'}
807
808 parameters['header'] = header
809 parameters['module'] = module
810 parameters['beams'] = json.dumps(beams)
811
812 answer = ''
813
814 try:
815 r_write = requests.post(write_route, parameters, timeout=0.5)
816 answer = r_write.json()
817 self.message = answer['message']
818 except:
819 self.message = "Could not write ABS parameters"
820 return 0
821
822
823 #self.device.status = int(answer['status'])
824
825 return 1
826
827
828
829 def module_6bits(self, module):
750 def module_6bits(self, module):
830 """
751 """
831 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
752 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
832 """
753 """
833 if module > 64:
754 if module > 64:
834 beam_bits = ""
755 beam_bits = ""
835 return beam_bits
756 return beam_bits
836
757
837 data = ast.literal_eval(self.antenna)
758 data = ast.literal_eval(self.antenna)
838 up_data = data['antenna_up']
759 up_data = data['antenna_up']
839 down_data = data['antenna_down']
760 down_data = data['antenna_down']
840
761
841 pos = ip2position(module)
762 pos = ip2position(module)
842 up_value = up_data[pos[0]][pos[1]]
763 up_value = up_data[pos[0]][pos[1]]
843 down_value = down_data[pos[0]][pos[1]]
764 down_value = down_data[pos[0]][pos[1]]
844
765
845 up_bits = up_conv_bits(up_value)
766 up_bits = up_conv_bits(up_value)
846 down_bits = down_conv_bits(down_value)
767 down_bits = down_conv_bits(down_value)
847 beam_bits = up_bits+down_bits
768 beam_bits = up_bits+down_bits
848
769
849 return beam_bits
770 return beam_bits
850
771
851 def modules_6bits(self):
772 def modules_6bits(self):
852 """
773 """
853 This function returns 6bits from every abs module (1-64) in a dict
774 This function returns 6bits from every abs module (1-64) in a dict
854 """
775 """
855 modules_configuration = ast.literal_eval(self.modules_conf)
776 modules_configuration = ast.literal_eval(self.modules_conf)
856
777
857 for i in range(1,65):
778 for i in range(1,65):
858 modules_configuration[str(i)] = self.module_6bits(i)
779 modules_configuration[str(i)] = self.module_6bits(i)
859
780
860 self.modules_conf = json.dumps(modules_configuration)
781 self.modules_conf = json.dumps(modules_configuration)
861 self.save()
782 self.save()
862
783
863 return self.modules_conf
784 return self.modules_conf
864
785
865 def add_beam2list(self):
786
866 """
787 def active_beam(self):
867 This function adds a beam to the beams list of ABS Configuration.
868 """
869 beams = ast.literal_eval(self.abs_conf.beams)
870 if any(beams):
871 for beam in beams:
872 if beams[beam] == self.id:
873 return
874 i = len(beams)+1
875 beams['beam'+str(i)] = self.id
876 else:
877 beams['beam1'] = self.id
878
879 self.abs_conf.beams = json.dumps(beams)
880 self.abs_conf.save()
881
882 return
883
884 def remove_beamfromlist(self):
885 """
788 """
886 This function removes current beam from the beams list of ABS Configuration.
789 This function set this beam as the active beam of its ABS Configuration.
887 """
790 """
888 beams = ast.literal_eval(self.abs_conf.beams)
791 self.abs_conf.active_beam = json.dumps({'active_beam': self.id})
889 dict_position = ''
890
891 if any(beams):
892 for beam in beams:
893 if beams[beam] == self.id:
894 dict_position = beam
895 if dict_position != '':
896 beams.pop(str(dict_position),None)
897 else:
898 return
899
900 self.abs_conf.beams = json.dumps(beams)
901 self.abs_conf.save()
792 self.abs_conf.save()
902
903 return
793 return
904
794
905 @property
795 @property
906 def get_upvalues(self):
796 def get_upvalues(self):
907 """
797 """
908 This function reads antenna pattern and show the up-value of one abs module
798 This function reads antenna pattern and show the up-value of one abs module
909 """
799 """
910
800
911 data = ast.literal_eval(self.antenna)
801 data = ast.literal_eval(self.antenna)
912 up_data = data['antenna_up']
802 up_data = data['antenna_up']
913
803
914 up_values = []
804 up_values = []
915 for data in up_data:
805 for data in up_data:
916 for i in range(0,8):
806 for i in range(0,8):
917 up_values.append(data[i])
807 up_values.append(data[i])
918
808
919 return up_values
809 return up_values
920
810
921 @property
811 @property
922 def antenna_upvalues(self):
812 def antenna_upvalues(self):
923 """
813 """
924 This function reads antenna pattern and show the up - values of one abs beam
814 This function reads antenna pattern and show the up - values of one abs beam
925 in a particular order
815 in a particular order
926 """
816 """
927 data = ast.literal_eval(self.antenna)
817 data = ast.literal_eval(self.antenna)
928 up_data = data['antenna_up']
818 up_data = data['antenna_up']
929
819
930 return up_data
820 return up_data
931
821
932 @property
822 @property
933 def antenna_downvalues(self):
823 def antenna_downvalues(self):
934 """
824 """
935 This function reads antenna pattern and show the down - values of one abs beam
825 This function reads antenna pattern and show the down - values of one abs beam
936 in a particular order
826 in a particular order
937 """
827 """
938 data = ast.literal_eval(self.antenna)
828 data = ast.literal_eval(self.antenna)
939 down_data = data['antenna_down']
829 down_data = data['antenna_down']
940
830
941 return down_data
831 return down_data
942
832
943 @property
833 @property
944 def get_downvalues(self):
834 def get_downvalues(self):
945 """
835 """
946 This function reads antenna pattern and show the down-value of one abs module
836 This function reads antenna pattern and show the down-value of one abs module
947 """
837 """
948
838
949 data = ast.literal_eval(self.antenna)
839 data = ast.literal_eval(self.antenna)
950 down_data = data['antenna_down']
840 down_data = data['antenna_down']
951
841
952 down_values = []
842 down_values = []
953 for data in down_data:
843 for data in down_data:
954 for i in range(0,8):
844 for i in range(0,8):
955 down_values.append(data[i])
845 down_values.append(data[i])
956
846
957 return down_values
847 return down_values
958
848
959 @property
849 @property
960 def get_up_ues(self):
850 def get_up_ues(self):
961 """
851 """
962 This function shows the up-ues-value of one beam
852 This function shows the up-ues-value of one beam
963 """
853 """
964 data = ast.literal_eval(self.ues)
854 data = ast.literal_eval(self.ues)
965 up_ues = data['up']
855 up_ues = data['up']
966
856
967 return up_ues
857 return up_ues
968
858
969 @property
859 @property
970 def get_down_ues(self):
860 def get_down_ues(self):
971 """
861 """
972 This function shows the down-ues-value of one beam
862 This function shows the down-ues-value of one beam
973 """
863 """
974 data = ast.literal_eval(self.ues)
864 data = ast.literal_eval(self.ues)
975 down_ues = data['down']
865 down_ues = data['down']
976
866
977 return down_ues
867 return down_ues
978
868
979 @property
869 @property
980 def get_up_onlyrx(self):
870 def get_up_onlyrx(self):
981 """
871 """
982 This function shows the up-onlyrx-value of one beam
872 This function shows the up-onlyrx-value of one beam
983 """
873 """
984 data = json.loads(self.only_rx)
874 data = json.loads(self.only_rx)
985 up_onlyrx = data['up']
875 up_onlyrx = data['up']
986
876
987 return up_onlyrx
877 return up_onlyrx
988
878
989 @property
879 @property
990 def get_down_onlyrx(self):
880 def get_down_onlyrx(self):
991 """
881 """
992 This function shows the down-onlyrx-value of one beam
882 This function shows the down-onlyrx-value of one beam
993 """
883 """
994 data = json.loads(self.only_rx)
884 data = json.loads(self.only_rx)
995 down_onlyrx = data['down']
885 down_onlyrx = data['down']
996
886
997 return down_onlyrx
887 return down_onlyrx
998
888
999 @property
889 @property
1000 def get_tx(self):
890 def get_tx(self):
1001 """
891 """
1002 This function shows the tx-values of one beam
892 This function shows the tx-values of one beam
1003 """
893 """
1004 data = json.loads(self.tx)
894 data = json.loads(self.tx)
1005
895
1006 return data
896 return data
1007
897
1008 @property
898 @property
1009 def get_uptx(self):
899 def get_uptx(self):
1010 """
900 """
1011 This function shows the up-tx-values of one beam
901 This function shows the up-tx-values of one beam
1012 """
902 """
1013 data = json.loads(self.tx)
903 data = json.loads(self.tx)
1014 up_data = data['up']
904 up_data = data['up']
1015
905
1016 up_values = []
906 up_values = []
1017 for data in up_data:
907 for data in up_data:
1018 for i in range(0,8):
908 for i in range(0,8):
1019 up_values.append(data[i])
909 up_values.append(data[i])
1020
910
1021 return up_values
911 return up_values
1022
912
1023 @property
913 @property
1024 def get_downtx(self):
914 def get_downtx(self):
1025 """
915 """
1026 This function shows the down-tx-values of one beam
916 This function shows the down-tx-values of one beam
1027 """
917 """
1028 data = json.loads(self.tx)
918 data = json.loads(self.tx)
1029 down_data = data['down']
919 down_data = data['down']
1030
920
1031 down_values = []
921 down_values = []
1032 for data in down_data:
922 for data in down_data:
1033 for i in range(0,8):
923 for i in range(0,8):
1034 down_values.append(data[i])
924 down_values.append(data[i])
1035
925
1036 return down_values
926 return down_values
1037
927
1038
928
1039
929
1040 @property
930 @property
1041 def get_rx(self):
931 def get_rx(self):
1042 """
932 """
1043 This function shows the rx-values of one beam
933 This function shows the rx-values of one beam
1044 """
934 """
1045 data = json.loads(self.rx)
935 data = json.loads(self.rx)
1046
936
1047 return data
937 return data
1048
938
1049 @property
939 @property
1050 def get_uprx(self):
940 def get_uprx(self):
1051 """
941 """
1052 This function shows the up-rx-values of one beam
942 This function shows the up-rx-values of one beam
1053 """
943 """
1054 data = json.loads(self.rx)
944 data = json.loads(self.rx)
1055 up_data = data['up']
945 up_data = data['up']
1056
946
1057 up_values = []
947 up_values = []
1058 for data in up_data:
948 for data in up_data:
1059 for i in range(0,8):
949 for i in range(0,8):
1060 up_values.append(data[i])
950 up_values.append(data[i])
1061
951
1062 return up_values
952 return up_values
1063
953
1064 @property
954 @property
1065 def get_downrx(self):
955 def get_downrx(self):
1066 """
956 """
1067 This function shows the down-rx-values of one beam
957 This function shows the down-rx-values of one beam
1068 """
958 """
1069 data = json.loads(self.rx)
959 data = json.loads(self.rx)
1070 down_data = data['down']
960 down_data = data['down']
1071
961
1072 down_values = []
962 down_values = []
1073 for data in down_data:
963 for data in down_data:
1074 for i in range(0,8):
964 for i in range(0,8):
1075 down_values.append(data[i])
965 down_values.append(data[i])
1076
966
1077 return down_values
967 return down_values
This diff has been collapsed as it changes many lines, (627 lines changed) Show them Hide them
@@ -1,462 +1,533
1 {% extends "dev_conf.html" %}
1 {% extends "dev_conf.html" %}
2
2
3 {% block extra-menu-actions %}
3 {% block extra-menu-actions %}
4 <li><a href="{{ dev_conf.get_absolute_url_plot }}" target="_blank"><span class="glyphicon glyphicon-picture" aria-hidden="true"></span> View Patterns </a></li>
4 <li><a href="{{ dev_conf.get_absolute_url_plot }}" target="_blank"><span class="glyphicon glyphicon-picture" aria-hidden="true"></span> View Patterns </a></li>
5 <!--<li><a href="{{ dev_conf.get_absolute_url_write }}"><span class="glyphicon glyphicon-download" aria-hidden="true"></span> Write</a></li>-->
5 <!--<li><a href="{{ dev_conf.get_absolute_url_write }}"><span class="glyphicon glyphicon-download" aria-hidden="true"></span> Write</a></li>-->
6 {% endblock %}
6 {% endblock %}
7
7
8 {% block extra-content %}
8 {% block extra-content %}
9 <style>
9 <style>
10
10
11 .abs {
11 .abs {
12 border: 2px solid #00334d;
12 border: 2px solid #00334d;
13 vertical-align: center;
13 vertical-align: center;
14 display: inline-block;
14 display: inline-block;
15 }
15 }
16 .abs tr:nth-child(1){
16 .abs tr:nth-child(1){
17 border-bottom: 1px dashed #00334d;
17 border-bottom: 1px dashed #00334d;
18 }
18 }
19 .abs tr{
19 .abs tr{
20 border-bottom: 0px solid #00334d;
20 border-bottom: 0px solid #00334d;
21 }
21 }
22 .abs td {
22 .abs td {
23 border-right: 1px dashed #00334d;
23 border-right: 1px dashed #00334d;
24 text-align: center;
24 text-align: center;
25 padding: 5px;
25 padding: 5px;
26 }
26 }
27
27
28
28
29 .legend {
29 .legend {
30 margin-left: 15px;
30 margin-left: 15px;
31 display: inline-block;
31 display: inline-block;
32 border: 2px solid #00334d;
32 border: 2px solid #00334d;
33 vertical-align: top;
33 vertical-align: top;
34 }
34 }
35 .legend th{
35 .legend th{
36 border-bottom: 1px dashed #00334d;
36 border-bottom: 1px dashed #00334d;
37 font-weight: bold;
37 font-weight: bold;
38 vertical-align: center;
38 vertical-align: center;
39 text-align: center;
39 text-align: center;
40 }
40 }
41 .legend td {
41 .legend td {
42 padding: 2px;
42 padding: 2px;
43 text-align: center;
43 text-align: center;
44 }
44 }
45
45
46
46
47 .north {
47 .north {
48 border: 2px solid #00334d;
48 border: 2px solid #00334d;
49 vertical-align: center;
49 vertical-align: center;
50 font-weight: bold;
50 font-weight: bold;
51 }
51 }
52 .north tr{
52 .north tr{
53 border: 1px solid #ffffff;
53 border: 1px solid #ffffff;
54 background-color: #FF0000;
54
55 }
55 }
56 .north td{
56 .north td{
57 border: 2px solid #e2e2e7;
57 border: 2px solid #e2e2e7;
58 text-align: center;
58 text-align: center;
59 padding: 1px 15px 1px 15px;
59 padding: 1px 15px 1px 15px;
60 }
60 }
61 .north tr:nth-child(even) td:nth-child(n){
61 .north tr:nth-child(even) td:nth-child(n){
62 border-bottom: 12px solid #e2e2e7;
62 border-bottom: 12px solid #e2e2e7;
63 }
63 }
64 .north td:nth-child(n) {
64 .north td:nth-child(n) {
65 border-right: 12px solid #e2e2e7;
65 border-right: 12px solid #e2e2e7;
66 }
66 }
67 .north td:nth-last-child(4n+1) {
67 .north td:nth-last-child(4n+1) {
68 border-right: 2px solid #e2e2e7;
68 border-right: 2px solid #e2e2e7;
69 }
69 }
70 .north tr:nth-last-child(1) td:nth-child(n){
70 .north tr:nth-last-child(1) td:nth-child(n){
71 border-bottom: 3px solid #e2e2e7;
71 border-bottom: 3px solid #e2e2e7;
72 }
72 }
73
73
74 .north tr:nth-child(2) td:nth-child(2){
75 background-color: #00cc00;
76 }
77
78 .north tr:nth-child(2) td:nth-child(4){
79 background-color: #ee902c;
80 }
81
82
74
83
75
84 .east {
76 .east {
85 border: 2px solid #00334d;
77 border: 2px solid #00334d;
86 vertical-align: center;
78 vertical-align: center;
87 font-weight: bold;
79 font-weight: bold;
88 }
80 }
89 .east tr{
81 .east tr{
90 border: 1px solid #ffffff;
82 border: 1px solid #ffffff;
91 background-color: #FF0000;
92 }
83 }
93 .east td{
84 .east td{
94 border: 2px solid #e2e2e7;
85 border: 2px solid #e2e2e7;
95 text-align: center;
86 text-align: center;
96 padding: 1px 15px 1px 15px;
87 padding: 1px 15px 1px 15px;
97 }
88 }
98 .east tr:nth-child(even) td:nth-child(n){
89 .east tr:nth-child(even) td:nth-child(n){
99 border-bottom: 12px solid #e2e2e7;
90 border-bottom: 12px solid #e2e2e7;
100 }
91 }
101 .east td:nth-child(n) {
92 .east td:nth-child(n) {
102 border-right: 12px solid #e2e2e7;
93 border-right: 12px solid #e2e2e7;
103 }
94 }
104 .east td:nth-last-child(4n+1) {
95 .east td:nth-last-child(4n+1) {
105 border-right: 2px solid #e2e2e7;
96 border-right: 2px solid #e2e2e7;
106 }
97 }
107 .east tr:nth-last-child(1) td:nth-child(n){
98 .east tr:nth-last-child(1) td:nth-child(n){
108 border-bottom: 3px solid #e2e2e7;
99 border-bottom: 3px solid #e2e2e7;
109 }
100 }
110
101
111 .east tr:nth-child(2) td:nth-child(2){
112 background-color: #00cc00;
113 }
114
102
115 .east tr:nth-child(2) td:nth-child(4){
116 background-color: #ee902c;
117 }
118
103
119
104
120 .west {
105 .west {
121 border: 2px solid #00334d;
106 border: 2px solid #00334d;
122 vertical-align: center;
107 vertical-align: center;
123 font-weight: bold;
108 font-weight: bold;
124 }
109 }
125 .west tr{
110 .west tr{
126 border: 1px solid #ffffff;
111 border: 1px solid #ffffff;
127 background-color: #FF0000;
128 }
112 }
129 .west td{
113 .west td{
130 border: 2px solid #e2e2e7;
114 border: 2px solid #e2e2e7;
131 text-align: center;
115 text-align: center;
132 padding: 1px 15px 1px 15px;
116 padding: 1px 15px 1px 15px;
133 }
117 }
134 .west tr:nth-child(even) td:nth-child(n){
118 .west tr:nth-child(even) td:nth-child(n){
135 border-bottom: 12px solid #e2e2e7;
119 border-bottom: 12px solid #e2e2e7;
136 }
120 }
137 .west td:nth-child(n) {
121 .west td:nth-child(n) {
138 border-right: 12px solid #e2e2e7;
122 border-right: 12px solid #e2e2e7;
139 }
123 }
140 .west td:nth-last-child(4n+1) {
124 .west td:nth-last-child(4n+1) {
141 border-right: 2px solid #e2e2e7;
125 border-right: 2px solid #e2e2e7;
142 }
126 }
143 .west tr:nth-last-child(1) td:nth-child(n){
127 .west tr:nth-last-child(1) td:nth-child(n){
144 border-bottom: 3px solid #e2e2e7;
128 border-bottom: 3px solid #e2e2e7;
145 }
129 }
146
130
147 .west tr:nth-child(2) td:nth-child(2){
148 background-color: #00cc00;
149 }
150
131
151 .west tr:nth-child(2) td:nth-child(4){
152 background-color: #ee902c;
153 }
154
132
155
133
156 .south {
134 .south {
157 border: 2px solid #00334d;
135 border: 2px solid #00334d;
158 vertical-align: center;
136 vertical-align: center;
159 font-weight: bold;
137 font-weight: bold;
160 }
138 }
161 .south tr{
139 .south tr{
162 border: 1px solid #ffffff;
140 border: 1px solid #ffffff;
163 background-color: #FF0000;
164 }
141 }
165 .south td{
142 .south td{
166 border: 2px solid #e2e2e7;
143 border: 2px solid #e2e2e7;
167 text-align: center;
144 text-align: center;
168 padding: 1px 15px 1px 15px;
145 padding: 1px 15px 1px 15px;
169 }
146 }
170 .south tr:nth-child(even) td:nth-child(n){
147 .south tr:nth-child(even) td:nth-child(n){
171 border-bottom: 12px solid #e2e2e7;
148 border-bottom: 12px solid #e2e2e7;
172 }
149 }
173 .south td:nth-child(n) {
150 .south td:nth-child(n) {
174 border-right: 12px solid #e2e2e7;
151 border-right: 12px solid #e2e2e7;
175 }
152 }
176 .south td:nth-last-child(4n+1) {
153 .south td:nth-last-child(4n+1) {
177 border-right: 2px solid #e2e2e7;
154 border-right: 2px solid #e2e2e7;
178 }
155 }
179 .south tr:nth-last-child(1) td:nth-child(n){
156 .south tr:nth-last-child(1) td:nth-child(n){
180 border-bottom: 3px solid #e2e2e7;
157 border-bottom: 3px solid #e2e2e7;
181 }
158 }
182
159
183 .south tr:nth-child(2) td:nth-child(2){
184 background-color: #00cc00;
185 }
186
187 .south tr:nth-child(2) td:nth-child(4){
188 background-color: #ee902c;
189 }
190
160
191
161
192
162
193 </style>
163 </style>
194
164
195 <h4>Beams:</h4>
165
196 {% if beams %}
166 {% if beams %}
197
167
198 <div class="container">
199 <ul class="nav nav-pills">
200
168
201 {% for beam in beams %}
202 <li {% if forloop.counter == 1 %} class="active" {% endif %}>
203 <a data-toggle="pill" id="button-{{ forloop.counter }}" href="#">{{ forloop.counter }}</a>
204 </li>
205 {% endfor %}
206
169
207 </ul>
170 <h4>Beams:</h4>
208 </div>
171 <div class="container">
172 <ul class="nav nav-pills">
173 {% for beam in beams %}
174 <li >
175 <a data-toggle="pill" href="#menu{{forloop.counter}}">{{forloop.counter}}</a>
176 </li>
177 {% endfor %}
178 </ul>
179
180
181 <div class="tab-content">
182 <div id="home" class="tab-pane fade in active">
183 <!---->
184 {% if active_beam %}
185 <h3>Active Beam: {{active_beam.name}}</h3>
186
187 <table id="abs_pattern" class="abs">
188 <tr>
189 <td> <b>North Quarter</b>
190 <table class="north ">
191 <tr>
192 <td {{color_status.1}}>{{active_beam.get_upvalues.0}}</td> <td {{color_status.2}}>{{active_beam.get_upvalues.1}}</td> <td {{color_status.3}}>{{active_beam.get_upvalues.2}}</td> <td {{color_status.4}}>{{active_beam.get_upvalues.3}}</td>
193 </tr>
194 <tr>
195 <td {{color_status.1}}>{{active_beam.get_downvalues.0}}</td> <td {{color_status.2}}>{{active_beam.get_downvalues.1}}</td> <td {{color_status.3}}>{{active_beam.get_downvalues.2}}</td> <td {{color_status.4}}>{{active_beam.get_downvalues.3}}</td>
196 </tr>
197 <tr>
198 <td {{color_status.9}}>{{active_beam.get_upvalues.8}}</td> <td {{color_status.10}}>{{active_beam.get_upvalues.9}}</td> <td {{color_status.11}}>{{active_beam.get_upvalues.10}}</td> <td {{color_status.12}}>{{active_beam.get_upvalues.11}}</td>
199 </tr>
200 <tr>
201 <td {{color_status.9}}>{{active_beam.get_downvalues.8}}</td> <td {{color_status.10}}>{{active_beam.get_downvalues.9}}</td> <td {{color_status.11}}>{{active_beam.get_downvalues.10}}</td> <td {{color_status.12}}>{{active_beam.get_downvalues.11}}</td>
202 </tr>
203 <tr>
204 <td {{color_status.17}}>{{active_beam.get_upvalues.16}}</td> <td {{color_status.18}}>{{active_beam.get_upvalues.17}}</td> <td {{color_status.19}}>{{active_beam.get_upvalues.18}}</td> <td {{color_status.20}}>{{active_beam.get_upvalues.19}}</td>
205 </tr>
206 <tr>
207 <td {{color_status.17}}>{{active_beam.get_downvalues.16}}</td> <td {{color_status.18}}>{{active_beam.get_downvalues.17}}</td> <td {{color_status.19}}>{{active_beam.get_downvalues.18}}</td> <td {{color_status.20}}>{{active_beam.get_downvalues.19}}</td>
208 </tr>
209 <tr>
210 <td {{color_status.25}}>{{active_beam.get_upvalues.24}}</td> <td {{color_status.26}}>{{active_beam.get_upvalues.25}}</td> <td {{color_status.27}}>{{active_beam.get_upvalues.26}}</td> <td {{color_status.28}}>{{active_beam.get_upvalues.27}}</td>
211 </tr>
212 <tr>
213 <td {{color_status.25}}>{{active_beam.get_downvalues.24}}</td> <td {{color_status.26}}>{{active_beam.get_downvalues.25}}</td> <td {{color_status.27}}>{{active_beam.get_downvalues.26}}</td> <td {{color_status.28}}>{{active_beam.get_downvalues.27}}</td>
214 </tr>
215 </table>
216 </td>
217 <td> <b>East Quarter</b>
218 <table class="east ">
219 <tr>
220 <td {{color_status.5}}>{{active_beam.get_upvalues.4}}</td> <td {{color_status.6}}>{{active_beam.get_upvalues.5}}</td> <td {{color_status.7}}>{{active_beam.get_upvalues.6}}</td> <td {{color_status.8}}>{{active_beam.get_upvalues.7}}</td>
221 </tr>
222 <tr>
223 <td {{color_status.5}}>{{active_beam.get_downvalues.4}}</td> <td {{color_status.6}}>{{active_beam.get_downvalues.5}}</td> <td {{color_status.7}}>{{active_beam.get_downvalues.6}}</td> <td {{color_status.8}}>{{active_beam.get_downvalues.7}}</td>
224 </tr>
225 <tr>
226 <td {{color_status.13}}>{{active_beam.get_upvalues.12}}</td> <td {{color_status.14}}>{{active_beam.get_upvalues.13}}</td> <td {{color_status.15}}>{{active_beam.get_upvalues.14}}</td> <td {{color_status.16}}>{{active_beam.get_upvalues.15}}</td>
227 </tr>
228 <tr>
229 <td {{color_status.13}}>{{active_beam.get_downvalues.12}}</td> <td {{color_status.14}}>{{active_beam.get_downvalues.13}}</td> <td {{color_status.15}}>{{active_beam.get_downvalues.14}}</td> <td {{color_status.16}}>{{active_beam.get_downvalues.15}}</td>
230 </tr>
231 <tr>
232 <td {{color_status.21}}>{{active_beam.get_upvalues.20}}</td> <td {{color_status.22}}>{{active_beam.get_upvalues.21}}</td> <td {{color_status.23}}>{{active_beam.get_upvalues.22}}</td> <td {{color_status.24}}>{{active_beam.get_upvalues.23}}</td>
233 </tr>
234 <tr>
235 <td {{color_status.21}}>{{active_beam.get_downvalues.20}}</td> <td {{color_status.22}}>{{active_beam.get_downvalues.21}}</td> <td {{color_status.23}}>{{active_beam.get_downvalues.22}}</td> <td {{color_status.24}}>{{active_beam.get_downvalues.23}}</td>
236 </tr>
237 <tr>
238 <td {{color_status.29}}>{{active_beam.get_upvalues.28}}</td> <td {{color_status.30}}>{{active_beam.get_upvalues.29}}</td> <td {{color_status.31}}>{{active_beam.get_upvalues.30}}</td> <td {{color_status.32}}>{{active_beam.get_upvalues.31}}</td>
239 </tr>
240 <tr>
241 <td {{color_status.29}}>{{active_beam.get_downvalues.28}}</td> <td {{color_status.30}}>{{active_beam.get_downvalues.29}}</td> <td {{color_status.31}}>{{active_beam.get_downvalues.30}}</td> <td {{color_status.32}}>{{active_beam.get_downvalues.31}}</td>
242 </tr>
243 </table>
244 </td>
245 </tr>
246 <tr>
247 <td> <b>West Quarter</b>
248 <table class="west ">
249 <tr>
250 <td {{color_status.33}}>{{active_beam.get_upvalues.32}}</td> <td {{color_status.34}}>{{active_beam.get_upvalues.33}}</td> <td {{color_status.35}}>{{active_beam.get_upvalues.34}}</td> <td {{color_status.36}}>{{active_beam.get_upvalues.35}}</td>
251 </tr>
252 <tr>
253 <td {{color_status.33}}>{{active_beam.get_downvalues.32}}</td> <td {{color_status.34}}>{{active_beam.get_downvalues.33}}</td> <td {{color_status.35}}>{{active_beam.get_downvalues.34}}</td> <td {{color_status.36}}>{{active_beam.get_downvalues.35}}</td>
254 </tr>
255 <tr>
256 <td {{color_status.41}}>{{active_beam.get_upvalues.40}}</td> <td {{color_status.42}}>{{active_beam.get_upvalues.41}}</td> <td {{color_status.43}}>{{active_beam.get_upvalues.42}}</td> <td {{color_status.44}}>{{active_beam.get_upvalues.43}}</td>
257 </tr>
258 <tr>
259 <td {{color_status.41}}>{{active_beam.get_downvalues.40}}</td> <td {{color_status.42}}>{{active_beam.get_downvalues.41}}</td> <td {{color_status.43}}>{{active_beam.get_downvalues.42}}</td> <td {{color_status.44}}>{{active_beam.get_downvalues.43}}</td>
260 </tr>
261 <tr>
262 <td {{color_status.49}}>{{active_beam.get_upvalues.48}}</td> <td {{color_status.50}}>{{active_beam.get_upvalues.49}}</td> <td {{color_status.51}}>{{active_beam.get_upvalues.50}}</td> <td {{color_status.52}}>{{active_beam.get_upvalues.51}}</td>
263 </tr>
264 <tr>
265 <td {{color_status.49}}>{{active_beam.get_downvalues.48}}</td> <td {{color_status.50}}>{{active_beam.get_downvalues.49}}</td> <td {{color_status.51}}>{{active_beam.get_downvalues.50}}</td> <td {{color_status.52}}>{{active_beam.get_downvalues.51}}</td>
266 </tr>
267 <tr>
268 <td {{color_status.57}}>{{active_beam.get_upvalues.56}}</td> <td {{color_status.58}}>{{active_beam.get_upvalues.57}}</td> <td {{color_status.59}}>{{active_beam.get_upvalues.58}}</td> <td {{color_status.60}}>{{active_beam.get_upvalues.59}}</td>
269 </tr>
270 <tr>
271 <td {{color_status.57}}>{{active_beam.get_downvalues.56}}</td> <td {{color_status.58}}>{{active_beam.get_downvalues.57}}</td> <td {{color_status.59}}>{{active_beam.get_downvalues.58}}</td> <td {{color_status.60}}>{{active_beam.get_downvalues.59}}</td>
272 </tr>
273 </table>
274 </td>
275 <td> <b>South Quarter</b>
276 <table class="south ">
277 <tr>
278 <td {{color_status.37}}>{{active_beam.get_upvalues.36}}</td> <td {{color_status.38}}>{{active_beam.get_upvalues.37}}</td> <td {{color_status.39}}>{{active_beam.get_upvalues.38}}</td> <td {{color_status.40}}>{{active_beam.get_upvalues.39}}</td>
279 </tr>
280 <tr>
281 <td {{color_status.37}}>{{active_beam.get_downvalues.36}}</td> <td {{color_status.38}}>{{active_beam.get_downvalues.37}}</td> <td {{color_status.39}}>{{active_beam.get_downvalues.38}}</td> <td {{color_status.40}}>{{active_beam.get_downvalues.39}}</td>
282 </tr>
283 <tr>
284 <td {{color_status.45}}>{{active_beam.get_upvalues.44}}</td> <td {{color_status.46}}>{{active_beam.get_upvalues.45}}</td> <td {{color_status.47}}>{{active_beam.get_upvalues.46}}</td> <td {{color_status.48}}>{{active_beam.get_upvalues.47}}</td>
285 </tr>
286 <tr>
287 <td {{color_status.45}}>{{active_beam.get_downvalues.44}}</td> <td {{color_status.46}}>{{active_beam.get_downvalues.45}}</td> <td {{color_status.47}}>{{active_beam.get_downvalues.46}}</td> <td {{color_status.48}}>{{active_beam.get_downvalues.47}}</td>
288 </tr>
289 <tr>
290 <td {{color_status.53}}>{{active_beam.get_upvalues.52}}</td> <td {{color_status.54}}>{{active_beam.get_upvalues.53}}</td> <td {{color_status.55}}>{{active_beam.get_upvalues.54}}</td> <td {{color_status.56}}>{{active_beam.get_upvalues.55}}</td>
291 </tr>
292 <tr>
293 <td {{color_status.53}}>{{active_beam.get_downvalues.52}}</td> <td {{color_status.54}}>{{active_beam.get_downvalues.53}}</td> <td {{color_status.55}}>{{active_beam.get_downvalues.54}}</td> <td {{color_status.56}}>{{active_beam.get_downvalues.55}}</td>
294 </tr>
295 <tr>
296 <td {{color_status.61}}>{{active_beam.get_upvalues.60}}</td> <td {{color_status.62}}>{{active_beam.get_upvalues.61}}</td> <td {{color_status.63}}>{{active_beam.get_upvalues.62}}</td> <td {{color_status.64}}>{{active_beam.get_upvalues.63}}</td>
297 </tr>
298 <tr>
299 <td {{color_status.61}}>{{active_beam.get_downvalues.60}}</td> <td {{color_status.62}}>{{active_beam.get_downvalues.61}}</td> <td {{color_status.63}}>{{active_beam.get_downvalues.62}}</td> <td {{color_status.64}}>{{active_beam.get_downvalues.63}}</td>
300 </tr>
301 </table>
302 </td>
303 </tr>
304 </table>
305
306
307
308 <table class="legend">
309 <tr>
310 <th colspan="2">Legend</th>
311 </tr>
312 <tr>
313 <td style="color:#ff0000;"><i>RED</i></td><td>Disconnected</td>
314 </tr>
315 <tr>
316 <td style="color:#ee902c;"><i>ORANGE</i></td><td>Connected</td>
317 </tr>
318 <tr>
319 <td style="color:#00cc00;"><i>GREEN</i></td><td>Running
320 </td>
321 </tr>
322 <!--
323 <tr>
324 <td colspan="2">
325 <button style="margin: 10px;" id="sendbeam" type="button" class="btn btn-default">
326 <span class="glyphicon glyphicon-export" aria-hidden="true"></span>
327 Change Beam</button>
328 </td>
329 </tr>
330 -->
331 </table>
332
333
334
335
336 {% else %}
337 <p><i>This ABS Configuration does not have a current active ABS Beam...<br>
338 Please send Beam List to ABS modules. </i></p>
339
340 {% endif %}
341
342
343 </div>
344
345
346
347 {% for beam in beams %}
348 <div id="menu{{forloop.counter}}" class="tab-pane fade">
349 <h3>{%if active_beam.id == beam.id%}Active Beam: {%endif%}{{beam.name}}</h3>
350 <!--<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>-->
351 <table id="abs_pattern{{forloop.counter}}" class="abs">
352 <tr>
353 <td> <b>North Quarter</b>
354 <table class="north ">
355 <tr>
356 <td {{beam.color_status.1}}>{{beam.get_upvalues.0}}</td> <td {{beam.color_status.2}}>{{beam.get_upvalues.1}}</td> <td {{beam.color_status.3}}>{{beam.get_upvalues.2}}</td> <td {{beam.color_status.4}}>{{beam.get_upvalues.3}}</td>
357 </tr>
358 <tr>
359 <td {{beam.color_status.1}}>{{beam.get_downvalues.0}}</td> <td {{beam.color_status.2}}>{{beam.get_downvalues.1}}</td> <td {{beam.color_status.3}}>{{beam.get_downvalues.2}}</td> <td {{beam.color_status.4}}>{{beam.get_downvalues.3}}</td>
360 </tr>
361 <tr>
362 <td {{beam.color_status.9}}>{{beam.get_upvalues.8}}</td> <td {{beam.color_status.10}}>{{beam.get_upvalues.9}}</td> <td {{beam.color_status.11}}>{{beam.get_upvalues.10}}</td> <td {{beam.color_status.12}}>{{beam.get_upvalues.11}}</td>
363 </tr>
364 <tr>
365 <td {{beam.color_status.9}}>{{beam.get_downvalues.8}}</td> <td {{beam.color_status.10}}>{{beam.get_downvalues.9}}</td> <td {{beam.color_status.11}}>{{beam.get_downvalues.10}}</td> <td {{beam.color_status.12}}>{{beam.get_downvalues.11}}</td>
366 </tr>
367 <tr>
368 <td {{beam.color_status.17}}>{{beam.get_upvalues.16}}</td> <td {{beam.color_status.18}}>{{beam.get_upvalues.17}}</td> <td {{beam.color_status.19}}>{{beam.get_upvalues.18}}</td> <td {{beam.color_status.20}}>{{beam.get_upvalues.19}}</td>
369 </tr>
370 <tr>
371 <td {{beam.color_status.17}}>{{beam.get_downvalues.16}}</td> <td {{beam.color_status.18}}>{{beam.get_downvalues.17}}</td> <td {{beam.color_status.19}}>{{beam.get_downvalues.18}}</td> <td {{beam.color_status.20}}>{{beam.get_downvalues.19}}</td>
372 </tr>
373 <tr>
374 <td {{beam.color_status.25}}>{{beam.get_upvalues.24}}</td> <td {{beam.color_status.26}}>{{beam.get_upvalues.25}}</td> <td {{beam.color_status.27}}>{{beam.get_upvalues.26}}</td> <td {{beam.color_status.28}}>{{beam.get_upvalues.27}}</td>
375 </tr>
376 <tr>
377 <td {{beam.color_status.25}}>{{beam.get_downvalues.24}}</td> <td {{beam.color_status.26}}>{{beam.get_downvalues.25}}</td> <td {{beam.color_status.27}}>{{beam.get_downvalues.26}}</td> <td {{beam.color_status.28}}>{{beam.get_downvalues.27}}</td>
378 </tr>
379 </table>
380 </td>
381 <td> <b>East Quarter</b>
382 <table class="east ">
383 <tr>
384 <td {{beam.color_status.5}}>{{beam.get_upvalues.4}}</td> <td {{beam.color_status.6}}>{{beam.get_upvalues.5}}</td> <td {{beam.color_status.7}}>{{beam.get_upvalues.6}}</td> <td {{beam.color_status.8}}>{{beam.get_upvalues.7}}</td>
385 </tr>
386 <tr>
387 <td {{beam.color_status.5}}>{{beam.get_downvalues.4}}</td> <td {{beam.color_status.6}}>{{beam.get_downvalues.5}}</td> <td {{beam.color_status.7}}>{{beam.get_downvalues.6}}</td> <td {{beam.color_status.8}}>{{beam.get_downvalues.7}}</td>
388 </tr>
389 <tr>
390 <td {{beam.color_status.13}}>{{beam.get_upvalues.12}}</td> <td {{beam.color_status.14}}>{{beam.get_upvalues.13}}</td> <td {{beam.color_status.15}}>{{beam.get_upvalues.14}}</td> <td {{beam.color_status.16}}>{{beam.get_upvalues.15}}</td>
391 </tr>
392 <tr>
393 <td {{beam.color_status.13}}>{{beam.get_downvalues.12}}</td> <td {{beam.color_status.14}}>{{beam.get_downvalues.13}}</td> <td {{beam.color_status.15}}>{{beam.get_downvalues.14}}</td> <td {{beam.color_status.16}}>{{beam.get_downvalues.15}}</td>
394 </tr>
395 <tr>
396 <td {{beam.color_status.21}}>{{beam.get_upvalues.20}}</td> <td {{beam.color_status.22}}>{{beam.get_upvalues.21}}</td> <td {{beam.color_status.23}}>{{beam.get_upvalues.22}}</td> <td {{beam.color_status.24}}>{{beam.get_upvalues.23}}</td>
397 </tr>
398 <tr>
399 <td {{beam.color_status.21}}>{{beam.get_downvalues.20}}</td> <td {{beam.color_status.22}}>{{beam.get_downvalues.21}}</td> <td {{beam.color_status.23}}>{{beam.get_downvalues.22}}</td> <td {{beam.color_status.24}}>{{beam.get_downvalues.23}}</td>
400 </tr>
401 <tr>
402 <td {{beam.color_status.29}}>{{beam.get_upvalues.28}}</td> <td {{beam.color_status.30}}>{{beam.get_upvalues.29}}</td> <td {{beam.color_status.31}}>{{beam.get_upvalues.30}}</td> <td {{beam.color_status.32}}>{{beam.get_upvalues.31}}</td>
403 </tr>
404 <tr>
405 <td {{beam.color_status.29}}>{{beam.get_downvalues.28}}</td> <td {{beam.color_status.30}}>{{beam.get_downvalues.29}}</td> <td {{beam.color_status.31}}>{{beam.get_downvalues.30}}</td> <td {{beam.color_status.32}}>{{beam.get_downvalues.31}}</td>
406 </tr>
407 </table>
408 </td>
409 </tr>
410 <tr>
411 <td> <b>West Quarter</b>
412 <table class="west ">
413 <tr>
414 <td {{beam.color_status.33}}>{{beam.get_upvalues.32}}</td> <td {{beam.color_status.34}}>{{beam.get_upvalues.33}}</td> <td {{beam.color_status.35}}>{{beam.get_upvalues.34}}</td> <td {{beam.color_status.36}}>{{beam.get_upvalues.35}}</td>
415 </tr>
416 <tr>
417 <td {{beam.color_status.33}}>{{beam.get_downvalues.32}}</td> <td {{beam.color_status.34}}>{{beam.get_downvalues.33}}</td> <td {{beam.color_status.35}}>{{beam.get_downvalues.34}}</td> <td {{beam.color_status.36}}>{{beam.get_downvalues.35}}</td>
418 </tr>
419 <tr>
420 <td {{beam.color_status.41}}>{{beam.get_upvalues.40}}</td> <td {{beam.color_status.42}}>{{beam.get_upvalues.41}}</td> <td {{beam.color_status.43}}>{{beam.get_upvalues.42}}</td> <td {{beam.color_status.44}}>{{beam.get_upvalues.43}}</td>
421 </tr>
422 <tr>
423 <td {{beam.color_status.41}}>{{beam.get_downvalues.40}}</td> <td {{beam.color_status.42}}>{{beam.get_downvalues.41}}</td> <td {{beam.color_status.43}}>{{beam.get_downvalues.42}}</td> <td {{beam.color_status.44}}>{{beam.get_downvalues.43}}</td>
424 </tr>
425 <tr>
426 <td {{beam.color_status.49}}>{{beam.get_upvalues.48}}</td> <td {{beam.color_status.50}}>{{beam.get_upvalues.49}}</td> <td {{beam.color_status.51}}>{{beam.get_upvalues.50}}</td> <td {{beam.color_status.52}}>{{beam.get_upvalues.51}}</td>
427 </tr>
428 <tr>
429 <td {{beam.color_status.49}}>{{beam.get_downvalues.48}}</td> <td {{beam.color_status.50}}>{{beam.get_downvalues.49}}</td> <td {{beam.color_status.51}}>{{beam.get_downvalues.50}}</td> <td {{beam.color_status.52}}>{{beam.get_downvalues.51}}</td>
430 </tr>
431 <tr>
432 <td {{beam.color_status.57}}>{{beam.get_upvalues.56}}</td> <td {{beam.color_status.58}}>{{beam.get_upvalues.57}}</td> <td {{beam.color_status.59}}>{{beam.get_upvalues.58}}</td> <td {{beam.color_status.60}}>{{beam.get_upvalues.59}}</td>
433 </tr>
434 <tr>
435 <td {{beam.color_status.57}}>{{beam.get_downvalues.56}}</td> <td {{beam.color_status.58}}>{{beam.get_downvalues.57}}</td> <td {{beam.color_status.59}}>{{beam.get_downvalues.58}}</td> <td {{beam.color_status.60}}>{{beam.get_downvalues.59}}</td>
436 </tr>
437 </table>
438 </td>
439 <td> <b>South Quarter</b>
440 <table class="south ">
441 <tr>
442 <td {{beam.color_status.37}}>{{beam.get_upvalues.36}}</td> <td {{beam.color_status.38}}>{{beam.get_upvalues.37}}</td> <td {{beam.color_status.39}}>{{beam.get_upvalues.38}}</td> <td {{beam.color_status.40}}>{{beam.get_upvalues.39}}</td>
443 </tr>
444 <tr>
445 <td {{beam.color_status.37}}>{{beam.get_downvalues.36}}</td> <td {{beam.color_status.38}}>{{beam.get_downvalues.37}}</td> <td {{beam.color_status.39}}>{{beam.get_downvalues.38}}</td> <td {{beam.color_status.40}}>{{beam.get_downvalues.39}}</td>
446 </tr>
447 <tr>
448 <td {{beam.color_status.45}}>{{beam.get_upvalues.44}}</td> <td {{beam.color_status.46}}>{{beam.get_upvalues.45}}</td> <td {{beam.color_status.47}}>{{beam.get_upvalues.46}}</td> <td {{beam.color_status.48}}>{{beam.get_upvalues.47}}</td>
449 </tr>
450 <tr>
451 <td {{beam.color_status.45}}>{{beam.get_downvalues.44}}</td> <td {{beam.color_status.46}}>{{beam.get_downvalues.45}}</td> <td {{beam.color_status.47}}>{{beam.get_downvalues.46}}</td> <td {{beam.color_status.48}}>{{beam.get_downvalues.47}}</td>
452 </tr>
453 <tr>
454 <td {{beam.color_status.53}}>{{beam.get_upvalues.52}}</td> <td {{beam.color_status.54}}>{{beam.get_upvalues.53}}</td> <td {{beam.color_status.55}}>{{beam.get_upvalues.54}}</td> <td {{beam.color_status.56}}>{{beam.get_upvalues.55}}</td>
455 </tr>
456 <tr>
457 <td {{beam.color_status.53}}>{{beam.get_downvalues.52}}</td> <td {{beam.color_status.54}}>{{beam.get_downvalues.53}}</td> <td {{beam.color_status.55}}>{{beam.get_downvalues.54}}</td> <td {{beam.color_status.56}}>{{beam.get_downvalues.55}}</td>
458 </tr>
459 <tr>
460 <td {{beam.color_status.61}}>{{beam.get_upvalues.60}}</td> <td {{beam.color_status.62}}>{{beam.get_upvalues.61}}</td> <td {{beam.color_status.63}}>{{beam.get_upvalues.62}}</td> <td {{beam.color_status.64}}>{{beam.get_upvalues.63}}</td>
461 </tr>
462 <tr>
463 <td {{beam.color_status.61}}>{{beam.get_downvalues.60}}</td> <td {{beam.color_status.62}}>{{beam.get_downvalues.61}}</td> <td {{beam.color_status.63}}>{{beam.get_downvalues.62}}</td> <td {{beam.color_status.64}}>{{beam.get_downvalues.63}}</td>
464 </tr>
465 </table>
466 </td>
467 </tr>
468 </table>
469
470 {% if active_beam.id != beam.id %}
471 <div style="vertical-align: top; display:inline-block;">
472 <button style="" id="sendbeam" type="button" class="btn btn-default">
473 <span class="glyphicon glyphicon-export" aria-hidden="true"></span>
474 Change Beam</button>
475 </div>
476 {% endif %}
477
478
479
480
481 {% if active_beam %}
482 {% if active_beam.id == beam.id %}
483 <table class="legend">
484 <tr>
485 <th colspan="2">Legend</th>
486 </tr>
487 <tr>
488 <td style="color:#ff0000;"><i>RED</i></td><td>Disconnected</td>
489 </tr>
490 <tr>
491 <td style="color:#ee902c;"><i>ORANGE</i></td><td>Connected</td>
492 </tr>
493 <tr>
494 <td style="color:#00cc00;"><i>GREEN</i></td><td>Running
495 </td>
496 </tr>
497 </table>
498
499 {% endif %}
500 {% endif %}
501
502
503 </div>
504
505
506 {% endfor %}
507
508
509
510 </div>
511 </div>
512
513
209
514
210
515
211 <script>
516 <script>
212 $(document).ready(function() {
517 $(document).ready(function() {
213
518
214 {% for beam in beams %}
519
215 $( "#button-{{ forloop.counter }}" ).click(function() {
216 //$(this).addClass('active');
217
218 var beam_upvalues = {{beam.get_upvalues}};
219 var beam_downvalues = {{beam.get_downvalues}};
220 //alert(beam_upvalues)
221 var table = document.getElementById('abs_pattern');
222 var cells = table.getElementsByTagName('td');
223 //alert(cells[99].textContent);
224
225 for (var i = 1, len = 30; i < len; i++) {
226 if ((i > 24) && (i<29)){
227 cells[i].innerHTML = beam_upvalues[i-1].toFixed(1);
228 cells[i+4].innerHTML = beam_downvalues[i-1].toFixed(1);
229 }
230 else if ((i > 16) && (i<21)){
231 cells[i].innerHTML = beam_upvalues[i-1].toFixed(1);
232 cells[i+4].innerHTML = beam_downvalues[i-1].toFixed(1);
233 }
234 else if ((i > 8) && (i<13)){
235 cells[i].innerHTML = beam_upvalues[i-1].toFixed(1);
236 cells[i+4].innerHTML = beam_downvalues[i-1].toFixed(1);
237 }
238 else if (i < 5) {
239 cells[i].innerHTML = beam_upvalues[i-1].toFixed(1);
240 cells[i+4].innerHTML = beam_downvalues[i-1].toFixed(1);
241 }
242 }
243
244 for (var i = 34, len = 63; i < len; i++) {
245 if ((i > 57) && (i<62)) {
246 cells[i].innerHTML = beam_upvalues[i-30].toFixed(1);
247 cells[i+4].innerHTML = beam_downvalues[i-30].toFixed(1);
248 }
249 if ((i > 49) && (i<54)) {
250 cells[i].innerHTML = beam_upvalues[i-30].toFixed(1);
251 cells[i+4].innerHTML = beam_downvalues[i-30].toFixed(1);
252 }
253 else if ((i > 41) && (i<46)) {
254 cells[i].innerHTML = beam_upvalues[i-30].toFixed(1);
255 cells[i+4].innerHTML = beam_downvalues[i-30].toFixed(1);
256 }
257 else if (i < 38) {
258 cells[i].innerHTML = beam_upvalues[i-30].toFixed(1);
259 cells[i+4].innerHTML = beam_downvalues[i-30].toFixed(1);
260 }
261 }
262
263 for (var i = 67, len = 96; i < len; i++) {
264 if ((i > 90) && (i<95)) {
265 cells[i].innerHTML = beam_upvalues[i-35].toFixed(1);
266 cells[i+4].innerHTML = beam_downvalues[i-35].toFixed(1);
267 }
268 else if ((i > 82) && (i<87)) {
269 cells[i].innerHTML = beam_upvalues[i-35].toFixed(1);
270 cells[i+4].innerHTML = beam_downvalues[i-35].toFixed(1);
271 }
272 else if ((i > 74) && (i<79)) {
273 cells[i].innerHTML = beam_upvalues[i-35].toFixed(1);
274 cells[i+4].innerHTML = beam_downvalues[i-35].toFixed(1);
275 }
276 else if (i < 71) {
277 cells[i].innerHTML = beam_upvalues[i-35].toFixed(1);
278 cells[i+4].innerHTML = beam_downvalues[i-35].toFixed(1);
279 }
280 }
281
282 for (var i = 100, len = 129; i < len; i++) {
283 if ((i > 123) && (i<128)) {
284 cells[i].innerHTML = beam_upvalues[i-64].toFixed(1);
285 cells[i+4].innerHTML = beam_downvalues[i-64].toFixed(1);
286 }
287 else if ((i > 115) && (i<120)) {
288 cells[i].innerHTML = beam_upvalues[i-64].toFixed(1);
289 cells[i+4].innerHTML = beam_downvalues[i-64].toFixed(1);
290 }
291 else if ((i > 107) && (i<112)) {
292 cells[i].innerHTML = beam_upvalues[i-64].toFixed(1);
293 cells[i+4].innerHTML = beam_downvalues[i-64].toFixed(1);
294 }
295 else if (i < 104) {
296 cells[i].innerHTML = beam_upvalues[i-64].toFixed(1);
297 cells[i+4].innerHTML = beam_downvalues[i-64].toFixed(1);
298 }
299 }
300
301 //$('#button-1').addClass("active");
302
303 });
304
305 {% endfor %}
306
307
308
309
310 //})
311
312 //function ChangeColor() {
313 // document.getElementById("button_1").style.backgroundColor = "#2c3e50";
314 // document.getElementById("button_1").style.color = "#ecf0f1";
315 //}
316 });
520 });
317 </script>
521 </script>
318
522
319
523
320
524
321 <br>
525
322
526
323 <table id="abs_pattern" class="abs">
324 <tr>
325 <td> <b>North Quarter</b>
326 <table class="north ">
327 <tr>
328 <td>{{beams.0.get_upvalues.0}}</td> <td>{{beams.0.get_upvalues.1}}</td> <td>{{beams.0.get_upvalues.2}}</td> <td>{{beams.0.get_upvalues.3}}</td>
329 </tr>
330 <tr>
331 <td>{{beams.0.get_downvalues.0}}</td> <td>{{beams.0.get_downvalues.1}}</td> <td>{{beams.0.get_downvalues.2}}</td> <td>{{beams.0.get_downvalues.3}}</td>
332 </tr>
333 <tr>
334 <td>{{beams.0.get_upvalues.8}}</td> <td>{{beams.0.get_upvalues.9}}</td> <td>{{beams.0.get_upvalues.10}}</td> <td>{{beams.0.get_upvalues.11}}</td>
335 </tr>
336 <tr>
337 <td>{{beams.0.get_downvalues.8}}</td> <td>{{beams.0.get_downvalues.9}}</td> <td>{{beams.0.get_downvalues.10}}</td> <td>{{beams.0.get_downvalues.11}}</td>
338 </tr>
339 <tr>
340 <td>{{beams.0.get_upvalues.16}}</td> <td>{{beams.0.get_upvalues.17}}</td> <td>{{beams.0.get_upvalues.18}}</td> <td>{{beams.0.get_upvalues.19}}</td>
341 </tr>
342 <tr>
343 <td>{{beams.0.get_downvalues.16}}</td> <td>{{beams.0.get_downvalues.17}}</td> <td>{{beams.0.get_downvalues.18}}</td> <td>{{beams.0.get_downvalues.19}}</td>
344 </tr>
345 <tr>
346 <td>{{beams.0.get_upvalues.24}}</td> <td>{{beams.0.get_upvalues.25}}</td> <td>{{beams.0.get_upvalues.26}}</td> <td>{{beams.0.get_upvalues.27}}</td>
347 </tr>
348 <tr>
349 <td>{{beams.0.get_downvalues.24}}</td> <td>{{beams.0.get_downvalues.25}}</td> <td>{{beams.0.get_downvalues.26}}</td> <td>{{beams.0.get_downvalues.27}}</td>
350 </tr>
351 </table>
352 </td>
353 <td> <b>East Quarter</b>
354 <table class="east ">
355 <tr>
356 <td>{{beams.0.get_upvalues.4}}</td> <td>{{beams.0.get_upvalues.5}}</td> <td>{{beams.0.get_upvalues.6}}</td> <td>{{beams.0.get_upvalues.7}}</td>
357 </tr>
358 <tr>
359 <td>{{beams.0.get_downvalues.4}}</td> <td>{{beams.0.get_downvalues.5}}</td> <td>{{beams.0.get_downvalues.6}}</td> <td>{{beams.0.get_downvalues.7}}</td>
360 </tr>
361 <tr>
362 <td>{{beams.0.get_upvalues.12}}</td> <td>{{beams.0.get_upvalues.13}}</td> <td>{{beams.0.get_upvalues.14}}</td> <td>{{beams.0.get_upvalues.15}}</td>
363 </tr>
364 <tr>
365 <td>{{beams.0.get_downvalues.12}}</td> <td>{{beams.0.get_downvalues.13}}</td> <td>{{beams.0.get_downvalues.14}}</td> <td>{{beams.0.get_downvalues.15}}</td>
366 </tr>
367 <tr>
368 <td>{{beams.0.get_upvalues.20}}</td> <td>{{beams.0.get_upvalues.21}}</td> <td>{{beams.0.get_upvalues.22}}</td> <td>{{beams.0.get_upvalues.23}}</td>
369 </tr>
370 <tr>
371 <td>{{beams.0.get_downvalues.20}}</td> <td>{{beams.0.get_downvalues.21}}</td> <td>{{beams.0.get_downvalues.22}}</td> <td>{{beams.0.get_downvalues.23}}</td>
372 </tr>
373 <tr>
374 <td>{{beams.0.get_upvalues.28}}</td> <td>{{beams.0.get_upvalues.29}}</td> <td>{{beams.0.get_upvalues.30}}</td> <td>{{beams.0.get_upvalues.31}}</td>
375 </tr>
376 <tr>
377 <td>{{beams.0.get_downvalues.28}}</td> <td>{{beams.0.get_downvalues.29}}</td> <td>{{beams.0.get_downvalues.30}}</td> <td>{{beams.0.get_downvalues.31}}</td>
378 </tr>
379 </table>
380 </td>
381 </tr>
382 <tr>
383 <td> <b>West Quarter</b>
384 <table class="west ">
385 <tr>
386 <td>{{beams.0.get_upvalues.32}}</td> <td>{{beams.0.get_upvalues.33}}</td> <td>{{beams.0.get_upvalues.34}}</td> <td>{{beams.0.get_upvalues.35}}</td>
387 </tr>
388 <tr>
389 <td>{{beams.0.get_downvalues.32}}</td> <td>{{beams.0.get_downvalues.33}}</td> <td>{{beams.0.get_downvalues.34}}</td> <td>{{beams.0.get_downvalues.35}}</td>
390 </tr>
391 <tr>
392 <td>{{beams.0.get_upvalues.40}}</td> <td>{{beams.0.get_upvalues.41}}</td> <td>{{beams.0.get_upvalues.42}}</td> <td>{{beams.0.get_upvalues.43}}</td>
393 </tr>
394 <tr>
395 <td>{{beams.0.get_downvalues.40}}</td> <td>{{beams.0.get_downvalues.41}}</td> <td>{{beams.0.get_downvalues.42}}</td> <td>{{beams.0.get_downvalues.43}}</td>
396 </tr>
397 <tr>
398 <td>{{beams.0.get_upvalues.48}}</td> <td>{{beams.0.get_upvalues.49}}</td> <td>{{beams.0.get_upvalues.50}}</td> <td>{{beams.0.get_upvalues.51}}</td>
399 </tr>
400 <tr>
401 <td>{{beams.0.get_downvalues.48}}</td> <td>{{beams.0.get_downvalues.49}}</td> <td>{{beams.0.get_downvalues.50}}</td> <td>{{beams.0.get_downvalues.51}}</td>
402 </tr>
403 <tr>
404 <td>{{beams.0.get_upvalues.56}}</td> <td>{{beams.0.get_upvalues.57}}</td> <td>{{beams.0.get_upvalues.58}}</td> <td>{{beams.0.get_upvalues.59}}</td>
405 </tr>
406 <tr>
407 <td>{{beams.0.get_downvalues.56}}</td> <td>{{beams.0.get_downvalues.57}}</td> <td>{{beams.0.get_downvalues.58}}</td> <td>{{beams.0.get_downvalues.59}}</td>
408 </tr>
409 </table>
410 </td>
411 <td> <b>South Quarter</b>
412 <table class="south ">
413 <tr>
414 <td>{{beams.0.get_upvalues.36}}</td> <td>{{beams.0.get_upvalues.37}}</td> <td>{{beams.0.get_upvalues.38}}</td> <td>{{beams.0.get_upvalues.39}}</td>
415 </tr>
416 <tr>
417 <td>{{beams.0.get_downvalues.36}}</td> <td>{{beams.0.get_downvalues.37}}</td> <td>{{beams.0.get_downvalues.38}}</td> <td>{{beams.0.get_downvalues.39}}</td>
418 </tr>
419 <tr>
420 <td>{{beams.0.get_upvalues.44}}</td> <td>{{beams.0.get_upvalues.45}}</td> <td>{{beams.0.get_upvalues.46}}</td> <td>{{beams.0.get_upvalues.47}}</td>
421 </tr>
422 <tr>
423 <td>{{beams.0.get_downvalues.44}}</td> <td>{{beams.0.get_downvalues.45}}</td> <td>{{beams.0.get_downvalues.46}}</td> <td>{{beams.0.get_downvalues.47}}</td>
424 </tr>
425 <tr>
426 <td>{{beams.0.get_upvalues.52}}</td> <td>{{beams.0.get_upvalues.53}}</td> <td>{{beams.0.get_upvalues.54}}</td> <td>{{beams.0.get_upvalues.55}}</td>
427 </tr>
428 <tr>
429 <td>{{beams.0.get_downvalues.52}}</td> <td>{{beams.0.get_downvalues.53}}</td> <td>{{beams.0.get_downvalues.54}}</td> <td>{{beams.0.get_downvalues.55}}</td>
430 </tr>
431 <tr>
432 <td>{{beams.0.get_upvalues.60}}</td> <td>{{beams.0.get_upvalues.61}}</td> <td>{{beams.0.get_upvalues.62}}</td> <td>{{beams.0.get_upvalues.63}}</td>
433 </tr>
434 <tr>
435 <td>{{beams.0.get_downvalues.60}}</td> <td>{{beams.0.get_downvalues.61}}</td> <td>{{beams.0.get_downvalues.62}}</td> <td>{{beams.0.get_downvalues.63}}</td>
436 </tr>
437 </table>
438 </td>
439 </tr>
440 </table>
441
442 <table class="legend">
443 <tr>
444 <th colspan="2">Legend</th>
445 </tr>
446 <tr>
447 <td style="color:#ff0000;"><i>RED</i></td><td>Disconnected</td>
448 </tr>
449 <tr>
450 <td style="color:#ee902c;"><i>ORANGE</i></td><td>Connected</td>
451 </tr>
452 <tr>
453 <td style="color:#00cc00;"><i>GREEN</i></td><td>Running</td>
454 </tr>
455 </table>
456
527
457 {% else %}
528 {% else %}
458 <p style="color:#b4bcc2; margin-left: 5%;"><i>No Beams...</i></p>
529 <p style="color:#b4bcc2; margin-left: 5%;"><i>No Beams...</i></p>
459 {% endif %}
530 {% endif %}
460
531
461
532
462 {% endblock %}
533 {% endblock %}
@@ -1,368 +1,373
1 from django.shortcuts import render_to_response
1 from django.shortcuts import render_to_response
2 from django.template import RequestContext
2 from django.template import RequestContext
3 from django.shortcuts import redirect, render, get_object_or_404
3 from django.shortcuts import redirect, render, get_object_or_404
4 from django.contrib import messages
4 from django.contrib import messages
5 from django.conf import settings
5 from django.conf import settings
6 from django.http import HttpResponse
6 from django.http import HttpResponse
7
7
8 from datetime import datetime
8 from datetime import datetime
9 from time import sleep
9 from time import sleep
10 import os
10 import os
11
11
12 from apps.main.models import Device, Configuration
12 from apps.main.models import Device, Configuration
13 from apps.main.views import sidebar
13 from apps.main.views import sidebar
14
14
15 from .models import ABSConfiguration, ABSBeam
15 from .models import ABSConfiguration, ABSBeam
16 from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm
16 from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm
17
17
18 from .utils.overJroShow import overJroShow
18 from .utils.overJroShow import overJroShow
19 from .utils.OverJRO import OverJRO
19 from .utils.OverJRO import OverJRO
20 # Create your views here.
20 # Create your views here.
21 import json, ast
21 import json, ast
22
22
23
23
24 def get_values_from_form(form_data):
24 def get_values_from_form(form_data):
25
25
26 sublistup = []
26 sublistup = []
27 sublistdown = []
27 sublistdown = []
28 subtxlistup = []
28 subtxlistup = []
29 subtxlistdown = []
29 subtxlistdown = []
30 subrxlistup = []
30 subrxlistup = []
31 subrxlistdown = []
31 subrxlistdown = []
32
32
33 up_values_list = []
33 up_values_list = []
34 down_values_list = []
34 down_values_list = []
35 up_txvalues_list = []
35 up_txvalues_list = []
36 down_txvalues_list = []
36 down_txvalues_list = []
37 up_rxvalues_list = []
37 up_rxvalues_list = []
38 down_rxvalues_list = []
38 down_rxvalues_list = []
39
39
40 values_list = {}
40 values_list = {}
41 cont = 1
41 cont = 1
42
42
43 for i in range(1,65):
43 for i in range(1,65):
44 x = float(form_data['abs_up'+str(i)])
44 x = float(form_data['abs_up'+str(i)])
45 y = float(form_data['abs_down'+str(i)])
45 y = float(form_data['abs_down'+str(i)])
46 sublistup.append(x)
46 sublistup.append(x)
47 sublistdown.append(y)
47 sublistdown.append(y)
48
48
49 if str(i) in form_data.getlist('uptx_checks'):
49 if str(i) in form_data.getlist('uptx_checks'):
50 subtxlistup.append(1)
50 subtxlistup.append(1)
51 else:
51 else:
52 subtxlistup.append(0)
52 subtxlistup.append(0)
53 if str(i) in form_data.getlist('downtx_checks'):
53 if str(i) in form_data.getlist('downtx_checks'):
54 subtxlistdown.append(1)
54 subtxlistdown.append(1)
55 else:
55 else:
56 subtxlistdown.append(0)
56 subtxlistdown.append(0)
57
57
58 if str(i) in form_data.getlist('uprx_checks'):
58 if str(i) in form_data.getlist('uprx_checks'):
59 subrxlistup.append(1)
59 subrxlistup.append(1)
60 else:
60 else:
61 subrxlistup.append(0)
61 subrxlistup.append(0)
62 if str(i) in form_data.getlist('downrx_checks'):
62 if str(i) in form_data.getlist('downrx_checks'):
63 subrxlistdown.append(1)
63 subrxlistdown.append(1)
64 else:
64 else:
65 subrxlistdown.append(0)
65 subrxlistdown.append(0)
66
66
67 cont = cont+1
67 cont = cont+1
68
68
69 if cont == 9:
69 if cont == 9:
70 up_values_list.append(sublistup)
70 up_values_list.append(sublistup)
71 down_values_list.append(sublistdown)
71 down_values_list.append(sublistdown)
72 sublistup = []
72 sublistup = []
73 sublistdown = []
73 sublistdown = []
74
74
75 up_txvalues_list.append(subtxlistup)
75 up_txvalues_list.append(subtxlistup)
76 down_txvalues_list.append(subtxlistdown)
76 down_txvalues_list.append(subtxlistdown)
77 subtxlistup = []
77 subtxlistup = []
78 subtxlistdown = []
78 subtxlistdown = []
79 up_rxvalues_list.append(subrxlistup)
79 up_rxvalues_list.append(subrxlistup)
80 down_rxvalues_list.append(subrxlistdown)
80 down_rxvalues_list.append(subrxlistdown)
81 subrxlistup = []
81 subrxlistup = []
82 subrxlistdown = []
82 subrxlistdown = []
83 cont = 1
83 cont = 1
84
84
85
85
86 list_uesup = []
86 list_uesup = []
87 list_uesdown = []
87 list_uesdown = []
88 for i in range(1,5):
88 for i in range(1,5):
89 if form_data['ues_up'+str(i)] == '':
89 if form_data['ues_up'+str(i)] == '':
90 list_uesup.append(0.0)
90 list_uesup.append(0.0)
91 else:
91 else:
92 list_uesup.append(float(form_data['ues_up'+str(i)]))
92 list_uesup.append(float(form_data['ues_up'+str(i)]))
93
93
94 if form_data['ues_down'+str(i)] == '':
94 if form_data['ues_down'+str(i)] == '':
95 list_uesdown.append(0.0)
95 list_uesdown.append(0.0)
96 else:
96 else:
97 list_uesdown.append(float(form_data['ues_down'+str(i)]))
97 list_uesdown.append(float(form_data['ues_down'+str(i)]))
98
98
99 onlyrx_list = form_data.getlist('onlyrx')
99 onlyrx_list = form_data.getlist('onlyrx')
100 only_rx = {}
100 only_rx = {}
101 if '1' in onlyrx_list:
101 if '1' in onlyrx_list:
102 only_rx['up'] = True
102 only_rx['up'] = True
103 else:
103 else:
104 only_rx['up'] = False
104 only_rx['up'] = False
105 if '2' in onlyrx_list:
105 if '2' in onlyrx_list:
106 only_rx['down'] = True
106 only_rx['down'] = True
107 else:
107 else:
108 only_rx['down'] = False
108 only_rx['down'] = False
109
109
110 antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list}
110 antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list}
111 tx = {'up': up_txvalues_list, 'down': down_txvalues_list}
111 tx = {'up': up_txvalues_list, 'down': down_txvalues_list}
112 rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list}
112 rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list}
113 ues = {'up': list_uesup, 'down': list_uesdown}
113 ues = {'up': list_uesup, 'down': list_uesdown}
114 name = str(form_data['beam_name'])
114 name = str(form_data['beam_name'])
115
115
116 beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx}
116 beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx}
117
117
118 return beam_data
118 return beam_data
119
119
120
120
121
121
122 def abs_conf(request, id_conf):
122 def abs_conf(request, id_conf):
123
123
124 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
124 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
125 beams = ABSBeam.objects.filter(abs_conf=conf)
125 beams = ABSBeam.objects.filter(abs_conf=conf)
126 #beams_dict = ast.literal_eval(conf.beams)
126 active_beam_id = json.loads(conf.active_beam)
127 #beams = []
127
128 #for beam_id in range(1,len(beams_dict)+1):
128 #------------Colors for Active Beam:-------------
129 # beam = ABSBeam.objects.get(pk=beams_dict['beam'+str(beam_id)])
129 modules_status = json.loads(conf.module_status)
130 # beams.append(beam)
130
131
131 color_status = {}
132 #beams_id = ast.literal_eval(conf.beams)
132 for status in modules_status:
133
133 if modules_status[status] == 2: #Running background-color: #ff0000;
134 ip=conf.device.ip_address
134 color_status[status] = 'bgcolor=#00cc00'
135 port=conf.device.port_address
135 elif modules_status[status] == 1: #Connected background-color: #ee902c;
136 color_status[status] = 'bgcolor=#ee902c'
137 else: #Disconnected background-color: #00cc00;
138 color_status[status] = 'bgcolor=#FF0000'
139 #------------------------------------------------
136
140
137 kwargs = {}
141 kwargs = {}
138 kwargs['status'] = conf.device.get_status_display()
142 kwargs['status'] = conf.device.get_status_display()
139
143
140
144
141 kwargs['dev_conf'] = conf
145 kwargs['dev_conf'] = conf
142 kwargs['dev_conf_keys'] = ['name',]
146 kwargs['dev_conf_keys'] = ['name',]
143
147
144 kwargs['title'] = 'ABS Configuration'
148 kwargs['title'] = 'ABS Configuration'
145 kwargs['suptitle'] = 'Details'
149 kwargs['suptitle'] = 'Details'
146 kwargs['no_play'] = True
150 kwargs['no_play'] = True
147
151
148 kwargs['button'] = 'Edit Configuration'
152 kwargs['button'] = 'Edit Configuration'
149
153 #------------------Active Beam-----------------------
150 #kwargs['no_play'] = True
154 try:
151 #kwargs['beams_id'] = beams_id
155 active_beam_id = active_beam_id['active_beam']
156 active_beam = ABSBeam.objects.get(pk=active_beam_id)
157 kwargs['active_beam'] = active_beam
158 for beam in beams:
159 if beam.id == active_beam.id:
160 beam.color_status=color_status
161 except:
162 active_beam = ''
163 #----------------------------------------------------
152 kwargs['beams'] = beams
164 kwargs['beams'] = beams
153 kwargs['beam_selector'] = 0
165 kwargs['modules_status'] = modules_status
154 #kwargs['my_data'] = simplejson.dumps(beams)
166 kwargs['color_status'] = color_status
155
167
156 kwargs['only_stop'] = True
168 kwargs['only_stop'] = True
157
169
158 ###### SIDEBAR ######
170 ###### SIDEBAR ######
159 kwargs.update(sidebar(conf=conf))
171 kwargs.update(sidebar(conf=conf))
160
172
161 return render(request, 'abs_conf.html', kwargs)
173 return render(request, 'abs_conf.html', kwargs)
162
174
163 def abs_conf_edit(request, id_conf):
175 def abs_conf_edit(request, id_conf):
164
176
165 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
177 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
166 #beams_list = ast.literal_eval(conf.beams)
178
167 #i = 1
168 #beams = []
169 #for b in beams_list:
170 # beam = ABSBeam.objects.get(pk=beams_list['beam'+str(i)])
171 # beams.append(beam)
172 # i=i+1
173
174 beams = ABSBeam.objects.filter(abs_conf=conf)
179 beams = ABSBeam.objects.filter(abs_conf=conf)
175 print beams
180 print beams
176
181
177 if request.method=='GET':
182 if request.method=='GET':
178 form = ABSConfigurationForm(instance=conf)
183 form = ABSConfigurationForm(instance=conf)
179
184
180 if request.method=='POST':
185 if request.method=='POST':
181 form = ABSConfigurationForm(request.POST, instance=conf)
186 form = ABSConfigurationForm(request.POST, instance=conf)
182
187
183 if form.is_valid():
188 if form.is_valid():
184 conf = form.save(commit=False)
189 conf = form.save(commit=False)
185 conf.save()
190 conf.save()
186 return redirect('url_abs_conf', id_conf=conf.id)
191 return redirect('url_abs_conf', id_conf=conf.id)
187
192
188 ###### SIDEBAR ######
193 ###### SIDEBAR ######
189 kwargs = {}
194 kwargs = {}
190
195
191 kwargs['dev_conf'] = conf
196 kwargs['dev_conf'] = conf
192 #kwargs['id_dev'] = conf.id
197 #kwargs['id_dev'] = conf.id
193 kwargs['id_conf'] = conf.id
198 kwargs['id_conf'] = conf.id
194 kwargs['form'] = form
199 kwargs['form'] = form
195 kwargs['abs_beams'] = beams
200 kwargs['abs_beams'] = beams
196 kwargs['title'] = 'Device Configuration'
201 kwargs['title'] = 'Device Configuration'
197 kwargs['suptitle'] = 'Edit'
202 kwargs['suptitle'] = 'Edit'
198 kwargs['button'] = 'Save'
203 kwargs['button'] = 'Save'
199
204
200 kwargs['edit'] = True
205 kwargs['edit'] = True
201
206
202 return render(request, 'abs_conf_edit.html', kwargs)
207 return render(request, 'abs_conf_edit.html', kwargs)
203
208
204
209
205
210
206
211
207 def add_beam(request, id_conf):
212 def add_beam(request, id_conf):
208
213
209 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
214 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
210 confs = Configuration.objects.all()
215 confs = Configuration.objects.all()
211
216
212 if request.method=='GET':
217 if request.method=='GET':
213 #form = ABSBeamEditForm()
218 #form = ABSBeamEditForm()
214 form = ABSBeamAddForm()
219 form = ABSBeamAddForm()
215
220
216 if request.method=='POST':
221 if request.method=='POST':
217 form = ABSBeamAddForm(request.POST)
222 form = ABSBeamAddForm(request.POST)
218
223
219 beam_data = get_values_from_form(request.POST)
224 beam_data = get_values_from_form(request.POST)
220
225
221 new_beam = ABSBeam(
226 new_beam = ABSBeam(
222 name =beam_data['name'],
227 name =beam_data['name'],
223 antenna =json.dumps(beam_data['antenna']),
228 antenna =json.dumps(beam_data['antenna']),
224 abs_conf=conf,
229 abs_conf=conf,
225 tx =json.dumps(beam_data['tx']),
230 tx =json.dumps(beam_data['tx']),
226 rx =json.dumps(beam_data['rx']),
231 rx =json.dumps(beam_data['rx']),
227 ues =json.dumps(beam_data['ues']),
232 ues =json.dumps(beam_data['ues']),
228 only_rx =json.dumps(beam_data['only_rx'])
233 only_rx =json.dumps(beam_data['only_rx'])
229 )
234 )
230 new_beam.save()
235 new_beam.save()
231 #---Update 6bits configuration and add beam to abs configuration beams list.
236 #---Update 6bits configuration and add beam to abs configuration beams list.
232 new_beam.modules_6bits()
237 new_beam.modules_6bits()
233 new_beam.add_beam2list()
238 #new_beam.add_beam2list()
234 messages.success(request, 'Beam: "%s" has been added.' % new_beam.name)
239 messages.success(request, 'Beam: "%s" has been added.' % new_beam.name)
235
240
236 return redirect('url_edit_abs_conf', conf.id)
241 return redirect('url_edit_abs_conf', conf.id)
237
242
238 ###### SIDEBAR ######
243 ###### SIDEBAR ######
239 kwargs = {}
244 kwargs = {}
240
245
241 #kwargs['dev_conf'] = conf.device
246 #kwargs['dev_conf'] = conf.device
242 #kwargs['id_dev'] = conf.device
247 #kwargs['id_dev'] = conf.device
243 kwargs['id_conf'] = conf.id
248 kwargs['id_conf'] = conf.id
244 kwargs['form'] = form
249 kwargs['form'] = form
245 kwargs['title'] = 'ABS Beams'
250 kwargs['title'] = 'ABS Beams'
246 kwargs['suptitle'] = 'Add Beam'
251 kwargs['suptitle'] = 'Add Beam'
247 kwargs['button'] = 'Add'
252 kwargs['button'] = 'Add'
248 kwargs['no_sidebar'] = True
253 kwargs['no_sidebar'] = True
249
254
250 #kwargs['previous'] = conf.get_absolute_url_edit()
255 #kwargs['previous'] = conf.get_absolute_url_edit()
251 kwargs['edit'] = True
256 kwargs['edit'] = True
252
257
253 return render(request, 'abs_add_beam.html', kwargs)
258 return render(request, 'abs_add_beam.html', kwargs)
254
259
255
260
256 def edit_beam(request, id_conf, id_beam):
261 def edit_beam(request, id_conf, id_beam):
257
262
258 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
263 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
259 beam = get_object_or_404(ABSBeam, pk=id_beam)
264 beam = get_object_or_404(ABSBeam, pk=id_beam)
260
265
261 if request.method=='GET':
266 if request.method=='GET':
262 form = ABSBeamEditForm(initial={'beam': beam})
267 form = ABSBeamEditForm(initial={'beam': beam})
263
268
264 if request.method=='POST':
269 if request.method=='POST':
265 form = ABSBeamEditForm(request.POST)
270 form = ABSBeamEditForm(request.POST)
266
271
267 beam_data = get_values_from_form(request.POST)
272 beam_data = get_values_from_form(request.POST)
268
273
269 beam.dict_to_parms(beam_data)
274 beam.dict_to_parms(beam_data)
270 beam.save()
275 beam.save()
271
276
272 messages.success(request, 'Beam: "%s" has been updated.' % beam.name)
277 messages.success(request, 'Beam: "%s" has been updated.' % beam.name)
273
278
274 return redirect('url_edit_abs_conf', conf.id)
279 return redirect('url_edit_abs_conf', conf.id)
275
280
276 ###### SIDEBAR ######
281 ###### SIDEBAR ######
277 kwargs = {}
282 kwargs = {}
278
283
279 kwargs['id_conf'] = conf.id
284 kwargs['id_conf'] = conf.id
280 kwargs['form'] = form
285 kwargs['form'] = form
281 kwargs['title'] = 'ABS Beams'
286 kwargs['title'] = 'ABS Beams'
282 kwargs['suptitle'] = 'Edit Beam'
287 kwargs['suptitle'] = 'Edit Beam'
283 kwargs['button'] = 'Save'
288 kwargs['button'] = 'Save'
284 kwargs['no_sidebar'] = True
289 kwargs['no_sidebar'] = True
285
290
286 #kwargs['previous'] = conf.get_absolute_url_edit()
291 #kwargs['previous'] = conf.get_absolute_url_edit()
287 kwargs['edit'] = True
292 kwargs['edit'] = True
288
293
289 return render(request, 'abs_edit_beam.html', kwargs)
294 return render(request, 'abs_edit_beam.html', kwargs)
290
295
291
296
292
297
293 def remove_beam(request, id_conf, id_beam):
298 def remove_beam(request, id_conf, id_beam):
294
299
295 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
300 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
296 beam = get_object_or_404(ABSBeam, pk=id_beam)
301 beam = get_object_or_404(ABSBeam, pk=id_beam)
297
302
298 if request.method=='POST':
303 if request.method=='POST':
299 if beam:
304 if beam:
300 try:
305 try:
301 beam.remove_beamfromlist()
306 beam.remove_beamfromlist()
302 beam.delete()
307 beam.delete()
303 messages.success(request, 'Beam: "%s" has been deleted.' % beam)
308 messages.success(request, 'Beam: "%s" has been deleted.' % beam)
304 except:
309 except:
305 messages.error(request, 'Unable to delete beam: "%s".' % beam)
310 messages.error(request, 'Unable to delete beam: "%s".' % beam)
306
311
307 return redirect('url_edit_abs_conf', conf.id)
312 return redirect('url_edit_abs_conf', conf.id)
308
313
309 ###### SIDEBAR ######
314 ###### SIDEBAR ######
310 kwargs = {}
315 kwargs = {}
311
316
312 kwargs['object'] = beam
317 kwargs['object'] = beam
313 kwargs['delete'] = True
318 kwargs['delete'] = True
314 kwargs['title'] = 'Delete'
319 kwargs['title'] = 'Delete'
315 kwargs['suptitle'] = 'Beam'
320 kwargs['suptitle'] = 'Beam'
316 kwargs['previous'] = conf.get_absolute_url_edit()
321 kwargs['previous'] = conf.get_absolute_url_edit()
317 return render(request, 'confirm.html', kwargs)
322 return render(request, 'confirm.html', kwargs)
318
323
319
324
320
325
321 def plot_patterns(request, id_conf, id_beam=None):
326 def plot_patterns(request, id_conf, id_beam=None):
322
327
323 kwargs = {}
328 kwargs = {}
324 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
329 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
325 beams = ABSBeam.objects.filter(abs_conf=conf)
330 beams = ABSBeam.objects.filter(abs_conf=conf)
326
331
327 if id_beam:
332 if id_beam:
328 beam = get_object_or_404(ABSBeam, pk=id_beam)
333 beam = get_object_or_404(ABSBeam, pk=id_beam)
329 kwargs['beam'] = beam
334 kwargs['beam'] = beam
330
335
331
336
332 ###### SIDEBAR ######
337 ###### SIDEBAR ######
333
338
334 kwargs['dev_conf'] = conf.device
339 kwargs['dev_conf'] = conf.device
335 kwargs['id_dev'] = conf.device
340 kwargs['id_dev'] = conf.device
336 kwargs['id_conf'] = conf.id
341 kwargs['id_conf'] = conf.id
337 kwargs['abs_beams'] = beams
342 kwargs['abs_beams'] = beams
338 kwargs['title'] = 'ABS Patterns'
343 kwargs['title'] = 'ABS Patterns'
339 kwargs['suptitle'] = conf.name
344 kwargs['suptitle'] = conf.name
340 kwargs['no_sidebar'] = True
345 kwargs['no_sidebar'] = True
341
346
342 return render(request, 'abs_patterns.html', kwargs)
347 return render(request, 'abs_patterns.html', kwargs)
343
348
344
349
345 def plot_pattern(request, id_conf, id_beam, antenna):
350 def plot_pattern(request, id_conf, id_beam, antenna):
346
351
347 if antenna=='down':
352 if antenna=='down':
348 sleep(3)
353 sleep(3)
349
354
350 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
355 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
351 beam = get_object_or_404(ABSBeam, pk=id_beam)
356 beam = get_object_or_404(ABSBeam, pk=id_beam)
352
357
353 name = conf.experiment.name
358 name = conf.experiment.name
354
359
355 just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0
360 just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0
356 phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)]
361 phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)]
357 gain_tx = json.loads(beam.tx)[antenna]
362 gain_tx = json.loads(beam.tx)[antenna]
358 gain_rx = json.loads(beam.rx)[antenna]
363 gain_rx = json.loads(beam.rx)[antenna]
359 ues = json.loads(beam.ues)[antenna]
364 ues = json.loads(beam.ues)[antenna]
360
365
361 newOverJro = overJroShow(name)
366 newOverJro = overJroShow(name)
362 fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx)
367 fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx)
363
368
364 response=HttpResponse(content_type='image/png')
369 response=HttpResponse(content_type='image/png')
365
370
366 fig.canvas.print_png(response)
371 fig.canvas.print_png(response)
367
372
368 return response
373 return response
General Comments 0
You need to be logged in to leave comments. Login now