import sys, os, serial, time, csv

# vhod

dev0="/dev/ttyUSB3" # generator
dev1="/dev/ttyUSB4" # sprejemnik

fstart=7000e6;		fstart=int(round(fstart/1e3)) # [kHz]
fstop=12900e6;		fstop=int(round(fstop/1e3))   # [kHz] |4.4GHz: 5GHz      |6GHz: 7GHz       |12.5GHz: 14GHz
step=50e6;		step=int(round(step/1e3))     # [kHz]
ampl=13;		ampl=int(ampl)                # [dBm] |4.4GHz: -4...6dBm |6GHz: -3...-3dBm |12.5GHz: -18...13dBm

# inicializacija hw

port0=serial.Serial(dev0, 9600); port1=serial.Serial(dev1, 115200)
port0.isOpen();                  port1.isOpen()
port0.setRTS(False);             port1.setRTS(False) # sprosti /BOOTLOADER
port0.setDTR(False);             port1.setDTR(False) # sprosti /RESET
time.sleep(2)

port0.write("F "+str(fstart)+"\n") # nastavi frekvenco
time.sleep(0.5)
port0.write("A "+str(ampl)+"\n") # amplituda
time.sleep(0.5)
port0.write("M 10025\n") # modulacija s pravokotnikom 10,025kHz (+25Hz da ni veckratnik 50Hz, za boljsi obcutek)
time.sleep(0.5)

port0.flushOutput();             port1.flushOutput()
port0.flushInput();              port1.flushInput()
time.sleep(1)

# inicializacija datoteke

file_name=time.strftime("sweep_%Y%m%d_%H%M%S.csv")
ofile=open(file_name, "w")
output=csv.writer(ofile)
output.writerow(["Frekvenca [kHz]", "Amplituda [dB]"])

# merilna zanka

f=range(fstart, fstop+1, step) # vektor frekvenc merjenja
a=[0]*int(round((fstop-fstart)/step)+1) # vektor meritev amplitude
i=0 # stevec meritev
lock=0

def loop():
	global i, lock, lock_old

	while i<len(f):
		try:
			port0.write("F "+str(f[i])+"\n") # nastavi frekvenco
			print str(int(round(f[i]/1e3)))+"MHz:",

			lock_old=lock
			lock=0

			rxline="" # rx buffer
			retry=50 # stevec za uklenitev
			while not lock: # pocakaj na uklenitev
				port0.write("\n") # vprasaj generator za status
				if not retry: # ce zmanjka poskusov
					if lock_old: # ce je bil generator na prejsnji frekvenci uklenjen, se se malo pocaka
						lock_old=0
						retry=50
					else:
						print "PLL NI UKLENJEN!"
						break
				rxline=port0.readline()
				if rxline[1:4]=="   " or rxline[1:4]==" ? ":
					lock=1
					print "PLL uklenjen.",
					time.sleep(0.1) # dodatna zakasnitev za ustalitev amplitude
				retry-=1

			if lock:
				port1.flushInput(); port1.readline() # zavrze stare meritve
				a[i]=float("%.2f"%float(port1.readline().split()[0])) # split() zaradi dvokanalnega sprejemnika
				print "Vrednost: "+str("%.1f"%a[i])+"dB"
			else:
				a[i]=None

			output.writerow([str(f[i]), str(a[i])])
			i+=1

		except KeyboardInterrupt: # CTRL+C
			ofile.close(); os.remove(file_name) # ce so bile meritve neuspesne odstrani datoteko
			sys.exit("Prekinitev!")
			return 0
	else: # uspesen zakljucek zanke meritev
		return 1

# prelet

start=time.time()
loop()
end=time.time()

# izhod

ofile.close()

print "Hitrost:  "+str("%.0f"%(i/(end-start)))+" meritev na sekundo"
print "Minimum:  "+str(min(value for value in a if value is not None))+"dB"
print "Maksimum: "+str(max(value for value in a if value is not None))+"dB"
