Esempio n. 1
0
    def change_key_mapping(self):
        def onPress(key):
            try:
                newkey = key.char
            except AttributeError:
                newkey = key.name
            if newkey == "esc":
                okVar.set(1)
                return
            if newkey == "f1":
                self.configure(text="NONE")
                okVar.set(1)
                return
            self.configure(text=newkey)
            okVar.set(1)

        def onRelease(key):
            listener.stop()

        okVar = IntVar()
        win = Toplevel()
        win.lift()
        win.focus_force()
        win.grab_set()
        win.grab_release()
        Label(
            win,
            text=
            "Press wanted Button or\nPress ESC to exit or\n Press F1 to set to none",
        ).pack()
        listener = keyboard.Listener(on_press=onPress, on_release=onRelease)
        listener.start()
        win.wait_variable(okVar)
        win.destroy()
class PopupWindow(object):
    """This class creates a custom pop-up window to display and edit the data in an associated Log object"""

    #TODO: Refactor to pass "New Mission as a parameter"
    #TODO: Refactor to pass "add_mission(self.app, name)"
    def __init__(self, app, master, text):
        self.app = app
        self.top = Toplevel(master)
        self.top.title("New Mission")
        self.top.grab_set()             # freezes the app until the user enters or cancels

        # build the widgets
        self.label = ttk.Label(self.top, text=text, background='white')
        self.label.pack()
        self.e = ttk.Entry(self.top)
        self.e.pack()
        self.b = ttk.Button(self.top, text='Ok', command=self._cleanup)
        self.b.pack()
    #end init


    def _cleanup(self):
        """Clean up the window we created"""
        name = self.e.get()
        add_mission(self.app, name)
        self.top.grab_release()         # HAVE TO RELEASE
        self.top.destroy()
Esempio n. 3
0
class SetupPopUp:
    """A TopLevel popup that will lock the main App and allow users to set up
    the required environmental paths to the SDSS data before unlocking the App
    again.

    Without those paths the createjobs module will likely not be able to create
    jobs.
    """
    def __init__(self, parent):
        self.top = Toplevel(parent)
        self.top.wm_title("Envionment not set up properly!")
        txt = (
            "Environment is missing BOSS and/or PHOTO_REDUX env variables.\n"
            "Please provide the PHOTO_REDUX path. See"
            "help(createjobs.setup.) for details.")

        self.explainLabel = ttk.Label(self.top, text=txt)
        self.explainLabel.pack()

        self.photoreduxSV = StringVar()
        self.pathEntry = ttk.Entry(self.top)
        self.pathEntry.pack(padx=5)

        self.okButton = ttk.Button(self.top, text="OK", command=self.ok)
        self.okButton.pack(pady=5)
        self.top.grab_set()

    def ok(self):
        """A callback function that will call the createjobs setup function,
        unlock the main app and destroy the popup.
        """
        cj.setup(self.photoreduxSV.get())
        self.top.grab_release()
        self.top.destroy()
class ModalWindow():
    def __init__(self, tab):
        self.toplevel = Toplevel(tab.tk)
        self.toplevel.transient(tab.tk)
        self.toplevel.withdraw()
        self.toplevel.grab_release()
        self.toplevel.protocol('WM_DELETE_WINDOW', self.hide)

    def show(self):
        self.centering()
        self.toplevel.deiconify()
        self.toplevel.tkraise()
        self.toplevel.grab_set()
        self.toplevel.focus_set()

    def hide(self):
        self.toplevel.grab_release()
        self.toplevel.withdraw()

    def centering(self):
        sw = self.toplevel.winfo_screenwidth()
        rw = self.toplevel.winfo_reqwidth()
        x = (sw - rw) // 2
        sw = self.toplevel.winfo_screenheight()
        rw = self.toplevel.winfo_reqheight()
        y = (sw - rw) // 2
        self.toplevel.wm_geometry('+%i+%i' % (x, y))
Esempio n. 5
0
class ToplevelVidget(object):
    """
    ToplevelVidget contains a Toplevel widget.
    """

    def __init__(
        self,
        close_handler=None,
        master=None,
    ):
        """
        Initialize object.

        @param close_handler: Window close button event handler.

        @param master: Master widget.

        @return: None.
        """

        # Create toplevel widget
        self._toplevel = Toplevel(master=master)

        # Hide the toplevel widget
        self._toplevel.withdraw()

        # Window close button event handler
        self._close_handler = close_handler \
            if close_handler is not None else self._close_handler_default

        # Register window close button event handler
        self._toplevel.protocol('WM_DELETE_WINDOW', self._close_handler)

    def toplevel(self):
        """
        Get the toplevel widget.

        @return: toplevel widget.
        """
        return self._toplevel

    def __getattr__(self, name):
        """
        Delegate attribute lookup to the toplevel widget.

        @return: Attribute value, or raise AttributeError.
        """
        return getattr(self._toplevel, name)

    def _close_handler_default(self):
        """
        Default window close button event handler.

        @return: None.
        """
        # Hide the toplevel widget
        self._toplevel.withdraw()

        # Release grab on the toplevel widget
        self._toplevel.grab_release()
Esempio n. 6
0
class ProgressWindow:
    def __init__(self, parent, msg):
        self.parent = parent
        self.msg = msg
        self.window = None

    def start(self):
        self.window = Toplevel(self.parent.window)
        self.window.protocol('WM_DELETE_WINDOW', do_nothing)
        bar = Progressbar(self.window,
                          orient=tk.HORIZONTAL,
                          length=200,
                          mode='indeterminate')
        label = Label(self.window, text=self.msg)
        self.window.title('Proszę czekać')
        self.window.geometry('300x50')
        #self.window.lift(aboveThis=self.parent.window)
        self.window.attributes("-topmost", True)
        label.pack(side=tk.TOP)
        bar.pack(side=tk.TOP)
        bar.start(10)
        self.window.grab_set()

    def destroy(self):
        self.window.grab_release()
        self.window.destroy()
Esempio n. 7
0
    def test_chuc_nang_tach_tu(self, event):
        top_level = Toplevel(self.root)
        tach_tu = TestTachTu(top_level, self.disk_db, self.memory_db)
        tach_tu.pack()

        top_level.grab_set()
        top_level.wait_window()
        top_level.grab_release()
Esempio n. 8
0
    def test_dan_nhan_thuc_the(self, event):
        top_level = Toplevel(self.root)
        dan_nhan_thuc_the = DanNhanThucThe(top_level, self.disk_db,
                                           self.memory_db)
        dan_nhan_thuc_the.pack()

        top_level.grab_set()
        top_level.wait_window()
        top_level.grab_release()
Esempio n. 9
0
class AddWriteWindow:
    def __init__(self, parent, model):
        self.buf_type = tk.IntVar()
        self.model = model
        self.parent = parent
        self.window = Toplevel(parent.window)
        self.window.title('Dodaj test write')
        self.window.geometry('300x320')
        self.window.columnconfigure(2, weight=1)
        self.window.rowconfigure(4, weight=1)
        Label(self.window, text='Parametr count').grid(sticky=tk.NW)
        self.count_entry = Entry(self.window)
        self.count_entry.grid(row=0, column=1, sticky=tk.NW)
        Radiobutton(self.window,
                    text='Bufor znakowy',
                    variable=self.buf_type,
                    value=0).grid(row=2, column=0, sticky=tk.NW)
        Radiobutton(self.window,
                    text='Bufor bajtów (hex)',
                    variable=self.buf_type,
                    value=1).grid(row=2, column=1, sticky=tk.NW)
        Label(self.window, text='Zawartość bufora').grid(row=3, sticky=tk.NW)
        self.buffer_entry = Text(self.window, width=36, height=12)
        self.buffer_entry.grid(row=4,
                               columnspan=3,
                               sticky=tk.NW + tk.E + tk.S,
                               padx=5)
        Button(self.window, text='Dodaj',
               command=self.add_case).grid(row=5, columnspan=2)
        self.window.transient(master=parent.window)
        self.window.grab_set()

    def add_case(self):
        text = self.buffer_entry.get("1.0", tk.END).strip()
        try:
            if self.buf_type.get() == 0:
                self.model.corpus.add_case(
                    struct.pack('Q{}s'.format(len(text.encode())),
                                int(self.count_entry.get()), text.encode()),
                    'write')
            else:
                print(str(text))
                buf_bytes = bytes.fromhex(str(text))
                print(buf_bytes)
                self.model.corpus.add_case(
                    struct.pack('Q{}s'.format(len(buf_bytes)),
                                int(self.count_entry.get()), buf_bytes),
                    'write')
            self.destroy()
        except ValueError:
            messagebox.showinfo("Błąd", "Podano złą wartość argumentu")

    def destroy(self):
        self.window.grab_release()
        self.window.destroy()
class SelectionY:
    def __init__(self, master, data):
        self.master = master
        self.data = data
        self.columns = self.data.columns
        self.variable = IntVar()

        self.window = Toplevel(self.master)
        self.window.grab_set()
        self.window.title('Dependent Variables')
        self.window.geometry('400x400')
        self.window.minsize(250, 250)

        self.frame = Frame(self.window)
        self.frame.pack(expand=True, fill=BOTH)

        self.canvas = Canvas(self.frame, background='antique white')

        self.v_scroll = Scrollbar(self.frame,
                                  orient=VERTICAL,
                                  command=self.canvas.yview)
        self.v_scroll.pack(side=RIGHT, fill=Y)

        self.canvas['yscrollcommand'] = self.v_scroll.set
        self.canvas.pack(expand=True, fill=BOTH)

        self.frame2 = Frame(self.canvas, bg='antique white')
        self.canvas.create_window((0, 0), window=self.frame2, anchor=N + W)

        for i in range(len(self.columns)):
            Radiobutton(self.frame2,
                        variable=self.variable,
                        value=i,
                        text=self.columns[i],
                        bg='antique white').pack(anchor=N + W)

        self.none = Button(self.canvas,
                           text='Confirm',
                           height=2,
                           width=10,
                           command=lambda: self.confirm())
        self.none.pack(anchor=E, padx=20, pady=20)

        self.canvas.configure(scrollregion=self.canvas.bbox(ALL))

        self.window.mainloop()

    def confirm(self):
        self.window.grab_release()
        self.window.quit()
        self.window.destroy()
Esempio n. 11
0
class DriversWindow:
    def __init__(self, parent, model):
        self.model = model
        self.parent = parent
        self.window = Toplevel(parent.window)
        self.window.title('Lista sterowników')
        self.window.geometry('600x400')
        self.window.rowconfigure(0, weight=1)
        self.window.columnconfigure(0, weight=1)
        self.x_scroll = Scrollbar(self.window, orient=tk.HORIZONTAL)
        self.y_scroll = Scrollbar(self.window, orient=tk.VERTICAL)
        self.x_scroll.grid(row=1, column=0, columnspan=2, sticky=tk.E + tk.W)
        self.y_scroll.grid(row=0, column=2, sticky=tk.N + tk.S)
        self.listbox = Listbox(self.window,
                               xscrollcommand=self.x_scroll.set,
                               yscrollcommand=self.y_scroll.set)
        self.x_scroll['command'] = self.listbox.xview
        self.y_scroll['command'] = self.listbox.yview
        threading.Thread(target=self.populate_list).start()
        self.prog_window = ProgressWindow(self, 'Trwa szukanie sterowników')
        self.prog_window.start()
        self.listbox.grid(row=0,
                          column=0,
                          sticky=tk.N + tk.E + tk.S + tk.W,
                          columnspan=2)
        Button(self.window, text='Wybierz',
               command=self.pick_dev).grid(row=2, sticky=tk.NE, padx=10)
        Button(self.window, text='Anuluj',
               command=self.destroy).grid(row=2,
                                          column=1,
                                          sticky=tk.NW,
                                          padx=10)
        self.window.transient(master=parent.window)

    def pick_dev(self):
        self.model.project.devpath = self.listbox.get(
            self.listbox.curselection()).split()[-1]
        self.parent.refresh_driver()
        self.destroy()

    def populate_list(self):
        dev_list = self.model.list_dev_paths()
        for d in dev_list:
            if d is not '':
                self.listbox.insert(tk.END, d)
        self.prog_window.destroy()
        self.window.grab_set()

    def destroy(self):
        self.window.grab_release()
        self.window.destroy()
Esempio n. 12
0
class AddMmapWindow:
    def __init__(self, parent, model):
        self.model = model
        self.parent = parent
        self.window = Toplevel(parent.window)
        self.window.title('Lista sterowników')
        self.window.geometry('600x400')
        Button(self.window, text='Dodaj', command=self.add_case).grid()
        self.window.transient(master=parent.window)
        self.window.grab_set()

    def add_case(self):
        pass

    def destroy(self):
        self.window.grab_release()
        self.window.destroy()
Esempio n. 13
0
    def change_word_ne(self):
        try:
            values = re.compile(r'(\-)(?!.*\-)').split(self.table_select)

            top_level = Toplevel(self.root)
            question_box = ChangeNeWindow(top_level, values[0], values[2],
                                          self.memory_db)
            question_box.pack()

            top_level.grab_set()
            top_level.wait_window()
            top_level.grab_release()
            self.update_table()
            self.hightlight_text()
        except AttributeError:
            messagebox.showerror(parent=self.root,
                                 title='Chưa có từ nào được chọn',
                                 message='Xin hãy chọn từ cần được sửa')
Esempio n. 14
0
class MutatorWindow:
    def __init__(self, parent, model):
        self.model = model
        self.parent = parent
        self.window = Toplevel(parent.window)
        self.mutations = self.model.get_mutations()
        self.window.title('Mutator')
        self.window.geometry('600x400')
        self.window.transient(master=parent.window)
        self.window.grab_set()
        Label(self.window, text='Wybrane mutacje').grid(sticky=tk.NW)
        for i in range(0, len(self.mutations)):
            Checkbutton(self.window,
                        text=self.mutations[i][0],
                        variable=self.mutations[i][1]).grid(row=i + 1,
                                                            sticky=tk.NW)

    def destroy(self):
        self.window.grab_release()
        self.window.destroy()
Esempio n. 15
0
class GeneratorWindow:
    def __init__(self, parent, model):
        self.model = model
        self.parent = parent
        self.window = Toplevel(parent.window)
        self.window.title('Generator')
        self.window.geometry('600x400')
        self.window.transient(master=parent.window)
        self.tabs = Notebook(self.window)
        self.ioctl_frame = Frame(self.tabs)
        self.write_frame = Frame(self.tabs)
        self.mmap_frame = Frame(self.tabs)
        self.tabs.add(self.ioctl_frame, text='ioctl')
        self.tabs.add(self.write_frame, text='write')
        self.tabs.add(self.mmap_frame, text='mmap')
        self.window.rowconfigure(0, weight=1)
        self.window.columnconfigure(0, weight=1)
        self.tabs.grid(sticky=tk.NW + tk.S + tk.E)
        self.window.grab_set()

    def destroy(self):
        self.window.grab_release()
        self.window.destroy()
Esempio n. 16
0
    def _autocomplete(self, event):
        if not self._autocomplete_list or len(self._autocomplete_list) == 0:
            return

        index = self._tk.index(INSERT).split(".")
        self._text_index = '.'.join(index)
        tw = Toplevel(self._tk)
        tw.wm_overrideredirect(True)

        font = self._get_font()
        font_size = int(font.cget("size"))

        tw.geometry(
            f"+{ self._tk.winfo_rootx() + int(index[1]) * int(font_size / 2) }+{ self._tk.winfo_rooty() + int(index[0]) * font_size }"
        )

        self._listbox = AutocompleteEntryListbox(
            tw,
            font=font,
            allow_other_values=False,
            completevalues=[v["name"] for v in self._autocomplete_list])
        self._listbox.pack()

        tw.lift()
        tw.focus_force()
        tw.grab_set()
        tw.grab_release()

        self._listbox.focus_force()

        self._listbox.listbox.bind("<Double-Button-1>",
                                   self._autocomplete_selected)
        self._listbox.entry.bind("<Return>", self._autocomplete_selected)
        self._listbox.bind("<Leave>", self._autocomplete_destroy)
        self._listbox.bind("<Escape>", self._autocomplete_destroy)

        self._autocomplete_window = tw
