Automatic commit. Sun Oct 14 00:00:08 WST 2012
[matches/honours.git] / research / TCS / interface.py
index f49824f..7553ab4 100755 (executable)
@@ -13,7 +13,10 @@ import serial
 import datetime
 
 import odict
+import Gnuplot, Gnuplot.funcutils
+import subprocess
 
+gnuplot = Gnuplot.Gnuplot()
 
 # TODO: Insert variables for calibration purposes here.
 calibrate = {
@@ -32,8 +35,8 @@ calibrate = {
 }
 
 # TODO: Adjust aqcuisition parameters here
-aquire = { "DAC_Sweep" : "0.0",# + 25.0*int(step/120)", # DAC Sweep value (t is in STEPS, not seconds!)
-       "ADC_Averages" : 200,
+aquire = { "DAC_Sweep" : "0.0 + 1.0*int(step)", # DAC Sweep value (t is in STEPS, not seconds!)
+       "ADC_Averages" : 100,
        #"ADC_Vi" : 5, # ADC channel to read back Vi (set by DAC) through
        #"ADC_Is" : 4, # ADC channel to read back Is through
        #"ADC_Ie" : 4, # ADC channel to read back Ie through
@@ -56,30 +59,34 @@ ser = serial.Serial(
        xonxoff=0,
        rtscts=0
 )
-
+#Using an ordered dictionary, so results will be determined (or prompted for) in this order.
+# Put things that are being changed a lot near the top of the list.
 parameters = odict.odict([
-       ("Accelerating Voltage" , None),
-       ("Focus Voltage" , None),
+       ("Chamber Pressure" , None), # Chamber pressure now automatically determined
        ("Deflection Voltage" , None),
+       ("Title" , None),
+       ("Comment" , None),
+       ("602 Scale" , None),
        ("Venault Voltage" , None),
+       ("Accelerating Voltage" , None),
+       ("Focus Voltage" , None),
+       
        ("Initial Voltage" , None),
        ("Heating Current" , None),
-       ("Heating Voltage" , None),
-       ("Chamber Pressure" , None),
-       ("610B Zero" , None),
+       ("Heating Voltage (across filament)" , None),
+       ("Heating Voltage (across power supply)", None),
+       #("610B Zero" , None),
        ("602 Zero" , None),
-       ("610B Scale" , None),
-       ("602 Scale" , None),
+       #("610B Scale" , None),
+       
        ("602 0.1 Battery" , None),
        ("602 0.03 Battery" , None),
        ("602 0.01 Battery" , None),
        ("602 0.003 Battery" , None),
        ("602 0.001 Battery" , None), 
-       ("ADC Regulator" , None),
        ("Sample", None),
        ("Sample Angle", None),
-       ("Title" , None),
-       ("Comment" , None),
+       ("ADC Regulator" , None),
        ("Data" , None),
        ("Parameters last checked", None)
 ])
@@ -90,6 +97,18 @@ def getTime():
 def getDate():
        return str(datetime.datetime.now()).split(" ")[0]
 
+def getPressure():
+       
+       try:
+               p = subprocess.Popen("./pressure/get_pressure.sh", stdout=subprocess.PIPE)
+               #p = subprocess.Popen("./this_program_does_not_exist.sh", stdout=subprocess.PIPE)
+               #result = float("a")
+               result = float(p.stdout.readline().strip(" \r\n\t"))
+       except:
+               return 0.0
+       return result
+       
+
 # Used for when I press Control-C to stop things
 def set_exit_handler(func):
     if os.name == "nt":
@@ -152,12 +171,15 @@ def init():
 #              pass
        #while (ser.readline().strip("\r\n ") != "#"):
        #       pass
-       time.sleep(1.0)
+       #time.sleep(1.0)
 
        ser.write("a "+str(aquire["ADC_Averages"]) + "\r\n")
-       print(ser.readline().strip("\r\n"))
-       print(ser.readline().strip("\r\n"))
-       print(ser.readline().strip("\r\n"))
+       ser.readline().strip("\r\n")
+       ser.readline().strip("\r\n")
+       ser.readline().strip("\r\n")
+       #print(ser.readline().strip("\r\n"))
+       #print(ser.readline().strip("\r\n"))
+       #print(ser.readline().strip("\r\n"))
 
        #print("Writing config information to config.dat...")
        #output = log_open("config.dat", "w", 1)
@@ -205,10 +227,23 @@ def main():
        # Experiment
        # TODO: Modify data to record here
        sweep = 1
+       #for i in range(0,1):
        while True:
                os.system("mkdir -p " + getDate())
-               record_data([4, 5], getDate()+"/"+str(getTime())+".dat", None, 4000)
+               record_data([5], getDate()+"/"+str(getTime())+".dat", None, 4001)
+
+               try:
+                       pass
+                       #os.system("echo \"Sweep number " + str(sweep) + " completed\" | festival --tts")
+               except:
+                       pass
                sweep += 1
+       #setDAC(500)
+
+       try:
+               os.system("echo \"Experiment complete\" | festival --tts")
+       except:
+               pass
        
 
 def checkList():
@@ -226,10 +261,13 @@ def checkList():
                                value = k[1].strip("# \r\n")
 
                        if (item in parameters):
-                               parameters[item] = value
+                               if item == "Chamber Pressure":
+                                       parameters[item] = getPressure()
+                               else:
+                                       parameters[item] = value
        
-               print("Checklist found. Overwrite? [Y/n]")
-               response = sys.stdin.readline().strip(" \r\n")
+               #print("Checklist found. Overwrite? [Y/n]")
+               response = "" #sys.stdin.readline().strip(" \r\n")
                if (response == "" or response == "y" or response == "Y"):
                        input_file = log_open(getDate()+"/checklist.old", "w")
                        for item in parameters:
@@ -242,8 +280,16 @@ def checkList():
                for item in parameters:
                        if item == "Parameters last checked":
                                continue
+                       if item == "Chamber Pressure":
+                               #sys.stdout.write("\""+str(item)+"\" = " + str(parameters[item]) + " - get new pressure... ")
+                               parameters[item] = getPressure()
+                               #sys.stdout.write(str(parameters[item]) + "\n")
+                               continue
+
                        sys.stdout.write("\""+str(item)+"\" = " + str(parameters[item]) + " New value?: ")
                        response = sys.stdin.readline().strip("\r\n ")
+                       if (response == "!"):
+                               break
                        if (response != ""):
                                parameters[item] = response
                        sys.stdout.write("\n")
@@ -260,8 +306,11 @@ def checkList():
 def record_data(ADC_channels, output, pollTime = None, dac_max = None):
        
        if (output != None):
+               gnuplot("set title \""+str(output)+"\"")
                output = [log_open(output, "w"), sys.stdout]
+
        else:
+               gnuplot("set title \"<No file>\"")
                output = [sys.stdout]
 
        for field in aquire:
@@ -271,6 +320,8 @@ def record_data(ADC_channels, output, pollTime = None, dac_max = None):
        for out in output:
                out.write("# Parameters:\n")
 
+       parameters["Chamber Pressure"] = getPressure() # Update chamber pressure
+
        for field in parameters:
                for out in output:
                        out.write("# "+str(field)+" = " + str(parameters[field]) + "\n")
@@ -278,6 +329,10 @@ def record_data(ADC_channels, output, pollTime = None, dac_max = None):
 
        start_time = time.time()
        
+       gnuplot("set xlabel \"DAC (counts)\"")
+       gnuplot("set ylabel \"ADC (counts)\"")
+       
+       
        for out in output:
                out.write("\n")
                out.write("# Experiment " + str(datetime.datetime.now()) + "\n")
@@ -290,9 +345,11 @@ def record_data(ADC_channels, output, pollTime = None, dac_max = None):
                out.write("\n")
 
        step = 0
+       data = [] # Keep track of data for dynamic plotting
        dacValue = int(eval(aquire["DAC_Sweep"]))
        if (setDAC(dacValue) == False):
                setDAC(dacValue)
+       time.sleep(2.0)
        while (pollTime == None or time.time() < start_time + pollTime):
                if (aquire["DAC_Sweep"] != None):
                        nextDacValue = int(eval(aquire["DAC_Sweep"]))
@@ -324,13 +381,22 @@ def record_data(ADC_channels, output, pollTime = None, dac_max = None):
                end_time = time.time()
 
                for out in output:
-                       out.write(str((measure_start + (end_time - measure_start)/2.0 - start_time)))
+                       measure_time = measure_start + (end_time - measure_start)/2.0 - start_time
+                       out.write(str(measure_time))
                        out.write("\t"+str(dacValue))
+                       data.append([measure_time, dacValue])
+
                        for adc in raw_adc:
                                out.write("\t" + str(adc[1]) + "\t" + str(adc[2]))
+                               data[len(data)-1].append(adc[1])
+                               data[len(data)-1].append(adc[2])
                        out.write("\n") 
        
-               
+               #gnuplot("set yrange [0:1023]")
+               #gnuplot("set xrange [0:4000]")
+               gnuplot("set xlabel \"DAC (counts)\"")
+               gnuplot("set ylabel \"Sample Current (ADC counts)\"")
+               gnuplot.plot(Gnuplot.Data(data, title="t = "+str(measure_time), with_="lp", using="2:3"))
        for out in output:              
                if out != sys.stdout:
                        log_close(out)

UCC git Repository :: git.ucc.asn.au