diff --git a/CHANGELOG.md b/CHANGELOG.md index c607180..7268b9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,17 @@ ### Изменено ### Исправлено + +## [0.2.1] - 2024-09-10 + +В версии 0.2.1 исправлены пути конфигурационных файлов по умолчанию, файлов лога OpenOCD и добавлен скрипт сборки +исполняемого файла + +### Добавлено +- Добавлен скрипт сборки исполняемого файла + +### Исправлено +- Исправлены пути конфигурационных файлов по умолчанию, файлов лога OpenOCD ## [0.2.0] - 2024-08-13 diff --git a/README.md b/README.md index c6bd245..84d164a 100644 --- a/README.md +++ b/README.md @@ -75,3 +75,25 @@ optional arguments: Программа принимает образы программы в формате hex и записывает данные в память МК через контроллер SPIFI, путем записи команд и настроек в регистры блока. Тип памяти и способ записи выбирается по адресу байт в hex файле, поэтому требуется правильное расположение секций, заданное в ld скрипте. Скрипт работает через OpenOCD, подключаясь через tcl сервер к уже запущенному openocd, подключенному к МК. Скрипт может запустить openocd самостоятельно. + +## Сборка в исполняемый файл + +Для сборки в исполняемый файл и подготовки релиза используется модуль PyInstaller. +Для его установки выполните команду: + +``` +pip install -U pyinstaller +``` + +Затем соберите программу с использованием файла с настройками mik32_upload.spec: + +``` +pyinstaller mik32_upload.spec +``` + +В папке `./dist` будет создана папка `mik32_upload`, содержащая исполняемый файл `mik32_upload` +и папка со служебными файлами `_internal`, а также архив с названием `mik32-uploader-{версия}.zip` +или `mik32-uploader-{версия}.tar.gz`. + +Для указания версии программы следует изменить значение переменной `applicaton_version` в файле +`_version.py`. При редактировании файла следует сохранять форматирование! diff --git a/_version.py b/_version.py new file mode 100644 index 0000000..5c0ccce --- /dev/null +++ b/_version.py @@ -0,0 +1 @@ +applicaton_version = 'v0.2.1' diff --git a/mik32_check.py b/mik32_check.py index 603a442..36b6576 100644 --- a/mik32_check.py +++ b/mik32_check.py @@ -7,7 +7,7 @@ import time from typing import List, Union from mik32_debug_hal.power_manager import pm_init -from mik32_upload import BootMode, Pages, form_pages, openocd_exec_path, openocd_scripts_path, openocd_interface_path, openocd_target_path, adapter_default_speed, run_openocd, default_post_action, default_log_path, default_openocd_host, mik32v0_sections, OpenOCDStartupException, adapter_speed_not_supported, memory_page_size +from mik32_upload import BootMode, Pages, form_pages, openocd_exec_path, openocd_scripts_path, openocd_interface_path, openocd_target_path, adapter_default_speed, run_openocd, default_post_action, default_log_path, default_openocd_host, mik32_sections, OpenOCDStartupException, adapter_speed_not_supported, memory_page_size from mik32_debug_hal.gpio import MIK32_Version, gpio_init, gpio_deinit import mik32_debug_hal.eeprom as eeprom import mik32_debug_hal.spifi as spifi @@ -47,7 +47,7 @@ def upload_file( print(f"ERROR: File {filename} does not exist") exit(1) - file = FirmwareFile(filename, mik32v0_sections) + file = FirmwareFile(filename, mik32_sections) segments: List[Segment] = file.get_segments() pages: Pages = form_pages(segments, boot_mode) diff --git a/mik32_upload.py b/mik32_upload.py index bde35eb..2b24c34 100644 --- a/mik32_upload.py +++ b/mik32_upload.py @@ -13,10 +13,12 @@ import mik32_debug_hal.eeprom as eeprom import mik32_debug_hal.spifi as spifi import mik32_debug_hal.ram as ram import mik32_debug_hal.power_manager as power_manager +from _version import applicaton_version from parsers import * import logging import sys +program_name = f'mik32-uploader-{applicaton_version}' # class bcolors(Enum): # OK = '\033[92m' @@ -33,10 +35,13 @@ else: default_openocd_host = '127.0.0.1' openocd_exec_path = os.path.join("openocd", "bin", openocd_exec) -openocd_scripts_path = os.path.join("openocd", "share", "openocd", "scripts") -openocd_interface_path = os.path.join("interface", "ftdi", "m-link.cfg") +openocd_scripts_path = os.path.join("openocd-scripts") +openocd_interface_path = os.path.join("interface", "ftdi", "mikron-link.cfg") openocd_target_path = os.path.join("target", "mik32.cfg") -default_log_path = "nul" +if os.name == 'nt': + default_log_path = "nul" +else: + default_log_path = "/dev/null" default_post_action = "reset run" adapter_default_speed = 500 @@ -81,7 +86,7 @@ class BootMode(Enum): return MemoryType.UNKNOWN -mik32v0_sections: List[MemorySection] = [ +mik32_sections: List[MemorySection] = [ MemorySection(MemoryType.BOOT, 0x0, 16 * 1024), MemorySection(MemoryType.EEPROM, 0x01000000, 8 * 1024), MemorySection(MemoryType.RAM, 0x02000000, 16 * 1024), @@ -215,7 +220,7 @@ def upload_file( print(f"ERROR: File {filename} does not exist") exit(1) - file = FirmwareFile(filename, mik32v0_sections) + file = FirmwareFile(filename, mik32_sections) segments: List[Segment] = file.get_segments() pages: Pages = form_pages(segments, boot_mode) @@ -296,8 +301,9 @@ def upload_file( def createParser(): parser = argparse.ArgumentParser( prog='mik32_upload.py', + usage='python mik32_upload.py firmware_name.hex', description='''Скрипт предназначен для записи программы в ОЗУ, EEPROM и внешнюю flash память, - подключенную по интерфейсу SPIFI''' + подключенную по интерфейсу SPIFI. Поддерживаемые форматы прошивок: *.hex, *.bin''' ) parser.add_argument( 'filepath', @@ -370,7 +376,6 @@ def createParser(): help='Открывать OpenOCD в отдельной консоли' ) parser.add_argument( - '-b', '--boot-mode', dest='boot_mode', type=BootMode, @@ -407,7 +412,6 @@ def createParser(): help='Вывод без последовательностей управления терминалом. Временно не используется' ) parser.add_argument( - '-t', '--mcu-type', dest='mcu_type', type=MIK32_Version, @@ -425,7 +429,7 @@ if __name__ == '__main__': parser = createParser() namespace = parser.parse_args() - print("mik32-uploader v0.2.0") + print(program_name) if namespace.filepath: upload_file( diff --git a/mik32_upload.spec b/mik32_upload.spec index f88166e..f1c9136 100644 --- a/mik32_upload.spec +++ b/mik32_upload.spec @@ -1,5 +1,16 @@ # -*- mode: python ; coding: utf-8 -*- +import os +import shutil +import zipfile +import tarfile + +program_name = 'mik32_upload' + +with open('_version.py', 'r') as f: + applicaton_version_line = f.read().strip() + applicaton_version_line = applicaton_version_line[len( + 'applicaton_version = '):].strip('\'') a = Analysis( ['mik32_upload.py'], @@ -12,22 +23,20 @@ a = Analysis( runtime_hooks=[], excludes=[], noarchive=False, + optimize=0, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, - a.binaries, - a.datas, [], - name='mik32_upload', + exclude_binaries=True, + name=program_name, debug=False, bootloader_ignore_signals=False, strip=False, upx=True, - upx_exclude=[], - runtime_tmpdir=None, console=True, disable_windowed_traceback=False, argv_emulation=False, @@ -35,3 +44,41 @@ exe = EXE( codesign_identity=None, entitlements_file=None, ) + +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='mik32_upload', +) + + +def zip_directory(directory_path, zip_path): + with zipfile.ZipFile(zip_path, 'w') as zipf: + for root, dirs, files in os.walk(directory_path): + for file in files: + zipf.write(os.path.join(root, file), + os.path.relpath(os.path.join(root, file), + os.path.join(directory_path, '..'))) + + +def tar_gz_directory(directory_path, tar_gz_path): + with tarfile.open(tar_gz_path, "w:gz") as tar: + for root, dirs, files in os.walk(directory_path): + for file in files: + tar.add(os.path.join(root, file), + os.path.relpath(os.path.join(root, file), + os.path.join(directory_path, '..'))) + + +shutil.copytree('./openocd-scripts/', + f'./dist/{program_name}/openocd-scripts/') +if os.name == 'nt': + zip_directory(f'./dist/{program_name}/', + f'./dist/mik32-uploader-{applicaton_version_line}.zip') +else: + tar_gz_directory(f'./dist/{program_name}/', + f'./dist/mik32-uploader-{applicaton_version_line}.tar.gz') diff --git a/mik32_upload_build.bat b/mik32_upload_build.bat deleted file mode 100644 index b1f9159..0000000 --- a/mik32_upload_build.bat +++ /dev/null @@ -1 +0,0 @@ -pyinstaller mik32_upload.spec \ No newline at end of file