Esempio n. 17
0
class WindowHome:
    def __init__(self, connection):
        #
        # Configuration of the window
        self.connection = connection
        self.role = 1
        self.window = Tk()
        self.window.protocol("WM_DELETE_WINDOW", self.click_log_out)
        #w, h = self.window.winfo_screenwidth(), self.window.winfo_screenheight()
        # self.window.geometry('%dx%d+0+0' % (1024, 778))
        # self.window.geometry('%dx%d+0+0' % (1500, 778))
        # self.window.geometry('%dx%d+0+0' % (w, h))
        # Place window on top left corner
        self.window.geometry('+%d+%d' % (0, 0))
        #self.window.resizable(0, 0)
        self.window.title('Tool for experimenting')
        self.window.withdraw()
        self.create_login()
        self.show_login()

    def create_login(self):
        # Resources for the Forms
        style = Style()
        style.configure("TButton", font=SUBTITLE2_FONT)

        self.tlevel_login = Toplevel(self.window)
        self.tlevel_login.protocol("WM_DELETE_WINDOW", self.click_log_out)
        self.tlevel_login.withdraw()
        frm_parent = LabelFrame(self.tlevel_login)
        lbl_title = Label(frm_parent, text='Welcome')
        lbl_title.config(fg=TEXT_COLOR, font=TITLE_FONT)
        lbl_title.grid(row=0, column=0, columnspan=3, pady=15, sticky=EW)
        lbl_role = Label(frm_parent, text='Role')
        lbl_role.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_role.grid(row=1, column=0, pady=10, padx=30, sticky=NW)
        lbl_username = Label(frm_parent, text='E-mail')
        lbl_username.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_username.grid(row=2, column=0, pady=10, padx=30, sticky=NW)
        lbl_passwd = Label(frm_parent, text='Password')
        lbl_passwd.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_passwd.grid(row=3, column=0, pady=10, padx=30, sticky=NW)
        self.cbx_role = Combobox(frm_parent, state="readonly", width=25)
        self.cbx_role['values'] = ['Administrator', 'Experimenter', 'Designer']
        self.cbx_role.grid(row=1,
                           column=1,
                           pady=10,
                           padx=30,
                           columnspan=2,
                           sticky=NW)
        self.txt_email = Entry(frm_parent, width=28)
        self.txt_email.grid(row=2,
                            column=1,
                            pady=10,
                            padx=30,
                            columnspan=2,
                            sticky=NW)
        self.txt_passwd = Entry(frm_parent, width=28, show="*")
        self.txt_passwd.grid(row=3,
                             column=1,
                             pady=10,
                             padx=30,
                             columnspan=2,
                             sticky=NW)
        self.txt_passwd.bind('<Return>', self.click_login)
        btn_access = Button(frm_parent,
                            text='Login',
                            command=self.click_login,
                            font=SUBTITLE2_FONT,
                            fg=TEXT_COLOR)
        btn_access.grid(row=4, column=1, padx=30, pady=15)
        btn_exit = Button(frm_parent,
                          text='Exit',
                          command=self.click_log_out,
                          font=SUBTITLE2_FONT,
                          fg=TEXT_COLOR)
        btn_exit.grid(row=4, column=2, padx=30, pady=15)
        frm_parent.grid(padx=10, pady=10)

    def show_login(self):
        self.tlevel_login.title('System access')
        self.tlevel_login.deiconify()
        self.tlevel_login.grab_set()

    def click_login(self, event=None):
        if len(self.txt_email.get()) != 0 and len(
                self.txt_passwd.get()) != 0 and len(self.cbx_role.get(
                )) != 0:  # validate empty fileds in login form
            if self.cbx_role.get(
            ) == 'Experimenter':  # directive (action) changes in accordance of the role
                self.role = 1
                self.directive = Message(
                    action=20, information=[self.txt_email.get(), 'login'])
            elif self.cbx_role.get() == 'Designer':
                self.role = 2
                self.directive = Message(
                    action=25, information=[self.txt_email.get(), 'login'])
            elif self.cbx_role.get() == 'Administrator':
                self.role = 3
                self.directive = Message(
                    action=15, information=[self.txt_email.get(), 'login'])
            self.connection = self.directive.send_directive(self.connection)
            if self.connection.message.action == 5:  # The user does not exist
                messagebox.showerror(
                    parent=self.tlevel_login,
                    title='E-mail',
                    message=self.connection.message.information[0])
            else:  # block to validate the inserted password
                if self.connection.message.information[4] == hashlib.sha1(
                        self.txt_passwd.get().encode()).hexdigest():
                    if self.role == 2:
                        self.current_designer = Designer(
                            id=self.connection.message.information[0],
                            name=self.connection.message.information[1],
                            surname=self.connection.message.information[2],
                            user=self.connection.message.information[3],
                            password=self.connection.message.information[4],
                            connection=self.connection)
                    self.access_system()
                else:
                    messagebox.showerror(
                        parent=self.tlevel_login,
                        title='Password',
                        message='The password you provided is wrong, retry')
        else:
            messagebox.showwarning(parent=self.tlevel_login,
                                   title='Missing information',
                                   message='Fill all the fields')

    def access_system(self):
        # Components (tool bar) will be shown depending on the role of the user
        menu_bar = Menu(self.window)
        self.window.config(menu=menu_bar)
        if self.role == 1:  # logged as experimenter
            administration_menu = Menu(menu_bar, tearoff=0)
            administration_menu.add_command(label='Designers',
                                            command=self.click_designers)
            patterns_menu = Menu(administration_menu, tearoff=0)
            patt_structure_menu = Menu(patterns_menu, tearoff=0)
            patt_structure_menu.add_command(label='Classifications',
                                            command=self.click_class)
            patt_structure_menu.add_command(label='Sections',
                                            command=self.click_sections)
            patt_structure_menu.add_command(label='Templates',
                                            command=self.click_templates)
            patterns_menu.add_cascade(label='Pattern structure',
                                      menu=patt_structure_menu)
            patterns_menu.add_command(label='Patterns',
                                      command=self.click_patterns)
            administration_menu.add_cascade(label='Patterns',
                                            menu=patterns_menu)
            menu_bar.add_cascade(label='Administration',
                                 menu=administration_menu)
            menu_bar.add_command(label='Experiments',
                                 command=self.click_experiments)
            menu_bar.add_command(label='Reports', command=self.click_reports)

            # Configuration of the existing frames, one for each command in the menu bar
            self.frm_parent_designer = FormParentAED(self.window, 'Designer',
                                                     connection)
            self.frm_parent_template = FormParentTemplate(
                self.window, connection)
            self.frm_parent_class = FormParentClassification(
                self.window, connection)
            self.frm_parent_section = FormParentSection(
                self.window, connection)
            self.frm_parent_pattern = FormParentPattern(
                self.window, connection)
            self.frm_parent_experiment = FormParentExperiment(
                self.window, connection)
            self.frm_parent_report = FormParentReport(self.window, connection)
        elif self.role == 2:  # logged as designer
            self.frm_parent_designer_gui = FormParentDesigner(
                self.window, connection, self.current_designer)
            self.click_designer_gui()
        elif self.role == 3:  # logged as administrator
            administration_menu = Menu(menu_bar, tearoff=0)
            users_menu = Menu(administration_menu, tearoff=0)
            users_menu.add_command(label='Administrators',
                                   command=self.click_administrators)
            users_menu.add_command(label='Experimenters',
                                   command=self.click_experimenters)
            users_menu.add_command(label='Designers',
                                   command=self.click_designers)
            administration_menu.add_cascade(label='Users', menu=users_menu)
            patterns_menu = Menu(administration_menu, tearoff=0)
            patt_structure_menu = Menu(patterns_menu, tearoff=0)
            patt_structure_menu.add_command(label='Classifications',
                                            command=self.click_class)
            patt_structure_menu.add_command(label='Sections',
                                            command=self.click_sections)
            patt_structure_menu.add_command(label='Templates',
                                            command=self.click_templates)
            patterns_menu.add_cascade(label='Pattern structure',
                                      menu=patt_structure_menu)
            patterns_menu.add_command(label='Patterns',
                                      command=self.click_patterns)
            administration_menu.add_cascade(label='Patterns',
                                            menu=patterns_menu)
            menu_bar.add_cascade(label='Administration',
                                 menu=administration_menu)
            menu_bar.add_command(label='Experiments',
                                 command=self.click_experiments)
            menu_bar.add_command(label='Reports', command=self.click_reports)

            # Configuration of the existing frames, one for each command in the menu bar
            self.frm_parent_administrator = FormParentAED(
                self.window, 'Administrator', connection)
            self.frm_parent_experimenter = FormParentAED(
                self.window, 'Experimenter', connection)
            self.frm_parent_designer = FormParentAED(self.window, 'Designer',
                                                     connection)
            self.frm_parent_template = FormParentTemplate(
                self.window, connection)
            self.frm_parent_class = FormParentClassification(
                self.window, connection)
            self.frm_parent_section = FormParentSection(
                self.window, connection)
            self.frm_parent_pattern = FormParentPattern(
                self.window, connection)
            self.frm_parent_experiment = FormParentExperiment(
                self.window, connection)
            self.frm_parent_report = FormParentReport(self.window, connection)
        else:
            raise Exception('Error while trying login the system')
        menu_bar.add_command(label='Log out', command=self.click_log_out)
        self.tlevel_login.grab_release()
        self.tlevel_login.withdraw()
        self.window.deiconify()

    def click_experimenters(self):
        self.frm_parent_designer.hide_frm()
        self.frm_parent_administrator.hide_frm()
        self.frm_parent_template.hide_frm()
        self.frm_parent_section.hide_frm()
        self.frm_parent_pattern.hide_frm()
        self.frm_parent_class.hide_frm()
        self.frm_parent_experiment.hide_frm()
        self.frm_parent_report.hide_frm()
        self.frm_parent_experimenter.hide_frm()
        self.frm_parent_experimenter.show_frm()

    def click_designers(self):
        if self.role == 3:
            self.frm_parent_administrator.hide_frm()
            self.frm_parent_experimenter.hide_frm()
        self.frm_parent_template.hide_frm()
        self.frm_parent_section.hide_frm()
        self.frm_parent_pattern.hide_frm()
        self.frm_parent_class.hide_frm()
        self.frm_parent_experiment.hide_frm()
        self.frm_parent_report.hide_frm()
        self.frm_parent_designer.hide_frm()
        self.frm_parent_designer.show_frm()

    def click_administrators(self):
        self.frm_parent_experimenter.hide_frm()
        self.frm_parent_designer.hide_frm()
        self.frm_parent_template.hide_frm()
        self.frm_parent_section.hide_frm()
        self.frm_parent_pattern.hide_frm()
        self.frm_parent_class.hide_frm()
        self.frm_parent_experiment.hide_frm()
        self.frm_parent_report.hide_frm()
        self.frm_parent_administrator.hide_frm()
        self.frm_parent_administrator.show_frm()

    def click_templates(self):
        if self.role == 3:
            self.frm_parent_administrator.hide_frm()
            self.frm_parent_experimenter.hide_frm()
        self.frm_parent_designer.hide_frm()
        self.frm_parent_section.hide_frm()
        self.frm_parent_pattern.hide_frm()
        self.frm_parent_class.hide_frm()
        self.frm_parent_experiment.hide_frm()
        self.frm_parent_report.hide_frm()
        self.frm_parent_template.hide_frm()
        self.frm_parent_template.show_frm()

    def click_sections(self):
        if self.role == 3:
            self.frm_parent_administrator.hide_frm()
            self.frm_parent_experimenter.hide_frm()
        self.frm_parent_designer.hide_frm()
        self.frm_parent_template.hide_frm()
        self.frm_parent_pattern.hide_frm()
        self.frm_parent_class.hide_frm()
        self.frm_parent_experiment.hide_frm()
        self.frm_parent_report.hide_frm()
        self.frm_parent_section.hide_frm()
        self.frm_parent_section.show_frm()

    def click_class(self):
        if self.role == 3:
            self.frm_parent_administrator.hide_frm()
            self.frm_parent_experimenter.hide_frm()
        self.frm_parent_designer.hide_frm()
        self.frm_parent_template.hide_frm()
        self.frm_parent_pattern.hide_frm()
        self.frm_parent_section.hide_frm()
        self.frm_parent_experiment.hide_frm()
        self.frm_parent_report.hide_frm()
        self.frm_parent_class.hide_frm()
        self.frm_parent_class.show_frm()

    def click_patterns(self):
        if self.role == 3:
            self.frm_parent_administrator.hide_frm()
            self.frm_parent_experimenter.hide_frm()
        self.frm_parent_designer.hide_frm()
        self.frm_parent_template.hide_frm()
        self.frm_parent_section.hide_frm()
        self.frm_parent_class.hide_frm()
        self.frm_parent_experiment.hide_frm()
        self.frm_parent_report.hide_frm()
        self.frm_parent_pattern.hide_frm()
        self.frm_parent_pattern.show_frm()

    def click_experiments(self):
        if self.role == 3:
            self.frm_parent_administrator.hide_frm()
            self.frm_parent_experimenter.hide_frm()
        self.frm_parent_designer.hide_frm()
        self.frm_parent_template.hide_frm()
        self.frm_parent_section.hide_frm()
        self.frm_parent_pattern.hide_frm()
        self.frm_parent_class.hide_frm()
        self.frm_parent_report.hide_frm()
        self.frm_parent_experiment.hide_frm()
        self.frm_parent_experiment.show_frm()

    def click_reports(self):
        if self.role == 3:
            self.frm_parent_administrator.hide_frm()
            self.frm_parent_experimenter.hide_frm()
        self.frm_parent_designer.hide_frm()
        self.frm_parent_template.hide_frm()
        self.frm_parent_section.hide_frm()
        self.frm_parent_pattern.hide_frm()
        self.frm_parent_class.hide_frm()
        self.frm_parent_experiment.hide_frm()
        self.frm_parent_report.hide_frm()
        self.frm_parent_report.show_frm()

    def click_designer_gui(self):
        self.frm_parent_designer_gui.hide_frm()
        self.frm_parent_designer_gui.show_frm()

    def click_log_out(self):
        if self.role != 2:
            self.exit()
        else:
            # Cant log out if designer is running an experimental scenario
            try:
                if not self.frm_parent_designer_gui.frm_general.grid_info():
                    self.exit()
                else:
                    decision = messagebox.askyesno(
                        parent=self.window,
                        title='Confirm exit',
                        message=
                        'Are you sure you want to leave? Exiting may cause loss of '
                        'experiment data. You won\'t be able to execute this '
                        'experiment again')
                    if decision:  # Confirm decision of exiting during an experiment execution
                        # Measurements may be saved as null
                        self.frm_parent_designer_gui.time_thread.stop()
                        acquisition_end_date = datetime.now()
                        # Saving NULL values of measurements for designer in remaining problems
                        while True:
                            problem_id = self.frm_parent_designer_gui.experimental_scenario.problems[
                                self.frm_parent_designer_gui.
                                problems_counter].id
                            current_measurements = []
                            # Solution time
                            measurement_1 = Measurement(
                                value=float(-2),
                                id_metric=1,
                                acquisition_start_date=acquisition_end_date,
                                acquisition_end_date=acquisition_end_date,
                                id_designer=self.current_designer.id,
                                id_problem=problem_id)
                            current_measurements.append(measurement_1)
                            if self.frm_parent_designer_gui.pattern_decision:
                                # Selection time
                                measurement_2 = Measurement(
                                    value=float(-2),
                                    id_metric=2,
                                    acquisition_start_date=acquisition_end_date,
                                    acquisition_end_date=acquisition_end_date,
                                    id_designer=self.current_designer.id,
                                    id_problem=problem_id)
                                current_measurements.append(measurement_2)
                                # Viewed patterns
                                measurement_3 = Measurement(
                                    value=float(-2),
                                    id_metric=3,
                                    acquisition_start_date=acquisition_end_date,
                                    acquisition_end_date=acquisition_end_date,
                                    id_designer=self.current_designer.id,
                                    id_problem=problem_id)
                                current_measurements.append(measurement_3)
                                # Chosen patterns
                                measurement_4 = Measurement(
                                    value=float(-2),
                                    id_metric=4,
                                    acquisition_start_date=acquisition_end_date,
                                    acquisition_end_date=acquisition_end_date,
                                    id_designer=self.current_designer.id,
                                    id_problem=problem_id)
                                current_measurements.append(measurement_4)
                            for item in current_measurements:
                                self.directive = Message(
                                    action=96,
                                    information=[
                                        item.value,
                                        item.acquisition_start_date,
                                        item.acquisition_end_date,
                                        item.id_metric, item.id_designer,
                                        item.id_problem
                                    ])
                                self.connection = self.directive.send_directive(
                                    self.connection)
                            self.frm_parent_designer_gui.problems_counter += 1
                            if self.frm_parent_designer_gui.problems_counter == len(
                                    self.frm_parent_designer_gui.
                                    experimental_scenario.problems
                            ):  # If no more problems available
                                # Finish experimental scenario if this was the las designer executing it
                                self.directive = Message(action=83,
                                                         information=['finished', self.frm_parent_designer_gui. \
                                                         experimental_scenario.id])
                                self.connection = self.directive.send_directive(
                                    self.connection)
                                break
                        self.exit()
            except:
                self.exit()

    def exit(self):
        msg = Message(comment='close_connection')
        self.connection.create_message(msg)
        self.connection.send_message()
        self.connection.close_connection()
        shutil.rmtree('./Resources/temp/')
        os.mkdir('./Resources/temp/')
        self.window.destroy()
