
# daqHardReset          
# daqSoftReset          
# daqRefreshState       
# daqSetDefaults        
# daqLoadSettings       file
# daqSaveSettings       file
# daqOpenData           file
# daqCloseData          
# daqSetRunParameters   rate count
# daqSetRunState        state
# daqGetRunState        
# daqResetCounters      
# daqSendCommand        command
# daqReadStatus         
# daqGetStatus          
# daqReadConfig         
# daqVerifyConfig       
# daqSetConfig          variable arg
# daqGetConfig          variable
# daqGetSystemStatus    
# daqGetUserStatus      
# daqGetError           
# daqSendXml            xml_string
# daqDisableTimeout
# daqOpen               system id

#--- imports ---#
import pythonDaq
import time
import os
import sys
import getopt

def doRun(path):
	os.system('rm -f '+path)
	pythonDaq.daqSetConfig('DataFile',path)
	pythonDaq.daqSendCommand('OpenDataFile','')
	pythonDaq.daqSetRunState('Running')
	while pythonDaq.daqGetRunState() == "Running":
		time.sleep(1)
		print "Running ..."

	pythonDaq.daqCloseData()
	print "Run complete and saved to " + path
	
# Set some default values
run_number = -1
half_module_number = -1
svt_test = False
filter_enabled = False

# Read in the command line arguments
options, remainder = getopt.getopt(sys.argv[1:], 'r:m:sfh', ['run_number=',
							   'half-module=',
							   'svt',
							   'enable-filter',
							   'help',
							  ])

# Parse the command line arguments
for opt, arg in options:
	if opt in ('-s', '--svt'):
		svt_test = True
	elif opt in ('-f', '--enable-filter'):
		filter_enabled = True	
	elif opt in ('-h', '--help'):
		print "\nUsage: run_calibration.py <file prefix>"
		print "Arguments: "
		print "\t-s, --svt: Specifies the device to be tested is the SVT"
		print "\t-f, --enable-filter: Enable FIR filter"
		print "\n"
		sys.exit(0)

if (len(remainder) != 1):
	print "need output file prefix"
	sys.exit(-1)

pythonDaq.daqOpen("hps",1);

print "Starting calibration run ... "

# Configure the DAQ
pythonDaq.daqHardReset()
if svt_test:
	pythonDaq.daqLoadSettings('/u1/software/daq/config/local_defaults.xml') 
	pythonDaq.daqLoadSettings('/u1/software/daq/config/coda_groupC.xml')
	pythonDaq.daqSetConfig("cntrlFpga:TholdEnable", "False")
	pythonDaq.daqSetConfig("cntrlFpga:FiltEnable",  "False") 
	if filter_enabled:
		 pythonDaq.daqSetConfig("cntrlFpga:FiltEnable",  "True")
		 print "Filter has been enabled" 
else:
	pythonDaq.daqLoadSettings('/u1/software/daq/config/devboard_oldshaping.xml');
	#pythonDaq.daqSetConfig("cntrlFpga:AdcClkInvert", "False");
#pythonDaq.daqLoadSettings('/u1/software/daq/config/devboard_new.xml');

pythonDaq.daqSoftReset();
pythonDaq.daqSetRunParameters("1000Hz",2000);
#pythonDaq.daqSetConfig("cntrlFpga:hybrid:apv25:Ical", str(22))
#pythonDaq.daqSetConfig("cntrlFpga:hybrid:apv25:Isha", str(100))
#pythonDaq.daqSetConfig("cntrlFpga:hybrid:apv25:Vfs", str(80))
 
if (remainder[0][0] == '/'):
	data_path = remainder[0]
else:
	data_path = os.environ['PWD'] + '/' + remainder[0]

print 'Saving output to '  + data_path

pythonDaq.daqSetConfig("cntrlFpga:hybrid:apv25:CalibInhibit","True")
pythonDaq.daqSetConfig("cntrlFpga:ApvTrigType", "DoubleTrig" )
pythonDaq.daqSetConfig("cntrlFpga:hybrid:apv25:CalGroup","0")
file_path = data_path + '_baseline_dtrig.bin'
print("Running baseline (DoubleTrig)")
doRun(file_path)

# Run baseline and calibrations
pythonDaq.daqSetConfig("cntrlFpga:hybrid:apv25:CalibInhibit","False")
pythonDaq.daqSetConfig("cntrlFpga:ApvTrigType", "DoubleCalib" )
for calgroup in range (0,8):
	pythonDaq.daqSetConfig("cntrlFpga:hybrid:apv25:CalGroup",str(calgroup))
	print("Running calibration group: " + str(calgroup))
	for delay in range (1,9):
		print("Running delay: " + str(delay))
		pythonDaq.daqSetConfig("cntrlFpga:hybrid:apv25:Csel","Dly_" + str(delay) + "x3_125ns")
		file_path = data_path + '_cal_g' + str(calgroup) + "_d" + str(delay) + ".bin"
		doRun(file_path)

   
print "Calibration run complete"

