예제 #1
0
    def __init__(self, baud_rate, *args, **kwargs):
        self.baud_rate = baud_rate
        self.builder = Gtk.Builder()
        my_dir = os.path.dirname(__file__)
        self.builder.add_from_file(os.path.join(my_dir, "TestSend.glade"))

        self.win = self.builder.get_object("TestSendMainWin")
        "top-level widget for whole window"
        self.close_btn = self.builder.get_object("btnClose")
        self.ports_list = self.builder.get_object("liststore1")
        "model for device list"
        self.ports_view = self.builder.get_object("dev_list_tview")
        "view for device list"
        self.chkSerial = self.builder.get_object("chkSerial")
        self.chkUSB = self.builder.get_object("chkUSB")
        isinstance(self.chkSerial, Gtk.CheckButton)
        isinstance(self.chkUSB, Gtk.CheckButton)
        self.ports_chooser = GtkPortChooser(self.ports_list,
                                            self.ports_view,
                                            self.chkSerial,
                                            self.chkUSB,
                                            self
                                           )

        self.ports_chooser.updateList()
        #isinstance(self.ports_view, Gtk.TreeView) # hint for editor
        #self.ports_view
        #pprint(dir(self.ports_view))
        self.page1_child = self.builder.get_object("stg_pg1_child")
        isinstance(self.page1_child, Gtk.Grid)

        self.text_view = self.builder.get_object("textview1")
        "Text output box"
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn(None, renderer, text=0)
        #the following is REQUIRED to display ports
        column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)

        column.set_widget(None)  # no header
        self.ports_view.append_column(column)

        #make the standard close box for window work
        #for some reason bad things happen if we try do this with handlers dict below
        self.win.connect("delete-event", Gtk.main_quit)

        #connect action handlers to code objects
        handlers = {
            #close button
            "onCloseAction": self.onCloseAction,
            "on_chkUSB_toggled": self.ports_chooser.onUSBToggled,
            "on_chkSerial_toggled": self.ports_chooser.onSerialToggled,
            "onSelectDevice": self.ports_chooser.onPortChosen,
            "b_entry_bkspc": self.b_entry_bkspc,
            "a_entry_bkspc": self.a_entry_bkspc,
            "b_entry_paste": self.b_entry_paste,
            "a_entry_paste": self.a_entry_paste,
            "b_key_press": self.b_key_press,
            "a_key_press": self.a_key_press,
            "on_btnClose_pressed": self.on_btnClose_press,
        }
        self.builder.connect_signals(handlers)

        #isinstance(self.text_view, Gtk.TextView)
        #buff = self.text_view.get_buffer()
        #buff.insert_at_cursor("{}.{}.{}".format(Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()))
        class RefreshTask(Thread):
            def __init__(self, main_win, *args, **kwargs):
                super().__init__(*args, **kwargs)
                self.parent_win = main_win
                assert isinstance(self.parent_win, TestSendMainWin)

            def run(self):
                while True:
                    time.sleep(3)
                    print("refreshing list", flush=True)
                    GObject.idle_add(self.parent_win.ports_chooser.updateList)
                    port = self.parent_win.ports_chooser.selectedPort
                    #if port:

        self.refresh_task = RefreshTask(self)

        self.refresh_task.start()
        assert self.refresh_task.is_alive()
        self.win.show_all()