Esempio n. 18
0
class AddIoctlWindow:

    types = ['ciąg bajtów (hex)', 'ciąg znaków', 'int (2 bajty)', 'int (4 bajty)',
             'int (8 bajtów)', 'float (4 bajty)', 'double (8 bajtów)']

    def __init__(self, parent, model):
        self.args = []
        self.format = ''
        self.model = model
        self.parent = parent
        self.window = Toplevel(parent.window)
        self.window.title('Dodaj test ioctl')
        self.window.geometry('375x320')
        self.type = tk.StringVar()
        Label(self.window, text='Kod metody ioctl').grid(row=0, column=0, sticky=tk.NW)
        self.cmd_code_entry = Entry(self.window)
        self.cmd_code_entry.grid(column=1, row=0, sticky=tk.NW)
        Label(self.window, text='Dodaj argument').grid(row=2, sticky=tk.NW)
        Label(self.window, text='Typ').grid(row=3, sticky=tk.NW)
        Button(self.window, text='Dodaj', command=self.add_argument).grid(row=3, column=2, rowspan=2)
        self.combobox = Combobox(self.window, textvariable=self.type,
                                 values=self.types)
        self.arg_entry = Entry(self.window)
        self.combobox.grid(row=3, column=1, sticky=tk.NW)
        Label(self.window, text='Wartość').grid(row=4, sticky=tk.NW)
        self.arg_entry.grid(row=4, column=1, sticky=tk.NW)
        Label(self.window, text='Przypadek testowy').grid(row=5, sticky=tk.NW)
        self.args_text = Text(self.window, width=36, wrap=tk.CHAR, height=10)
        self.args_text.grid(row=6, columnspan=5, sticky=tk.NW+tk.S+tk.E)
        Button(self.window, text='Dodaj', command=self.add_case).grid(row=7, column=2)
        self.window.transient(master=parent.window)
        self.window.grab_set()

    def add_argument(self):
        idx = -1
        type = str(self.type.get())
        for i in range(0, len(self.types)):
            if self.types[i] == type:
                idx = i
        if idx == -1:
            messagebox.showinfo("Błąd", "Brak podanego typu argumentu")

        try:
            if idx == 0:
                self.format += '{}s'.format(int(len(self.arg_entry.get())/2))
                self.args.append(bytes.fromhex(str(self.arg_entry.get())))
                self.args_text.insert(tk.END, '#')
            elif idx == 1:
                self.format += '{}s'.format(len(self.arg_entry.get()))
                self.args.append(str(self.arg_entry.get()).encode())
            elif idx == 2:
                self.format += 'h'
                self.args.append(int(self.arg_entry.get()))
            elif idx == 3:
                self.format += 'i'
                self.args.append(int(self.arg_entry.get()))
            elif idx == 4:
                self.format += 'q'
                self.args.append(int(self.arg_entry.get()))
            elif idx == 5:
                self.format += 'f'
                self.args.append(float(self.arg_entry.get()))
            elif idx == 6:
                self.format += 'd'
                self.args.append(float(self.arg_entry.get()))
            else:
                return
        except ValueError:
            messagebox.showinfo("Błąd", "Podano złą wartość argumentu")
        self.args_text.insert(tk.END, '{}\n'.format(self.arg_entry.get()))
        self.arg_entry.config(text='')

    def destroy(self):
        self.window.grab_release()
        self.window.destroy()

    def add_case(self):
        print('Format: q{}'.format(self.format))
        if self.cmd_code_entry.get() == '':
            messagebox.showinfo("Błąd", "Podaj kod metody")
            return
        try:
            code = int(self.cmd_code_entry.get())
            data = struct.pack('q{}'.format(self.format), code, *self.args)
            self.model.corpus.add_case(data, 'ioctl')
            self.parent.log('Dodano test ioctl\n')
            self.destroy()
        except ValueError:
            messagebox.showinfo("Błąd", "Wartość kodu metody musi być liczbą!")
            return
