diff --git a/design_viewer_v1.ui b/design_viewer_v1.ui index b7c36f0..c99fdc0 100644 --- a/design_viewer_v1.ui +++ b/design_viewer_v1.ui @@ -277,7 +277,7 @@ - 1 + 3 @@ -2038,6 +2038,132 @@ + + + + 20 + 460 + 231 + 22 + + + + QFrame::NoFrame + + + Длительность поиска события после Vp, мс + + + Qt::AlignCenter + + + + + + 10 + 490 + 181 + 22 + + + + QFrame::NoFrame + + + Время слепоты после Vp, мс + + + Qt::AlignCenter + + + + + + 0 + 520 + 221 + 22 + + + + QFrame::NoFrame + + + Амплитуда сигнала после Vp, мВ + + + Qt::AlignCenter + + + + + + 270 + 460 + 61 + 21 + + + + 500 + + + 2000 + + + 100 + + + 500 + + + + + + 270 + 490 + 61 + 21 + + + + 100 + + + 500 + + + 50 + + + 100 + + + + + + 270 + 520 + 61 + 21 + + + + 1 + + + 0.500000000000000 + + + 15.000000000000000 + + + 0.500000000000000 + + + 2.000000000000000 + + @@ -2507,7 +2633,7 @@ 100 - 10000 + 5000 100 @@ -3015,7 +3141,7 @@ 0.100000000000000 - 2.000000000000000 + 3.000000000000000 @@ -3043,6 +3169,45 @@ 6.000000000000000 + + + + 90 + 80 + 31 + 17 + + + + + + + + + + 310 + 80 + 31 + 17 + + + + + + + + + + 470 + 80 + 31 + 17 + + + + + + level High_Tf_spinBox High_Tt2_spinBox @@ -3092,6 +3257,9 @@ t1_hv_phase_1_duration_SpinBox t2_hv_switch_duration_SpinBox t3_hv_phase_2_duration_SpinBox + High_Tf_checkBox + High_Tt2_checkBox + High_Tt1_checkBox @@ -3355,7 +3523,7 @@ 0 360 491 - 131 + 181 @@ -3428,7 +3596,7 @@ - 10 + 20 60 101 22 @@ -3469,7 +3637,7 @@ - 190 + 270 90 81 21 @@ -3493,17 +3661,55 @@ 10 90 - 181 + 241 21 - T следования импульсов, мс + Начальный T следования импульсов, мс Qt::AlignCenter + + + + 10 + 120 + 241 + 21 + + + + Конечный T следования импульсов, мс + + + Qt::AlignCenter + + + + + + 270 + 120 + 81 + 21 + + + + 150 + + + 500 + + + 10 + + + 250 + + diff --git a/project/controller.py b/project/controller.py index f588303..b4c7db3 100644 --- a/project/controller.py +++ b/project/controller.py @@ -211,21 +211,26 @@ class DataClass: self.Vs_cnt = 0 # счетчик Vs self.sub_mode = 0 # текущий подрежим терапии self.terapy_now = 0 # текущий режим терапии - self.burst_period = 0 # период следования импульсов при НВ стимуляции - self.burst_voltage = 0 # напряжение импульсов при НВ стимуляции - self.burst_cnt = 0 # количество импульсов в пачке при НВ стимуляции - self.lv_relax_time = 0 # время стабилизации после НВ стимуляции - self.lv_shock_time = 0 # время импульса НВ стимуляции - self.hv_polarity = 0 # полярность - self.hv_mode = 0 # режим высоковольтной стимуляции - self.hv_phase_1_duration = 0 # время положительной полуволны - self.hv_switch_duration = 0 # время задержки - self.hv_phase_2_duration = 0 # время отрицательной полуволны - self.hv_switching_voltage = 0 # процент от максимального напряжения для смены полярности - self.hv_cutoff_voltage = 0 # процент от максимального напряжения для окончания стимуляции - self.lv_voltage = 0 # напряжение НВ стимуляции - self.lv_mode = 0 # режим низковольтной стимуляции - self.lv_polarity = 0 # полярность для НВ + self.burst_period = 0 # период следования импульсов при НВ стимуляции + self.burst_end_period = 0 # конечный период следования импульсов при НВ стимуляции + self.burst_voltage = 0 # напряжение импульсов при НВ стимуляции + self.burst_cnt = 0 # количество импульсов в пачке при НВ стимуляции + self.lv_relax_time = 0 # время стабилизации после НВ стимуляции + self.lv_shock_time = 0 # время импульса НВ стимуляции + self.hv_polarity = 0 # полярность + self.hv_mode = 0 # режим высоковольтной стимуляции + self.hv_phase_1_duration = 0 # время положительной полуволны + self.hv_switch_duration = 0 # время задержки + self.hv_phase_2_duration = 0 # время отрицательной полуволны + self.hv_switching_voltage = 0 # процент от максимального напряжения для смены полярности + self.hv_cutoff_voltage = 0 # процент от максимального напряжения для окончания стимуляции + self.lv_voltage = 0 # напряжение НВ стимуляции + self.lv_mode = 0 # режим низковольтной стимуляции + self.lv_polarity = 0 # полярность для НВ + self.Psense_period = 0 # длительность поиска события после Vp + self.post_pace_block_period = 0 # время слепоты после Vp + self.post_pace_amplitude = 0 # амплитуда сигнала после Vp + def clear_data(self): """ @@ -505,10 +510,13 @@ class DataClass: if self.counter[self.draw_cnt] % 12 == 11: int1 = int.from_bytes(self.data_rx[self.pac_count + 23], "big") - self.hv_polarity = (int1 & 0xF0) >> 4 - self.hv_mode = int1 & 0xF + self.hv_polarity = (int1 & 0xC) >> 2 + self.hv_mode = int1 & 0x3 self.hv_phase_1_duration = int.from_bytes(self.data_rx[self.pac_count + 24], "big") self.hv_switch_duration = int.from_bytes(self.data_rx[self.pac_count + 26], "big") self.hv_phase_2_duration = int.from_bytes(self.data_rx[self.pac_count + 25], "big") self.hv_switching_voltage = int.from_bytes(self.data_rx[self.pac_count + 27], "big") self.hv_cutoff_voltage = int.from_bytes(self.data_rx[self.pac_count + 28], "big") + self.burst_end_period = ( + shift_or_16(int.from_bytes(self.data_rx[self.pac_count + 29], "big", signed=False), + int.from_bytes(self.data_rx[self.pac_count + 30], "big", signed=False))) diff --git a/project/view.py b/project/view.py index c7a9b25..a9e9703 100644 --- a/project/view.py +++ b/project/view.py @@ -90,6 +90,11 @@ class Ui(QtWidgets.QMainWindow): self.RA_square_time_ms_BOX.editTextChanged.connect(self.set_RA_square_time_ms_BOX) self.RA_square_coeff_BOX.editTextChanged.connect(self.set_RA_square_coeff_BOX) self.RA_all_time_ms_BOX.editTextChanged.connect(self.set_RA_all_time_ms_BOX) + self.Psense_period_spinBox.valueChanged.connect(self.set_Psense_period_spinBox) + self.Post_pace_block_period_spinBox.valueChanged.connect(self.set_Post_pace_block_period_spinBox) + self.Post_pace_amplitude_SpinBox.valueChanged.connect(self.set_Post_pace_amplitude_SpinBox) + + self.Signal_Box.currentIndexChanged.connect(self.set_Signal_Box) self.Channel_Box.currentIndexChanged.connect(self.set_Channel_Box) self.DC_cut_Box.currentIndexChanged.connect(self.set_DC_cut_Box) @@ -123,11 +128,14 @@ class Ui(QtWidgets.QMainWindow): self.burst_cnt_spinBox.valueChanged.connect(self.set_burst_cnt_spinBox) self.burst_voltage_SpinBox.valueChanged.connect(self.set_burst_voltage_SpinBox) self.burst_period_spinBox.valueChanged.connect(self.set_burst_period_spinBox) - self.u1_hv_switching_voltage_l.setVisible(False) - self.u2_hv_cutoff_voltage_l.setVisible(False) - self.u1_hv_switching_voltage_spinBox.setVisible(False) - self.u2_hv_cutoff_voltage_spinBox.setVisible(False) - self.burst_frame.setVisible(False) + self.burst_end_period_spinBox.valueChanged.connect(self.set_burst_end_period_spinBox) + self.u1_hv_switching_voltage_l.setVisible(True) + self.u2_hv_cutoff_voltage_l.setVisible(True) + self.u1_hv_switching_voltage_spinBox.setVisible(True) + self.u2_hv_cutoff_voltage_spinBox.setVisible(True) + self.burst_frame.setVisible(True) + self.HV_Box.currentIndexChanged.connect(self.set_HV_Box) + self.LV_Box.currentIndexChanged.connect(self.set_LV_Box) set_up_controls() @@ -148,6 +156,10 @@ class Ui(QtWidgets.QMainWindow): self.timer_LS.timeout.connect(self.timerEvent_param) self.timer_LS.start(2000) + # Создание таймера для отображения зарядки конденсатора + self.timer_charge = QtCore.QTimer() + self.timer_charge.timeout.connect(self.timerEvent_charge) + def write_file(self): """ Открытие на запись файла @@ -180,6 +192,20 @@ class Ui(QtWidgets.QMainWindow): # отрисовка app.processEvents() + def timerEvent_charge(self): + if MODE_COM_PORT: + self.draw_charge(data_IN_COM) + if MODE_FILE: + self.draw_charge(data_IN_FILE) + app.processEvents() + + def draw_charge(self, data_in): + self.text = pg.TextItem('*') + self.text.setColor('red') + self.text.setFont(QFont('Arial', 20)) + self.text.setPos(data_in.draw_cnt / my_data.DATA_RATE, (0.05 if data_in.dc_cut else 16)) + self.graph_1.addItem(self.text) + def synchronise_param(self, data_in): """Синхронизация параметров стимулятора""" self.SD_card_Box.setCurrentIndex(int(data_in.sd_card)) @@ -205,21 +231,27 @@ class Ui(QtWidgets.QMainWindow): self.redet_bad_spinBox.setValue(data_in.redet_bad) self.Work_Mode_pacemaker.setCurrentIndex(data_in.Work_Mode_pacemaker) self.Spi_spot_set_spinBox.setValue(data_in.spi_pot_set) - self.hv_polarity_BOX.setValue(data_in.hv_polarity) - self.hv_mode_BOX.setValue(data_in.hv_mode) + self.hv_polarity_BOX.setCurrentIndex(data_in.hv_polarity) + self.hv_mode_BOX.setCurrentIndex(data_in.hv_mode) self.t1_hv_phase_1_duration_SpinBox.setValue(data_in.hv_phase_1_duration / 10.0) self.t3_hv_phase_2_duration_SpinBox.setValue(data_in.hv_phase_2_duration / 10.0) self.t2_hv_switch_duration_SpinBox.setValue(data_in.hv_switch_duration / 10.0) self.u1_hv_switching_voltage_spinBox.setValue(data_in.hv_switching_voltage) self.u2_hv_cutoff_voltage_spinBox.setValue(data_in.hv_cutoff_voltage) - self.lv_polarity_BOX.setValue(data_in.lv_polarity) - self.lv_mode_BOX.setValue(data_in.lv_mode) - self.t1_lv_shock_time_SpinBox().setValue(data_in.lv_shock_time / 10.0) - self.t2_lv_relax_time_spinBox().setValue(data_in.lv_relax_time) - self.u_lv_voltage_SpinBox().setValue(data_in.lv_voltage / 10.0) + self.lv_polarity_BOX.setCurrentIndex(data_in.lv_polarity) + self.lv_mode_BOX.setCurrentIndex(data_in.lv_mode) + self.t1_lv_shock_time_SpinBox.setValue(data_in.lv_shock_time / 10.0) + self.t2_lv_relax_time_spinBox.setValue(data_in.lv_relax_time) + self.u_lv_voltage_SpinBox.setValue(data_in.lv_voltage / 10.0) self.burst_cnt_spinBox.setValue(data_in.burst_cnt) self.burst_voltage_SpinBox.setValue(data_in.burst_voltage / 10.0) - self.burst_period.setValue(data_in.burst_period) + self.burst_period_spinBox.setValue(data_in.burst_period) + self.burst_end_period_spinBox.setValue(data_in.burst_end_period) + self.Psense_period_spinBox.setValue(data_in.Psense_period) + self.Post_pace_block_period_spinBox.setValue(data_in.post_pace_block_period) + self.Post_pace_amplitude_SpinBox.setValue(data_in.post_pace_amplitude) + self.HV_Box.setCurrentIndex(int(data_in.hv)) + self.LV_Box.setCurrentIndex(int(data_in.lv)) def timerEvent(self): @@ -362,6 +394,7 @@ class Ui(QtWidgets.QMainWindow): if data_in.sub_mode == 0: self.sub_modeB.setStyleSheet('background-color: green; color: white') self.sub_modeB.setText("Терапия неактивна") + if data_in.sub_mode == 1: self.sub_modeB.setStyleSheet('background-color: blue; color: white') self.sub_modeB.setText("Зарядка конденсатора") @@ -380,8 +413,13 @@ class Ui(QtWidgets.QMainWindow): # Вывод времени зарядки конденсатора if data_in.sub_mode == 1 and self.sub_mode_previous != 1: self.start_time_charging = time.time() + self.U_cap_max = 0 + self.timer_charge.start(100) if data_in.sub_mode == 1 and self.sub_mode_previous == 1: self.end_time_charging = time.time() + if data_in.sub_mode != 1 and self.sub_mode_previous == 1: + self.timer_charge.stop() + self.sub_mode_previous = data_in.sub_mode self.charge_timer_label.setText(f"{(self.end_time_charging - self.start_time_charging):.2f}") @@ -406,6 +444,11 @@ class Ui(QtWidgets.QMainWindow): self.text.setColor('red') self.text.setPos(data_in.draw_cnt_last / my_data.DATA_RATE, (0 if data_in.dc_cut else 15)) self.graph_1.addItem(self.text) + if data_in.draw_last_QRS == 2: + self.text = pg.TextItem('Vn\nT:' + str(data_in.draw_last_period)) + self.text.setColor('blue') + self.text.setPos(data_in.draw_cnt_last / my_data.DATA_RATE, (0 if data_in.dc_cut else 15)) + self.graph_1.addItem(self.text) def on_stop(self): self.close_file() @@ -729,17 +772,9 @@ class Ui(QtWidgets.QMainWindow): case 0: self.picture_4.setVisible(True) self.picture_5.setVisible(False) - self.u1_hv_switching_voltage_l.setVisible(False) - self.u2_hv_cutoff_voltage_l.setVisible(False) - self.u1_hv_switching_voltage_spinBox.setVisible(False) - self.u2_hv_cutoff_voltage_spinBox.setVisible(False) case 1: self.picture_5.setVisible(True) self.picture_4.setVisible(False) - self.u1_hv_switching_voltage_l.setVisible(True) - self.u2_hv_cutoff_voltage_l.setVisible(True) - self.u1_hv_switching_voltage_spinBox.setVisible(True) - self.u2_hv_cutoff_voltage_spinBox.setVisible(True) my_data.state_packet(self.send_mode, self.serial, 0x31, param, 1, int) def set_t1_hv_phase_1_duration_SpinBox(self): @@ -770,11 +805,6 @@ class Ui(QtWidgets.QMainWindow): def set_lv_mode_BOX(self): """Выбор режима низковольтной стимуляции""" param = self.lv_mode_BOX.currentIndex() - match param: - case 3: - self.burst_frame.setVisible(True) - case _: - self.burst_frame.setVisible(False) my_data.state_packet(self.send_mode, self.serial, 0x23, param, 1, int) @@ -794,7 +824,7 @@ class Ui(QtWidgets.QMainWindow): my_data.state_packet(self.send_mode, self.serial, 0x24, param, 1, int) def set_t2_lv_relax_time_spinBox(self): """Выбор времени стабилизации после НВ стимуляции""" - param = int(self.t2_lv_relax_time_spinBox.value() * 10) + param = int(self.t2_lv_relax_time_spinBox.value()) my_data.state_packet(self.send_mode, self.serial, 0x25, param, 1, int) def set_burst_cnt_spinBox(self): """Выбор количества импульсов в пачке при НВ стимуляции""" @@ -807,4 +837,34 @@ class Ui(QtWidgets.QMainWindow): def set_burst_period_spinBox(self): """Выбор периода следования импульсов при НВ стимуляции""" param = self.burst_period_spinBox.value() - my_data.state_packet(self.send_mode, self.serial, 0x29, param, 2, int) \ No newline at end of file + my_data.state_packet(self.send_mode, self.serial, 0x29, param, 2, int) + def set_burst_end_period_spinBox(self): + """Выбор периода следования импульсов при НВ стимуляции""" + param = self.burst_end_period_spinBox.value() + my_data.state_packet(self.send_mode, self.serial, 0x37, param, 2, int) + def set_Psense_period_spinBox(self): + """Выбор длительность поиска события после Vp, мс""" + param = int(self.Psense_period_spinBox.value()) + my_data.state_packet(self.send_mode, self.serial, 0x00, param, 2, int) + + def set_Post_pace_block_period_spinBox(self): + """Выбор времени слепоты после Vp, мс """ + param = int(self.Post_pace_block_period_spinBox.value()) + my_data.state_packet(self.send_mode, self.serial, 0x00, param, 2, int) + + def set_Post_pace_amplitude_SpinBox(self): + """Выбор амплитуды сигнала после Vp, мВ""" + param = int(self.Post_pace_amplitude_SpinBox.value()) + my_data.state_packet(self.send_mode, self.serial, 0x00, param, 1, int) + + def set_HV_Box(self): + """Настройка активации режима высоковольтной стимуляции""" + param = int(self.HV_Box.currentIndex()) + my_data.state_packet(self.send_mode, self.serial, 0x0F, param, 1, int) + + def set_LV_Box(self): + """Настройка активации режима низковольтной стимуляции""" + param = int(self.LV_Box.currentIndex()) + my_data.state_packet(self.send_mode, self.serial, 0x0E, param, 1, int) + + diff --git a/viewer.exe b/viewer.exe index 5d3d4cf..727f24b 100644 Binary files a/viewer.exe and b/viewer.exe differ