示例#1
0
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)