Esempio n. 19
0
class FormChildReport:
    def __init__(self, frm_parent, connection):
        self.connection = connection
        self.id_selected = 0
        self.frm_child_report = LabelFrame(frm_parent)
        self.tlevel_comp_detail = Toplevel(frm_parent)
        self.tlevel_comp_detail.protocol("WM_DELETE_WINDOW", self.click_exit_component_det)
        self.tlevel_comp_detail.withdraw()
        self.tlevel_sol_detail = Toplevel(frm_parent)
        self.tlevel_sol_detail.protocol("WM_DELETE_WINDOW", self.click_exit_solution_det)
        self.tlevel_sol_detail.withdraw()
        self.tlevel_diagram = Toplevel(self.tlevel_sol_detail)
        self.tlevel_diagram.protocol("WM_DELETE_WINDOW", self.click_exit_diagram)
        self.tlevel_diagram.withdraw()
        self.initialize_components()

    def initialize_components(self):
        """
        Method that initialize the visual components for each form associated with the configuration of experiments
        """
        # Button icons used in the forms
        self.csv_icon = PhotoImage(file=r"./Resources/csv.png")
        self.info_icon = PhotoImage(file=r"./Resources/info.png")

        # Components for Report form (list of experiments)
        # General selection section
        lbl_sep1 = Label(self.frm_child_report)
        lbl_sep1.grid(row=0, column=0, padx=10, pady=10, rowspan=7)
        lbl_available_exp = Label(self.frm_child_report, text='Select an experiment', anchor=W)
        lbl_available_exp.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_available_exp.grid(row=0, column=1, pady=10, sticky=W)
        self.trv_available_exp = Treeview(self.frm_child_report, height=5, columns=('N', 'Experiment'))
        self.trv_available_exp.heading('#0', text='ID', anchor=CENTER)
        self.trv_available_exp.heading('#1', text='N', anchor=CENTER)
        self.trv_available_exp.heading('#2', text='Experiment', anchor=CENTER)
        self.trv_available_exp.column('#0', width=0, minwidth=50, stretch=NO)
        self.trv_available_exp.column('#1', width=20, minwidth=20, stretch=NO)
        self.trv_available_exp.column('#2', width=250, minwidth=250, stretch=NO)
        self.trv_available_exp.bind("<ButtonRelease-1>", self.select_experiment_general)
        self.trv_available_exp.grid(row=1, column=1, columnspan=3, sticky=W, pady=10)
        vsb_trv_avex = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_available_exp.yview)
        vsb_trv_avex.grid(row=1, column=4, pady=10, sticky=NS)
        self.trv_available_exp.configure(yscrollcommand=vsb_trv_avex.set)
        btn_detail_exp = Button(self.frm_child_report, image=self.info_icon, command=self.click_view_experiment)
        btn_detail_exp.grid(row=0, column=3, pady=10, padx=5, sticky=E)
        btn_detail_exp_ttp = CreateToolTip(btn_detail_exp, 'View experiment information')
        btn_csv = Button(self.frm_child_report, image=self.csv_icon, command=self.click_csv)
        btn_csv.grid(row=0, column=2, pady=10, sticky=E)
        btn_csv_ttp = CreateToolTip(btn_csv, 'Generate .csv file')
        lbl_available_sc = Label(self.frm_child_report, text='Select a scenario', anchor=W)
        lbl_available_sc.config(font=SUBTITLE2_FONT, fg=TEXT_COLOR)
        lbl_available_sc.grid(row=2, column=1, pady=10, columnspan=2, sticky=W)
        self.trv_available_sc = Treeview(self.frm_child_report, height=5, columns=('N', 'Experimental scenario'))
        self.trv_available_sc.heading('#0', text='ID', anchor=CENTER)
        self.trv_available_sc.heading('#1', text='N', anchor=CENTER)
        self.trv_available_sc.heading('#2', text='Experimental scenario', anchor=CENTER)
        self.trv_available_sc.column('#0', width=0, minwidth=50, stretch=NO)
        self.trv_available_sc.column('#1', width=20, minwidth=20, stretch=NO)
        self.trv_available_sc.column('#2', width=250, minwidth=250, stretch=NO)
        self.trv_available_sc.bind("<ButtonRelease-1>", self.select_scenario_general)
        self.trv_available_sc.grid(row=3, column=1, columnspan=3, sticky=W, pady=10)
        vsb_trv_avsc = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_available_sc.yview)
        vsb_trv_avsc.grid(row=3, column=4, pady=10, sticky=NS)
        self.trv_available_sc.configure(yscrollcommand=vsb_trv_avsc.set)
        btn_detail_sc = Button(self.frm_child_report, image=self.info_icon, command=self.click_view_scenario)
        btn_detail_sc.grid(row=2, column=3, pady=10, sticky=E)
        btn_detail_sc_ttp = CreateToolTip(btn_detail_sc, 'View scenario information')
        lbl_available_prob = Label(self.frm_child_report, text='Select a problem', anchor=W)
        lbl_available_prob.config(font=SUBTITLE2_FONT, fg=TEXT_COLOR)
        lbl_available_prob.grid(row=4, column=1, pady=10, columnspan=2, sticky=W)
        self.trv_available_prob = Treeview(self.frm_child_report, height=5, columns=('N', 'Design problem'))
        self.trv_available_prob.heading('#0', text='ID', anchor=CENTER)
        self.trv_available_prob.heading('#1', text='N', anchor=CENTER)
        self.trv_available_prob.heading('#2', text='Design problem', anchor=CENTER)
        self.trv_available_prob.column('#0', width=0, minwidth=50, stretch=NO)
        self.trv_available_prob.column('#1', width=20, minwidth=20, stretch=NO)
        self.trv_available_prob.column('#2', width=250, minwidth=250, stretch=NO)
        self.trv_available_prob.bind("<ButtonRelease-1>", self.select_problem_general)
        self.trv_available_prob.grid(row=5, column=1, columnspan=3, sticky=W, pady=10)
        vsb_trv_avprob = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_available_prob.yview)
        vsb_trv_avprob.grid(row=5, column=4, pady=10, sticky=NS)
        self.trv_available_prob.configure(yscrollcommand=vsb_trv_avprob.set)
        btn_detail_prob = Button(self.frm_child_report, image=self.info_icon, command=self.click_view_problem)
        btn_detail_prob.grid(row=4, column=3, pady=10, sticky=E)
        btn_detail_prob_ttp = CreateToolTip(btn_detail_prob, 'View problem report')
        sep_aux1 = Separator(self.frm_child_report, orient=VERTICAL)
        sep_aux1.grid(row=0, column=5, sticky=NS, rowspan=7, padx=30)
        # Detailed selection section
        self.trv_detail_sc = Treeview(self.frm_child_report, height=8,
                                      columns=('N', 'Scenario', 'M1', 'M2', 'M3', 'M4'))
        self.trv_detail_sc.heading('#0', text='ID', anchor=CENTER)
        self.trv_detail_sc.heading('#1', text='N', anchor=CENTER)
        self.trv_detail_sc.heading('#2', text='Scenario', anchor=CENTER)
        self.trv_detail_sc.heading('#3', text='M1', anchor=CENTER)
        self.trv_detail_sc.heading('#4', text='M2', anchor=CENTER)
        self.trv_detail_sc.heading('#5', text='M3', anchor=CENTER)
        self.trv_detail_sc.heading('#6', text='M4', anchor=CENTER)
        self.trv_detail_sc.column('#0', width=0, minwidth=50, stretch=NO)
        self.trv_detail_sc.column('#1', width=20, minwidth=20, stretch=NO)
        self.trv_detail_sc.column('#2', width=250, minwidth=250, stretch=NO)
        self.trv_detail_sc.column('#3', width=55, minwidth=55, stretch=NO)
        self.trv_detail_sc.column('#4', width=55, minwidth=55, stretch=NO)
        self.trv_detail_sc.column('#5', width=55, minwidth=55, stretch=NO)
        self.trv_detail_sc.column('#6', width=55, minwidth=55, stretch=NO)
        self.trv_detail_sc.grid(row=0, column=6, rowspan=2, sticky=W, pady=10)
        vsb_trv_detsc = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_detail_sc.yview)
        vsb_trv_detsc.grid(row=0, column=7, rowspan=2, pady=10, sticky=NS)
        self.trv_detail_sc.configure(yscrollcommand=vsb_trv_detsc.set)
        self.trv_detail_prob = Treeview(self.frm_child_report, height=8,
                                        columns=('N', 'Problem', 'M1', 'M2', 'M3', 'M4'))
        self.trv_detail_prob.heading('#0', text='ID', anchor=CENTER)
        self.trv_detail_prob.heading('#1', text='N', anchor=CENTER)
        self.trv_detail_prob.heading('#2', text='Problem', anchor=CENTER)
        self.trv_detail_prob.heading('#3', text='M1', anchor=CENTER)
        self.trv_detail_prob.heading('#4', text='M2', anchor=CENTER)
        self.trv_detail_prob.heading('#5', text='M3', anchor=CENTER)
        self.trv_detail_prob.heading('#6', text='M4', anchor=CENTER)
        self.trv_detail_prob.column('#0', width=0, minwidth=50, stretch=NO)
        self.trv_detail_prob.column('#1', width=20, minwidth=20, stretch=NO)
        self.trv_detail_prob.column('#2', width=250, minwidth=250, stretch=NO)
        self.trv_detail_prob.column('#3', width=55, minwidth=55, stretch=NO)
        self.trv_detail_prob.column('#4', width=55, minwidth=55, stretch=NO)
        self.trv_detail_prob.column('#5', width=55, minwidth=55, stretch=NO)
        self.trv_detail_prob.column('#6', width=55, minwidth=55, stretch=NO)
        self.trv_detail_prob.grid(row=2, column=6, rowspan=2, sticky=W, pady=10)
        vsb_trv_detprob = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_detail_prob.yview)
        vsb_trv_detprob.grid(row=2, column=7, rowspan=2, pady=10, sticky=NS)
        self.trv_detail_prob.configure(yscrollcommand=vsb_trv_detprob.set)
        self.trv_detail_designer = Treeview(self.frm_child_report, height=8, columns=('N', 'Designer', 'M1', 'M2',
                                                                                      'M3', 'M4'))
        self.trv_detail_designer.heading('#0', text='ID', anchor=CENTER)
        self.trv_detail_designer.heading('#1', text='N', anchor=CENTER)
        self.trv_detail_designer.heading('#2', text='Designer', anchor=CENTER)
        self.trv_detail_designer.heading('#3', text='M1', anchor=CENTER)
        self.trv_detail_designer.heading('#4', text='M2', anchor=CENTER)
        self.trv_detail_designer.heading('#5', text='M3', anchor=CENTER)
        self.trv_detail_designer.heading('#6', text='M4', anchor=CENTER)
        self.trv_detail_designer.column('#0', width=0, minwidth=50, stretch=NO)
        self.trv_detail_designer.column('#1', width=20, minwidth=20, stretch=NO)
        self.trv_detail_designer.column('#2', width=250, minwidth=250, stretch=NO)
        self.trv_detail_designer.column('#3', width=55, minwidth=55, stretch=NO)
        self.trv_detail_designer.column('#4', width=55, minwidth=55, stretch=NO)
        self.trv_detail_designer.column('#5', width=55, minwidth=55, stretch=NO)
        self.trv_detail_designer.column('#6', width=55, minwidth=55, stretch=NO)
        self.trv_detail_designer.bind("<Double-1>", self.view_detailed_solution)
        self.trv_detail_designer.grid(row=4, column=6, rowspan=2, sticky=W, pady=10)
        vsb_trv_detdesig = Scrollbar(self.frm_child_report, orient="vertical", command=self.trv_detail_designer.yview)
        vsb_trv_detdesig.grid(row=4, column=7, rowspan=2, pady=10, sticky=NS)
        self.trv_detail_designer.configure(yscrollcommand=vsb_trv_detdesig.set)
        lbl_notes = Label(self.frm_child_report, text='NOTE:\tDouble click on a designer to see\tLEGEND:\tM1=Solution '
                                                      'time | M3=Viewed patterns\n\this solution for a problem ^.\t\t\t'
                                                      'M2=Selection time | M4=Selection efficiency\n')
        lbl_notes.config(fg=TEXT_COLOR, font=NOTE_FONT, justify=LEFT)
        lbl_notes.grid(row=6, column=6, pady=10, sticky=W)
        lbl_sep2 = Label(self.frm_child_report)
        lbl_sep2.grid(row=0, column=8, padx=10, pady=10, rowspan=7)

        # Components for component (experiment, scenario or problem) details
        lbl_sep3 = Label(self.tlevel_comp_detail)
        lbl_sep3.grid(row=0, column=0, padx=10, pady=20)
        self.txt_detail_component = Text(self.tlevel_comp_detail, height=25, width=60)
        self.txt_detail_component.config(font=TEXT_FONT, bg=DISABLED_COLOR)
        self.txt_detail_component.grid(row=0, column=1, pady=20, sticky=W)
        vsb_txt_detcomp = Scrollbar(self.tlevel_comp_detail, orient="vertical", command=self.txt_detail_component.yview)
        vsb_txt_detcomp.grid(row=0, column=2, pady=20, sticky=NS)
        self.txt_detail_component.configure(yscrollcommand=vsb_txt_detcomp.set)
        lbl_sep4 = Label(self.tlevel_comp_detail)
        lbl_sep4.grid(row=0, column=3, padx=10, pady=20)

        # Components of expanded detailed sent solution
        lbl_sep5 = Label(self.tlevel_sol_detail)
        lbl_sep5.grid(row=0, column=0, padx=10, pady=20, rowspan=3)
        lbl_sep6 = Label(self.tlevel_sol_detail)
        lbl_sep6.grid(row=0, column=1, pady=10)
        self.btn_detail_sol = Button(self.tlevel_sol_detail, text='View diagram >>',
                                     command=self.click_view_diagram_sol)
        self.txt_detail_solution = Text(self.tlevel_sol_detail, height=25, width=60)
        self.txt_detail_solution.config(font=TEXT_FONT, bg=DISABLED_COLOR)
        self.txt_detail_solution.grid(row=1, column=1, sticky=W, columnspan=2)
        vsb_txt_detsol = Scrollbar(self.tlevel_sol_detail, orient="vertical", command=self.txt_detail_solution.yview)
        vsb_txt_detsol.grid(row=1, column=3, sticky=NS)
        self.txt_detail_solution.configure(yscrollcommand=vsb_txt_detsol.set)
        lbl_sep7 = Label(self.tlevel_sol_detail)
        lbl_sep7.grid(row=0, column=4, padx=10, pady=20, rowspan=3)
        lbl_sep8 = Label(self.tlevel_sol_detail)
        lbl_sep8.grid(row=2, column=1, pady=10, columnspan=2)

        # Components of expanded sent solution diagram
        self.canvas_expanded = Canvas(self.tlevel_diagram, width=500, height=500)
        self.canvas_expanded.config(background='white', borderwidth=1)
        self.canvas_expanded.grid()

    def show_frm(self):
        """
        Displays the home list of the 'Experiments' form
        """
        self.frm_child_report.grid(row=1, column=0, columnspan=9, rowspan=8, pady=10, padx=10)
        self.retrieve_experiments()

    def hide_frm(self):
        """
        Hides all forms that are currently active
        """
        self.clear_components()
        self.frm_child_report.grid_forget()

    def retrieve_experiments(self):
        """
        This function shows the existing 'Experiments' in the home TreeView
        """
        # Remove existing elements in the list
        for item in self.trv_available_exp.get_children():
            self.trv_available_exp.delete(item)
        self.directive = Message(action=92, information=['finished'])
        self.connection = self.directive.send_directive(self.connection)
        if len(self.connection.message.information) != 0:
            for index, item in enumerate(self.connection.message.information):
                elements = item.split('¥')
                self.trv_available_exp.insert('', 'end', text=elements[0], values=(index + 1,
                                                                                   summarize_text(elements[1], 250)))
            self.available_patterns = Pattern.get_available_patterns(self.connection)
            '''if len(self.trv_available_exp.get_children()) != 0:
                self.trv_available_exp.selection_set(self.trv_available_exp.get_children()[0])
                self.select_experiment_general()'''
        else:
            messagebox.showwarning(parent=self.frm_child_report, title='No experiments',
                                   message='No experiments in finished state')

    def retrieve_scenarios(self, scenarios=None):
        """
        This function shows the existing Experimental scenarios in an 'Experiment'
        """
        # Remove existing elements in the list
        for item in self.trv_available_sc.get_children():
            self.trv_available_sc.delete(item)
        for index, item in enumerate(scenarios):
            elements = item.split('¥')
            self.trv_available_sc.insert('', 'end', text=elements[0], values=(index + 1,
                                                                              summarize_text(elements[1], 250)))
        '''if len(self.trv_available_sc.get_children()) != 0:
            self.trv_available_sc.selection_set(self.trv_available_sc.get_children()[0])
            self.select_scenario()'''

    def retrieve_problems(self, problems=None):
        """
        This function shows the existing Problems in an 'Experimental scenario'
        """
        # Remove existing elements in the list
        for item in self.trv_available_prob.get_children():
            self.trv_available_prob.delete(item)
        for index, item in enumerate(problems):
            elements = item.split('¥')
            self.trv_available_prob.insert('', 'end', text=elements[0], values=(index + 1,
                                                                                summarize_text(elements[1], 250)))
        '''if len(self.trv_available_prob.get_children()) != 0:
            self.trv_available_prob.selection_set(self.trv_available_prob.get_children()[0])
            self.select_problem()'''

    def select_experiment_general(self, event=None):
        """
        This function is activated when the 'Click Experiments TreeView' event ocurrs, it indicates than an experiments
        has been selected
        """
        if len(self.trv_available_exp.selection()) == 1:
            self.clear_components(3)
            id_selected_exp = int(self.trv_available_exp.item(self.trv_available_exp.selection())[
                                      'text'])  # Retrieve id of selected item from TreeView
            self.directive = Message(action=95, information=[id_selected_exp])
            self.connection = self.directive.send_directive(self.connection)
            self.experiment = Experiment(id=id_selected_exp, name=self.connection.message.information[0],
                                         description=self.connection.message.information[1],
                                         design_type=self.connection.message.information[2],
                                         state=self.connection.message.information[3],
                                         creation_date=self.connection.message.information[5],
                                         execution_date=self.connection.message.information[6],
                                         finished_date=self.connection.message.information[7])
            self.retrieve_scenarios(self.connection.message.information[4])
            # Ask to server for dataframe of the measurements for the scenarios of selected experiment
            self.directive = Message(action=107, information=[id_selected_exp, 'experiment'])
            self.connection = self.directive.send_directive(self.connection)
            final_df = get_mean_value(self.connection.message.information[0])
            for index, row in final_df.iterrows():
                self.trv_detail_sc.insert('', 'end', text=row.id, values=(index + 1, summarize_text(row.variable, 250),
                                                                          row.m1, row.m2, row.m3, row.m4))

    def select_scenario_general(self, event=None):
        """
        Function activated when a scenario is selecteded
        """
        if len(self.trv_available_sc.selection()) == 1:
            self.clear_components(2)
            id_selected_sc = int(self.trv_available_sc.item(self.trv_available_sc.selection())[
                                     'text'])  # Retrieve id of selected item from TreeView
            self.directive = Message(action=85, information=[id_selected_sc, 'report', 1])
            self.connection = self.directive.send_directive(self.connection)
            self.scenario = ExperimentalSC(id=id_selected_sc, title=self.connection.message.information[0],
                                           description=self.connection.message.information[1],
                                           id_description_diagram=self.connection.message.information[2],
                                           info_designers=self.connection.message.information[4])
            self.retrieve_problems(self.connection.message.information[3])
            # Ask to server for dataframe of the measurements for the problems of selected scenario
            self.directive = Message(action=107, information=[id_selected_sc, 'scenario'])
            self.connection = self.directive.send_directive(self.connection)
            final_df = get_mean_value(self.connection.message.information[0])
            for index, row in final_df.iterrows():
                self.trv_detail_prob.insert('', 'end', text=row.id, values=(index + 1,
                                                                            summarize_text(row.variable, 250), row.m1,
                                                                            row.m2, row.m3, row.m4))

    def select_problem_general(self, event=None):
        """
        Function activated when a scenario is selected
        """
        if len(self.trv_available_prob.selection()) == 1:
            self.clear_components(1)
            id_selected_prob = int(self.trv_available_prob.item(self.trv_available_prob.selection())[
                                       'text'])  # Retrieve id of selected item from TreeView
            self.directive = Message(action=55, information=[id_selected_prob])
            self.connection = self.directive.send_directive(self.connection)
            self.problem = Problem(id=id_selected_prob, brief_description=self.connection.message.information[0],
                                   description=self.connection.message.information[1],
                                   id_solution=self.connection.message.information[2],
                                   av_patterns=self.available_patterns, connection=self.connection)
            # Ask to server for dataframe of the measurements for the designers of selected problem
            self.directive = Message(action=107, information=[id_selected_prob, 'problem'])
            self.connection = self.directive.send_directive(self.connection)
            final_df = get_mean_value(self.connection.message.information[0])
            for index, row in final_df.iterrows():
                self.trv_detail_designer.insert('', 'end', text=row.id, values=(index + 1,
                                                                                summarize_text(row.variable, 250),
                                                                                row.m1, row.m2, row.m3, row.m4))

    def click_view_experiment(self):
        """
        Function activated when 'Experiment detail' button is pressed, it shows the tlevel_detail window showing
        main information of the selected experimentin trv_available_sc
        """
        if len(self.trv_available_exp.selection()) == 1:
            self.txt_detail_component['state'] = NORMAL
            self.txt_detail_component.delete('1.0', 'end-1c')
            self.txt_detail_component.insert('1.0', 'EXPERIMENT NAME\n{}\n\n'
                                                    'DESCRIPTION\n{}\n\n'
                                                    'DESIGN TYPE\n{}\n\n'
                                                    'CREATION DATETIME\n{}\n\n'
                                                    'EXECUTION DATETIME\n{}\n\n'
                                                    'FINISHED DATETIME\n{}'.
                                             format(self.experiment.name,
                                                    self.experiment.description,
                                                    'One group' if self.experiment.design_type == 1 else 'Two groups',
                                                    self.experiment.creation_date.strftime('%c'),
                                                    self.experiment.execution_date.strftime('%c'),
                                                    self.experiment.finished_date.strftime('%c')))
            self.txt_detail_component['state'] = DISABLED
            self.tlevel_comp_detail.deiconify()
            self.tlevel_comp_detail.grab_set()
        else:
            messagebox.showwarning(parent=self.frm_child_report, title='No selection',
                                   message='You must select one item')

    def click_view_scenario(self):
        """
        Function activated when 'Scenario detail' button is pressed, it shows the tlevel_detail window showing
        main information of the selected experimental scenario in trv_available_sc
        """
        if len(self.trv_available_sc.selection()) == 1:
            self.txt_detail_component['state'] = NORMAL
            self.txt_detail_component.delete('1.0', 'end-1c')
            self.txt_detail_component.insert('1.0', 'EXPERIMENTAL SCENARIO TITLE\n{}\n\n'
                                                    'DESCRIPTION\n{}\n\n'
                                                    'DESIGNERS SCENARIO ASSIGNED: {}\n\n'
                                                    'DESIGNERS COMPLETED SCENARIO: {}\n\n'
                                                    'DESIGNERS DID NOT COMPLETE SCENARIO: {}\n\n'
                                                    'DESIGNERS DID NOT RUN SCENARIO: {}'.
                                             format(self.scenario.title,
                                                    self.scenario.description,
                                                    self.scenario.info_designers[0],
                                                    self.scenario.info_designers[1],
                                                    self.scenario.info_designers[2],
                                                    self.scenario.info_designers[3]))
            self.txt_detail_component['state'] = DISABLED
            self.tlevel_comp_detail.deiconify()
            self.tlevel_comp_detail.grab_set()
        else:
            messagebox.showwarning(parent=self.frm_child_report, title='No selection',
                                   message='You must select one item')

    def click_view_problem(self):
        """
        Function activated when 'Problem detail' button is pressed, it shows the tlevel_detail window showing
        main information of the selected problem in trv_available_prob
        """
        if len(self.trv_available_prob.selection()) == 1:
            aux_patterns = ''
            for item in self.problem.solution.patterns:
                aux_patterns += '- {}\n'.format(item.get_joined_main_s())
            self.txt_detail_component['state'] = NORMAL
            self.txt_detail_component.delete('1.0', 'end-1c')
            self.txt_detail_component.insert('1.0', 'PROBLEM BRIEF DESCRIPTION\n{}\n\n'
                                                    'DESCRIPTION\n{}\n\n'
                                                    'EXPECTED SOLUTION NOTES\n{}\n\n'
                                                    'EXPECTED SOLUTION PATTERNS\n{}'.
                                             format(self.problem.brief_description,
                                                    self.problem.description,
                                                    self.problem.solution.annotations,
                                                    'No patterns configured' if aux_patterns == '' else aux_patterns))
            self.txt_detail_component['state'] = DISABLED
            self.tlevel_comp_detail.deiconify()
            self.tlevel_comp_detail.grab_set()
        else:
            messagebox.showwarning(parent=self.frm_child_report, title='No selection',
                                   message='You must select one item')

    def click_view_diagram_sol(self):
        # Fill summary problem canvas with retrieved image
        load = Image.open(self.solution.diagram.filename)
        load = load.resize((500, 500), Image.ANTIALIAS)
        self.render = ImageTk.PhotoImage(load)
        self.canvas_expanded.delete()
        self.solution.diagram.image = self.canvas_expanded.create_image(0, 0, anchor='nw',
                                                                        image=self.render)  # and display new image
        self.tlevel_diagram.deiconify()
        self.tlevel_diagram.grab_set()

    def click_csv(self):
        if len(self.trv_available_exp.selection()) == 1:
            # Get report in .zip (temporarly)
            path = askdirectory(title='Select destination folder')  # shows dialog box and return the path
            if path:
                # Retrieve zip file and create into the selected folder
                self.directive = Message(action=106, information=[self.experiment.id])
                self.connection = self.directive.send_directive(self.connection)
                report_file = File()
                report_file.write_permanent_file(self.connection.message.information[0],
                                                 self.connection.message.information[1], path)
                messagebox.showinfo(parent=self.frm_child_report, title='Report created',
                                    message='Zipped report created: "{}"'.format(report_file.filename))
        else:
            messagebox.showwarning(parent=self.frm_child_report, title='No selection',
                                   message='You must select one item')

    def view_detailed_solution(self, event=None):
        if len(self.trv_detail_designer.selection()) == 1:
            id_selected_desig = self.trv_detail_designer.item(self.trv_detail_designer.selection())[
                'text']  # Retrieve id of selected item from TreeView
            if id_selected_desig != 'X':
                if self.trv_detail_designer.item(self.trv_detail_designer.selection())['values'][2] != 'X':
                    # Here asks for the sent solution of specific designer
                    self.directive = Message(action=105, information=[int(id_selected_desig), self.problem.id])
                    self.connection = self.directive.send_directive(self.connection)
                    # Getting assigned patterns in current experimental scenario
                    assigned_patterns = []
                    for item in self.connection.message.information[4]:
                        for pattern in self.available_patterns:
                            if item == pattern.id:
                                assigned_patterns.append(pattern)
                    chosen_patterns = []
                    # Getting patterns of sent solution
                    for item in self.connection.message.information[2]:
                        id_pattern = int(item.split('¥')[0])
                        for pattern in self.available_patterns:
                            if id_pattern == pattern.id:
                                chosen_patterns.append(pattern)
                    # Getting current group for the designer
                    current_group = self.connection.message.information[3]
                    # Creating the auxiliar solution
                    self.solution = Solution(annotations=self.connection.message.information[0],
                                             patterns=chosen_patterns,
                                             diagram_id=self.connection.message.information[1],
                                             connection=self.connection)
                    # Adjust visual components depending on the sent solution
                    self.btn_detail_sol.grid_forget()
                    if self.solution.diagram_id is not None:
                        self.btn_detail_sol.grid(row=0, column=2, pady=10, sticky=E)
                    aux_patterns_assign = ''
                    for item in assigned_patterns:
                        aux_patterns_assign += '- {}\n'.format(item.get_joined_main_s())
                    aux_patterns_sent_sol = ''
                    for item in self.solution.patterns:
                        aux_patterns_sent_sol += '- {}\n'.format(item.get_joined_main_s())
                    self.txt_detail_solution['state'] = NORMAL
                    self.txt_detail_solution.delete('1.0', 'end-1c')
                    self.txt_detail_solution.insert('1.0', 'CURRENT PROBLEM\n{}\n\n'
                                                           'CURRENT DESIGNER\n{}\n\n'
                                                           'ASSIGNED GROUP\n{}\n\n'
                                                           'SENT SOLUTION NOTES\n{}\n\n'
                                                           'SENT SOLUTION DIAGRAM\n{}\n\n'
                                                           'ASSIGNED PATTERNS\n{}\n\n'
                                                           'CHOSEN PATTERNS\n{}'.
                                                    format(self.problem.brief_description,
                                                           self.trv_detail_designer.item(
                                                               self.trv_detail_designer.selection())['values'][1],
                                                           'Control group' if current_group == 1 else 'Experimental group',
                                                           self.solution.annotations,
                                                           'No diagram in solution' if self.solution.diagram_id is None else 'Click up button to see diagram ^',
                                                           'No patterns configured' if aux_patterns_assign == '' else aux_patterns_assign,
                                                           'No patterns chosen' if aux_patterns_sent_sol == '' else aux_patterns_sent_sol))
                    self.txt_detail_solution['state'] = DISABLED
                    self.tlevel_sol_detail.deiconify()
                    self.tlevel_sol_detail.grab_set()
                else:
                    messagebox.showwarning(parent=self.frm_child_report, title='Wrong selection',
                                           message='The selected designer does not have a solution for the current '
                                                   'problem')

    def clear_components(self, decision=4):
        if decision > 0:  # When selecting an problem form general list
            for item in self.trv_detail_designer.get_children():
                self.trv_detail_designer.delete(item)
            if decision > 1:  # When selecting a scenario form general list
                for item in self.trv_available_prob.get_children():
                    self.trv_available_prob.delete(item)
                for item in self.trv_detail_prob.get_children():
                    self.trv_detail_prob.delete(item)
                if decision > 2:  # When selecting an experiment form general list
                    for item in self.trv_available_sc.get_children():
                        self.trv_available_sc.delete(item)
                    for item in self.trv_detail_sc.get_children():
                        self.trv_detail_sc.delete(item)
                    if decision > 3:  # Clearing information from all the treeviews
                        for item in self.trv_available_exp.get_children():
                            self.trv_available_exp.delete(item)

    def click_exit_component_det(self):
        self.tlevel_comp_detail.grab_release()
        self.tlevel_comp_detail.withdraw()

    def click_exit_diagram(self):
        self.tlevel_diagram.grab_release()
        self.tlevel_diagram.withdraw()

    def click_exit_solution_det(self):
        self.tlevel_sol_detail.grab_release()
        self.tlevel_sol_detail.withdraw()
