From d5ceee05acbc0be8c79b7c895ce3176731a775d2 Mon Sep 17 00:00:00 2001 From: sumolx Date: Thu, 16 May 2024 09:51:25 -0400 Subject: [PATCH 1/4] the name "Download" overshadows python3 built in module, renamed to downloader --- downloader.py | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 downloader.py diff --git a/downloader.py b/downloader.py new file mode 100644 index 0000000..479f618 --- /dev/null +++ b/downloader.py @@ -0,0 +1,105 @@ +import requests +import sys +import time +from global_var import * +import os +import zipfile + + +class downloader: + def __init__(self): + + self.status = download_status.IDLE.value + self.url = "" + self.save_path = "" + self.to_stop = 0 + + def download_file(self, url, save_path, clear): + print(f"Downloading {url}") + if clear: + if os.path.exists(save_path): + os.remove(save_path) + try: + response = requests.get(url) + if response.status_code == 200: + with open(save_path, "wb") as file: + for chunk in response.iter_content(chunk_size=1024): + if self.to_stop == 1: + self.to_stop = 0 + return 2 + if chunk: + file.write(chunk) + if self.status == download_status.DOWNLOAD_EXIT.value: + sys.exit() + return 1 + else: + if self.status == download_status.DOWNLOAD_EXIT.value: + sys.exit() + print("Failed to download file.") + return 0 + except: + return 0 + + +my_download = downloader() + + +def download_thread_proc(): + my_download.download_file( + "https://api.github.com/repos/hd-zero/hdzero-vtx/releases", "resource/vtx_releases", 1) + my_download.download_file( + "https://raw.githubusercontent.com/hd-zero/hdzero-vtx/main/src/common.h", "resource/vtx_common", 0) + my_download.download_file( + "https://raw.githubusercontent.com/hd-zero/hdzero-vtx/main/vtx_targets.png", "resource/vtx_targets.png", 0) + my_download.download_file( + "https://api.github.com/repos/ligenxxxx/event-vrx/releases", "resource/event_vrx_releases", 1) + my_download.download_file( + "https://api.github.com/repos/ligenxxxx/hv/releases", "resource/monitor_releases", 1) + + time.sleep(1) + my_download.status = download_status.FILE_PARSE.value + + while True: + if my_download.status == download_status.DOWNLOAD_VTX_FW.value: + ret = my_download.download_file( + my_download.url, my_download.save_path+".zip", 1) + if ret == 1: + # unzip file + with zipfile.ZipFile(my_download.save_path+".zip", 'r') as zip_ref: + zip_ref.extractall("resource/") + + # rename file + if (os.path.exists(my_download.save_path)): + os.remove(my_download.save_path) + os.rename("resource/HDZERO_TX.bin", my_download.save_path) + + my_download.status = download_status.DOWNLOAD_VTX_FW_DONE.value + elif ret == 2: # stop + my_download.status = download_status.IDLE.value + else: + my_download.status = download_status.DOWNLOAD_VTX_FW_FAILED.value + + elif my_download.status == download_status.DOWNLOAD_MONITOR_FW.value: + ret = my_download.download_file( + my_download.url, my_download.save_path, 1) + if ret == 1: + my_download.status = download_status.DOWNLOAD_MONITOR_FW_DONE.value + elif ret == 2: # stop + my_download.status = download_status.IDLE.value + else: + my_download.status = download_status.DOWNLOAD_MONITOR_FW_FAILED.value + + elif my_download.status == download_status.DOWNLOAD_EVENT_VRX_FW.value: + ret = my_download.download_file( + my_download.url, my_download.save_path, 1) + if ret == 1: + my_download.status = download_status.DOWNLOAD_EVENT_VRX_FW_DONE.value + elif ret == 2: # stop + my_download.status = download_status.IDLE.value + else: + my_download.status = download_status.DOWNLOAD_EVENT_VRX_FW_FAILED.value + + elif my_download.status == download_status.DOWNLOAD_EXIT.value: + sys.exit() + + time.sleep(0.01) From 7db1e2bd3b923f95ecb68f568a8fa69a6e314dc5 Mon Sep 17 00:00:00 2001 From: sumolx Date: Thu, 16 May 2024 09:52:12 -0400 Subject: [PATCH 2/4] Added platform checks in preparation for other OS support --- ch341.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/ch341.py b/ch341.py index 8c23053..728dc7c 100644 --- a/ch341.py +++ b/ch341.py @@ -10,6 +10,7 @@ from ctypes import * import global_var import subprocess +import platform class ch341_class(object): @@ -26,11 +27,10 @@ def __init__(self): self.fw_8339_buf = create_string_buffer(FW_8339SIZE) self.dll = None + self.dll_name = None self.target = -1 self.status = ch341_status.IDLE.value # idle self.read_setting_flag = 1 - self.dll_name = "CH341DLL.DLL" - self.reconnect_vtx = 0 # ------ monitor ------------- @@ -78,19 +78,21 @@ def __init__(self): self.buffer_size = 2560 self.write_buffer = create_string_buffer(self.buffer_size) - try: - self.dll = ctypes.WinDLL(self.dll_name) - except: - command = "resource\driver\SETUP.EXE \S" - print("Need to install ch341 driver") - print("Installing ...") - subprocess.run(command, shell=True, capture_output=True, text=True) - print("done") - time.sleep(1) + if platform.system() == "Windows": try: + self.dll_name = "CH341DLL.DLL" self.dll = ctypes.WinDLL(self.dll_name) except: - a = 1 + print("Need to install ch341 driver") + print("Installing ...") + command = "resource\\driver\\SETUP.EXE \\S" + subprocess.run(command, shell=True, capture_output=True, text=True) + print("done") + time.sleep(1) + try: + self.dll = ctypes.WinDLL(self.dll_name) + except: + pass def parse_monitor_fw(self, fw_path): try: From 8d6648503c110b6b3d0345ef87119705b6d914b7 Mon Sep 17 00:00:00 2001 From: sumolx Date: Thu, 16 May 2024 09:52:45 -0400 Subject: [PATCH 3/4] UI handling must be handled in main thread to remain compatible with other OS environments. --- Download.py | 105 ------------------------------------------- hdzero_programmer.py | 12 +++-- main_window.py | 8 ++-- 3 files changed, 9 insertions(+), 116 deletions(-) delete mode 100644 Download.py diff --git a/Download.py b/Download.py deleted file mode 100644 index 6a7d740..0000000 --- a/Download.py +++ /dev/null @@ -1,105 +0,0 @@ -import requests -import sys -import time -from global_var import * -import os -import zipfile - - -class download: - def __init__(self): - - self.status = download_status.IDLE.value - self.url = "" - self.save_path = "" - self.to_stop = 0 - - def download_file(self, url, save_path, clear): - print(f"Downloading {url}") - if clear: - if os.path.exists(save_path): - os.remove(save_path) - try: - response = requests.get(url) - if response.status_code == 200: - with open(save_path, "wb") as file: - for chunk in response.iter_content(chunk_size=1024): - if self.to_stop == 1: - self.to_stop = 0 - return 2 - if chunk: - file.write(chunk) - if self.status == download_status.DOWNLOAD_EXIT.value: - sys.exit() - return 1 - else: - if self.status == download_status.DOWNLOAD_EXIT.value: - sys.exit() - print("Failed to download file.") - return 0 - except: - return 0 - - -my_download = download() - - -def download_thread_proc(): - my_download.download_file( - "https://api.github.com/repos/hd-zero/hdzero-vtx/releases", "resource/vtx_releases", 1) - my_download.download_file( - "https://raw.githubusercontent.com/hd-zero/hdzero-vtx/main/src/common.h", "resource/vtx_common", 0) - my_download.download_file( - "https://raw.githubusercontent.com/hd-zero/hdzero-vtx/main/vtx_targets.png", "resource/vtx_targets.png", 0) - my_download.download_file( - "https://api.github.com/repos/ligenxxxx/event-vrx/releases", "resource/event_vrx_releases", 1) - my_download.download_file( - "https://api.github.com/repos/ligenxxxx/hv/releases", "resource/monitor_releases", 1) - - time.sleep(1) - my_download.status = download_status.FILE_PARSE.value - - while True: - if my_download.status == download_status.DOWNLOAD_VTX_FW.value: - ret = my_download.download_file( - my_download.url, my_download.save_path+".zip", 1) - if ret == 1: - # unzip file - with zipfile.ZipFile(my_download.save_path+".zip", 'r') as zip_ref: - zip_ref.extractall("resource/") - - # rename file - if (os.path.exists(my_download.save_path)): - os.remove(my_download.save_path) - os.rename("resource/HDZERO_TX.bin", my_download.save_path) - - my_download.status = download_status.DOWNLOAD_VTX_FW_DONE.value - elif ret == 2: # stop - my_download.status = download_status.IDLE.value - else: - my_download.status = download_status.DOWNLOAD_VTX_FW_FAILED.value - - elif my_download.status == download_status.DOWNLOAD_MONITOR_FW.value: - ret = my_download.download_file( - my_download.url, my_download.save_path, 1) - if ret == 1: - my_download.status = download_status.DOWNLOAD_MONITOR_FW_DONE.value - elif ret == 2: # stop - my_download.status = download_status.IDLE.value - else: - my_download.status = download_status.DOWNLOAD_MONITOR_FW_FAILED.value - - elif my_download.status == download_status.DOWNLOAD_EVENT_VRX_FW.value: - ret = my_download.download_file( - my_download.url, my_download.save_path, 1) - if ret == 1: - my_download.status = download_status.DOWNLOAD_EVENT_VRX_FW_DONE.value - elif ret == 2: # stop - my_download.status = download_status.IDLE.value - else: - my_download.status = download_status.DOWNLOAD_EVENT_VRX_FW_FAILED.value - - elif my_download.status == download_status.DOWNLOAD_EXIT.value: - sys.exit() - - time.sleep(0.01) diff --git a/hdzero_programmer.py b/hdzero_programmer.py index 63038e5..c7337f5 100644 --- a/hdzero_programmer.py +++ b/hdzero_programmer.py @@ -2,8 +2,8 @@ import os import sys import shutil -from main_window import ui_thread_proc -from download import download_thread_proc +from main_window import main_window_ui +from downloader import download_thread_proc from ch341 import ch341_thread_proc @@ -37,16 +37,14 @@ def check_and_release_resource(): def main(): check_and_release_resource() - download_thread = threading.Thread( - target=download_thread_proc, name="download") - download_thread.start() - ui_thread = threading.Thread(target=ui_thread_proc, name="ui") - ui_thread.start() + download_thread = threading.Thread(target=download_thread_proc, name="downloader") + download_thread.start() ch341_thread = threading.Thread(target=ch341_thread_proc, name="ch341") ch341_thread.start() + main_window_ui() if __name__ == '__main__': main() diff --git a/main_window.py b/main_window.py index 0490441..6e7825e 100644 --- a/main_window.py +++ b/main_window.py @@ -10,7 +10,7 @@ from frame_programmer import frame_programmer from frame_statusbar import frame_statusbar -from download import * +from downloader import * from parse_file import * import global_var from global_var import * @@ -357,7 +357,7 @@ def create_downloading_firmware_window(self): self.downloading_window_status = 1 self.downloading_window.overrideredirect(True) - self._main_window.attributes('-disable', True) + #self._main_window.attributes('-disable', True) def set_downloading_label(self, str): self.downloading_label.config(text=str) @@ -403,7 +403,7 @@ def refresh(self): self._vtx_frame.create_radio_button_list( list(my_parse.vtx_info.keys()), self.on_select_vtx_target, my_parse.vtx_target_image) - self._main_window.attributes('-disable', False) + #self._main_window.attributes('-disable', False) # vtx if self.current_selected_tab() == 0: @@ -765,7 +765,7 @@ def on_closing(): global my_gui -def ui_thread_proc(): +def main_window_ui(): global my_gui root = tk.Tk() From 0ac6160f9656090a2b2de6ad2d5448c384707b31 Mon Sep 17 00:00:00 2001 From: sumolx Date: Thu, 16 May 2024 13:30:46 -0400 Subject: [PATCH 4/4] Fixed run path when running directly within python or as a packaged deliverable --- hdzero_programmer.py | 32 ++------------------------------ package.bat | 2 +- package.sh | 4 ++++ 3 files changed, 7 insertions(+), 31 deletions(-) create mode 100755 package.sh diff --git a/hdzero_programmer.py b/hdzero_programmer.py index c7337f5..8c0b800 100644 --- a/hdzero_programmer.py +++ b/hdzero_programmer.py @@ -1,42 +1,14 @@ import threading import os import sys -import shutil from main_window import main_window_ui from downloader import download_thread_proc from ch341 import ch341_thread_proc - -def get_resource_folder(): - if getattr(sys, 'frozen', False): - base_path = sys._MEIPASS - else: - base_path = os.path.dirname(os.path.abspath(__file__)) - - resource_folder = os.path.join(base_path, "data_folder") - print(resource_folder) - - return resource_folder - - -def check_and_release_resource(): - - resource_folder = get_resource_folder() - - if os.path.exists("resource"): - pass - else: - for filename in os.listdir(resource_folder): - source_file = os.path.join(resource_folder, filename) - destination_file = os.path.join("resource", filename) - if os.path.isfile(source_file): - shutil.copy(source_file, destination_file) - elif os.path.isdir(source_file): - shutil.copytree(source_file, destination_file) - +run_path = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) +os.chdir(run_path) def main(): - check_and_release_resource() download_thread = threading.Thread(target=download_thread_proc, name="downloader") download_thread.start() diff --git a/package.bat b/package.bat index 045a614..4af1cf3 100644 --- a/package.bat +++ b/package.bat @@ -1 +1 @@ -pyinstaller -i HDZeroIcon.ico -w --onefile --add-data "resource;data_folder" hdzero_programmer.py +pyinstaller -i HDZeroIcon.ico -w --onefile --add-data "resource;resource" hdzero_programmer.py diff --git a/package.sh b/package.sh new file mode 100755 index 0000000..11e9ee5 --- /dev/null +++ b/package.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +rm -rf build dist +pyinstaller -i HDZeroIcon.ico -w --onefile --add-data="resource:resource" hdzero_programmer.py