Skip to content
Snippets Groups Projects
Commit 1150709c authored by Michael DM Dryden's avatar Michael DM Dryden
Browse files

Added CV, CA, and SWV to multiprocessing. Seems to all work.

parent f19f434e
Branches
Tags
No related merge requests found
......@@ -14,27 +14,29 @@ class delayedSerial(serial.Serial): #overrides normal serial write so that chara
time.sleep(.001)
class dataCapture(mp.Process):
def __init__(self, ser_instance, pipe):
def __init__(self, ser_instance, pipe, size):
mp.Process.__init__(self)
self.size = size
self.serial = ser_instance
self.recv_p, self.send_p = pipe
def run(self):
sys.stdout.write('[%s] running ... process id: %s\n'
% (self.name, os.getpid()))
scan = 0
while True:
for line in self.serial:
if line.startswith('B'):
self.send_p.send(self.serial.read(size=6))#uint16 + int32
self.send_p.send((scan,self.serial.read(size=self.size)))
elif line.lstrip().startswith("no"):
self.serial.flushInput()
self.send_p.close() #causes EOF at other end of pipe
print "closed"
break
elif line.lstrip().startswith('S'):
scan += 1
break
class SerialDevices:
......@@ -98,21 +100,15 @@ class Experiment:
self.data_handler() #Will be overridden by experiment classes to deal with more complicated data
self.data_postprocessing()
# self.plot.updateline(self, 0)
# self.plot.redraw()
print "pipe closed"
self.main_pipe.close()
self.ser.close()
def data_handler(self):
recv_p, send_p = mp.Pipe(duplex=False)
capture_proc = dataCapture(self.ser, (recv_p, send_p))
capture_proc = dataCapture(self.ser, (recv_p, send_p), self.databytes)
capture_proc.start()
send_p.close() #pipe won't trip EOFError unless all connections are closed
updatetime = 0
while True:
try:
......@@ -120,16 +116,11 @@ class Experiment:
if self.main_pipe.recv() == 'a':
self.ser.write('a')
return
voltage, current = struct.unpack('<Hl', recv_p.recv()) #uint16 + int32
scan, data = recv_p.recv()
voltage, current = struct.unpack('<Hl', data) #uint16 + int32
#(line, [data])
self.main_pipe.send((0, [(voltage-32768)*3000./65536, current*(1.5/self.gain/8388607)]))
# self.data[0].append((voltage-32768)*3000./65536)
# self.data[1].append(current*(1.5/self.gain/8388607))
# if ((time.time() - updatetime) > .2):
# self.plot.updateline(self, 0)
# self.plot.redraw()
# updatetime = float(time.time())
except EOFError:
print "empty"
......@@ -139,7 +130,8 @@ class Experiment:
pass
class chronoamp(Experiment):
def __init__(self, parameters, view_parameters, plot_instance, databuffer_instance):
def __init__(self, parameters, view_parameters, plot_instance, databuffer_instance, main_pipe):
self.main_pipe = main_pipe
self.parameters = parameters
self.view_parameters = view_parameters
self.plot = plot_instance
......@@ -149,6 +141,7 @@ class chronoamp(Experiment):
self.ylabel = "Current (A)"
self.data = [[],[]]
self.datalength = 2
self.databytes = 8
self.xmin = 0
self.xmax = 0
......@@ -168,30 +161,26 @@ class chronoamp(Experiment):
self.commands[2] += " "
def data_handler(self): #overrides inherited method to not convert x axis
while True:
for line in self.ser:
if line.startswith('B'):
inputdata = self.ser.read(size=8) #2*uint16 + int32
seconds, milliseconds, current = struct.unpack('<HHl', inputdata)
self.data[0].append(seconds+milliseconds/1000.)
self.data[1].append(current*(1.5/self.gain/8388607))
self.plot.updateline(self, 0)
if self.update:
if self.updatecounter == self.updatelimit:
self.plot.redraw()
self.updatecounter = 0
else:
self.updatecounter +=1
recv_p, send_p = mp.Pipe(duplex=False)
capture_proc = dataCapture(self.ser, (recv_p, send_p), self.databytes)
capture_proc.start()
send_p.close() #pipe won't trip EOFError unless all connections are closed
elif line.lstrip().startswith("no"):
self.ser.flushInput()
break
while True:
try:
if self.main_pipe.poll():
if self.main_pipe.recv() == 'a':
self.ser.write('a')
return
scan, data = recv_p.recv()
seconds, milliseconds, current = struct.unpack('<HHl', data) #2*uint16 + int32
#(line, [data])
self.main_pipe.send((0, [seconds+milliseconds/1000., current*(1.5/self.gain/8388607)]))
break
except EOFError:
print "empty"
break
class lsv_exp(Experiment):
def __init__(self, parameters, view_parameters, plot_instance, databuffer_instance, send_pipe):
......@@ -206,6 +195,7 @@ class lsv_exp(Experiment):
self.ylabel = "Current (A)"
self.data = [[],[]]
self.datalength = 2
self.databytes = 6 #uint16 + int32
self.xmin = self.parameters['start']
self.xmax = self.parameters['stop']
......@@ -228,7 +218,8 @@ class lsv_exp(Experiment):
self.commands[2] += " "
class cv_exp(Experiment):
def __init__(self, parameters, view_parameters, plot_instance, databuffer_instance):
def __init__(self, parameters, view_parameters, plot_instance, databuffer_instance, main_pipe):
self.main_pipe = main_pipe
self.parameters = parameters
self.view_parameters = view_parameters
self.plot = plot_instance
......@@ -239,6 +230,7 @@ class cv_exp(Experiment):
self.ylabel = "Current (A)"
self.data = [[],[]] #Will have to alter data_handler to add new lists as needed
self.datalength = 2 * self.parameters['scans'] #x and y for each scan
self.databytes = 6 #uint16 + int32
self.xmin = self.parameters['v1']
self.xmax = self.parameters['v2']
......@@ -265,48 +257,31 @@ class cv_exp(Experiment):
self.commands[2] += " "
def data_handler(self):
scan = 0
recv_p, send_p = mp.Pipe(duplex=False)
capture_proc = dataCapture(self.ser, (recv_p, send_p), self.databytes)
capture_proc.start()
send_p.close() #pipe won't trip EOFError unless all connections are closed
while True:
for line in self.ser:
if line.startswith('B'):
inputdata = self.ser.read(size=6) #uint16 + int32
voltage, current = struct.unpack('<Hl', inputdata)
self.data[2*scan].append((voltage-32768)*3000./65536)
self.data[2*scan+1].append(current*(1.5/self.gain/8388607))
self.plot.updateline(self, scan)
if self.update:
if self.updatecounter == self.updatelimit:
self.plot.redraw()
self.updatecounter = 0
else:
self.updatecounter +=1
elif line.lstrip().startswith("no"):
self.ser.flushInput()
break
elif line.lstrip().startswith('S'):
self.plot.redraw()
self.plot.addline()
self.data.append([])
self.data.append([])
scan += 1
elif line.lstrip().startswith('D'):
self.data.pop()
self.data.pop() #instrument signals with S after each cycle, so last one will be blank, D singals end of experiment
self.plot.clearline(scan)
self.plot.redraw()
break
try:
if self.main_pipe.poll():
if self.main_pipe.recv() == 'a':
self.ser.write('a')
return
scan, data = recv_p.recv()
voltage, current = struct.unpack('<Hl', data) #uint16 + int32
#(line, [data])
self.main_pipe.send((scan, [(voltage-32768)*3000./65536, current*(1.5/self.gain/8388607)]))
except EOFError:
print "empty"
break
class swv_exp(Experiment):
def __init__(self, parameters, view_parameters, plot_instance, databuffer_instance):
def __init__(self, parameters, view_parameters, plot_instance, databuffer_instance, main_pipe):
self.main_pipe = main_pipe
self.parameters = parameters
self.view_parameters = view_parameters
self.plot = plot_instance
......@@ -317,6 +292,7 @@ class swv_exp(Experiment):
self.ylabel = "Current (A)"
self.data = [[],[]] #only difference stored here
self.datalength = 2 * self.parameters['scans']
self.databytes = 10
self.xmin = self.parameters['start']
self.xmax = self.parameters['stop']
......@@ -347,49 +323,24 @@ class swv_exp(Experiment):
self.commands[2] += " "
def data_handler(self):
scan = 0
while True:
for line in self.ser:
if line.startswith('B'):
inputdata = self.ser.read(size=10) #uint16 + 2*int32
voltage, forward, reverse = struct.unpack('<Hll', inputdata)
self.data[2*scan].append((voltage-32768)*3000./65536)
self.data[2*scan+1].append((forward-reverse)*(1.5/self.gain/8388607))
self.data_extra[2*scan].append(forward*(1.5/self.gain/8388607))
self.data_extra[2*scan+1].append(reverse*(1.5/self.gain/8388607))
self.plot.updateline(self, scan) #displays only difference current, but forward and reverse stored
if self.update:
if self.updatecounter == self.updatelimit:
self.plot.redraw()
self.updatecounter = 0
else:
self.updatecounter +=1
elif line.lstrip().startswith("no"):
self.ser.flushInput()
break
recv_p, send_p = mp.Pipe(duplex=False)
elif line.lstrip().startswith('S'):
self.plot.redraw()
self.plot.addline()
self.data.append([])
self.data.append([])
self.data_extra.append([])
self.data_extra.append([])
scan += 1
capture_proc = dataCapture(self.ser, (recv_p, send_p), self.databytes)
capture_proc.start()
send_p.close() #pipe won't trip EOFError unless all connections are closed
while True:
try:
if self.main_pipe.poll():
if self.main_pipe.recv() == 'a':
self.ser.write('a')
return
elif line.lstrip().startswith('D'):
self.data.pop()
self.data.pop() #instrument signals with S after each cycle, so last one will be blank, D singals end of experiment
self.data_extra.pop()
self.data_extra.pop()
self.plot.clearline(scan)
self.plot.redraw()
scan, data = recv_p.recv()
voltage, forward, reverse = struct.unpack('<Hll', data) #uint16 + int32
#(line, [data])
self.main_pipe.send((scan, [(voltage-32768)*3000./65536, (forward-reverse)*(1.5/self.gain/8388607), forward*(1.5/self.gain/8388607), reverse*(1.5/self.gain/8388607)]))
break
except EOFError:
print "empty"
break
......@@ -199,6 +199,10 @@ class main:
view_parameters['update'] = self.plotint_checkbox.get_active()
view_parameters['updatelimit'] = int(self.updatelimit_adj.get_value())
self.line = 0
self.lastline = 0
self.lastdataline = 0
self.spinner.start()
self.statusbar.remove_all(self.error_context_id)
......@@ -210,8 +214,16 @@ class main:
if not parameters['potential']:
raise InputError(parameters['potential'],"Step table is empty")
self.current_exp = comm.chronoamp(parameters, view_parameters, self.plot, self.rawbuffer)
self.current_exp.run(self.serial_liststore.get_value(self.serial_combobox.get_active_iter(), 0))
self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True)
self.current_exp = comm.chronoamp(parameters, view_parameters, self.plot, self.rawbuffer, self.send_p)
self.p = multiprocessing.Process(target=self.current_exp.run, args=(self.serial_liststore.get_value(self.serial_combobox.get_active_iter(), 0), ))
self.p.start()
self.send_p.close() #need to close this copy of connection object for EOF signal to work
self.plot_proc = gobject.timeout_add(200, self.experiment_running_plot)
gobject.idle_add(self.experiment_running)
elif selection == 1: #LSV
parameters['clean_mV'] = int(self.lsv.clean_mV.get_text())
......@@ -239,12 +251,8 @@ class main:
raise InputError(parameters['slope'],"Slope parameter exceeds hardware limits.")
if parameters['start'] == parameters['stop']:
raise InputError(parameters['start'],"Start cannot equal Stop.")
# self.current_exp.run(self.serial_liststore.get_value(self.serial_combobox.get_active_iter(), 0))
self.line = 0
self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True)
self.current_exp = comm.lsv_exp(parameters, view_parameters, self.plot, self.rawbuffer, self.send_p)
self.p = multiprocessing.Process(target=self.current_exp.run, args=(self.serial_liststore.get_value(self.serial_combobox.get_active_iter(), 0), ))
......@@ -288,9 +296,17 @@ class main:
if parameters['v1'] == parameters['v2']:
raise InputError(parameters['v1'],"Vertex 1 cannot equal Vertex 2.")
self.current_exp = comm.cv_exp(parameters, view_parameters, self.plot, self.rawbuffer)
self.current_exp.run(self.serial_liststore.get_value(self.serial_combobox.get_active_iter(), 0))
self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True)
self.current_exp = comm.cv_exp(parameters, view_parameters, self.plot, self.rawbuffer, self.send_p)
self.p = multiprocessing.Process(target=self.current_exp.run, args=(self.serial_liststore.get_value(self.serial_combobox.get_active_iter(), 0), ))
self.p.start()
self.send_p.close()
self.plot_proc = gobject.timeout_add(200, self.experiment_running_plot)
gobject.idle_add(self.experiment_running)
elif selection == 3: #SWV
parameters['clean_mV'] = int(self.swv.clean_mV.get_text())
parameters['clean_s'] = int(self.swv.clean_s.get_text())
......@@ -330,10 +346,18 @@ class main:
raise InputError(parameters['freq'], "Frequency parameter outside limits.")
if parameters['start'] == parameters['stop']:
raise InputError(parameters['start'],"Start cannot equal Stop.")
self.current_exp = comm.swv_exp(parameters, view_parameters, self.plot, self.rawbuffer)
self.current_exp.run(self.serial_liststore.get_value(self.serial_combobox.get_active_iter(), 0))
self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True)
self.current_exp = comm.swv_exp(parameters, view_parameters, self.plot, self.rawbuffer, self.send_p)
self.p = multiprocessing.Process(target=self.current_exp.run, args=(self.serial_liststore.get_value(self.serial_combobox.get_active_iter(), 0), ))
self.p.start()
self.send_p.close()
self.plot_proc = gobject.timeout_add(200, self.experiment_running_plot)
gobject.idle_add(self.experiment_running)
else:
self.statusbar.push(self.error_context_id, "Experiment not yet implemented.")
......@@ -358,14 +382,25 @@ class main:
if self.recv_p.poll():
self.line, data = self.recv_p.recv()
print self.line, data
for i in range(len(data)):
self.current_exp.data[self.line+i].append(data[i])
if self.line > self.lastdataline:
self.current_exp.data += [[],[]]
if len(data) > 2:
self.current_exp.data_extra += [[],[]]
self.lastdataline = self.line
for i in range(2):
self.current_exp.data[2*self.line+i].append(data[i])
if len(data) > 2:
self.current_exp.data_extra[2*self.line+i].append(data[i])
return True
except EOFError:
self.experiment_done()
return False
def experiment_running_plot(self):
if self.line > self.lastline:
self.plot.addline()
self.plot.updateline(self.current_exp, self.lastline) #make sure all of last line is added
self.lastline = self.line
self.plot.updateline(self.current_exp, self.line)
self.plot.redraw()
return True
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment