예제 #1
0
 def create_macros_set(self) -> Optional[data_types.MacroSet]:
     """
     create new macros from data from fields and add it to all macroses
     :return: new macros
     """
     name = self.LineNameSet.text()
     if not name:
         common_functions.error_message("Macros Set Name is empty")
         return None
     if name not in [macro.name for macro in self.all_macros]:
         new_macros_set = data_types.MacroSet(name=name, macros=list())
         for key in self.macros_dict.keys():
             new_macros_set.macros.append(
                 data_types.Macro(
                     name=self.macros_names_list[key].text(),
                     command=self.macros_command_list[key].text(),
                     icon_path=self.current_icon_paths[key]))
         self.all_macros.append(new_macros_set)
         self.CBMacros.addItem(name)
         self.CBMacros.setCurrentText(name)
         return new_macros_set
     else:
         macros_used = data_types.get_macros_by_name(name, self.all_macros)
         for i in range(data_types.max_macros):
             macros_used.macros[i].name = self.macros_names_list[i].text()
             macros_used.macros[i].command = self.macros_command_list[
                 i].text()
             macros_used.macros[i].command = self.current_icon_paths[i]
         return macros_used
예제 #2
0
 def connect(self):
     """
     connects to selected port with selected settings, sets connected UI state if success
     :return:
     """
     name: str = self.CBPorts.currentText().split(':')[0]
     self.serial_port.setPortName(name)
     # noinspection PyArgumentList
     self.serial_port.setBaudRate(self.port_settings.baudrate)
     self.serial_port.setDataBits(
         data_types.databits_dict[self.port_settings.databits])
     self.serial_port.setParity(
         data_types.parity_dict[self.port_settings.parity])
     self.serial_port.setStopBits(
         data_types.stopbits_dict[self.port_settings.stopbits])
     if not self.serial_port.open(QtCore.QIODevice.ReadWrite):
         common_functions.error_message("Unable to open port %s" % name)
     else:
         self.start_time = datetime.datetime.now()
         self.LblStatus.setPixmap(
             QtGui.QPixmap(":/status-conn/icon/status con2.gif"))
         self.BtnDisconnect.setEnabled(True)
         self.BtnConnect.setEnabled(False)
         self.port_settings.name = name
         self.port_settings.last_name = name
         self.BtnSend.setEnabled(True)
         self.BtnSend2.setEnabled(True)
         self.statusbar.clearMessage()
         self.TxtBuffer.clear()
         self.clear_counter()
예제 #3
0
 def write_data(self, text: Union[str, bytes], encode=True, hexes=True) -> int:
     """
     writes data to comport
     :param hexes: convert hexes or not
     :param encode: True if we need to encode
     :param text: text to send
     :return: -1 if failed 0 if ok
     """
     commands = common_functions.split_with_bytes(text) if hexes and encode else [text]
     res_command = bytes()
     for command in commands:
         if common_functions.is_byte(command):
             add_command = bytes.fromhex(command[1:]) if encode else command
         else:
             add_command = bytes(command, encoding='utf-8') if encode else command
         res_command += add_command
     res = self.serial_port.write(res_command)
     self.serial_port.flush()
     if res != len(res_command):
         common_functions.error_message('Data was not sent correctly')
         return -1
     if self.text_settings.show_sent and encode:
         self.TxtBuffer.setStyleSheet("background-color:rgb%s" % str(self.colors['background-color']))
         self.TxtBuffer.setTextBackgroundColor(QtGui.QColor(*self.colors['background-color']))
         for command in commands:
             if common_functions.is_byte(command):
                 self.TxtBuffer.setTextColor(QtGui.QColor(*self.colors['bytes-color']))
             else:
                 self.TxtBuffer.setTextColor(QtGui.QColor(*self.colors['font-transmit']))
             command_to_show: str = common_functions.hexify(command) if self.CBHex.isChecked() else command
             self.TxtBuffer.insertPlainText(command_to_show)
             if self.text_settings.scroll:
                 scroll = self.TxtBuffer.verticalScrollBar().maximum()
                 self.TxtBuffer.verticalScrollBar().setValue(scroll)
     return 0
예제 #4
0
    def set_question_ui(self):
        """
        sets ui of question (text and other question data)
        :return:
        """

        actual_category: questiondata.Category = self.state.category
        self.LblDscr.setText(
            "%s:\nВопрос № %i из %i. Стоимость %i " %
            (actual_category.name, self.state.question + 1,
             len(actual_category.questions),
             actual_category.questions[self.state.question].points))
        self.TxtQstn.setHtml(
            common_functions.get_question_text(
                actual_category.questions[self.state.question].description))
        self.LblAnswer.setText(
            actual_category.questions[self.state.question].answer)
        self.category_form.question = question_opened.QuestionDialog(
            actual_category, self.state.question, self.model, self.usbhost,
            self.state.commands_answered, self.Timer)
        self.category_form.question.question_signal[int].connect(
            self.cmd_button_pressed)
        self.state.answer_signal[bool].connect(
            self.category_form.question.answer_processed)
        if self.category_form.question.image:
            common_functions.resize_to_third(self.category_form.question)
            self.category_form.question.image.show()
        if self.category_form.question.media:
            if self.category_form.question.mediapath:
                self.BtnMusic.setEnabled(True)
                os.system(r"start %s" % self.category_form.question.mediapath)
            else:
                common_functions.error_message(
                    "Файла с медиаконтентом не существует или формат неверный")
        self.category_form.question.show()
예제 #5
0
 def create_macros_set(self) -> Optional[data_types.MacroSet]:
     """
     create new macros from data from fields and add it to all macroses
     :return: new macros
     """
     name = self.LineNameSet.text()
     if not name:
         common_functions.error_message("Macros Set Name is empty")
         return None
     new_macros_set = data_types.MacroSet(name=name, macros=list())
     for key in self.macros_dict.keys():
         new_macros_set.macros.append(
             data_types.Macro(name=self.macros_dict[key][0].text(),
                              command=self.macros_dict[key][1].text()))
     if name in [macro.name for macro in self.all_macros]:
         macros_used = data_types.get_macros_by_name(name, self.all_macros)
         if macros_used != new_macros_set:
             # reply = QtWidgets.QMessageBox.question(self, 'Message',
             #                                        'Macros set "%s" already exists. Overwrite?' % name,
             #                                        QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
             # if reply == QtWidgets.QMessageBox.Yes:
             ind = self.all_macros.index(macros_used)
             self.all_macros.pop(ind)
             self.all_macros.insert(ind, new_macros_set)
         return macros_used
     if name not in [macro.name for macro in self.all_macros]:
         self.all_macros.append(new_macros_set)
         self.CBMacros.addItem(name)
         self.CBMacros.setCurrentText(name)
     return new_macros_set
예제 #6
0
    def new_category(self):
        """

        :return:
        """
        if len(self.bets.bets) > 0:
            common_functions.error_message("Все незачтенные ставки сгорели!")
            self.bets.clear_bet()
        self.category_form.setVisible(True)
예제 #7
0
    def load_settings(self):
        """
        loads settings from file if any and overwrites default
        :return:
        """
        if os.path.exists("settings.json"):
            with open("settings.json") as f:
                try:
                    settings_json = json.load(f)
                    if 'COM settings' in settings_json.keys():
                        if 'baudrate' in settings_json['COM settings'].keys():
                            self.port_settings.baudrate = settings_json['COM settings']['baudrate']
                            if self.port_settings.baudrate not in data_types.baudrates:
                                self.CBBaudrate.addItem(str(self.port_settings.baudrate))
                            self.CBBaudrate.setCurrentText(str(self.port_settings.baudrate))
                        if 'stopbits' in settings_json['COM settings'].keys():
                            self.port_settings.stopbits = settings_json['COM settings']['stopbits']
                        if 'parity' in settings_json['COM settings'].keys():
                            self.port_settings.parity = data_types.Parity(settings_json['COM settings']['parity'])
                        if 'databits' in settings_json['COM settings'].keys():
                            self.port_settings.databits = settings_json['COM settings']['databits']
                    if 'Text settings' in settings_json.keys():
                        if 'CRLF' in settings_json['Text settings'].keys():
                            self.text_settings.CRLF = settings_json['Text settings']['CRLF']
                        if 'bytecodes' in settings_json['Text settings'].keys():
                            self.text_settings.bytecodes = settings_json['Text settings']['bytecodes']
                        if 'scroll' in settings_json['Text settings'].keys():
                            self.text_settings.scroll = settings_json['Text settings']['scroll']
                        if 'show sent' in settings_json['Text settings'].keys():
                            self.text_settings.show_sent = settings_json['Text settings']['show sent']
                        if 'timestamps' in settings_json['Text settings'].keys():
                            self.text_settings.timestamps = settings_json['Text settings']['timestamps']

                    if 'Colors' in settings_json.keys():
                        if 'background-color' in settings_json['Colors'].keys():
                            self.colors['background-color'] = tuple(settings_json['Colors']['background-color'])
                            self.back_color_changed()
                        if 'font-transmit' in settings_json['Colors'].keys():
                            self.colors['font-transmit'] = tuple(settings_json['Colors']['font-transmit'])
                        if 'font-receive' in settings_json['Colors'].keys():
                            self.colors['font-receive'] = tuple(settings_json['Colors']['font-receive'])
                        if 'bytes-color' in settings_json['Colors'].keys():
                            self.colors['bytes-color'] = tuple(settings_json['Colors']['bytes-color'])
                    if 'Font' in settings_json.keys():
                        font_family = settings_json['Font']['family'] if 'family' in settings_json['Font'].keys() \
                            else 'Consolas'
                        font_size = settings_json['Font']['size'] if 'size' in settings_json['Font'].keys() else 10
                        self.current_font = QtGui.QFont(font_family, font_size)
                        self.TxtBuffer.setFont(self.current_font)
                    if 'Macros set' in settings_json.keys():
                        self.current_macros = data_types.get_macros_by_name(settings_json['Macros set'],
                                                                            self.all_macros)
                        if self.current_macros:
                            self.port_settings.last_macros_set = settings_json['Macros set']
                            self.CBMacros.setCurrentText(self.port_settings.last_macros_set)
                except (json.JSONDecodeError, AttributeError, KeyError, ValueError):
                    common_functions.error_message("Settings file is incorrect, default settings used")
예제 #8
0
 def write_to_port(self, command) -> int:
     """
     writes command to port, checks for error
     :param command: command to write
     :return: 0 if OK, -1 if error
     """
     res = self.serial_port.write(command)
     self.serial_port.flush()
     if res != len(command):
         common_functions.error_message('Data was not sent correctly')
         return -1
     return 0
예제 #9
0
    def open_port(self):
        """
        opens serial port and change state to scanning

        :return:
        """
        answer = self.usbhost.send_command("RstTmr")
        if answer in common_functions.wrong_answers:
            common_functions.error_message(
                common_functions.answer_translate[answer])
            return
        self.scanning = True
예제 #10
0
 def update_plot_data(self, data_x: float, data_y: List[float]):
     """
     updates plot with new values
     :param data_x: new x data
     :param data_y: list with new y data
     :return:
     """
     self.data_x.append(data_x)
     for (i, y) in enumerate(data_y):
         try:
             self.data_y[i].append(y)
         except IndexError:
             common_functions.error_message('Too many items in data')
     for (i, line) in enumerate(self.data_lines):
         line.setData(self.data_x, self.data_y[i])
예제 #11
0
 def btn_select_pressed(self):
     """
     enables timer if any button pressed, button is remembered in self.testing variable
     :return:
     """
     error = self.usbhost.send_command("rsttmr")
     if error in common_functions.wrong_answers:
         common_functions.error_message(
             common_functions.answer_translate[error])
         return
     self.testing = self.sender()
     self.scanning = True
     self.retries = 0
     self.LblInstruction.setText("Ждем ответа кнопки")
     print("Successfully started timer")
예제 #12
0
 def menu_open_pressed(self):
     openfilename = QtWidgets.QFileDialog.getOpenFileName(
         self, 'Выберите игру', "")[0]
     if openfilename and openfilename.endswith(".xlsx"):
         self.game, error = questiondata.create_game(openfilename)
         if self.game:
             if error:
                 common_functions.error_message(error)
             self.state.set_game(self.game)
             self.category_form = category.CategoryForm(self.game)
             self.category_form.category_signal[str].connect(
                 self.category_selected)
             self.category_form.show()
     else:
         common_functions.error_message(
             'Файл не выбран или формат неверный (выберите .xlxs файл')
예제 #13
0
 def baudrate_changed(self):
     """
     change baudrate in settings
     :return:
     """
     if self.CBBaudrate.currentText() != 'Custom':
         self.port_settings.baudrate = int(self.CBBaudrate.currentText())
     else:
         # noinspection PyCallByClass,PyArgumentList
         text, ok = QtWidgets.QInputDialog.getText(self, 'Custom baudrate', 'Enter baudrate')
         if ok:
             try:
                 new_baudrate: Optional[int] = int(text)
             except ValueError:
                 new_baudrate = None
             if not new_baudrate or new_baudrate <= 0:
                 common_functions.error_message("Baudrate must be positive number")
             else:
                 self.port_settings.baudrate = new_baudrate
