class PageOne(wx.Panel): def __init__(self, parent, hw_ver, frame): self.frame = frame self.multiplier_list = [1, 2, 4, 5, 8, 10, 16, 20] wx.Panel.__init__(self, parent) self.hw_ver = hw_ver main_sizer = wx.BoxSizer(wx.HORIZONTAL) grid = wx.GridBagSizer(hgap=5, vgap=5) grid_2 = wx.GridBagSizer(hgap=5, vgap=5) horizontal_sizer_2 = wx.BoxSizer(wx.HORIZONTAL) horizontal_sizer = wx.BoxSizer(wx.VERTICAL) plot_sizer = wx.BoxSizer(wx.VERTICAL) self.input_label = wx.StaticBox(self, -1, 'Analog input') self.input_sizer = wx.StaticBoxSizer(self.input_label, wx.HORIZONTAL) self.sample_list = [] for i in range(1, 9): self.sample_list.append("A" + str(i)) self.label_ch_1 = wx.StaticText(self, label="Ch+") grid.Add(self.label_ch_1, pos=(0, 0)) self.edit_ch_1 = wx.ComboBox(self, size=(95, -1), choices=self.sample_list, style=wx.CB_READONLY) self.edit_ch_1.SetSelection(0) grid.Add(self.edit_ch_1, pos=(0, 1)) if self.hw_ver == 1: self.sample_list = ("AGND", "VREF", "A5", "A6", "A7", "A8") else: if self.hw_ver == 2: self.sample_list = ("AGND", "A2") self.label_ch_2 = wx.StaticText(self, label="Ch-") grid.Add(self.label_ch_2, pos=(1, 0)) self.edit_ch_2 = wx.ComboBox(self, size=(95, -1), choices=self.sample_list, style=wx.CB_READONLY) self.edit_ch_2.SetSelection(0) grid.Add(self.edit_ch_2, pos=(1, 1)) self.Bind(wx.EVT_COMBOBOX, self.edit_ch_1_change, self.edit_ch_1) self.Bind(wx.EVT_COMBOBOX, self.edit_ch_2_change, self.edit_ch_2) if self.hw_ver == 1: self.sample_list = ("+-12 V", "+-4 V", "+-2 V", "+-0.4 V", "+-0.04 V") self.label_range = wx.StaticText(self, label="Range") else: if self.hw_ver == 2: self.sample_list = ("x1", "x2", "x4", "x5", "x8", "x10", "x16", "x20") self.label_range = wx.StaticText(self, label="Multiplier") grid.Add(self.label_range, pos=(2, 0)) self.edit_range = wx.ComboBox(self, size=(95, -1), choices=self.sample_list, style=wx.CB_READONLY) self.edit_range.SetSelection(0) grid.Add(self.edit_range, pos=(2, 1)) if self.hw_ver == 2: self.edit_range.Enable(False) self.label_rate = wx.StaticText(self, label="Rate(s)") grid.Add(self.label_rate, pos=(3, 0)) self.edit_rate = (FloatSpin(self, value=1, min_val=0.1, max_val=65.535, increment=0.1, digits=1)) grid.Add(self.edit_rate, pos=(3, 1)) self.button_play = wx.Button(self, label="Play", size=(95, 25)) self.Bind(wx.EVT_BUTTON, self.play_event, self.button_play) self.button_stop = wx.Button(self, label="Stop", size=(95, 25)) self.Bind(wx.EVT_BUTTON, self.stop_event, self.button_stop) self.button_stop.Enable(False) grid.Add(self.button_play, pos=(4, 0)) grid.Add(self.button_stop, pos=(4, 1)) self.label_value = wx.StaticText(self, label="Last value (V)") grid.Add(self.label_value, pos=(5, 0)) self.input_value = wx.TextCtrl(self, style=wx.TE_READONLY, size=(95, 25)) grid.Add(self.input_value, pos=(5, 1)) self.input_sizer.Add(grid, 0, wx.ALL, border=10) self.output_label = wx.StaticBox(self, -1, 'Analog output') self.output_sizer = wx.StaticBoxSizer(self.output_label, wx.HORIZONTAL) if hw_ver == 1: self.edit_value = FloatSpin(self, value=0, min_val=-4.0, max_val=4.0, increment=0.1, digits=3) elif hw_ver == 2: self.edit_value = FloatSpin(self, value=0, min_val=0, max_val=4.0, increment=0.1, digits=3) self.Bind(wx.lib.agw.floatspin.EVT_FLOATSPIN, self.slider_change, self.edit_value) self.lblDAC = wx.StaticText(self, label="DAC value (V)") grid_2.Add(self.lblDAC, pos=(0, 0)) grid_2.Add(self.edit_value, pos=(0, 3)) self.output_sizer.Add(grid_2, 0, wx.ALL, border=10) self.export_label = wx.StaticBox(self, -1, 'Export') self.export_sizer = wx.StaticBoxSizer(self.export_label, wx.HORIZONTAL) self.png = wx.Button(self, label="As PNG file...", size=(98, 25)) self.Bind(wx.EVT_BUTTON, self.save_as_png_event, self.png) self.csv = wx.Button(self, label="As CSV file...", size=(98, 25)) self.Bind(wx.EVT_BUTTON, self.save_as_csv_event, self.csv) horizontal_sizer_2.Add(self.png, 0, wx.ALL) horizontal_sizer_2.Add(self.csv, 0, wx.ALL) self.export_sizer.Add(horizontal_sizer_2, 0, wx.ALL, border=10) self.figure = Figure(facecolor='#ece9d8') self.axes = self.figure.add_subplot(111) self.canvas = FigureCanvas(self, -1, self.figure) self.axes.set_xlabel("Time (s)", fontsize=12) self.axes.set_ylabel("Voltage (mV)", fontsize=12) self.canvas.SetInitialSize(size=(600, 600)) self.add_toolbar() self.cidUpdate = self.canvas.mpl_connect('motion_notify_event', self.UpdateStatusBar) plot_sizer.Add(self.toolbar, 0, wx.CENTER) plot_sizer.Add(self.canvas, 0, wx.ALL) horizontal_sizer.Add(self.input_sizer, 0, wx.CENTRE) horizontal_sizer.Add(self.output_sizer, 0, wx.EXPAND) horizontal_sizer.Add(self.export_sizer, 0, wx.EXPAND) main_sizer.Add(horizontal_sizer, 0, wx.ALL, border=10) main_sizer.Add(plot_sizer, 0, wx.ALL) self.SetSizerAndFit(main_sizer) self.data_packet = [] self.x = [] self.y = [] # Create a publisher receiver pub.subscribe(self.new_data, "newdata") pub.subscribe(self.clear_canvas, "clearcanvas") def new_data(self, msg): data = msg.data if isinstance(msg.data, float): self.input_value.Clear() self.input_value.AppendText(str(data)) if (self.toolbar.mode == "pan/zoom"): return if (self.toolbar.mode == "zoom rect"): return self.canvas.mpl_disconnect(self.frame.page_1.cidUpdate) self.axes.cla() self.axes.grid(color='gray', linestyle='dashed') self.axes.plot(self.y, self.x) self.canvas.draw() self.cidUpdate = self.frame.page_1.canvas.mpl_connect( 'motion_notify_event', self.frame.page_1.UpdateStatusBar) def clear_canvas(self, msg): self.input_value.Clear() self.axes.cla() self.axes.grid(color='gray', linestyle='dashed') self.axes.plot(self.y, self.x) self.canvas.draw() def UpdateStatusBar(self, event): if event.inaxes: x, y = event.xdata, event.ydata self.frame.status_bar.SetStatusText( ("x= " + "%.4g" % x + " y=" + "%.4g" % y), 1) def add_toolbar(self): self.toolbar = MyCustomToolbar(self.canvas) self.toolbar.Realize() # On Windows platform, default window size is incorrect, so set # toolbar width to figure width. tw, th = self.toolbar.GetSizeTuple() fw, fh = self.canvas.GetSizeTuple() # By adding toolbar in sizer, we are able to put it at the bottom # of the frame - so appearance is closer to GTK version. # As noted above, doesn't work for Mac. self.toolbar.SetSize(wx.Size(fw, th)) #self.main_sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND) # update the axes menu on the toolbar self.toolbar.update() def save_as_png_event(self, event): self.directory_name = '' dlg = wx.FileDialog(self, "Choose a file", self.directory_name, "", "*.png", wx.OPEN) if dlg.ShowModal() == wx.ID_OK: self.file_name = dlg.GetFilename() self.directory_name = dlg.GetDirectory() self.figure.savefig(self.directory_name + "\\" + self.file_name) dlg.Destroy() def save_as_csv_event(self, event): self.directory_name = '' dlg = wx.FileDialog(self, "Choose a file", self.directory_name, "", "*.odq", wx.OPEN) if dlg.ShowModal() == wx.ID_OK: self.file_name = dlg.GetFilename() self.directory_name = dlg.GetDirectory() with open(self.directory_name + "\\" + self.file_name, 'wb') as file: spamwriter = csv.writer(file, quoting=csv.QUOTE_MINIMAL) for i in range(len(self.frame.comunication_thread.data)): spamwriter.writerow([ self.frame.comunication_thread.x[i], self.frame.comunication_thread.y[i] ]) dlg.Destroy() def zoom_up(self, event): pass def play_event(self, event): self.data_packet = [] self.x = [] self.y = [] self.ch_1 = self.edit_ch_1.GetCurrentSelection() self.ch_2 = self.edit_ch_2.GetCurrentSelection() self.range = self.edit_range.GetCurrentSelection() self.rate = self.edit_rate.GetValue() * 1000 self.edit_rate.SetValue(self.edit_rate.GetValue()) self.edit_value.SetValue(self.edit_value.GetValue()) if self.ch_1 == -1: self.frame.show_error_parameters() return if self.ch_2 == -1: self.frame.show_error_parameters() return if self.range == -1: self.frame.show_error_parameters() return if self.hw_ver == 2 and self.ch_2 == 1: self.ch_2 = self.edit_ch_2.GetValue() self.ch_2 = self.ch_2[1] if self.hw_ver == 1: if self.ch_2 == 1: self.ch_2 = 25 elif self.ch_2 > 1: self.ch_2 += 3 self.frame.comunication_thread.config(self.ch_1, int(self.ch_2), self.range, self.rate) self.button_play.Enable(False) self.button_stop.Enable(True) self.edit_ch_1.Enable(False) self.edit_ch_2.Enable(False) self.edit_range.Enable(False) self.edit_rate.Enable(False) self.frame.daq.set_led(3) wx.CallAfter(pub.sendMessage, "clearcanvas", None) if self.frame.comunication_thread.is_alive(): self.frame.comunication_thread.restart() else: self.frame.comunication_thread.start() self.frame.comunication_thread.stop() self.play_event(0) def stop_event(self, event): self.button_play.Enable(True) self.button_stop.Enable(False) self.edit_ch_1.Enable(True) self.edit_ch_2.Enable(True) self.edit_rate.Enable(True) if (self.hw_ver == 1 or (self.hw_ver == 2 and self.edit_ch_2.GetValue() != "AGND")): self.edit_range.Enable(True) self.frame.daq.set_led(1) self.frame.comunication_thread.stop() def slider_change(self, event): dac_value = self.edit_value.GetValue() self.frame.daq.set_analog(dac_value) def edit_ch_1_change(self, event): if self.hw_ver == 1: return value = self.edit_ch_1.GetValue() self.edit_ch_2.Clear() self.edit_ch_2.Append("AGND") if (int(value[1]) % 2) == 0: self.edit_ch_2.Append("A" + str(int(value[1]) - 1)) else: self.edit_ch_2.Append("A" + str(int(value[1]) + 1)) self.edit_ch_2.SetSelection(0) self.edit_range.SetSelection(0) self.edit_range.Enable(False) def edit_ch_2_change(self, event): if self.hw_ver == 1: return if self.edit_ch_2.GetValue() == "AGND": self.edit_range.Enable(False) self.edit_range.SetSelection(0) else: self.edit_range.Enable(True)