Esempio n. 20
0
class About:
    def __init__(self):
        self.rootpath = '.\\'
        self.openAbout()

    def openAbout(self):
        self.about = Toplevel()

        w = 501
        h = 240
        ws = self.about.winfo_screenwidth()
        hs = self.about.winfo_screenheight()
        x = (ws / 2) - (w / 2)
        y = (hs / 2) - (h / 2)
        self.about.geometry('%dx%d+%d+%d' % (w, h, x, y))

        self.about.resizable(0, 0)
        self.about.title('About Testcase Generator')
        self.about.attributes("-toolwindow", 1)
        self.about.protocol("WM_DELETE_WINDOW", self.closeAboutWindow)
        self.about.grab_set()
        self.about.iconbitmap(self.rootpath + 'appdata\\images\\favicon.ico')
        txt = Text(self.about,
                   padx=10,
                   pady=10,
                   font=("Consolas", 10),
                   wrap='word')
        self.hyperlink = HyperlinkManager.HyperlinkManager(txt)
        txt.tag_configure('bold', font='Consolas 11 bold')
        txt.tag_configure('header', font='Consolas 15 bold')
        txt.insert(INSERT, '             Testcase Generator\n', 'header')
        txt.insert(INSERT, '                            version: 1.0.0\n')
        txt.insert(END, '\nTestcase Generator ', 'bold')
        txt.insert(
            END,
            "is a handy tool for preparing the input and output dataset for programming competition. "
        )
        txt.insert(END, 'Input generator is implemented using ')
        txt.insert(
            END, 'CodeForces',
            self.hyperlink.add(
                partial(webbrowser.open, "https://www.codeforces.com/")))
        txt.insert(END, ' testlib.h library in C++. ')
        txt.insert(
            END,
            "This tool is specially helpful for the problem author and tester of a programming competition."
        )
        txt.insert(END, '\n\n')
        txt.insert(
            END, 'Github Repository',
            self.hyperlink.add(
                partial(webbrowser.open,
                        "https://github.com/skmonir/testcase_generator/")))
        txt.insert(END, '\n\n')
        txt.insert(END, 'Developed by ')
        txt.insert(END, 'Md Moniruzzaman', 'bold')
        txt.insert(END, ' <*****@*****.**>\n')
        txt.insert(
            END, 'Facebook',
            self.hyperlink.add(
                partial(webbrowser.open,
                        "https://www.facebook.com/skmnrcse/")))
        txt.insert(END, ' ')
        txt.insert(
            END, 'LinkedIn',
            self.hyperlink.add(
                partial(webbrowser.open,
                        "https://www.linkedin.com/in/skmonir/")))
        txt.insert(END, ' ')
        txt.insert(
            END, 'Github',
            self.hyperlink.add(
                partial(webbrowser.open, "https://www.github.com/skmonir/")))
        txt.pack()
        txt.config(state=DISABLED)

    def closeAboutWindow(self):
        self.about.grab_release()
        self.about.destroy()
Esempio n. 21
0
class spi(Frame):
    def __init__(self, master):
        self.master = master
        self.CLKIn = 0
        self.DataIn = 0
        self.SSIn = 0

        self.cpol = 0
        self.cpha = 0

        self.decode_index = []
        self.decode_state1 = []
        self.decode_state2 = []
        self.decode_position = []
        self.decode_text = []

    def set_decode(self, channelStates):
        #self.master.withdraw()
        self.top = Toplevel(self.master)
        self.top.geometry("300x210")
        self.top.title("spi")
        self.top.grab_set()

        self.Datalab = Label(self.top, text="MISO/MOSI:")
        self.Datalab.place(x=70, y=20)

        self.CLKlab = Label(self.top, text="CLK:")
        self.CLKlab.place(x=70, y=50)

        self.SSlab = Label(self.top, text="SS:")
        self.SSlab.place(x=70, y=80)

        self.DataCombo = Combobox(self.top, state="readonly", width=8)
        self.DataCombo.place(x=150, y=20)

        self.CLKCombo = Combobox(self.top, state="readonly", width=8)
        self.CLKCombo.place(x=150, y=50)

        self.SSCombo = Combobox(self.top, state="readonly", width=8)
        self.SSCombo.place(x=150, y=80)

        clk_in_temp = 100
        data_in_temp = 100
        ss_in_temp = 100

        for i in range(0, len(channelStates)):
            if (channelStates[i] == 1 and i == self.CLKIn):
                clk_in_temp = i
            if (channelStates[i] == 1 and i == self.DataIn):
                data_in_temp = i
            if (channelStates[i] == 1 and i == self.SSIn):
                ss_in_temp = i

        for i in range(0, len(channelStates)):
            if (channelStates[i] == 1 and clk_in_temp == 100):
                clk_in_temp = i
            if (channelStates[i] == 1 and data_in_temp == 100):
                data_in_temp = i
            if (channelStates[i] == 1 and ss_in_temp == 100):
                ss_in_temp = i

        if (clk_in_temp == 100):
            clk_in_temp = 0
        if (data_in_temp == 100):
            data_in_temp = 0
        if (ss_in_temp == 100):
            ss_in_temp = 0

        self.CLKIn = clk_in_temp
        self.DataIn = data_in_temp
        self.SSIn = ss_in_temp

        self.DataCombo['values'] += (str(self.DataIn))
        self.CLKCombo['values'] += (str(self.CLKIn))
        self.SSCombo['values'] += (str(self.SSIn))
        for i in range(0, len(channelStates)):
            if (channelStates[i] == 1):
                if str(i) not in self.DataCombo['values']:
                    self.DataCombo['values'] += (str(i), )
                if str(i) not in self.CLKCombo['values']:
                    self.CLKCombo['values'] += (str(i), )
                if str(i) not in self.SSCombo['values']:
                    self.SSCombo['values'] += (str(i), )

        self.cpol_var = IntVar()
        self.CB1 = Checkbutton(self.top,
                               text='CPOL',
                               variable=self.cpol_var,
                               onvalue=1,
                               offvalue=0)  #
        self.CB1.place(x=150, y=110)
        self.cpol_var.set(self.cpol)

        self.cpha_var = IntVar()
        self.CB2 = Checkbutton(self.top,
                               text='CPHA',
                               variable=self.cpha_var,
                               onvalue=1,
                               offvalue=0)  #
        self.CB2.place(x=150, y=130)
        self.cpha_var.set(self.cpha)

        self.Button = Button(self.top,
                             text="OK",
                             height=2,
                             width=18,
                             command=self.OkCallBack)
        self.Button.place(x=80, y=155)
        self.CLKCombo.current(0)
        self.DataCombo.current(0)
        self.SSCombo.current(0)

        self.top.protocol('WM_DELETE_WINDOW', self.exit_handler)
        self.top.mainloop()

    def decode(self, results, max_index, frequence):
        print(results[self.DataIn][100:4])
        self.decode_index = []
        self.decode_state1 = []
        self.decode_state2 = []
        self.decode_index.append(0)
        self.decode_state1.append(1)
        self.decode_state2.append(0)
        self.bit_count = 0
        self.data = 0
        self.data_end_pos = 0
        self.decodeStrTmp = ""
        for i in range(1, max_index):

            if (results[self.SSIn][i - 1] == 1 and results[self.SSIn][i] == 0
                    and self.bit_count == 0):  #START
                self.add_point(i)

                self.decodeStrTmp += "St"
                self.decode_position.append(i -
                                            ((i - self.decode_index[-1]) / 2))
                self.decode_text.append(self.decodeStrTmp)
                self.decodeStrTmp = ""
                self.data = 0
                self.bit_count = 1
            elif (results[self.SSIn][i - 1] == 0
                  and results[self.SSIn][i] == 1):  #STOP
                self.decode_position.append(self.data_end_pos - (
                    (self.data_end_pos - self.decode_index[-1]) / 2))
                self.decodeStrTmp = str(hex(self.data))
                self.decode_text.append(self.decodeStrTmp)
                self.data = 0
                self.add_point(self.data_end_pos)  #data end position

                self.decode_position.append(i -
                                            ((i - self.decode_index[-1]) / 2))
                self.decodeStrTmp = "Sp"
                self.decode_text.append(self.decodeStrTmp)
                self.decodeStrTmp = ""
                self.add_point(i)
                self.bit_count = 0
            elif (self.cpol == self.cpha and self.bit_count > 0
                  and results[self.CLKIn][i] == 1
                  and results[self.CLKIn][i - 1] == 0):  #DATA
                self.data = (self.data << 1) & results[self.DataIn][i]
                self.bit_count += 1
            elif (self.cpol == self.cpha and self.bit_count > 0
                  and results[self.CLKIn][i] == 0
                  and results[self.CLKIn][i - 1] == 1):
                self.data = (self.data << 1) & results[self.DataIn][i]
                self.data_end_pos = i
            elif (self.cpol != self.cpha and self.bit_count > 0
                  and results[self.CLKIn][i] == 0
                  and results[self.CLKIn][i - 1] == 1):  #DATA
                self.data = (self.data << 1) & results[self.DataIn][i]
                self.bit_count += 1
            elif (self.cpol != self.cpha and self.bit_count > 0
                  and results[self.CLKIn][i] == 1
                  and results[self.CLKIn][i - 1] == 0):
                self.data = (self.data << 1) & results[self.DataIn][i]
                self.data_end_pos = i
            elif (self.bit_count >= 128 and results[self.CLKIn][i] == 0
                  and results[self.CLKIn][i - 1] == 1):
                self.bit_count = 1
                self.decode_position.append(i -
                                            ((i - self.decode_index[-1]) / 2))
                self.decodeStrTmp = str(hex(self.data))
                self.decode_text.append(self.decodeStrTmp)
                self.data = 0
                self.add_point(i)

    def OkCallBack(self):
        self.DataIn = int(self.DataCombo.get())
        self.CLKIn = int(self.CLKCombo.get())
        self.SSIn = int(self.SSCombo.get())
        self.cpol = int(self.cpol_var.get())
        self.cpha = int(self.cpha_var.get())
        self.exit_handler()

    def exit_handler(self):
        #self.master.deiconify()
        self.top.grab_release()
        self.top.destroy()

    def add_point(self, i):
        self.decode_index.append(i)
        self.decode_state1.append(self.decode_state1[-1])
        self.decode_state2.append(self.decode_state2[-1])
        self.decode_index.append(i + 0.5)
        self.decode_state1.append(1 - self.decode_state1[-1])
        self.decode_state2.append(1 - self.decode_state2[-1])
Esempio n. 22
0
    def change_settings(self):
        win = Toplevel()
        win.lift()
        win.focus_force()
        win.grab_set()
        win.grab_release()
        dropdown_frame = Frame(win)
        dropdown_frame.pack()
        button_frame = Frame(win)
        button_frame.pack(pady=20)
        setting_frame = Frame(win)
        setting_frame.pack(pady=20)
        self.buttons = [None] * 26
        rows = 13

        self.combox = Combobox(dropdown_frame)
        self.combox.pack(side=LEFT)
        inis = glob("configs/*.ini")
        inis = [ini.split(".")[0].split("\\")[-1] for ini in inis]
        self.combox["values"] = inis

        self.loadbutton = Button(
            dropdown_frame,
            text="load",
            width=self.buttonwidth,
            command=self.loadprofile,
        )
        self.loadbutton.pack(side=LEFT)

        self.savebutton = Button(
            dropdown_frame,
            text="save",
            width=self.buttonwidth,
            command=self.saveprofile,
        )
        self.savebutton.pack(side=LEFT)
        for index, items in enumerate(self.mapping.controller_keyboard.items()):
            Label(button_frame, text=items[0], width=self.buttonwidth).grid(
                row=index % rows, column=int(index / rows) * 2
            )
            a = KeyMappingButton(button_frame, text=items[1], width=self.buttonwidth)
            if index >= 13:
                a.grid(
                    row=index % rows,
                    column=int(index / rows) * 2 + 1,
                    padx=25,
                    sticky="w",
                )
            else:
                a.grid(row=index % rows, column=int(index / rows) * 2 + 1)

            self.buttons[index] = a

        confirm_button = Button(
            setting_frame,
            text="confirm",
            width=self.buttonwidth,
            command=lambda: self.confirm_setting(win, self.buttons),
        )
        confirm_button.pack(side=LEFT)
        win.wm_title("Window")