예제 #14
0
 def icon_clicked(self):
     """
     selects icon for current macros.
     :return:
     """
     sender = self.sender()
     icon_filename = QtWidgets.QFileDialog.getOpenFileName(
         self, 'Select icon...', "")[0]
     if icon_filename and os.path.splitext(
             icon_filename.lower())[1] in data_types.icon_exts:
         index = self.btn_icon_list.index(sender)
         icon = QtGui.QIcon()
         icon.addFile(icon_filename)
         self.btn_send_list[index].setIcon(icon)
         self.current_macros.macros[index].icon_path = icon_filename
         self.current_icon_paths[index] = icon_filename
         self.save()
     elif icon_filename:
         common_functions.error_message("Wrong icon format")
예제 #15
0
 def load_settings(self, filename='settings.json'):
     """
     loads settings from file if any and overwrites default
     :return:
     """
     if os.path.exists(filename):
         with open(filename) as f:
             try:
                 settings_json = json.load(f)
                 self.load_port_settings(settings_json)
                 self.load_text_settings(settings_json)
                 self.load_filter_settings(settings_json)
                 self.load_crc_settings(settings_json)
                 self.load_style_settings(settings_json)
                 self.load_macros_settings(settings_json)
             except (json.JSONDecodeError, AttributeError, KeyError,
                     ValueError):
                 common_functions.error_message(
                     "Settings file is incorrect, default settings used")
예제 #16
0
 def send_file(self):
     """
     sends selected file data to serial port
     :return:
     """
     if self.port_settings.name and self.file_to_send:
         if os.path.exists(self.file_to_send) and not os.path.isdir(
                 self.file_to_send):
             with open(self.file_to_send, "rb") as f:
                 data = f.read()
                 res = self.write_data(data, False, False, False)
                 if res != -1:
                     # error = QtWidgets.QMessageBox()
                     # error.setIcon(QtWidgets.QMessageBox.Information)
                     # error.setText("File transmitted")
                     # error.setWindowTitle('Success')
                     # error.setStandardButtons(QtWidgets.QMessageBox.Ok)
                     # error.exec_()
                     self.statusbar.showMessage("File sent")
     else:
         common_functions.error_message("Check file or port")
예제 #17
0
 def timerEvent(self):
     """
     if timer as active, try to get button pressed
     :return:
     """
     if self.scanning:
         print('scan')
         caption = self.LblInstruction.text() + "."
         self.LblInstruction.setText(caption)
         self.retries += 1
         button: int = common_functions.get_first_button(
             self.usbhost, "idle", list())
         if button:
             self.CBlist[self.btnlist.index(self.testing)].setCurrentText(
                 "Кнопка %i" % button)
             self.state_not_scanning()
         if self.retries > retry_number:
             common_functions.error_message(
                 "Ни одна кнопка не нажата в течение 10 секунд, попробуйте еще раз"
             )
             self.state_not_scanning()
예제 #18
0
 def load(self):
     """
     loads variable data from variables.json
     :return:
     """
     if os.path.exists("variables.json"):
         with open("variables.json") as f:
             try:
                 var_data = json.load(f)
                 if 'Variables' in var_data.keys() and isinstance(
                         var_data['Variables'], dict):
                     for key in var_data['Variables'].keys():
                         self.var_dict[key] = var_data['Variables'][key]
                         self.ListVariables.addItem(
                             "$%s = %s" % (key, var_data['Variables'][key]))
                 if 'Range' in var_data.keys() and isinstance(
                         var_data['Range'], dict):
                     range_data = var_data['Range']
                     try:
                         if 'name' in range_data.keys():
                             self.LineVarName.setText(range_data['name'])
                         if 'min_value' in range_data.keys():
                             self.SpinMin.setValue(range_data['min_value'])
                         if 'max_value' in range_data.keys():
                             self.SpinMax.setValue(range_data['max_value'])
                         if 'step' in range_data.keys():
                             self.SpinStep.setValue(range_data['step'])
                         if 'is_autosend' in range_data.keys():
                             self.CBAuto.setChecked(
                                 range_data['is_autosend'])
                         if 'command' in range_data.keys():
                             self.LineCommand.setText(range_data['command'])
                         self.value_changed()
                     except (AttributeError, ValueError):
                         common_functions.error_message(
                             'Cannot load saved variables')
             except json.JSONDecodeError:
                 common_functions.error_message(
                     "Cannot load saved variables")