From f19f434e27e2c4d889524318b20d81341e54295b Mon Sep 17 00:00:00 2001 From: "Michael D. M. Dryden" <mdryden@chem.utoronto.ca> Date: Fri, 11 Jul 2014 16:45:09 -0400 Subject: [PATCH] Multiprocessed UI for LSV (Other experiment types broken) Stop button implemented. --- dstatInterface/dstat_comm.py | 32 ++++++++----- dstatInterface/interface/dstatInterface.glade | 1 + dstatInterface/interface_test.py | 48 +++++++++++++++++-- dstatInterface/mpltest.py | 2 + 4 files changed, 66 insertions(+), 17 deletions(-) diff --git a/dstatInterface/dstat_comm.py b/dstatInterface/dstat_comm.py index 562b0dc..1f81053 100644 --- a/dstatInterface/dstat_comm.py +++ b/dstatInterface/dstat_comm.py @@ -99,9 +99,10 @@ class Experiment: self.data_postprocessing() - self.plot.updateline(self, 0) - self.plot.redraw() - +# self.plot.updateline(self, 0) +# self.plot.redraw() + print "pipe closed" + self.main_pipe.close() self.ser.close() def data_handler(self): @@ -115,15 +116,21 @@ class Experiment: while True: try: - voltage, current = struct.unpack('<Hl', recv_p.recv()) #uint16 + int32 + if self.main_pipe.poll(): + if self.main_pipe.recv() == 'a': + self.ser.write('a') + return + + voltage, current = struct.unpack('<Hl', recv_p.recv()) #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()) - 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" break @@ -187,7 +194,8 @@ class chronoamp(Experiment): break class lsv_exp(Experiment): - def __init__(self, parameters, view_parameters, plot_instance, databuffer_instance): + def __init__(self, parameters, view_parameters, plot_instance, databuffer_instance, send_pipe): + self.main_pipe = send_pipe self.parameters = parameters self.view_parameters = view_parameters self.plot = plot_instance diff --git a/dstatInterface/interface/dstatInterface.glade b/dstatInterface/interface/dstatInterface.glade index c476d8f..01ebc18 100644 --- a/dstatInterface/interface/dstatInterface.glade +++ b/dstatInterface/interface/dstatInterface.glade @@ -375,6 +375,7 @@ <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> + <signal name="clicked" handler="on_pot_stop_clicked" swapped="no"/> </object> <packing> <property name="expand">True</property> diff --git a/dstatInterface/interface_test.py b/dstatInterface/interface_test.py index e16ed93..31926e1 100644 --- a/dstatInterface/interface_test.py +++ b/dstatInterface/interface_test.py @@ -240,8 +240,20 @@ class main: if parameters['start'] == parameters['stop']: raise InputError(parameters['start'],"Start cannot equal Stop.") - self.current_exp = comm.lsv_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.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), )) + 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 == 2: #CV parameters['clean_mV'] = int(self.cv.clean_mV.get_text()) @@ -340,17 +352,38 @@ class main: except AssertionError as e: self.spinner.stop() self.statusbar.push(self.error_context_id, str(e)) + + def experiment_running(self): + try: + 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]) + return True + except EOFError: + self.experiment_done() + return False + + def experiment_running_plot(self): + self.plot.updateline(self.current_exp, self.line) + self.plot.redraw() + return True + + def experiment_done(self): + gobject.source_remove(self.plot_proc) #stop automatic plot update + self.experiment_running_plot() #make sure all data updated on plot self.databuffer.set_text("") self.databuffer.place_cursor(self.databuffer.get_start_iter()) self.rawbuffer.set_text("") self.rawbuffer.place_cursor(self.rawbuffer.get_start_iter()) - + for col in zip(*self.current_exp.data): for row in col: self.rawbuffer.insert_at_cursor(str(row)+ "\t") self.rawbuffer.insert_at_cursor("\n") - + if self.current_exp.data_extra: for col in zip(*self.current_exp.data_extra): @@ -360,7 +393,12 @@ class main: self.spinner.stop() - + + def on_pot_stop_clicked(self, data=None): + if self.recv_p: + print "stop" + self.recv_p.send('a') + def on_file_save_exp_activate(self, menuitem, data=None): if self.current_exp: self.save = save.npSave(self.current_exp) diff --git a/dstatInterface/mpltest.py b/dstatInterface/mpltest.py index 516d803..ea8bc75 100644 --- a/dstatInterface/mpltest.py +++ b/dstatInterface/mpltest.py @@ -61,4 +61,6 @@ class plotbox: self.axe1.relim() self.axe1.autoscale(True, axis = 'y') self.figure.canvas.draw() + + return True -- GitLab