Esempio n. 23
0
class FormParentDesigner:
    def __init__(self, window, connection, current_designer):
        self.connection = connection
        self.current_designer = current_designer
        self.frm_parent = LabelFrame(window)
        self.tlevel_auth_scenario = Toplevel(window)
        self.tlevel_auth_scenario.protocol("WM_DELETE_WINDOW", self.click_authenticate_cancel)
        self.tlevel_auth_scenario.withdraw()
        self.frm_general = LabelFrame(window)
        self.tlevel_image_exp = Toplevel(window)
        self.tlevel_image_exp.title('Diagram')
        self.tlevel_image_exp.protocol("WM_DELETE_WINDOW", self.close_tlevel_image)
        self.tlevel_image_exp.withdraw()
        self.initialize_components()

    def initialize_components(self):
        # Resources for the Forms
        self.new_icon = PhotoImage(file=r"./Resources/create.png")
        self.modify_icon = PhotoImage(file=r"./Resources/modify.png")
        self.remove_icon = PhotoImage(file=r"./Resources/delete.png")
        self.save_icon = PhotoImage(file=r"./Resources/save.png")
        self.cancel_icon = PhotoImage(file=r"./Resources/cancel.png")
        self.add_icon = PhotoImage(file=r"./Resources/down_arrow.png")
        self.delete_icon = PhotoImage(file=r"./Resources/up_arrow.png")
        self.next_icon = PhotoImage(file=r"./Resources/next.png")
        self.back_icon = PhotoImage(file=r"./Resources/back.png")
        self.copy_icon = PhotoImage(file=r"./Resources/copy.png")
        self.open_icon = PhotoImage(file=r"./Resources/open.png")
        self.complete_icon = PhotoImage(file=r"./Resources/complete.png")
        self.incomplete_icon = PhotoImage(file=r"./Resources/incomplete.png")
        self.optional_icon = PhotoImage(file=r"./Resources/optional.png")
        self.refresh_icon = PhotoImage(file=r"./Resources/refresh.png")

        # Initialize visual components for displaying available experiment scenarios
        lbl_title = Label(self.frm_parent, text='Experiments')
        lbl_title.config(fg=TEXT_COLOR, font=TITLE_FONT)
        lbl_title.grid(row=0, column=0, columnspan=9, pady=20, sticky=EW)
        sep_aux5 = Separator(self.frm_parent, orient=HORIZONTAL)
        sep_aux5.grid(row=1, column=0, sticky=EW, columnspan=9)
        lbl_sep1 = Label(self.frm_parent)
        lbl_sep1.grid(row=2, column=0, padx=10, pady=20, rowspan=2)
        lbl_experimental_trv = Label(self.frm_parent, text='Select an experiment')
        lbl_experimental_trv.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_experimental_trv.grid(row=2, column=1, pady=20, sticky=W)
        lbl_sep2 = Label(self.frm_parent)
        lbl_sep2.grid(row=2, column=3, padx=10, pady=20, rowspan=2)
        lbl_problem_desc = Label(self.frm_parent, text='Information')
        lbl_problem_desc.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_problem_desc.grid(row=2, column=4, pady=20, sticky=W)
        lbl_sep3 = Label(self.frm_parent)
        lbl_sep3.grid(row=2, column=6, padx=10, pady=20, rowspan=2)
        self.trv_available = Treeview(self.frm_parent, height=11, columns='Title')
        self.trv_available.heading('#0', text='ID', anchor=CENTER)
        self.trv_available.heading('#1', text='Title', anchor=CENTER)
        self.trv_available.column('#0', width=0, minwidth=50, stretch=NO)
        self.trv_available.column('#1', width=400, minwidth=400, stretch=NO)
        self.trv_available.bind("<ButtonRelease-1>", self.select_experimental_scenario)
        self.trv_available.grid(row=3, column=1, sticky=W, pady=20)
        vsb_trv_av = Scrollbar(self.frm_parent, orient="vertical", command=self.trv_available.yview)
        vsb_trv_av.grid(row=3, column=2, pady=20, sticky=NS)
        self.trv_available.configure(yscrollcommand=vsb_trv_av.set)
        self.txt_scenario_desc = Text(self.frm_parent, height=15, width=40)
        self.txt_scenario_desc.config(font=TEXT_FONT, bg=DISABLED_COLOR)
        self.txt_scenario_desc.grid(row=3, column=4, pady=20, sticky=W)
        vsb_txt_sc = Scrollbar(self.frm_parent, orient="vertical", command=self.txt_scenario_desc.yview)
        vsb_txt_sc.grid(row=3, column=5, pady=20, sticky=NS)
        self.txt_scenario_desc.configure(yscrollcommand=vsb_txt_sc.set)
        sep_aux1 = Separator(self.frm_parent, orient=VERTICAL)
        sep_aux1.grid(row=2, column=7, sticky=NS, rowspan=2)
        btn_access = Button(self.frm_parent, image=self.next_icon, command=self.click_enter_scenario)
        btn_access.grid(row=2, column=8, padx=30, pady=5)
        btn_access_ttp = CreateToolTip(btn_access, 'Go')
        btn_refresh = Button(self.frm_parent, image=self.refresh_icon, command=self.retrieve_list)
        btn_refresh.grid(row=3, column=8, padx=30, pady=5, sticky=N)
        btn_refresh_ttp = CreateToolTip(btn_refresh, 'Refresh list')

        # Window dialog to authenticate the selected experimental scenario
        lbl_access_auth = Label(self.tlevel_auth_scenario, text='Insert access code: ')
        lbl_access_auth.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_access_auth.grid(pady=10, padx=20, sticky=W)
        self.txt_auth_scenario = Entry(self.tlevel_auth_scenario, width=50)
        self.txt_auth_scenario.config(font=SUBTITLE2_FONT, show="*")
        self.txt_auth_scenario.grid(row=0, column=1, padx=20, pady=10, sticky=W)
        btn_access_auth = Button(self.tlevel_auth_scenario, image=self.next_icon, command=self.click_authenticate_scenario)
        btn_access_auth.grid(row=0, column=2, padx=20, pady=10, sticky=W)
        btn_access_auth_ttp = CreateToolTip(btn_access_auth, 'Go')
        btn_cancel_auth = Button(self.tlevel_auth_scenario, image=self.cancel_icon, command=self.click_authenticate_cancel)
        btn_cancel_auth.grid(row=1, column=2, padx=20, pady=10, sticky=W)
        btn_cancel_auth_ttp = CreateToolTip(btn_cancel_auth, 'Cancel')

        # Experiment form
        lbl_sep4 = Label(self.frm_general)
        lbl_sep4.grid(row=0, column=0, padx=10, pady=5, rowspan=2)
        self.lbl_exp_title = Label(self.frm_general, text='Experiment: {}')
        self.lbl_exp_title.config(fg=TEXT_COLOR, font=TITLE_FONT)
        self.lbl_exp_title.grid(row=0, column=1, columnspan=5, pady=5, sticky=EW)
        self.txt_exp_desc = Text(self.frm_general, height=4, width=157)
        self.txt_exp_desc.config(font=TEXT_FONT, bg=DISABLED_COLOR)
        self.txt_exp_desc.grid(row=1, column=1, pady=5, sticky=W)
        vsb_txt_expd = Scrollbar(self.frm_general, orient="vertical", command=self.txt_exp_desc.yview)
        vsb_txt_expd.grid(row=1, column=2, pady=5, sticky=NS)
        self.txt_exp_desc.configure(yscrollcommand=vsb_txt_expd.set)
        lbl_sep11 = Label(self.frm_general)
        lbl_sep11.grid(row=1, column=3, padx=10, pady=5)
        self.btn_view_dd = Button(self.frm_general, text='View >>\ndiagram', command=self.click_expand_dd)
        btn_view_dd_ttp = CreateToolTip(self.btn_view_dd, 'Experiment description diagram')
        sep_aux3 = Separator(self.frm_general, orient=HORIZONTAL)
        sep_aux3.grid(row=2, column=0, sticky=EW, columnspan=6)

        lbl_sep5 = Label(self.frm_general)
        lbl_sep5.grid(row=3, column=0, padx=10, pady=5, rowspan=2)
        self.lbl_prob_title = Label(self.frm_general, text='Problem {} of {}: {}')
        self.lbl_prob_title.config(fg=TEXT_COLOR, font=SUBTITLE_FONT)
        self.lbl_prob_title.grid(row=3, column=1, columnspan=2, pady=5, sticky=W)
        self.txt_prob_desc = Text(self.frm_general, height=7, width=157)
        self.txt_prob_desc.config(font=TEXT_FONT, bg=DISABLED_COLOR)
        self.txt_prob_desc.grid(row=4, column=1, pady=5, sticky=W)
        vsb_txt_probd = Scrollbar(self.frm_general, orient="vertical", command=self.txt_prob_desc.yview)
        vsb_txt_probd.grid(row=4, column=2, pady=5, sticky=NS)
        self.txt_prob_desc.configure(yscrollcommand=vsb_txt_probd.set)
        lbl_sep12 = Label(self.frm_general)
        lbl_sep12.grid(row=3, column=3, padx=10, pady=5, rowspan=2)
        sep_aux2 = Separator(self.frm_general, orient=HORIZONTAL)
        sep_aux2.grid(row=5, column=0, sticky=EW, columnspan=4)
        lbl_sep6 = Label(self.frm_general)
        lbl_sep6.grid(row=6, column=0, padx=10, pady=5, rowspan=2)
        lbl_solution_title = Label(self.frm_general, text='Your solution')
        lbl_solution_title.config(fg=TEXT_COLOR, font=SUBTITLE_FONT)
        lbl_solution_title.grid(row=6, column=1, pady=5, columnspan=2, sticky=W)
        self.btn_next_scenario = Button(self.frm_general, image=self.next_icon, command=self.click_next_scenario)
        self.btn_next_scenario.grid(row=3, column=5, padx=30, pady=5, sticky=W)
        btn_next_scenario_ttp = CreateToolTip(self.btn_next_scenario, 'Next component')
        sep_aux4 = Separator(self.frm_general, orient=VERTICAL)
        sep_aux4.grid(row=3, column=4, sticky=NS, rowspan=5)

        self.tab_control = Notebook(self.frm_general)
        self.tab_patterns = Frame(self.tab_control)
        self.tab_control.add(self.tab_patterns, text="Design patterns", padding=10, image=self.incomplete_icon, compound=RIGHT)
        lbl_av_patterns = Label(self.tab_patterns, text='Patterns browser')
        lbl_av_patterns.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_av_patterns.grid(row=0, column=1, pady=10, columnspan=6, sticky=W)
        lbl_content = Label(self.tab_patterns, text='Pattern content')
        lbl_content.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_content.grid(row=0, column=8, pady=10, sticky=W)
        lbl_sel_patterns = Label(self.tab_patterns, text='Selected patterns')
        lbl_sel_patterns.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_sel_patterns.grid(row=3, column=1, pady=10, columnspan=6, sticky=W)
        lbl_sep7 = Label(self.tab_patterns)
        lbl_sep7.grid(row=0, column=0, padx=10, pady=10, rowspan=5)
        self.lbx_av_patterns = Listbox(self.tab_patterns, height=6, width=60, exportselection=0)
        self.lbx_av_patterns.grid(row=1, column=1, sticky=W, columnspan=5)
        self.lbx_av_patterns.bind('<<ListboxSelect>>', self.select_available_pattern)
        vsb_trv_avpat = Scrollbar(self.tab_patterns, orient="vertical", command=self.lbx_av_patterns.yview)
        vsb_trv_avpat.grid(row=1, column=6, pady=10, sticky=NS)
        self.lbx_av_patterns.configure(yscrollcommand=vsb_trv_avpat.set)
        lbl_sep8 = Label(self.tab_patterns)
        lbl_sep8.grid(row=0, column=7, padx=10, pady=10, rowspan=5)
        self.btn_view_pd = Button(self.tab_patterns, text='View diagram >>', command=self.click_expand_pd)
        btn_view_pd_ttp = CreateToolTip(self.btn_view_pd, 'Pattern section diagram')
        self.txt_pattern_content = Text(self.tab_patterns, height=18, width=85)
        self.txt_pattern_content.config(font=TEXT_FONT, bg=DISABLED_COLOR)
        self.txt_pattern_content.tag_configure("center", justify='center')
        self.txt_pattern_content.tag_add("center", 1.0, "end")
        self.txt_pattern_content.grid(row=1, column=8, sticky=W, columnspan=2, rowspan=4)
        vsb_txt_content = Scrollbar(self.tab_patterns, orient="vertical", command=self.txt_pattern_content.yview)
        vsb_txt_content.grid(row=1, column=10, rowspan=4, pady=10, sticky=NS)
        self.txt_pattern_content.configure(yscrollcommand=vsb_txt_content.set)
        btn_add = Button(self.tab_patterns, image=self.add_icon, command=self.click_add_patt)
        btn_add.grid(row=2, column=3, pady=10, sticky=E)
        btn_add_ttp = CreateToolTip(btn_add, 'Add pattern')
        btn_remove = Button(self.tab_patterns, image=self.delete_icon, command=self.click_remove_patt)
        btn_remove.grid(row=2, column=4, pady=10)
        btn_remove_ttp = CreateToolTip(btn_remove, 'Remove pattern')
        self.lbx_sel_patterns = Listbox(self.tab_patterns, height=6, width=60, exportselection=0)
        self.lbx_sel_patterns.grid(row=4, column=1, sticky=W, columnspan=5)
        vsb_trv_selpat = Scrollbar(self.tab_patterns, orient="vertical", command=self.lbx_sel_patterns.yview)
        vsb_trv_selpat.grid(row=4, column=6, pady=10, sticky=NS)
        self.lbx_sel_patterns.configure(yscrollcommand=vsb_trv_selpat.set)
        lbl_sep9 = Label(self.tab_patterns)
        lbl_sep9.grid(row=0, column=11, padx=10, pady=10, rowspan=5)

        self.tab_desc = Frame(self.tab_control)
        self.tab_control.add(self.tab_desc, text="Notes", padding=10, image=self.incomplete_icon, compound=RIGHT)
        lbl_sep10 = Label(self.tab_desc)
        lbl_sep10.grid(row=0, column=0, padx=10, pady=20)
        self.txt_solution_desc = Text(self.tab_desc, height=20, width=145)
        self.txt_solution_desc.config(font=TEXT_FONT)
        self.txt_solution_desc.bind("<Key>", self.txt_notes_modified)
        self.txt_solution_desc.grid(row=0, column=1, pady=20, sticky=W)
        vsb_txt_solution_desc = Scrollbar(self.tab_desc, orient="vertical", command=self.txt_solution_desc.yview)
        vsb_txt_solution_desc.grid(row=0, column=2, pady=20, sticky=NS)
        self.txt_solution_desc.configure(yscrollcommand=vsb_txt_solution_desc.set)
        lbl_sep14 = Label(self.tab_desc)
        lbl_sep14.grid(row=0, column=3, padx=10, pady=20)

        self.tab_file = Frame(self.tab_control)
        self.tab_control.add(self.tab_file, text="File", padding=1, image=self.optional_icon, compound=RIGHT)
        lbl_upload = Label(self.tab_file, text='Attach a file to the solution: ')
        lbl_upload.config(fg=TEXT_COLOR, font=SUBTITLE2_FONT)
        lbl_upload.grid(row=0, column=0, padx=20, pady=20, sticky=W)
        btn_open = Button(self.tab_file, image=self.open_icon, command=self.click_attach_file)
        btn_open.grid(row=1, column=0, padx=20, pady=10, sticky=E)
        btn_open_ttp = CreateToolTip(btn_open, 'Attach file')
        btn_quit = Button(self.tab_file, image=self.remove_icon, command=self.click_remove_file)
        btn_quit.grid(row=2, column=0, padx=20, pady=10, sticky=E)
        btn_quit_ttp = CreateToolTip(btn_quit, 'Remove file')
        self.canvas_solution = Canvas(self.tab_file, width=350, height=350)
        self.canvas_solution.config(background='white', borderwidth=1)
        self.canvas_solution.grid(row=0, column=1, padx=10, pady=10, rowspan=10, sticky=NS)
        self.tab_control.grid(row=7, column=1, pady=10, sticky=W, columnspan=2)

        self.canvas_expanded = Canvas(self.tlevel_image_exp, width=500, height=500)
        self.canvas_expanded.config(background='white', borderwidth=1)
        self.canvas_expanded.grid()

    def show_frm(self):
        self.retrieve_list()
        self.frm_parent.grid(row=0, column=0, columnspan=9, rowspan=9, pady=10, padx=10)

    def hide_frm(self):
        self.frm_parent.grid_forget()
        self.frm_general.grid_forget()

    def retrieve_list(self):
        """
        This function shows the existing 'Experimental scenarios for the specified designer' in the home TreeView, if
        not 'Experimental scenario' then an information box is showed
        """
        # Remove existing elements in the list
        for item in self.trv_available.get_children():
            self.trv_available.delete(item)
        # Retrieve scenario for current designer
        self.directive = Message(action=82, information=['my scenarios', self.current_designer.id])
        self.connection = self.directive.send_directive(self.connection)
        # Set visual components with retrieved scenarios
        for item in self.connection.message.information:
            elements = item.split('¥')
            self.trv_available.insert('', 'end', text=elements[0], values=(summarize_text(elements[1], 400),))
        if len(self.trv_available.get_children()) != 0:
            self.trv_available.selection_set(self.trv_available.get_children()[0])
            self.select_experimental_scenario()
        else:
            self.txt_scenario_desc['state'] = NORMAL
            self.txt_scenario_desc.delete('1.0', 'end-1c')
            self.txt_scenario_desc.insert('1.0', 'No experiments available for you')
            self.txt_scenario_desc['state'] = DISABLED

    def select_experimental_scenario(self, event=None):
        """
        Retrieves information of the selected experimental scenario form the server and saves in a local variable for
        future usage, also shows the description of the selected experimental scenario in a textbox
        """
        if self.trv_available.item(self.trv_available.selection())['text'] != '':
            id_selected_ex_scenario = int(self.trv_available.item(self.trv_available.selection())['text'])  # Retrieve id of selected item from TreeView
            self.directive = Message(action=85, information=[id_selected_ex_scenario])
            self.connection = self.directive.send_directive(self.connection)
            self.experimental_scenario = ExperimentalSC(id=id_selected_ex_scenario,
                                                        title=self.connection.message.information[0],
                                                        description=self.connection.message.information[1],
                                                        access_code=self.connection.message.information[2],
                                                        state=self.connection.message.information[3],
                                                        availability=self.connection.message.information[4],
                                                        id_experiment=self.connection.message.information[6],
                                                        id_description_diagram=self.connection.message.information[5],
                                                        connection=self.connection)
            if self.experimental_scenario.description_diagram is not None:
                self.file_dd = self.experimental_scenario.description_diagram
            else:
                self.file_dd = None
            # Insert description of the current scenario into visual component
            self.txt_scenario_desc['state'] = NORMAL
            self.txt_scenario_desc.delete('1.0', 'end-1c')
            self.txt_scenario_desc.insert('1.0', self.experimental_scenario.description)
            self.txt_scenario_desc['state'] = DISABLED

    def click_enter_scenario(self):
        """
        Shows pop-up window that allows validation of access code for the experimental scenario (necessary before showing
        the problems of the experimental scenario)
        """
        if self.trv_available.item(self.trv_available.selection())['text'] != '':
            self.tlevel_auth_scenario.title('Need to authenticate')
            self.tlevel_auth_scenario.deiconify()
            self.tlevel_auth_scenario.grab_set()
            self.txt_auth_scenario.focus_set()

    def click_authenticate_scenario(self):
        """
        If validation process is correct the the experimental scenario and it's problems are loaded into the visual
        components
        """
        if self.validate_access_code():
            self.load_experiment()
            self.txt_auth_scenario.delete(0, END)
            self.tlevel_auth_scenario.grab_release()
            self.tlevel_auth_scenario.withdraw()
            self.frm_parent.grid_forget()
            self.frm_general.grid(row=0, column=0, columnspan=9, rowspan=9, pady=10, padx=10)
        else:
            messagebox.showerror(parent=self.tlevel_auth_scenario, title='Wrong access code',
                                 message='The access code you provided is wrong, retry')

    def initialize_component_variables(self):
        """
        Initialize to zero or empty state all variables associated with the resolution of a problem for the designers
        (solutions and measurements)
        """
        self.attached_file = None
        self.av_patterns_seen = []
        self.solution_time = 0
        self.selection_time = []    # Time for selecting solution patterns (may be more than one solution pattern)
        self.selected_pattern_sol = []  # Indicates that any pattern solution has been selected yet

    def click_authenticate_cancel(self):
        """
        Cancel validation of access code for an experimental scenario, it hides the validation pop-up window
        """
        self.txt_auth_scenario.delete(0, END)
        self.tlevel_auth_scenario.grab_release()
        self.tlevel_auth_scenario.withdraw()

    def validate_access_code(self):
        """
        Verifies that the provided code matches the stored access code for the selected experimental scenario
        """
        if len(self.txt_auth_scenario.get()) != 0:
            if self.txt_auth_scenario.get() == self.experimental_scenario.access_code:
                return True
        return False

    def click_next_scenario(self):
        """
        After clicking next scenario component. This method prompts the user to confirm his decision. After confirming
        the system saves the important information (solutions and measurements) and then continue to the next scenario
        component if available, otherwise the experiment will be closed
        """
        decision = messagebox.askyesno(parent=self.frm_general, title='Confirmation',
                                       message="Are you sure you want to continue? Yo won't be able to make any change "
                                               "later")
        if decision: # Confirmation of action
            if self.save_changes():
                self.problems_counter += 1
                if self.problems_counter == len(self.experimental_scenario.problems): # If no more problems available
                    messagebox.showinfo(parent=self.frm_general, title='Experiment',
                                        message="This concludes the execution of the experiment. Thank you!")
                    self.finish_experiment()
                    self.clear_visual_components()
                    self.hide_frm()
                    self.show_frm()
                else: # If another scenario component available
                    messagebox.showinfo(parent=self.frm_general, title='Next problem',
                                        message="You are about to start a new problem, press Ok when you are ready.")
                    self.clear_visual_components()
                    self.initialize_component_variables()
                    self.load_problem()

    def save_changes(self):
        # Validate any problem with info inserted into visual components
        if self.validate_component_frm():  # No problem, proceed to save info
            self.solution_time += self.time_thread.seconds
            self.time_thread.stop() # Stop thread timer
            acquisition_end_date = datetime.now()
            # Get measurements of important metrics for the current component
            problem_id = self.experimental_scenario.problems[self.problems_counter].id
            current_measurements = []
            # Solution time
            measurement_1 = Measurement(value=float(self.solution_time), acquisition_start_date=self.acquisition_start_date,
                                        acquisition_end_date=acquisition_end_date, id_metric=1,
                                        id_designer=self.current_designer.id, id_problem=problem_id)
            current_measurements.append(measurement_1)
            # Save measurements associated with patterns only when these are available for designer
            if self.pattern_decision:
                # Selection time
                # Getting average if more than one value for this metric
                selection_time = 0 if len(self.selection_time) == 0 else sum(self.selection_time) / len(self.selection_time)
                measurement_2 = Measurement(value=float(selection_time), acquisition_start_date=self.acquisition_start_date,
                                            acquisition_end_date=acquisition_end_date, id_metric=2,
                                            id_designer=self.current_designer.id, id_problem=problem_id)
                current_measurements.append(measurement_2)
                # Viewed patterns
                measurement_3 = Measurement(value=float(len(self.av_patterns_seen)),
                                            acquisition_start_date=self.acquisition_start_date,
                                            acquisition_end_date=acquisition_end_date, id_metric=3,
                                            id_designer=self.current_designer.id, id_problem=problem_id)
                current_measurements.append(measurement_3)
                # Chosen patterns
                measurement_4 = Measurement(value=float(self.lbx_sel_patterns.size()),
                                            acquisition_start_date=self.acquisition_start_date,
                                            acquisition_end_date=acquisition_end_date, id_metric=4,
                                            id_designer=self.current_designer.id, id_problem=problem_id)
                current_measurements.append(measurement_4)
            for item in current_measurements:
                self.directive = Message(action=96, information=[item.value, item.acquisition_start_date,
                                                                 item.acquisition_end_date, item.id_metric,
                                                                 item.id_designer, item.id_problem])
                self.connection = self.directive.send_directive(self.connection)
            # Get info and build the solution to send to the server
            # Create diagram in DB
            id_diagram = None
            if self.attached_file is not None:
                self.directive = Message(action=61, information=[self.attached_file.file_bytes, self.attached_file.name,
                                                                 'sent sol'])
                self.connection = self.directive.send_directive(self.connection)
                id_diagram = self.connection.message.information[0]
            # Create object for the solution
            solution_aux = Solution(annotations=self.txt_solution_desc.get('1.0', 'end-1c'), diagram_id=id_diagram,
                                    patterns_id=self.sel_patterns_ids)
            # Create the solution in DB
            self.directive = Message(action=101, information=[solution_aux.annotations, solution_aux.diagram_id,
                                                              self.current_designer.id, problem_id,
                                                              solution_aux.patterns_id])
            self.connection = self.directive.send_directive(self.connection)
            return True
        return False

    def finish_experiment(self):
        """
        This section checks in the server if current designer is the last of the current experimental scenario, and if
        True changes it's state to finished, otherwise the state remains in executed
        """
        self.directive = Message(action=83, information=['finished', self.experimental_scenario.id])
        self.connection = self.directive.send_directive(self.connection)

    def validate_component_frm(self):
        if self.pattern_decision:
            if self.lbx_sel_patterns.size() == 0:
                messagebox.showwarning(parent=self.frm_general, title='Missing information',
                                       message="You haven't selected any pattern")
                return False
        if len(self.txt_solution_desc.get('1.0', 'end-1c')) == 0:
            messagebox.showwarning(parent=self.frm_general, title='Missing information',
                                   message='You must add notes to your solution')
            return False
        return True

    def click_attach_file(self):
        """
        Create a File object that is uploaded by the user, validating that there is not a file uploaded already.
        """
        if self.attached_file is None:
            filename = filedialog.askopenfilename(initialdir=os.getcwd(), title="Select image file",
                                                  filetypes=[("Diagrams", ".jpg .png .tiff")])
            if not filename:
                return  # user cancelled; stop this method
            self.attached_file = File()
            self.attached_file.read_file(filename)
            # Display image into canvas
            load = Image.open(self.attached_file.filename)
            load = load.resize((350, 350), Image.ANTIALIAS)
            self.render = ImageTk.PhotoImage(load)
            if self.attached_file.image is not None:  # if an image was already loaded
                self.canvas_solution.delete(self.attached_file.image)  # remove the previous image
            self.attached_file.image = self.canvas_solution.create_image(0, 0, anchor='nw', image=self.render)

    def click_remove_file(self):
        """
        Remove an uploaded file from the system validating it is already uploaded. This method also delete
        any image in the canvas that may be fulfilled with an image.
        """
        if self.attached_file is not None:  # if an image was already loaded
            self.canvas_solution.delete(self.attached_file.image)
            self.attached_file = None

    def click_add_patt(self):
        """
        Adds a pattern to the selected pattern listbox (when available to the designer).
        """
        element = self.lbx_av_patterns.curselection()
        if element is not None:   # Check if listbox is selected
            index = element[0]
            id_selected = self.av_patterns_ids[index]
            if not id_selected in self.sel_patterns_ids:    # Check if current pattern_id is not in the 'selected patterns list'
                if id_selected in self.current_ideal_patterns and not id_selected in self.selected_pattern_sol:  # Check if selected pattern matches ideal patterns and for the first time
                    self.selected_pattern_sol.append(id_selected)
                    self.selection_time.append(self.time_thread.seconds)
                for item in self.available_patterns:
                    if item.id == id_selected:  # Find selected pattern in available patterns list
                        self.selected_pattern = item
                        break
                self.sel_patterns_ids.append(id_selected)   # Append pattern_id to selected patterns ids
                self.lbx_sel_patterns.insert(END, self.selected_pattern.get_joined_main_s())  # Insert pattern name into selected listbox patters
                self.check_selected_patterns()

    def click_remove_patt(self):
        """
        Removes a pattern from the selected pattern listbox (when available to the designer).
        """
        element = self.lbx_sel_patterns.curselection()
        if element is not None:  # Check if listbox is selected
            if element:
                index = element[0]
                id_selected = self.sel_patterns_ids[index]
                self.lbx_sel_patterns.delete(element)  # Remove from listbox
                if id_selected in self.current_ideal_patterns and id_selected in self.selected_pattern_sol:  # Check if selected pattern matches ideal patterns and if the the selected pattern correspond to the one selected previously as the pattern solution
                    del self.selection_time[self.selected_pattern_sol.index(id_selected)]
                    self.selected_pattern_sol.remove(id_selected)
                for item in reversed(self.sel_patterns_ids):
                    if item == id_selected:
                        self.sel_patterns_ids.remove(item)
                        break
                self.check_selected_patterns()

    def click_expand_pd(self):
        # Fill canvas with retrieved image
        load = Image.open(self.file_pd.filename)
        load = load.resize((500, 500), Image.ANTIALIAS)
        self.render_pd = ImageTk.PhotoImage(load)
        self.canvas_expanded.delete()
        self.file_pd.image = self.canvas_expanded.create_image(0, 0, anchor='nw', image=self.render_pd)  # and display new image
        self.tlevel_image_exp.deiconify()
        self.tlevel_image_exp.grab_set()

    def click_expand_dd(self):
        # Fill canvas with retrieved image
        load = Image.open(self.file_dd.filename)
        load = load.resize((500, 500), Image.ANTIALIAS)
        self.render_dd = ImageTk.PhotoImage(load)
        self.canvas_expanded.delete()
        self.file_dd.image = self.canvas_expanded.create_image(0, 0, anchor='nw', image=self.render_dd)  # and display new image
        self.tlevel_image_exp.deiconify()
        self.tlevel_image_exp.grab_set()

    def close_tlevel_image(self):
        self.tlevel_image_exp.grab_release()
        self.tlevel_image_exp.withdraw()

    def clear_visual_components(self):
        self.txt_prob_desc['state'] = NORMAL
        self.txt_prob_desc.delete('1.0', 'end-1c')
        self.lbx_av_patterns.delete(0, END)
        self.lbx_sel_patterns.delete(0, END)
        self.txt_pattern_content['state'] = NORMAL
        self.txt_pattern_content.delete('1.0', 'end-1c')
        self.txt_pattern_content['state'] = DISABLED
        self.txt_solution_desc.delete('1.0', 'end-1c')
        if self.attached_file is not None:  # if an image was already loaded
            self.canvas_solution.delete(self.attached_file.image)
            self.attached_file = None
        self.tab_control.tab(0, image=self.incomplete_icon)
        self.tab_control.tab(1, image=self.incomplete_icon)

    def load_experiment(self):
        # Retrieve all information of problems of current scenario
        self.experimental_scenario.retrieve_problems(Pattern.get_available_patterns(self.connection))
        self.initialize_component_variables()
        self.problems_counter = 0
        self.current_designer.get_current_role(
            self.experimental_scenario.id)  # Get role for current experimental scenario
        # Retrieve patterns for designer in current experimental scenario
        self.directive = Message(action=42, information=[self.experimental_scenario.id,
                                                         1 if self.current_designer.current_group == 'experimental' else 2])
        self.connection = self.directive.send_directive(self.connection)
        self.available_patterns = Pattern.get_patterns(self.connection, self.connection.message.information)
        # Make patterns visible if the patterns are available for current designer in current experimental scenario
        if self.available_patterns:
            self.tab_control.tab(0, state='normal')
            self.tab_control.select(0)
            self.pattern_decision = True
        else:
            self.tab_control.tab(0, state='hidden')
            self.tab_control.select(1)
            self.pattern_decision = False
        self.btn_view_dd.grid_forget()
        if self.experimental_scenario.description_diagram is not None:
            self.btn_view_dd.grid(row=1, column=5, padx=10, pady=10, sticky=N)
        self.lbl_exp_title['text'] = 'Experiment: {}'.format(self.experimental_scenario.title)
        self.txt_exp_desc['state'] = NORMAL
        self.txt_exp_desc.delete('1.0', 'end-1c')
        self.txt_exp_desc.insert('1.0', self.experimental_scenario.description)
        self.txt_exp_desc['state'] = DISABLED
        self.load_problem()

    def load_problem(self):
        # Ask for available patterns in current problem for the current designer, depending of the role
        self.lbl_prob_title['text'] = 'Problem {} of {}: {}'.format(self.problems_counter + 1,
                                                                    len(self.experimental_scenario.problems),
                                                                    self.experimental_scenario.problems[self.problems_counter].brief_description)
        self.txt_prob_desc['state'] = NORMAL
        self.txt_prob_desc.delete('1.0', 'end-1c')
        self.txt_prob_desc.insert('1.0', self.experimental_scenario.problems[self.problems_counter].description)
        self.txt_prob_desc['state'] = DISABLED
        self.av_patterns_ids = []
        self.sel_patterns_ids = []
        for item in self.available_patterns:
            self.av_patterns_ids.append(item.id)
            self.lbx_av_patterns.insert(END, item.get_joined_main_s())
        self.current_ideal_patterns = self.experimental_scenario.problems[self.problems_counter].solution.patterns_id  # Get the patterns of the ideal solution for current problem
        # Make patterns visible if the patterns are available for current designer in current experimental scenario
        if self.pattern_decision:
            self.tab_control.select(0)
        else:
            self.tab_control.select(1)
        self.btn_view_pd.grid_forget()
        self.time_thread = TimerClass()
        self.time_thread.begin()
        self.acquisition_start_date = datetime.now()

    def select_available_pattern(self, event):
        id_selected = self.av_patterns_ids[self.lbx_av_patterns.curselection()[0]]
        # Add selected pattern to the seen pattern (metric)
        if not id_selected in self.av_patterns_seen:
            self.av_patterns_seen.append(id_selected)
        # Retrieve info of the selected pattern (in available patterns list)
        for item in self.available_patterns:
            if item.id == id_selected:
                self.selected_pattern = item
                break
        # Set visual components depending on the selected pattern and its info
        self.btn_view_pd.grid_forget()
        self.txt_pattern_content['state'] = NORMAL
        self.txt_pattern_content.delete('1.0', 'end-1c')
        for item in self.selected_pattern.sections:
            self.txt_pattern_content.insert('end-1c', item.name + ": ")
            if item.data_type == 'File': # The section content is a file
                if item.diagram_id != 0:
                    self.directive = Message(action=65, information=[item.diagram_id])
                    self.connection = self.directive.send_directive(self.connection)
                    self.file_pd = File()
                    self.file_pd.write_file(self.connection.message.information[0], self.connection.message.information[1])
                    self.btn_view_pd.grid(row=0, column=9, sticky=E)
                    self.txt_pattern_content.insert('end-1c', "\nClick up button to see diagram ^\n\n")

                else:
                    self.file_pd = None
                    self.txt_pattern_content.insert('end-1c', "\nNo diagram loaded for this section\n\n")

            else:
                self.txt_pattern_content.insert('end-1c', "\n" + item.content + "\n\n")
        self.txt_pattern_content['state'] = DISABLED

    def txt_notes_modified(self, event):
        """
        Method that checks if text box of additional notes (solution) is filled or not, so tab image is selected
        """
        if self.txt_solution_desc.get('1.0', 'end-1c') != '':
            self.tab_control.tab(1, image=self.complete_icon)
        else:
            self.tab_control.tab(1, image=self.incomplete_icon)

    def check_selected_patterns(self):
        """
        Method that checks if list box of selected patterns (solution) is filled or not, so tab image is selected
        """
        if self.lbx_sel_patterns.size() != 0:
            self.tab_control.tab(0, image=self.complete_icon)
        else:
            self.tab_control.tab(0, image=self.incomplete_icon)