예제 #2
0
class TestSendMainWin(object):

    TIMEOUT=2  #seconds
    "Timeout for serial reads"

    def __init__(self, baud_rate, *args, **kwargs):
        self.baud_rate = baud_rate
        self.builder = Gtk.Builder()
        my_dir = os.path.dirname(__file__)
        self.builder.add_from_file(os.path.join(my_dir, "TestSend.glade"))

        self.win = self.builder.get_object("TestSendMainWin")
        "top-level widget for whole window"
        self.close_btn = self.builder.get_object("btnClose")
        self.ports_list = self.builder.get_object("liststore1")
        "model for device list"
        self.ports_view = self.builder.get_object("dev_list_tview")
        "view for device list"
        self.chkSerial = self.builder.get_object("chkSerial")
        self.chkUSB = self.builder.get_object("chkUSB")
        isinstance(self.chkSerial, Gtk.CheckButton)
        isinstance(self.chkUSB, Gtk.CheckButton)
        self.ports_chooser = GtkPortChooser(self.ports_list,
                                            self.ports_view,
                                            self.chkSerial,
                                            self.chkUSB,
                                            self
                                           )

        self.ports_chooser.updateList()
        #isinstance(self.ports_view, Gtk.TreeView) # hint for editor
        #self.ports_view
        #pprint(dir(self.ports_view))
        self.page1_child = self.builder.get_object("stg_pg1_child")
        isinstance(self.page1_child, Gtk.Grid)

        self.text_view = self.builder.get_object("textview1")
        "Text output box"
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn(None, renderer, text=0)
        #the following is REQUIRED to display ports
        column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)

        column.set_widget(None)  # no header
        self.ports_view.append_column(column)

        #make the standard close box for window work
        #for some reason bad things happen if we try do this with handlers dict below
        self.win.connect("delete-event", Gtk.main_quit)

        #connect action handlers to code objects
        handlers = {
            #close button
            "onCloseAction": self.onCloseAction,
            "on_chkUSB_toggled": self.ports_chooser.onUSBToggled,
            "on_chkSerial_toggled": self.ports_chooser.onSerialToggled,
            "onSelectDevice": self.ports_chooser.onPortChosen,
            "b_entry_bkspc": self.b_entry_bkspc,
            "a_entry_bkspc": self.a_entry_bkspc,
            "b_entry_paste": self.b_entry_paste,
            "a_entry_paste": self.a_entry_paste,
            "b_key_press": self.b_key_press,
            "a_key_press": self.a_key_press,
            "on_btnClose_pressed": self.on_btnClose_press,
        }
        self.builder.connect_signals(handlers)

        #isinstance(self.text_view, Gtk.TextView)
        #buff = self.text_view.get_buffer()
        #buff.insert_at_cursor("{}.{}.{}".format(Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()))
        class RefreshTask(Thread):
            def __init__(self, main_win, *args, **kwargs):
                super().__init__(*args, **kwargs)
                self.parent_win = main_win
                assert isinstance(self.parent_win, TestSendMainWin)

            def run(self):
                while True:
                    time.sleep(3)
                    print("refreshing list", flush=True)
                    GObject.idle_add(self.parent_win.ports_chooser.updateList)
                    port = self.parent_win.ports_chooser.selectedPort
                    #if port:

        self.refresh_task = RefreshTask(self)

        self.refresh_task.start()
        assert self.refresh_task.is_alive()
        self.win.show_all()

    def _set_device(self, device_name):
        # args to serial
        #         port = None,           # number of device, numbering starts at
        #                                # zero. if everything fails, the user
        #                                # can specify a device string, note
        #                                # that this isn't portable anymore
        #                                # port will be opened if one is specified
        #         baudrate=9600,         # baud rate
        #         bytesize=EIGHTBITS,    # number of data bits
        #         parity=PARITY_NONE,    # enable parity checking
        #         stopbits=STOPBITS_ONE, # number of stop bits
        #         timeout=None,          # set a timeout value, None to wait forever
        #         xonxoff=False,         # enable software flow control
        #         rtscts=False,          # enable RTS/CTS flow control
        #         writeTimeout=None,     # set a timeout for writes
        #         dsrdtr=False,          # None: use rtscts setting, dsrdtr
        #                                #override if True or False
        #         interCharTimeout=None  # Inter-character timeout, None to disable
        self.current_port = Serial(port=device_name, baudrate=self.baud_rate, timeout=self.TIMEOUT)
        self.xb = ZigBee(self.current_port, shorthand=True, escaped=False)
        assert self.xb

    def cancel_threads(self):
        self.refresh_task.join()

    def onChkUSB(self, button):
        self.ports_chooser.onUSBToggled(button)

    def onChkSerial(self, button):
        self.ports_chooser.onUSBToggled(button)

    def onPortSelected(self, port):
        print("selected {}".format(port))
        self.ports_chooser.updateList()

    def onCloseAction(self):
        Gtk.main_quit()

    def a_entry_bkspc(self, event):
        print("a_entry_bkspc(self, {})".format(str(event)))

    def b_entry_bkspc(self, event):
        print("b_entry_bkspc(self, {})".format(str(event)))

    def a_entry_paste(self, event):
        print("a_entry_paste(self, {})".format(str(event)))

    def b_entry_paste(self, event):
        print("b_entry_paste(self, {})".format(str(dir(event))))

    def a_key_press(self, text_view, event_key):
        print("a_key_press: {}".format(event_key.string))

    def b_key_press(self, text_view, event_key):
        #isinstance(event_key, Gdk.EventKey)
        print("b_key_press: {}".format(event_key.string))

    def on_btnClose_press(self, event):
        Gtk.main_quit()