From 295894a84389bd511e9c46de0fee3d6bcc14a465 Mon Sep 17 00:00:00 2001 From: gitea Date: Fri, 21 Jun 2024 16:53:13 +0800 Subject: [PATCH] =?UTF-8?q?2024-06-12=204.=20[openapi.py]=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20int.to=5Fbytes=20=E5=92=8C=20int.from=5Fbytes=20?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=20binascii=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=205.=20[aio.py]=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=86Data=20Process=E4=B8=AD=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E5=8A=A8=E4=BD=9C=EF=BC=8C=E4=BD=BF=E5=BE=97=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E6=97=B6=E7=9A=84=E7=8A=B6=E6=80=81=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E6=88=90=E7=A8=8B=E5=BA=8F=E5=88=9A=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E6=A0=B7=E5=AD=90=206.=20[aio.py]=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86tabview=E7=9A=84=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E8=A1=8C=E4=B8=BA=E5=87=BD=E6=95=B0=EF=BC=8C=E6=AF=8F=E6=AC=A1?= =?UTF-8?q?=E7=82=B9=E5=87=BBtab=E9=83=BD=E4=BC=9A=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=207.=20[aio.py]=20=E5=A2=9E=E5=8A=A0=E4=BA=86Automati?= =?UTF-8?q?c=20Test=E7=95=8C=E9=9D=A2=E5=85=83=E7=B4=A0=EF=BC=8C=E5=8C=85?= =?UTF-8?q?=E6=8B=AC=E5=A6=82=E4=B8=8B=EF=BC=8C=E5=B9=B6=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E4=BA=86=E5=8A=9F=E8=83=BD=E6=A1=86=E6=9E=B6=E7=9A=84=E6=90=AD?= =?UTF-8?q?=E5=BB=BA=20-=20=E6=A0=87=E7=AD=BE=EF=BC=9A=E6=96=87=E4=BB=B6/?= =?UTF-8?q?=E8=A7=92=E9=80=9F=E5=BA=A6/=E5=87=8F=E9=80=9F=E6=AF=94=20-=20?= =?UTF-8?q?=E6=8C=89=E9=92=AE=EF=BC=9A=E6=80=A5=E5=81=9C=E5=8F=8A=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=20-=20=E8=BE=93=E5=85=A5=E6=A1=86=EF=BC=9A=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=B7=AF=E5=BE=84/=E8=A7=92=E9=80=9F=E5=BA=A6/?= =?UTF-8?q?=E5=87=8F=E9=80=9F=E6=AF=94=20-=20OptionMenu=EF=BC=9A=E8=B4=9F?= =?UTF-8?q?=E8=BD=BD=20-=20=E8=BF=9B=E5=BA=A6=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/README.md | 8 + aio/assets/layout.xlsx | Bin 1224438 -> 1224510 bytes aio/code/aio.py | 440 ++++++++++++++++++----------- aio/code/automatic_test/openapi.py | 2 - 4 files changed, 288 insertions(+), 162 deletions(-) diff --git a/aio/README.md b/aio/README.md index 335924f..79b4cac 100644 --- a/aio/README.md +++ b/aio/README.md @@ -251,6 +251,14 @@ v0.1.7.0(2024/06/29) 2. [openapi.py] 修改了封包的规则,使之更加明晰,封包操作没有实现分包功能,目前看实际场景用不到 3. [openapi.py] 定义 MAX_FRAME_SIZE 常量(1024),替换socket接收以及响应数据处理相关部分 4. [openapi.py] 使用 int.to_bytes 和 int.from_bytes 替换 binascii 模块的功能 +5. [aio.py] 修改了Data Process中初始化的动作,使得初始化时的状态统一成程序刚启动时的样子 +6. [aio.py] 增加了tabview的点击行为函数,每次点击tab都会初始化 +7. [aio.py] 增加了Automatic Test界面元素,包括如下,并完成了功能框架的搭建 +- 标签:文件/角速度/减速比 +- 按钮:急停及恢复 +- 输入框:文件路径/角速度/减速比 +- OptionMenu:负载 +- 进度条 > **关于HMI接口** > - 封包解包顺序:帧长度二字节/包长度四字节/协议二字节/预留二字节,\x04\x00:\x00\x00\tR:\x02:\x00 diff --git a/aio/assets/layout.xlsx b/aio/assets/layout.xlsx index e50780f7edaf1eeb0d1a414229282681a09f121a..951c7a9ad850a59e781246c87b53ecd0cf17278d 100644 GIT binary patch delta 8164 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 diff --git a/aio/code/aio.py b/aio/code/aio.py index 7366aca..3957b23 100644 --- a/aio/code/aio.py +++ b/aio/code/aio.py @@ -1,3 +1,4 @@ +import tkinter from os.path import exists from os import getcwd from threading import Thread @@ -17,13 +18,13 @@ customtkinter.set_widget_scaling(1.1) # widget dimensions and text size customtkinter.set_window_scaling(1.1) # window geometry dimensions setdefaulttimeout(10) # global vars -btns = { +btns_func = { 'start': {'btn': '', 'row': 1, 'text': '开始运行'}, 'check': {'btn': '', 'row': 2, 'text': '检查参数'}, 'log': {'btn': '', 'row': 3, 'text': '保存日志'}, 'end': {'btn': '', 'row': 4, 'text': '结束运行'}, } -widgits = { +widgits_dp = { 'path': {'label': '', 'entry': '', 'row': 1, 'col': 2, 'text': '数据文件夹路径'}, 'av': {'label': '', 'entry': '', 'row': 2, 'col': 2, 'text': '角速度'}, 'rc': {'label': '', 'entry': '', 'row': 2, 'col': 4, 'text': '额定电流'}, @@ -42,11 +43,36 @@ widgits = { 'rc5': {'label': '', 'entry': '', 'row': 4, 'col': 10, 'text': '额定电流'}, 'rc6': {'label': '', 'entry': '', 'row': 4, 'col': 12, 'text': '额定电流'}, } +widgits_at = { + 'path': {'label': '', 'entry': '', 'row': 2, 'col': 2, 'text': '数据文件夹路径'}, + 'loadsel': {'label': '', 'optionmenu': '', 'row': 2, 'col': 1, 'text': '负载信息'}, + 'av1': {'label': '', 'entry': '', 'row': 3, 'col': 2, 'text': '角速度'}, + 'av2': {'label': '', 'entry': '', 'row': 3, 'col': 4, 'text': '角速度'}, + 'av3': {'label': '', 'entry': '', 'row': 3, 'col': 6, 'text': '角速度'}, + 'av4': {'label': '', 'entry': '', 'row': 3, 'col': 8, 'text': '角速度'}, + 'av5': {'label': '', 'entry': '', 'row': 3, 'col': 10, 'text': '角速度'}, + 'av6': {'label': '', 'entry': '', 'row': 3, 'col': 12, 'text': '角速度'}, + 'rc1': {'label': '', 'entry': '', 'row': 4, 'col': 2, 'text': '额定电流'}, + 'rc2': {'label': '', 'entry': '', 'row': 4, 'col': 4, 'text': '额定电流'}, + 'rc3': {'label': '', 'entry': '', 'row': 4, 'col': 6, 'text': '额定电流'}, + 'rc4': {'label': '', 'entry': '', 'row': 4, 'col': 8, 'text': '额定电流'}, + 'rc5': {'label': '', 'entry': '', 'row': 4, 'col': 10, 'text': '额定电流'}, + 'rc6': {'label': '', 'entry': '', 'row': 4, 'col': 12, 'text': '额定电流'}, + 'rr1': {'label': '', 'entry': '', 'row': 5, 'col': 2, 'text': '额定转速'}, + 'rr2': {'label': '', 'entry': '', 'row': 5, 'col': 4, 'text': '额定转速'}, + 'rr3': {'label': '', 'entry': '', 'row': 5, 'col': 6, 'text': '额定转速'}, + 'rr4': {'label': '', 'entry': '', 'row': 5, 'col': 8, 'text': '额定转速'}, + 'rr5': {'label': '', 'entry': '', 'row': 5, 'col': 10, 'text': '额定转速'}, + 'rr6': {'label': '', 'entry': '', 'row': 5, 'col': 12, 'text': '额定转速'}, +} class App(customtkinter.CTk): def __init__(self): super().__init__() + self.net_detect = Thread(target=self.detect_network) + self.net_detect.daemon = True + self.net_detect.start() self.my_font = customtkinter.CTkFont(family="Consolas", size=16, weight="bold") self.w_param = 84 # ===================================================================== @@ -56,7 +82,7 @@ class App(customtkinter.CTk): self.geometry("1200x550+30+30") self.protocol("WM_DELETE_WINDOW", self.func_end_callback) self.config(bg='#E9E9E9') - self.grid_rowconfigure(5, weight=1) + self.grid_rowconfigure(6, weight=1) self.grid_columnconfigure((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), weight=1) self.minsize(1200, 550) # ===================================================================== @@ -67,54 +93,90 @@ class App(customtkinter.CTk): self.label_logo = customtkinter.CTkLabel(self.frame_func, text="Rokae AIO", height=60, font=customtkinter.CTkFont(family="Segoe Script Bold", size=24, weight="bold"), text_color="#4F4F4F") self.label_logo.grid(row=0, column=0, padx=15, pady=15) # create buttons - for func in btns: - btns[func]['btn'] = customtkinter.CTkButton(self.frame_func, corner_radius=10, text=btns[func]['text'], fg_color='#4F4F4F', font=self.my_font) - btns[func]['btn'].grid(row=btns[func]['row'], column=0, sticky='new', padx=10, pady=10, ipadx=5, ipady=5) - btns['start']['btn'].configure(command=lambda: self.thread_it(self.func_start_callback)) - btns['check']['btn'].configure(command=lambda: self.thread_it(self.func_check_callback)) - btns['log']['btn'].configure(command=lambda: self.thread_it(self.func_log_callback)) - btns['end']['btn'].configure(command=lambda: self.thread_it(self.func_end_callback)) + for func in btns_func: + btns_func[func]['btn'] = customtkinter.CTkButton(self.frame_func, corner_radius=10, text=btns_func[func]['text'], fg_color='#4F4F4F', font=self.my_font) + btns_func[func]['btn'].grid(row=btns_func[func]['row'], column=0, sticky='new', padx=10, pady=10, ipadx=5, ipady=5) + btns_func['start']['btn'].configure(command=lambda: self.thread_it(self.func_start_callback)) + btns_func['check']['btn'].configure(command=lambda: self.thread_it(self.func_check_callback)) + btns_func['log']['btn'].configure(command=lambda: self.thread_it(self.func_log_callback)) + btns_func['end']['btn'].configure(command=lambda: self.thread_it(self.func_end_callback)) # create version info self.label_version = customtkinter.CTkLabel(self.frame_func, justify='left', text="Vers: 0.1.6.3\nDate: 06/18/2024", font=self.my_font, text_color="#4F4F4F") self.frame_func.rowconfigure(6, weight=1) self.label_version.grid(row=6, column=0, padx=20, pady=20, sticky='s') # ===================================================================== # create tabviews - self.tabview = customtkinter.CTkTabview(self, width=10000, height=100, anchor='w', fg_color='#E9E9E9', border_width=2, border_color='#CDCDCD') + self.tabview = customtkinter.CTkTabview(self, width=10000, height=100, anchor='w', fg_color='#E9E9E9', border_width=2, border_color='#CDCDCD', command=self.tabview_click) self.tabview.grid(row=0, column=1, padx=10, pady=5, sticky="nsew") self.tabview.add("Data Process") self.tabview.add("Automatic Test") - # create main menu + # create main menu for data process self.menu_main_dp = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process'), values=["init", "brake", "current", "iso", "wavelogger"], font=self.my_font, text_color='yellow', button_color='red', fg_color='green', command=self.func_main_callback) self.menu_main_dp.grid(row=1, column=1, sticky='we', padx=5, pady=5) self.menu_main_dp.set("Start Here!") - # create sub menu + # create sub menu for data process self.menu_sub_dp = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process')) - # ===================================================================== - # create widgits - for widgit in widgits: + # create main menu for automatic test + self.menu_main_at = customtkinter.CTkOptionMenu(self.tabview.tab('Automatic Test'), values=["init", "brake", "current"], font=self.my_font, text_color='yellow', button_color='red', fg_color='green', command=self.func_main_callback) + self.menu_main_at.grid(row=1, column=1, sticky='we', padx=5, pady=5) + self.menu_main_at.set("Start Here!") + # For data process tab START ===================================================================== + # create widgits_dp + for widgit in widgits_dp: if widgit == 'path': - widgits[widgit]['label'] = customtkinter.CTkLabel(self.tabview.tab('Data Process'), text=f'{widgit.upper()}', font=self.my_font) - widgits[widgit]['label'].grid(row=widgits[widgit]['row'], column=widgits[widgit]['col'], sticky='e', pady=5) - widgits[widgit]['entry'] = customtkinter.CTkEntry(self.tabview.tab('Data Process'), width=670, placeholder_text=widgits[widgit]['text'], font=self.my_font) - widgits[widgit]['entry'].grid(row=widgits[widgit]['row'], column=widgits[widgit]['col']+1, columnspan=11, padx=(5, 10), pady=5, sticky='we') - widgits[widgit]['entry'].configure(state='disabled') + widgits_dp[widgit]['label'] = customtkinter.CTkLabel(self.tabview.tab('Data Process'), text=f'{widgit.upper()}', font=self.my_font) + widgits_dp[widgit]['label'].grid(row=widgits_dp[widgit]['row'], column=widgits_dp[widgit]['col'], sticky='e', pady=5) + widgits_dp[widgit]['entry'] = customtkinter.CTkEntry(self.tabview.tab('Data Process'), width=670, placeholder_text=widgits_dp[widgit]['text'], font=self.my_font) + widgits_dp[widgit]['entry'].grid(row=widgits_dp[widgit]['row'], column=widgits_dp[widgit]['col']+1, columnspan=11, padx=(5, 10), pady=5, sticky='we') + widgits_dp[widgit]['entry'].configure(state='disabled') elif widgit in ['av', 'rc', 'rpm', 'rr', 'dur', 'rc1', 'rc2', 'rc3', 'rc4', 'rc5', 'rc6']: - widgits[widgit]['label'] = customtkinter.CTkLabel(self.tabview.tab('Data Process'), text=f"{widgit.upper()}", font=self.my_font) - widgits[widgit]['label'].grid(row=widgits[widgit]['row'], column=widgits[widgit]['col'], sticky='e', pady=5) - widgits[widgit]['entry'] = customtkinter.CTkEntry(self.tabview.tab('Data Process'), width=self.w_param, placeholder_text=f"{widgits[widgit]['text']}", font=self.my_font) - widgits[widgit]['entry'].grid(row=widgits[widgit]['row'], column=widgits[widgit]['col']+1, padx=(5, 10), pady=5, sticky='w') - widgits[widgit]['entry'].configure(state='disabled') + widgits_dp[widgit]['label'] = customtkinter.CTkLabel(self.tabview.tab('Data Process'), text=f"{widgit.upper()}", font=self.my_font) + widgits_dp[widgit]['label'].grid(row=widgits_dp[widgit]['row'], column=widgits_dp[widgit]['col'], sticky='e', pady=5) + widgits_dp[widgit]['entry'] = customtkinter.CTkEntry(self.tabview.tab('Data Process'), width=self.w_param, placeholder_text=f"{widgits_dp[widgit]['text']}", font=self.my_font) + widgits_dp[widgit]['entry'].grid(row=widgits_dp[widgit]['row'], column=widgits_dp[widgit]['col']+1, padx=(5, 10), pady=5, sticky='w') + widgits_dp[widgit]['entry'].configure(state='disabled') elif widgit in ['axis', 'vel', 'trq', 'trqh', 'estop']: - widgits[widgit]['label'] = customtkinter.CTkLabel(self.tabview.tab('Data Process'), text=f"{widgit.upper()}", font=self.my_font) - widgits[widgit]['label'].grid(row=widgits[widgit]['row'], column=widgits[widgit]['col'], sticky='e', pady=5) - widgits[widgit]['optionmenu'] = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process'), button_color='#708090', fg_color='#778899', values=["1", "2", "3", "4", "5", "6", "7"], width=self.w_param, font=self.my_font) - widgits[widgit]['optionmenu'].grid(row=widgits[widgit]['row'], column=widgits[widgit]['col']+1, padx=(5, 10), pady=5, sticky='w') - widgits[widgit]['optionmenu'].configure(state='disabled') - # ===================================================================== + widgits_dp[widgit]['label'] = customtkinter.CTkLabel(self.tabview.tab('Data Process'), text=f"{widgit.upper()}", font=self.my_font) + widgits_dp[widgit]['label'].grid(row=widgits_dp[widgit]['row'], column=widgits_dp[widgit]['col'], sticky='e', pady=5) + widgits_dp[widgit]['optionmenu'] = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process'), button_color='#708090', fg_color='#778899', values=["1", "2", "3", "4", "5", "6", "7"], width=self.w_param, font=self.my_font) + widgits_dp[widgit]['optionmenu'].grid(row=widgits_dp[widgit]['row'], column=widgits_dp[widgit]['col']+1, padx=(5, 10), pady=5, sticky='w') + widgits_dp[widgit]['optionmenu'].configure(state='disabled') + # For data process tab END ===================================================================== + # For automatic test tab START ===================================================================== + # create buttons + self.seg_button = customtkinter.CTkSegmentedButton(self.tabview.tab('Automatic Test'), font=self.my_font, command=lambda value='机器状态': self.thread_it(self.segmented_button_callback())) + self.seg_button.grid(row=1, column=2, columnspan=12, padx=(20, 10), pady=(10, 10), sticky="ew") + self.seg_button.configure(values=["无效功能", "触发急停", "停止运动", "继续运动", "零点位姿", "机器状态", "告警信息"]) + self.seg_button.set("无效功能") + # self.seg_button.configure(state="disabled") + + self.progressbar = customtkinter.CTkProgressBar(self.tabview.tab('Automatic Test')) + self.progressbar.grid(row=5, column=1, padx=5, pady=5, sticky="ew") + self.progressbar.configure(mode="determinnate") + self.progressbar.start() + # create widgits_at + for widgit in widgits_at: + if widgit == 'path': + widgits_at[widgit]['label'] = customtkinter.CTkLabel(self.tabview.tab('Automatic Test'), text=f'{widgit.upper()}', font=self.my_font) + widgits_at[widgit]['label'].grid(row=widgits_at[widgit]['row'], column=widgits_at[widgit]['col'], sticky='e', pady=5) + widgits_at[widgit]['entry'] = customtkinter.CTkEntry(self.tabview.tab('Automatic Test'), width=670, placeholder_text=widgits_at[widgit]['text'], font=self.my_font) + widgits_at[widgit]['entry'].grid(row=widgits_at[widgit]['row'], column=widgits_at[widgit]['col']+1, columnspan=11, padx=(5, 10), pady=5, sticky='we') + widgits_at[widgit]['entry'].configure(state='disabled') + elif widgit in ['av1', 'av2', 'av3', 'av4', 'av5', 'av6', 'rc1', 'rc2', 'rc3', 'rc4', 'rc5', 'rc6', 'rr1', 'rr2', 'rr3', 'rr4', 'rr5', 'rr6']: + widgits_at[widgit]['label'] = customtkinter.CTkLabel(self.tabview.tab('Automatic Test'), text=f"{widgit.upper()}", font=self.my_font) + widgits_at[widgit]['label'].grid(row=widgits_at[widgit]['row'], column=widgits_at[widgit]['col'], sticky='e', pady=5) + widgits_at[widgit]['entry'] = customtkinter.CTkEntry(self.tabview.tab('Automatic Test'), width=self.w_param, placeholder_text=f"{widgits_at[widgit]['text']}", font=self.my_font) + widgits_at[widgit]['entry'].grid(row=widgits_at[widgit]['row'], column=widgits_at[widgit]['col']+1, padx=(5, 10), pady=5, sticky='w') + widgits_at[widgit]['entry'].configure(state='disabled') + elif widgit in ['loadsel', ]: + widgits_at[widgit]['optionmenu'] = customtkinter.CTkOptionMenu(self.tabview.tab('Automatic Test'), button_color='#708090', fg_color='#778899', values=["tool33", "tool66", "tool100"], width=self.w_param, font=self.my_font) + widgits_at[widgit]['optionmenu'].grid(row=widgits_at[widgit]['row'], column=widgits_at[widgit]['col'], padx=5, pady=5, sticky='we') + widgits_at[widgit]['optionmenu'].set(widgits_at[widgit]['text']) + widgits_at[widgit]['optionmenu'].configure(state='disabled') + # For automatic test tab END ===================================================================== # create textbox self.textbox = customtkinter.CTkTextbox(self, wrap='none', font=customtkinter.CTkFont(family="consolas", size=14), text_color="blue", fg_color='#E9E9E9', border_width=2, border_color='#CDCDCD', border_spacing=5) - self.textbox.grid(row=5, column=1, rowspan=2, columnspan=13, ipadx=10, ipady=10, padx=10, pady=(5, 10), sticky='nsew') + self.textbox.grid(row=6, column=1, columnspan=13, ipadx=10, ipady=10, padx=10, pady=(5, 10), sticky='nsew') self.textbox.configure(state='disabled') # ===================================================================== # version check @@ -127,6 +189,27 @@ class App(customtkinter.CTk): tkinter.messagebox.showwarning(title="版本更新", message=msg) except: tkinter.messagebox.showwarning(title="版本更新", message="连接服务器失败,无法确认当前是否是最新版本......") + # functions below ↓ ---------------------------------------------------------------------------------------- + + def segmented_button_callback(self): + value = self.seg_button.get() + print(f"segment button is triggered: {value}") + match value: + case '触发急停': + pass + case '停止运动': + pass + case '继续运动': + pass + case '零点位姿': + pass + case '机器状态': + pass + case '告警信息': + pass + + def detect_network(self): + pass def thread_it(self, func, *args): """ 将函数打包进线程 """ @@ -134,78 +217,107 @@ class App(customtkinter.CTk): self.myThread.daemon = True # 主线程退出就直接让子线程跟随退出,不论是否运行完成。 self.myThread.start() - def initialization(self): - for widgit in widgits: - if widgit in ['path', 'av', 'rc', 'rpm', 'rr', 'dur', 'rc1', 'rc2', 'rc3', 'rc4', 'rc5', 'rc6']: - widgits[widgit]['label'].configure(text=f'{widgit.upper()}', text_color='black') - widgits[widgit]['entry'].configure(placeholder_text=widgits[widgit]['text'], state='disabled') - elif widgit in ['axis', 'vel', 'trq', 'trqh', 'estop']: - widgits[widgit]['label'].configure(text=f'{widgit.upper()}', text_color="black") - widgits[widgit]['optionmenu'].configure(state='disabled') + def tabview_click(self): + self.initialization() + tab_name = self.tabview.get() + if tab_name == 'Data Process': + self.menu_main_dp.set("Start Here!") + elif tab_name == 'Automatic Test': + self.menu_main_at.set("Start Here!") - self.menu_sub_dp.grid_forget() - self.textbox.delete(index1='1.0', index2='end') - self.textbox.configure(state='disabled') + def initialization(self): + tab_name = self.tabview.get() + if tab_name == 'Data Process': + for widgit in widgits_dp: + if widgit in ['path', 'av', 'rc', 'rpm', 'rr', 'dur', 'rc1', 'rc2', 'rc3', 'rc4', 'rc5', 'rc6']: + widgits_dp[widgit]['label'].configure(text=f'{widgit.upper()}', text_color='black') + widgits_dp[widgit]['entry'].delete(0, tkinter.END) + widgits_dp[widgit]['entry'].configure(placeholder_text=widgits_dp[widgit]['text'], state='normal') + widgits_dp[widgit]['entry'].configure(state='disabled') + elif widgit in ['axis', 'vel', 'trq', 'trqh', 'estop']: + widgits_dp[widgit]['label'].configure(text=f'{widgit.upper()}', text_color="black") + widgits_dp[widgit]['optionmenu'].configure(state='normal') + widgits_dp[widgit]['optionmenu'].set('1') + widgits_dp[widgit]['optionmenu'].configure(state='disabled') + + self.menu_sub_dp.grid_forget() + self.textbox.delete(index1='1.0', index2='end') + self.textbox.configure(state='disabled') + elif tab_name == 'Automatic Test': + for widgit in widgits_at: + if widgit in ['path', 'av1', 'av2', 'av3', 'av4', 'av5', 'av6', 'rc1', 'rc2', 'rc3', 'rc4', 'rc5', 'rc6', 'rr1', 'rr2', 'rr3', 'rr4', 'rr5', 'rr6']: + widgits_at[widgit]['label'].configure(text=f'{widgit.upper()}', text_color='black') + widgits_at[widgit]['entry'].delete(0, tkinter.END) + widgits_at[widgit]['entry'].configure(placeholder_text=widgits_at[widgit]['text'], state='normal') + widgits_at[widgit]['entry'].configure(state='disabled') + elif widgit in ['loadsel']: + widgits_at[widgit]['optionmenu'].configure(state='normal') + widgits_at[widgit]['optionmenu'].set(widgits_at[widgit]['text']) + widgits_at[widgit]['optionmenu'].configure(state='disabled') + self.seg_button.set("无效按钮") def func_main_callback(self, func_name): self.initialization() + tab_name = self.tabview.get() + if tab_name == 'Data Process': + if func_name == 'brake': + for widgit in widgits_dp: + if widgit in ['path', 'av', 'rr']: + widgits_dp[widgit]['label'].configure(text_color='red') + widgits_dp[widgit]['entry'].configure(state='normal') + elif widgit in ['axis', 'vel', 'trq', 'estop']: + widgits_dp[widgit]['label'].configure(text_color="red") + widgits_dp[widgit]['optionmenu'].configure(state='normal') + elif func_name == 'current': + self.menu_sub_dp = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process'), values=["max", "avg", "cycle"], font=self.my_font, button_color='red', fg_color='green', command=self.func_sub_callback) + self.menu_sub_dp.grid(row=2, column=1, sticky='we', padx=5, pady=5) + self.menu_sub_dp.set("--select--") + self.menu_sub_dp.configure(text_color='yellow') - if func_name == 'brake': - for widgit in widgits: - if widgit in ['path', 'av', 'rr']: - widgits[widgit]['label'].configure(text_color='red') - widgits[widgit]['entry'].configure(state='normal') - elif widgit in ['axis', 'vel', 'trq', 'estop']: - widgits[widgit]['label'].configure(text_color="red") - widgits[widgit]['optionmenu'].configure(state='normal') - elif func_name == 'current': - self.menu_sub_dp = customtkinter.CTkOptionMenu(self.tabview.tab('Data Process'), values=["max", "avg", "cycle"], font=self.my_font, button_color='red', fg_color='green', command=self.func_sub_callback) - self.menu_sub_dp.grid(row=2, column=1, sticky='we', padx=5, pady=5) - self.menu_sub_dp.set("--select--") - self.menu_sub_dp.configure(text_color='yellow') - - for widgit in widgits: - if widgit in ['path', 'rc', 'rc1', 'rc2', 'rc3', 'rc4', 'rc5', 'rc6']: - color = 'blue' if widgit == 'rc' else 'red' - widgits[widgit]['label'].configure(text_color=color) - widgits[widgit]['entry'].configure(state='normal') - elif widgit in ['trqh',]: - widgits[widgit]['label'].configure(text_color="red") - widgits[widgit]['optionmenu'].configure(state='normal') - elif func_name == 'iso' or func_name == 'wavelogger': - for widgit in widgits: - if widgit in ['path',]: - widgits[widgit]['label'].configure(text_color='red') - widgits[widgit]['entry'].configure(state='normal') - else: - self.initialization() - self.menu_main_dp.set("Start Here!") + for widgit in widgits_dp: + if widgit in ['path', 'rc', 'rc1', 'rc2', 'rc3', 'rc4', 'rc5', 'rc6']: + color = 'blue' if widgit == 'rc' else 'red' + widgits_dp[widgit]['label'].configure(text_color=color) + widgits_dp[widgit]['entry'].configure(state='normal') + elif widgit in ['trqh',]: + widgits_dp[widgit]['label'].configure(text_color="red") + widgits_dp[widgit]['optionmenu'].configure(state='normal') + elif func_name == 'iso' or func_name == 'wavelogger': + for widgit in widgits_dp: + if widgit in ['path',]: + widgits_dp[widgit]['label'].configure(text_color='red') + widgits_dp[widgit]['entry'].configure(state='normal') + else: + self.initialization() + self.menu_main_dp.set("Start Here!") + elif tab_name == 'Automatic Test': + pass def func_sub_callback(self, func_name): if func_name == "max": - for widgit in widgits: + for widgit in widgits_dp: if widgit in ['rpm', 'dur']: - widgits[widgit]['label'].configure(text_color='black') - widgits[widgit]['entry'].configure(state='disabled') + widgits_dp[widgit]['label'].configure(text_color='black') + widgits_dp[widgit]['entry'].configure(state='disabled') elif widgit in ['vel', 'trq']: - widgits[widgit]['label'].configure(text_color='black') - widgits[widgit]['optionmenu'].configure(state='disabled') + widgits_dp[widgit]['label'].configure(text_color='black') + widgits_dp[widgit]['optionmenu'].configure(state='disabled') elif func_name == 'avg': - for widgit in widgits: + for widgit in widgits_dp: if widgit in ['rpm', 'dur']: - widgits[widgit]['label'].configure(text_color='black') - widgits[widgit]['entry'].configure(state='disabled') + widgits_dp[widgit]['label'].configure(text_color='black') + widgits_dp[widgit]['entry'].configure(state='disabled') elif widgit in ['vel', 'trq']: - widgits[widgit]['label'].configure(text_color='black') - widgits[widgit]['optionmenu'].configure(state='disabled') + widgits_dp[widgit]['label'].configure(text_color='black') + widgits_dp[widgit]['optionmenu'].configure(state='disabled') elif func_name == 'cycle': - for widgit in widgits: + for widgit in widgits_dp: if widgit in ['rpm', 'dur']: - widgits[widgit]['label'].configure(text_color='blue') - widgits[widgit]['entry'].configure(state='normal') + widgits_dp[widgit]['label'].configure(text_color='blue') + widgits_dp[widgit]['entry'].configure(state='normal') elif widgit in ['vel', 'trq']: - widgits[widgit]['label'].configure(text_color="red") - widgits[widgit]['optionmenu'].configure(state='normal') + widgits_dp[widgit]['label'].configure(text_color="red") + widgits_dp[widgit]['optionmenu'].configure(state='normal') def write2textbox(self, text, wait=0, exitcode=0, color='blue'): self.textbox.tag_add(color, 'insert', 'end') @@ -240,81 +352,89 @@ class App(customtkinter.CTk): return True def check_param(self): - func_name = self.menu_main_dp.get() - if func_name == 'brake': - path = widgits['path']['entry'].get().strip() - av = widgits['av']['entry'].get().strip('- ') - rr = widgits['rr']['entry'].get().strip('- ') - axis = widgits['axis']['optionmenu'].get() - vel = widgits['vel']['optionmenu'].get() - trq = widgits['trq']['optionmenu'].get() - estop = widgits['estop']['optionmenu'].get() + tab_name = self.tabview.get() + if tab_name == 'Data Process': + func_name = self.menu_main_dp.get() + if func_name == 'brake': + path = widgits_dp['path']['entry'].get().strip() + av = widgits_dp['av']['entry'].get().strip('- ') + rr = widgits_dp['rr']['entry'].get().strip('- ') + axis = widgits_dp['axis']['optionmenu'].get() + vel = widgits_dp['vel']['optionmenu'].get() + trq = widgits_dp['trq']['optionmenu'].get() + estop = widgits_dp['estop']['optionmenu'].get() - c1 = exists(path) - c2 = self.is_float('required', av, rr) - c3 = True if len({vel, trq, estop}) == 3 else False + c1 = exists(path) + c2 = self.is_float('required', av, rr) + c3 = True if len({vel, trq, estop}) == 3 else False - if c1 and c2 and c3: - return 1, path, float(av), float(rr), int(axis), int(vel), int(trq), int(estop) + if c1 and c2 and c3: + return 1, path, float(av), float(rr), int(axis), int(vel), int(trq), int(estop) + else: + return 0, 0 + # ======================================================= + elif func_name == 'current': + path = widgits_dp['path']['entry'].get().strip() + rc = widgits_dp['rc']['entry'].get().strip('- ') + rpm = widgits_dp['rpm']['entry'].get().strip() + dur = widgits_dp['dur']['entry'].get().strip() + rc1 = widgits_dp['rc1']['entry'].get().strip() + rc2 = widgits_dp['rc2']['entry'].get().strip() + rc3 = widgits_dp['rc3']['entry'].get().strip() + rc4 = widgits_dp['rc4']['entry'].get().strip() + rc5 = widgits_dp['rc5']['entry'].get().strip() + rc6 = widgits_dp['rc6']['entry'].get().strip() + vel = widgits_dp['vel']['optionmenu'].get() + trq = widgits_dp['trq']['optionmenu'].get() + trqh = widgits_dp['trqh']['optionmenu'].get() + sub = self.menu_sub_dp.get() + + c1 = exists(path) + c2 = sub in ['max', 'avg', 'cycle'] + c3 = self.is_float('optional', rc, rpm) + c4 = self.is_float('required', rc1, rc2, rc3, rc4, rc5, rc6) + + c5 = c6 = True + if sub == 'cycle': + c5 = True if len({vel, trq}) == 2 else False + c6 = self.is_float('optional', dur) + + if c1 and c2 and c3 and c4 and c5 and c6: + rcs = [] + for x in [rc1, rc2, rc3, rc4, rc5, rc6]: + rcs.append(float(x)) + rc = 0 if rc == '' else rc + dur = 0 if sub != 'cycle' or dur == '' else dur + rpm = 0 if sub != 'cycle' or rpm == '' else rpm + rcs.append(float(rc)) + return 2, path, sub, rcs, int(vel), int(trq), int(trqh), float(dur), float(rpm) + else: + return 0, 0 + # ======================================================= + elif func_name == 'iso': + path = widgits_dp['path']['entry'].get().strip() + c1 = exists(path) + if c1: + return 3, path + else: + return 0, 0 + # ======================================================= + elif func_name == 'wavelogger': + path = widgits_dp['path']['entry'].get().strip() + c1 = exists(path) + if c1: + return 4, path + else: + return 0, 0 + # ======================================================= else: return 0, 0 - # ======================================================= - elif func_name == 'current': - path = widgits['path']['entry'].get().strip() - rc = widgits['rc']['entry'].get().strip('- ') - rpm = widgits['rpm']['entry'].get().strip() - dur = widgits['dur']['entry'].get().strip() - rc1 = widgits['rc1']['entry'].get().strip() - rc2 = widgits['rc2']['entry'].get().strip() - rc3 = widgits['rc3']['entry'].get().strip() - rc4 = widgits['rc4']['entry'].get().strip() - rc5 = widgits['rc5']['entry'].get().strip() - rc6 = widgits['rc6']['entry'].get().strip() - vel = widgits['vel']['optionmenu'].get() - trq = widgits['trq']['optionmenu'].get() - trqh = widgits['trqh']['optionmenu'].get() - sub = self.menu_sub_dp.get() - - c1 = exists(path) - c2 = sub in ['max', 'avg', 'cycle'] - c3 = self.is_float('optional', rc, rpm) - c4 = self.is_float('required', rc1, rc2, rc3, rc4, rc5, rc6) - - c5 = c6 = True - if sub == 'cycle': - c5 = True if len({vel, trq}) == 2 else False - c6 = self.is_float('optional', dur) - - if c1 and c2 and c3 and c4 and c5 and c6: - rcs = [] - for x in [rc1, rc2, rc3, rc4, rc5, rc6]: - rcs.append(float(x)) - rc = 0 if rc == '' else rc - dur = 0 if sub != 'cycle' or dur == '' else dur - rpm = 0 if sub != 'cycle' or rpm == '' else rpm - rcs.append(float(rc)) - return 2, path, sub, rcs, int(vel), int(trq), int(trqh), float(dur), float(rpm) - else: - return 0, 0 - # ======================================================= - elif func_name == 'iso': - path = widgits['path']['entry'].get().strip() - c1 = exists(path) - if c1: - return 3, path - else: - return 0, 0 - # ======================================================= - elif func_name == 'wavelogger': - path = widgits['path']['entry'].get().strip() - c1 = exists(path) - if c1: - return 4, path - else: - return 0, 0 - # ======================================================= - else: - return 0, 0 + elif tab_name == 'Automatic Test': + func_name = self.menu_main_at.get() + if func_name == 'brake': + pass + elif func_name == 'current': + pass def func_start_callback(self): self.textbox.configure(state='normal') diff --git a/aio/code/automatic_test/openapi.py b/aio/code/automatic_test/openapi.py index 0da6865..b9cd64c 100644 --- a/aio/code/automatic_test/openapi.py +++ b/aio/code/automatic_test/openapi.py @@ -3,8 +3,6 @@ import socket import threading import selectors import time -import sys - MAX_FRAME_SIZE = 1024