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