|
|
|
|
@ -30,10 +30,14 @@ class WaveformPage(BasePage):
|
|
|
|
|
self.sample_duration = 2.0
|
|
|
|
|
self.time_axis = np.linspace(0, self.sample_duration, self.sample_points)
|
|
|
|
|
|
|
|
|
|
# 量程选项
|
|
|
|
|
self.range_options = [200, 500, 1000, 2000]
|
|
|
|
|
self.current_range = 1000 # 默认1000mV
|
|
|
|
|
|
|
|
|
|
# 纵轴配置
|
|
|
|
|
self.y_min = -1000
|
|
|
|
|
self.y_max = 1000
|
|
|
|
|
self.y_precision = 200
|
|
|
|
|
self.y_min = -self.current_range
|
|
|
|
|
self.y_max = self.current_range
|
|
|
|
|
self.y_precision = self.current_range // 5 # 每大格为量程的1/5
|
|
|
|
|
|
|
|
|
|
# 通道配置
|
|
|
|
|
self.channels = list(range(1, 9))
|
|
|
|
|
@ -43,6 +47,9 @@ class WaveformPage(BasePage):
|
|
|
|
|
self.selected_channel = tk.IntVar(value=1) # 默认选择通道1
|
|
|
|
|
self.previous_channel = 1 # 记录上一个通道
|
|
|
|
|
|
|
|
|
|
# 量程选择
|
|
|
|
|
self.selected_range = tk.StringVar(value="1000mV") # 默认选择1000mV
|
|
|
|
|
|
|
|
|
|
# 波形开启开关
|
|
|
|
|
self.wave_enabled = False
|
|
|
|
|
|
|
|
|
|
@ -61,9 +68,13 @@ class WaveformPage(BasePage):
|
|
|
|
|
control_frame = ttk.LabelFrame(main_frame, text="控制面板", padding=10)
|
|
|
|
|
control_frame.pack(fill=tk.X, pady=5)
|
|
|
|
|
|
|
|
|
|
# 第一行:通道选择和量程选择
|
|
|
|
|
top_frame = ttk.Frame(control_frame)
|
|
|
|
|
top_frame.pack(fill=tk.X, pady=5)
|
|
|
|
|
|
|
|
|
|
# 通道选择
|
|
|
|
|
channel_frame = ttk.Frame(control_frame)
|
|
|
|
|
channel_frame.pack(fill=tk.X, pady=5)
|
|
|
|
|
channel_frame = ttk.Frame(top_frame)
|
|
|
|
|
channel_frame.pack(side=tk.LEFT, padx=(0, 20))
|
|
|
|
|
|
|
|
|
|
ttk.Label(channel_frame, text="通道选择:").pack(side=tk.LEFT, padx=(0, 10))
|
|
|
|
|
|
|
|
|
|
@ -78,11 +89,28 @@ class WaveformPage(BasePage):
|
|
|
|
|
# 绑定选择事件
|
|
|
|
|
channel_combo.bind('<<ComboboxSelected>>', self.on_channel_selected)
|
|
|
|
|
|
|
|
|
|
# 量程选择
|
|
|
|
|
range_frame = ttk.Frame(top_frame)
|
|
|
|
|
range_frame.pack(side=tk.LEFT)
|
|
|
|
|
|
|
|
|
|
ttk.Label(range_frame, text="量程选择:").pack(side=tk.LEFT, padx=(0, 10))
|
|
|
|
|
|
|
|
|
|
# 创建量程选择下拉框
|
|
|
|
|
range_combo = ttk.Combobox(range_frame,
|
|
|
|
|
textvariable=self.selected_range,
|
|
|
|
|
values=["200mV", "500mV", "1000mV", "2000mV"],
|
|
|
|
|
state="readonly",
|
|
|
|
|
width=10)
|
|
|
|
|
range_combo.pack(side=tk.LEFT, padx=5)
|
|
|
|
|
|
|
|
|
|
# 绑定量程选择事件
|
|
|
|
|
range_combo.bind('<<ComboboxSelected>>', self.on_range_selected)
|
|
|
|
|
|
|
|
|
|
# 通道信息显示
|
|
|
|
|
self.channel_info_var = tk.StringVar(value="当前通道: 1")
|
|
|
|
|
ttk.Label(channel_frame, textvariable=self.channel_info_var).pack(side=tk.LEFT, padx=(20, 0))
|
|
|
|
|
ttk.Label(top_frame, textvariable=self.channel_info_var).pack(side=tk.RIGHT, padx=(20, 0))
|
|
|
|
|
|
|
|
|
|
# 控制按钮
|
|
|
|
|
# 第二行:控制按钮
|
|
|
|
|
button_frame = ttk.Frame(control_frame)
|
|
|
|
|
button_frame.pack(fill=tk.X, pady=5)
|
|
|
|
|
|
|
|
|
|
@ -103,6 +131,43 @@ class WaveformPage(BasePage):
|
|
|
|
|
self.setup_plot(plot_frame)
|
|
|
|
|
self.setup_udp()
|
|
|
|
|
|
|
|
|
|
def on_range_selected(self, event=None):
|
|
|
|
|
"""量程选择变化时的回调函数"""
|
|
|
|
|
range_str = self.selected_range.get()
|
|
|
|
|
# 从字符串中提取数字部分
|
|
|
|
|
new_range = int(range_str.replace("mV", ""))
|
|
|
|
|
|
|
|
|
|
if new_range != self.current_range:
|
|
|
|
|
print(f"切换量程: {self.current_range}mV -> {new_range}mV")
|
|
|
|
|
self.current_range = new_range
|
|
|
|
|
|
|
|
|
|
# 更新纵轴配置
|
|
|
|
|
self.y_min = -self.current_range
|
|
|
|
|
self.y_max = self.current_range
|
|
|
|
|
self.y_precision = self.current_range // 5 # 每大格为量程的1/5
|
|
|
|
|
|
|
|
|
|
# 更新坐标轴显示
|
|
|
|
|
self.update_plot_scale()
|
|
|
|
|
|
|
|
|
|
# 更新状态显示
|
|
|
|
|
self.status_var.set(f"量程已切换到 {new_range}mV")
|
|
|
|
|
|
|
|
|
|
def update_plot_scale(self):
|
|
|
|
|
"""更新坐标轴刻度"""
|
|
|
|
|
if hasattr(self, 'ax'):
|
|
|
|
|
# 更新纵轴范围
|
|
|
|
|
self.ax.set_ylim(self.y_min, self.y_max)
|
|
|
|
|
|
|
|
|
|
# 更新纵轴刻度
|
|
|
|
|
y_major_ticks = np.arange(self.y_min, self.y_max + 1, self.y_precision)
|
|
|
|
|
y_minor_ticks = np.arange(self.y_min, self.y_max + 1, self.y_precision // 4) # 每小格为量程的1/20
|
|
|
|
|
|
|
|
|
|
self.ax.set_yticks(y_major_ticks)
|
|
|
|
|
self.ax.set_yticks(y_minor_ticks, minor=True)
|
|
|
|
|
|
|
|
|
|
# 重绘画布
|
|
|
|
|
self.canvas.draw_idle()
|
|
|
|
|
|
|
|
|
|
def on_channel_selected(self, event=None):
|
|
|
|
|
"""通道选择变化时的回调函数"""
|
|
|
|
|
new_channel = self.selected_channel.get()
|
|
|
|
|
@ -142,7 +207,7 @@ class WaveformPage(BasePage):
|
|
|
|
|
|
|
|
|
|
# 设置坐标轴标签
|
|
|
|
|
self.ax.set_xlabel('Time (us)')
|
|
|
|
|
self.ax.set_ylabel('Amplitude(mV)')
|
|
|
|
|
self.ax.set_ylabel('Amplitude (mV)')
|
|
|
|
|
self.ax.set_title('Real-time Waveform Display')
|
|
|
|
|
|
|
|
|
|
# 设置坐标轴范围
|
|
|
|
|
@ -156,8 +221,8 @@ class WaveformPage(BasePage):
|
|
|
|
|
x_minor_ticks = np.arange(0, self.sample_duration + 0.05, 0.05)
|
|
|
|
|
|
|
|
|
|
# 纵轴刻度
|
|
|
|
|
y_major_ticks = np.arange(self.y_min, self.y_max + 1, self.y_precision) # 每10mV主刻度
|
|
|
|
|
y_minor_ticks = np.arange(self.y_min, self.y_max + 1, 50) # 每2mV次刻度
|
|
|
|
|
y_major_ticks = np.arange(self.y_min, self.y_max + 1, self.y_precision)
|
|
|
|
|
y_minor_ticks = np.arange(self.y_min, self.y_max + 1, self.y_precision // 4) # 每小格为量程的1/20
|
|
|
|
|
|
|
|
|
|
self.ax.set_xticks(x_major_ticks)
|
|
|
|
|
self.ax.set_xticks(x_minor_ticks, minor=True)
|
|
|
|
|
@ -167,7 +232,7 @@ class WaveformPage(BasePage):
|
|
|
|
|
# 设置网格线
|
|
|
|
|
# 主网格线:0.1us间隔,颜色较深
|
|
|
|
|
self.ax.grid(True, which='major', alpha=0.4, linestyle='-', linewidth=0.8)
|
|
|
|
|
# 次网格线:0.05us间隔和2mV间隔,颜色较浅
|
|
|
|
|
# 次网格线:0.05us间隔和纵轴小刻度间隔,颜色较浅
|
|
|
|
|
self.ax.grid(True, which='minor', alpha=0.2, linestyle='--', linewidth=0.5)
|
|
|
|
|
|
|
|
|
|
# 创建画布
|
|
|
|
|
@ -184,6 +249,7 @@ class WaveformPage(BasePage):
|
|
|
|
|
# 添加图例
|
|
|
|
|
self.ax.legend(loc='upper right')
|
|
|
|
|
|
|
|
|
|
# 其他方法保持不变...
|
|
|
|
|
def setup_udp(self):
|
|
|
|
|
"""设置UDP socket"""
|
|
|
|
|
try:
|
|
|
|
|
@ -438,7 +504,7 @@ class WaveformPage(BasePage):
|
|
|
|
|
self.show_info("波形地址设置成功")
|
|
|
|
|
self.start_udp()
|
|
|
|
|
else:
|
|
|
|
|
elf.show_info("波形地址设置成功")
|
|
|
|
|
self.show_info("波形地址设置成功")
|
|
|
|
|
self.stop_udp()
|
|
|
|
|
|
|
|
|
|
def ip_to_int(self, ip):
|
|
|
|
|
|