class i2c(Frame) :
    def __init__(self,master):
        self.master = master
        self.SclIn = 0
        self.SdaIn = 0
        
        self.decode_index  = []
        self.decode_state1 = []
        self.decode_state2 = []
        self.decode_position = []
        self.decode_text     = []
        
    def set_decode(self,channelStates):
        self.top = Toplevel(self.master)
        self.top.geometry("300x150")
        self.top.title("i2c") 
        self.top.grab_set()
        
        self.SDAlab = Label(self.top, text="SDA:")
        self.SDAlab.place(x = 80,y = 20)
        
        self.SCLlab = Label(self.top, text="SCL:")
        self.SCLlab.place(x = 80,y = 50)
        
        self.SdaCombo = Combobox(self.top, state="readonly",width = 8)
        self.SdaCombo.place(x = 140,y = 20)
        
        self.SclCombo = Combobox(self.top, state="readonly",width = 8)
        self.SclCombo.place(x = 140,y = 50)
        
        scl_in_temp = 100
        sda_in_temp = 100
        
        for i in range(0,len(channelStates)):
            if(channelStates[i] == 1 and i == self.SclIn):
                scl_in_temp = i
            if(channelStates[i] == 1 and i == self.SdaIn):
                sda_in_temp = i
                
        for i in range(0,len(channelStates)):
            if(channelStates[i] == 1 and scl_in_temp == 100):
                scl_in_temp = i
            if(channelStates[i] == 1 and sda_in_temp == 100):
                sda_in_temp = i
        
        if (scl_in_temp == 100):
            scl_in_temp = 0
        if (sda_in_temp == 100):
            sda_in_temp = 0    
        
        self.SclIn = scl_in_temp
        self.SdaIn = sda_in_temp
        
        self.SdaCombo['values'] += (str(self.SdaIn))
        self.SclCombo['values'] += (str(self.SclIn))
        for i in range(0,len(channelStates)):
            if (channelStates[i] == 1):
                if str(i) not in self.SdaCombo['values']:
                    self.SdaCombo['values'] += (str(i),)
                if str(i) not in self.SclCombo['values']:    
                    self.SclCombo['values'] += (str(i),)
                
        self.Button = Button(self.top, text = "OK",height=2, width=18, command = self.OkCallBack)
        self.Button.place(x = 80,y = 90)
        self.SclCombo.current(0)
        self.SdaCombo.current(0)
        
        self.top.protocol('WM_DELETE_WINDOW', self.exit_handler)
        self.top.mainloop()
    
    def decode(self,results,max_index,frequence):
        print (results[self.SdaIn][100:4])
        self.decode_index =  []
        self.decode_state1 =  []
        self.decode_state2 =  []
        self.decode_position = []
        self.decode_text = []
        self.decode_index.append(0)
        self.decode_state1.append(1)
        self.decode_state2.append(0)
        self.bit_count = 0
        self.data = 0
        self.decodeStrTmp = ""
        for i in range(1,max_index):
            if ((results[self.SclIn][i-1]==1 and results[self.SdaIn][i-1]==1) and 
                (results[self.SclIn][i]==1 and results[self.SdaIn][i]==0) and self.bit_count == 0):#START
                self.add_point(i)                
                
                self.decodeStrTmp += "St"
                self.decode_position.append(i-((i-self.decode_index[-1])/2))
                self.decode_text.append(self.decodeStrTmp)
                self.decodeStrTmp = ""
                self.bit_count = 1
            elif ((results[self.SclIn][i-1]==1 and results[self.SdaIn][i-1]==0) and 
                  (results[self.SclIn][i]==1 and results[self.SdaIn][i]==1)):#STOP
                self.decode_position.append(i-((i-self.decode_index[-1])/2))
                self.decodeStrTmp += "Sp"
                self.decode_text.append(self.decodeStrTmp)
                self.decodeStrTmp = ""
                
                self.add_point(i)
                
                self.bit_count = 0
            elif(self.bit_count > 0 and self.bit_count < 8 and results[self.SclIn][i]==1 and
                 results[self.SclIn][i-1]==0):#ADRESS
                if(self.bit_count==1):
                    self.data = 0
                    self.add_point(i)
                self.data = self.data<<1
                self.data += results[self.SdaIn][i]
                if(self.bit_count==7):
                    self.decodeStrTmp = str(hex(self.data))
                    self.data = 0
                self.bit_count += 1
            elif(self.bit_count == 8 and results[self.SclIn][i]==1 and results[self.SclIn][i-1]==0):#READ/WRITE
                if(results[self.SdaIn][i] == 1):
                    self.decodeStrTmp = self.decodeStrTmp + "+R"
                else:
                    self.decodeStrTmp = self.decodeStrTmp + "+W"
                
                self.decode_position.append(i-((i-self.decode_index[-1])/2))
                self.decode_text.append(self.decodeStrTmp)
                self.decodeStrTmp = ""
                
                self.bit_count = 30
            elif((self.bit_count == 9 or self.bit_count == 18) and results[self.SclIn][i]==1 and results[self.SclIn][i-1]==0):#ACK
                if(results[self.SdaIn][i] == 1):
                    self.decodeStrTmp = self.decodeStrTmp + "NACK"
                else:
                    self.decodeStrTmp = self.decodeStrTmp + "ACK"
                self.bit_count = 31
                
                self.decode_position.append(i-((i-self.decode_index[-1])/2))
                self.decode_text.append(self.decodeStrTmp)
                self.decodeStrTmp = ""
                
            elif(self.bit_count > 9 and self.bit_count < 18 and results[self.SclIn][i]==1 and results[self.SclIn][i-1]==0):#DATA
                if(self.bit_count==10):
                    self.data = 0
                self.data = (self.data<<1) & results[self.SdaIn][i]
                if(self.bit_count==17):
                    self.decodeStrTmp = str(hex(self.data))
                    self.data = 0
                self.bit_count += 1
            elif(self.bit_count == 30 and results[self.SclIn][i]==0 and results[self.SclIn][i-1]==1):
                self.bit_count = 9
                self.add_point(i)
            elif(self.bit_count == 31 and results[self.SclIn][i]==0 and results[self.SclIn][i-1]==1):
                self.bit_count = 10
                self.add_point(i)
    
    def OkCallBack(self):
        self.SdaIn = int(self.SdaCombo.get())
        self.SclIn = int(self.SclCombo.get())
        self.exit_handler()
    
    def exit_handler(self):
        #self.master.deiconify()
        self.top.grab_release()
        self.top.destroy()
    def add_point(self,i):
        self.decode_index.append(i)
        self.decode_state1.append(self.decode_state1[-1])
        self.decode_state2.append(self.decode_state2[-1])
        self.decode_index.append(i+0.5)
        self.decode_state1.append(1-self.decode_state1[-1])
        self.decode_state2.append(1-self.decode_state2[-1])
