diff --git a/dstatInterface/dstat_comm.py b/dstatInterface/dstat_comm.py index 562b0dc128052ac593cfbce2d228d869a534d492..1f8105338f9693fc9b2d78182aac2c54f3051040 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 c476d8fc2939556f9d74018fc37d968c12e3b495..01ebc18238b1793e9fd2f20bef743a550ef64545 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 e16ed93081d1f07982b50faaf5d52e2f838a4679..31926e10c63aa6d69b3d479fd19e5663b0e1d3e8 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 516d8032dc57a5c5397d4444a0879752d21bd26e..ea8bc7585a474746f87782ce287df979f53d0beb 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