##### Meritev smernega diagrama - S53MV 16.09.2016 #####

#izvajanje potrebuje najmanj Anaconda2-4.1.1-Windows-x86 in pyserial-2.7.win32_py3k
import time,serial,math	#uporabljene funkcije
rxime='COM14'		#ime zaporednega vmesnika sprejemnika
vrtime='COM10'		#ime zaporednega vmesnika vrtiljaka

print '*** Meritev smernega diagrama - S53MV 16.09.2016 ***'

x=[0.0]			#pripravi obe polji za rezultat
y=[999]
i=1
while i<=3600:
	x=x+[i/10.0]
	y=y+[999]
	i=i+1

#odpri comporta rx in vrt, 115200bps, 8bit, brez paritete
print 'Pocakaj na lenobni USB...'
rx=serial.Serial(rxime,115200,timeout=3.0)
rx.setRTS(False)	#sprosti /BOOTLOADER
rx.setDTR(False)	#sprosti /RESET
vrt=serial.Serial(vrtime,115200,timeout=3.0)
vrt.setRTS(False)	#sprosti /BOOTLOADER
vrt.setDTR(False)	#sprosti /RESET
time.sleep(3)
vrt.flushInput()	#pocisti sprejemni vmesnik vrtiljaka
vrt.write('6D')		#pozeni vrtiljak v desno

i=0			#zanka merjenja antene
m=-1
while i<3600:
	s=vrt.readline()
	k=float(s[0:5])
	rx.flushInput()
	rx.readline()
	s=rx.readline()
	r=int(s[0:3])
	print 'Kot:',k,' Jakost:',r,'    ',chr(13),
	i=int(k*10.0+0.5)
	y[i]=r
	if r>m:		#isci maksimum
		m=r
		km1=k
	if r==m:
		km2=k
vrt.write('7L')		#vrtiljak v levo z navisjo hitrostjo
t=time.ctime()		#zabelezi cas meritve
print '\r\nMeritev smernega diagrama   '+t
rx.close()		#zapri oba comporta
vrt.close()

if m<1:			#prepreci deljenje z 0
	m=1
i=0			#normaliziraj smerni diagram na max
while i<=3600:
	y[i]=y[i]/float(m)
	i=i+1

km=(km1+km2)*0.5	#povprecni polozaj maksimuma
om='Odmik maksimuma: '+str(km-180.0)+' stopinj'
print om

i=1			#integriraj smerni diagram
s=0.0
im=int(km*10+0.5)
while i<1800:
	i1=im-i
	if i1<0:
		i1=i1+3600
	i2=im+i
	if i2>3600:
		i2=i2-3600
	ff=(y[i1]*y[i1])+(y[i2]*y[i2])
	s=s+ff*math.sin(math.radians(i*0.1))
	i=i+1
if s<0.001:		#prepreci deljenje z 0
	s=0.001
D=(7200/math.pi)/s	#izracunaj smernost
dd='Smernost: %5.1f'%(D)+' = %5.2f'%(10*math.log(D,10))+' dBi'
print dd

i=int(km*10+0.5)	#poisci -3dB meji glavnega lista
while i>=0:
	km1=i*0.1
	if y[i]<math.sqrt(0.5):
		i=0
	i=i-1
i=int(km*10+0.5)
while i<=3600:
	km2=i*0.1
	if y[i]<math.sqrt(0.5):
		i=3600
	i=i+1
ss='Sirina snopa -3dB: '+str(km2-km1)+' stopinj'
print ss

print 'Pocakaj na nalaganje grafike...'
import matplotlib.pyplot as plt

#narisi polozaj maksimuma in sirino lista
r=1.06
plt.plot([km,km],[0.0,r],'y-')
plt.plot([km1,km1],[0.0,r],'r-')
plt.plot([km2,km2],[0.0,r],'r-')

plt.plot(x,y,'b-')	#narisi smerni diagram
plt.axis([0.0,360.0,0.0,r])
plt.xticks([0.0,45.0,90.0,135.0,180.0,225.0,270.0,315.0,360.0])
plt.yticks([0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0])
plt.grid(True)
plt.title(t+' '+om+'\n'+dd+' '+ss)
plt.xlabel('Kot v stopinjah')
plt.ylabel('Jakost sprejema')
plt.show()

print 'Risanje polarnega diagrama...'
x1=[]	#priprava krogov in pretvorba podatkov
y1=[]
x2=[]
y2=[]
x3=[]
y3=[]
x4=[]
y4=[]
xx=[]
yy=[]
i=0
while i<=3600:
	s=math.sin(math.radians(i*0.1))
	c=math.cos(math.radians(i*0.1))
	x1=x1+[s/4]
	y1=y1+[c/4]
	x2=x2+[s/2]
	y2=y2+[c/2]
	x3=x3+[3*s/4]
	y3=y3+[3*c/4]
	x4=x4+[s]
	y4=y4+[c]
	xx=xx+[y[i]*s]
	yy=yy+[-y[i]*c]
	i=i+1

w=0.2	#sirina crt koordinatne mreze
plt.plot(x1,y1,'g-',lw=w)	#krog polmera 0.25
plt.plot(x2,y2,'g-',lw=w)	#krog polmera 0.5
plt.plot(x3,y3,'g-',lw=w)	#krog polmera 0.75
plt.plot(x4,y4,'g-',lw=w)	#krog polmera 1
k=0			#razdelki po 30 stopinj
while k<360:
	xk=math.sin(math.radians(k))*0.25
	yk=math.cos(math.radians(k))*0.25
	plt.plot([0.0,xk],[0.0,yk],'g-',lw=w)
	k=k+30
k=0			#razdelki po 15 stopinj
while k<360:
	xz=math.sin(math.radians(k))*0.25
	yz=math.cos(math.radians(k))*0.25
	xk=math.sin(math.radians(k))*0.5
	yk=math.cos(math.radians(k))*0.5
	plt.plot([xz,xk],[yz,yk],'g-',lw=w)
	k=k+15
k=0			#razdelki po 5 stopinj
while k<360:
	xz=math.sin(math.radians(k))*0.5
	yz=math.cos(math.radians(k))*0.5
	xk=math.sin(math.radians(k))
	yk=math.cos(math.radians(k))
	plt.plot([xz,xk],[yz,yk],'g-',lw=w)
	k=k+5

#narisi polozaj maksimuma in sirino lista
r=1.04
plt.plot([0.0,r*math.sin(math.radians(km))],[0.0,-r*math.cos(math.radians(km))],'y-')
plt.plot([0.0,r*math.sin(math.radians(km1))],[0.0,-r*math.cos(math.radians(km1))],'r-')
plt.plot([0.0,r*math.sin(math.radians(km2))],[0.0,-r*math.cos(math.radians(km2))],'r-')

plt.plot(xx,yy,'b-')	#narisi smerni diagram
r=1.06
plt.axis([-r,r,-r,r])
plt.xticks([])
plt.yticks([])
plt.title(t+' '+om+'\n'+dd+' '+ss)
plt.ylabel('Linearno radialno merilo za jakost')
plt.axes().set_aspect('equal')
plt.show()

#konec programa