Esempio n. 25
0
class uart(Frame) :
    def __init__(self,master):
        self.master = master
        self.dataPin = 0
        self.baudRate = 9600
        self.parity = 0
        
        self.PusleWidth = 1.0
        
        self.decode_index  = []
        self.decode_state1 = []
        self.decode_state2 = []
        self.decode_position = []
        self.decode_text     = []
        
    def set_decode(self,channelStates):
        #self.master.withdraw()
        self.top = Toplevel(self.master)
        self.top.geometry("300x160")
        self.top.title("uart") 
        self.top.grab_set()
        
        self.datalab = Label(self.top, text="data pin:")
        self.datalab.place(x = 80,y = 20)
        
        self.baudlab = Label(self.top, text="baud rate:")
        self.baudlab.place(x = 80,y = 50)
        
        self.dataCombo = Combobox(self.top, state="readonly",width = 8)
        self.dataCombo.place(x = 140,y = 20)
        #self.SdaCombo.current(0)
        
        self.BaudVar = StringVar()
        self.BaudVar.set(str(self.baudRate))
        self.BaudEntry = Entry(self.top, width=11,textvariable = self.BaudVar)
        self.BaudEntry.place(x = 140,y = 50)
        
        data_in_temp = 100
        for i in range(0,len(channelStates)):
            if(channelStates[i] == 1 and i == self.dataPin):
                data_in_temp = i
                
        for i in range(0,len(channelStates)):
            if(channelStates[i] == 1 and data_in_temp == 100):
                data_in_temp = i

        if (data_in_temp == 100):
            data_in_temp = 0
        
        self.dataPin = data_in_temp
        
        self.dataCombo['values'] += (str(self.dataPin))
        for i in range(0,len(channelStates)):
            if (channelStates[i] == 1):
                if str(i) not in self.dataCombo['values']:
                    self.dataCombo['values'] += (str(i),)
        
        self.parity_var = IntVar()
        self.CB1 = Checkbutton(self.top, 
                               text='Parity bit',
                               variable=self.parity_var, 
                               onvalue=1, 
                               offvalue=0) #
        self.CB1.place(x = 140,y = 80)
        self.parity_var.set(self.parity)        
        
        self.Button = Button(self.top, 
                             text = "OK",
                             height=2, 
                             width=18, 
                             command = self.OkCallBack)
        self.Button.place(x = 80,y = 110)
        self.dataCombo.current(0)
        
        self.top.protocol('WM_DELETE_WINDOW', self.exit_handler)
        self.top.mainloop()
    
    def decode(self,results,max_index,frq):
        self.decode_index =  []
        self.decode_state1 =  []
        self.decode_state2 =  []
        self.decode_position = []
        self.decode_text = []
        self.decode_index.append(0)
        self.decode_state1.append(1)
        self.decode_state2.append(0)
        
        self.bit_count = 0
        self.data = 0
        self.decodeStrTmp = ""
        
        self.PulseWidth = frq / self.baudRate
        
        i = 0
        while i < max_index:
            if (results[self.dataPin][i-1]==1 and results[self.dataPin][i]==0):#START
                offsetStart = int(round(self.PulseWidth))
                offset8 = int(round(self.PulseWidth * 8 + self.PulseWidth/2))  
                
                
                self.add_point(i)
                self.decode_position.append(i+(self.PulseWidth/5))
                self.decode_text.append("St")
                
                offsetDecode = (offset8 - offsetStart)//2
                
                self.data = 0
                for d in range(0,8):
                    self.data = self.data>>1
                    offset = int(round(self.PulseWidth * (d+1) + self.PulseWidth/2))
                    self.data += results[self.dataPin][i+offset] * 128
                
                self.add_point(i+offsetStart)
                self.decode_position.append(i+offsetDecode)
                self.decode_text.append(str(hex(self.data)))
                
                if(self.parity == 0):
                    offsetStop = int(round(self.PulseWidth * 9))
                    self.add_point(i+offsetStop)
                    self.decode_position.append(i+offsetStop+ (self.PulseWidth/5))
                    self.decode_text.append("Sp")
                else:
                    offsetParity = int(round(self.PulseWidth * 9))
                    offsetStop = int(round(self.PulseWidth * 10))
                    self.add_point(i+offsetParity)
                    self.decode_position.append(i+offsetParity+ (self.PulseWidth/5))
                    self.decode_text.append(str(results[self.dataPin][i+int(offsetParity + self.PulseWidth/2)]))
                    
                    self.add_point(i+offsetStop)
                    self.decode_position.append(i+ offsetStop + (self.PulseWidth/5))
                    self.decode_text.append("Sp")
                
                i+=offsetStop
                i+=1
            else:
                i+=1
    def OkCallBack(self):
        self.dataPin = int(self.dataCombo.get())
        self.baudRate = int(self.BaudVar.get())
        self.exit_handler()
        self.parity = self.parity_var.get()
    
    def exit_handler(self):
        self.top.grab_release()
        self.top.destroy()
    def add_point(self,i):
        self.decode_index.append(i)
        self.decode_state1.append(self.decode_state1[-1])
        self.decode_state2.append(self.decode_state2[-1])
        self.decode_index.append(i+0.5)
        self.decode_state1.append(1-self.decode_state1[-1])
        self.decode_state2.append(1-self.decode_state2[-1])