##### Meritev smernega diagrama v logaritemski skali - S53MV 14.09.2016 #####

#izvajanje potrebuje najmanj Anaconda2-4.1.1-Windows-x86 in pyserial-2.7.win32_py3k
import time,serial,math	#uporabljene funkcije
rxime='COM16'		#ime zaporednega vmesnika sprejemnika
vrtime='COM5'		#ime zaporednega vmesnika vrtiljaka

print '*** Meritev smernega diagrama, log sprejemnik - S53MV 14.09.2016 ***'

x=[0.0]			#pripravi obe polji za rezultat
y=[99.99]
i=1
while i<=3600:
	x=x+[i/10.0]
	y=y+[99.99]
	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('5D')		#pozeni vrtiljak v desno

i=0			#zanka merjenja antene
m=-1.0
while i<3600:
	s=vrt.readline()
	k=float(s[0:5])
	rx.flushInput()
	rx.readline()
	s=rx.readline()
	r=float(s[0:6])
	print 'Kot:',k,' Jakost:',r,'dB    ',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()

i=0			#normaliziraj smerni diagram na max
while i<=3600:
	y[i]=y[i]-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=math.pow(10.0,(y[i1]*0.1))+math.pow(10.0,(y[i2]*0.1))
	s=s+ff*math.sin(math.radians(i*0.1))
	i=i+1
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]<-3.0:
		i=0
	i=i-1
i=int(km*10+0.5)
while i<=3600:
	km2=i*0.1
	if y[i]<-3.0:
		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
plt.plot([km,km],[-40.0,2.0],'y-')
plt.plot([km1,km1],[-40.0,2.0],'r-')
plt.plot([km2,km2],[-40.0,2.0],'r-')

plt.plot(x,y,'b-')	#narisi smerni diagram
plt.axis([0.0,360.0,-40.0,2.0])
plt.xticks([0.0,45.0,90.0,135.0,180.0,225.0,270.0,315.0,360.0])
plt.yticks([-40.0,-35.0,-30.0,-25.0,-20.0,-15.0,-10.0,-5.0,0.0])
plt.grid(True)
plt.title(t+' '+om+'\n'+dd+' '+ss)
plt.xlabel('Kot v stopinjah')
plt.ylabel('Relativna jakost sprejema v dB')
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]
	a=(y[i]+40.0)/40.0
	if a<0.0:
		a=0.0
	xx=xx+[a*s]
	yy=yy+[-a*c]
	i=i+1

plt.plot(x1,y1,'g-')	#krog polmera 0.25
plt.plot(x2,y2,'g-')	#krog polmera 0.5
plt.plot(x3,y3,'g-')	#krog polmera 0.75
plt.plot(x4,y4,'g-')	#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-')
	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-')
	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-')
	k=k+5
#narisi polozaj maksimuma in sirino lista
plt.plot([0.0,math.sin(math.radians(km))],[0.0,-math.cos(math.radians(km))],'y-')
plt.plot([0.0,math.sin(math.radians(km1))],[0.0,-math.cos(math.radians(km1))],'r-')
plt.plot([0.0,math.sin(math.radians(km2))],[0.0,-math.cos(math.radians(km2))],'r-')

plt.plot(xx,yy,'b-')	#narisi smerni diagram
plt.axis([-1.05,1.05,-1.05,1.05])
plt.xticks([])
plt.yticks([])
plt.title(t+' '+om+'\n'+dd+' '+ss)
plt.ylabel('Radialno logaritemsko merilo z razponom 40dB')
plt.axes().set_aspect('equal')
plt.show()

#konec programa

