diff --git a/Marlin/src/HAL/DUE/upload_extra_script.py b/Marlin/src/HAL/DUE/upload_extra_script.py index 4f7a494512..ca12b3b54f 100644 --- a/Marlin/src/HAL/DUE/upload_extra_script.py +++ b/Marlin/src/HAL/DUE/upload_extra_script.py @@ -6,14 +6,14 @@ # import pioutil if pioutil.is_pio_build(): - import platform - current_OS = platform.system() + import platform + current_OS = platform.system() - if current_OS == 'Windows': + if current_OS == 'Windows': - Import("env") + Import("env") - # Use bossac.exe on Windows - env.Replace( - UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE" - ) + # Use bossac.exe on Windows + env.Replace( + UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE" + ) diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py index a69520f46d..4f2da9cdc0 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py @@ -4,16 +4,16 @@ import pioutil if pioutil.is_pio_build(): - Import("env", "projenv") + Import("env", "projenv") - flash_size = 0 - vect_tab_addr = 0 + flash_size = 0 + vect_tab_addr = 0 - for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - vect_tab_addr = define[1] - if define[0] == "STM32_FLASH_SIZE": - flash_size = define[1] + for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + vect_tab_addr = define[1] + if define[0] == "STM32_FLASH_SIZE": + flash_size = define[1] - print('Use the {0:s} address as the marlin app entry point.'.format(vect_tab_addr)) - print('Use the {0:d}KB flash version of stm32f103rct6 chip.'.format(flash_size)) + print('Use the {0:s} address as the marlin app entry point.'.format(vect_tab_addr)) + print('Use the {0:d}KB flash version of stm32f103rct6 chip.'.format(flash_size)) diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py index 2cab2ce5c1..ecb0cc145c 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py @@ -3,25 +3,25 @@ # import pioutil if pioutil.is_pio_build(): - from os.path import join - from os.path import expandvars - Import("env") + from os.path import join + from os.path import expandvars + Import("env") - # Custom HEX from ELF - env.AddPostAction( - join("$BUILD_DIR", "${PROGNAME}.elf"), - env.VerboseAction(" ".join([ - "$OBJCOPY", "-O ihex", "$TARGET", - "\"" + join("$BUILD_DIR", "${PROGNAME}.hex") + "\"", # Note: $BUILD_DIR is a full path - ]), "Building $TARGET")) + # Custom HEX from ELF + env.AddPostAction( + join("$BUILD_DIR", "${PROGNAME}.elf"), + env.VerboseAction(" ".join([ + "$OBJCOPY", "-O ihex", "$TARGET", + "\"" + join("$BUILD_DIR", "${PROGNAME}.hex") + "\"", # Note: $BUILD_DIR is a full path + ]), "Building $TARGET")) - # In-line command with arguments - UPLOAD_TOOL="stm32flash" - platform = env.PioPlatform() - if platform.get_package_dir("tool-stm32duino") != None: - UPLOAD_TOOL=expandvars("\"" + join(platform.get_package_dir("tool-stm32duino"),"stm32flash","stm32flash") + "\"") + # In-line command with arguments + UPLOAD_TOOL="stm32flash" + platform = env.PioPlatform() + if platform.get_package_dir("tool-stm32duino") != None: + UPLOAD_TOOL=expandvars("\"" + join(platform.get_package_dir("tool-stm32duino"),"stm32flash","stm32flash") + "\"") - env.Replace( - UPLOADER=UPLOAD_TOOL, - UPLOADCMD=expandvars(UPLOAD_TOOL + " -v -i rts,-dtr,dtr -R -b 115200 -g 0x8000000 -w \"" + join("$BUILD_DIR","${PROGNAME}.hex")+"\"" + " $UPLOAD_PORT") - ) + env.Replace( + UPLOADER=UPLOAD_TOOL, + UPLOADCMD=expandvars(UPLOAD_TOOL + " -v -i rts,-dtr,dtr -R -b 115200 -g 0x8000000 -w \"" + join("$BUILD_DIR","${PROGNAME}.hex")+"\"" + " $UPLOAD_PORT") + ) diff --git a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py index 0eab7a8361..4189cb5899 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py @@ -3,29 +3,29 @@ # import pioutil if pioutil.is_pio_build(): - import shutil,marlin - from pathlib import Path + import shutil,marlin + from pathlib import Path - Import("env") - platform = env.PioPlatform() - board = env.BoardConfig() + Import("env") + platform = env.PioPlatform() + board = env.BoardConfig() - FRAMEWORK_DIR = Path(platform.get_package_dir("framework-arduinoststm32-maple")) - assert FRAMEWORK_DIR.is_dir() + FRAMEWORK_DIR = Path(platform.get_package_dir("framework-arduinoststm32-maple")) + assert FRAMEWORK_DIR.is_dir() - source_root = Path("buildroot/share/PlatformIO/variants") - assert source_root.is_dir() + source_root = Path("buildroot/share/PlatformIO/variants") + assert source_root.is_dir() - variant = board.get("build.variant") - variant_dir = FRAMEWORK_DIR / "STM32F1/variants" / variant + variant = board.get("build.variant") + variant_dir = FRAMEWORK_DIR / "STM32F1/variants" / variant - source_dir = source_root / variant - assert source_dir.is_dir() + source_dir = source_root / variant + assert source_dir.is_dir() - if variant_dir.is_dir(): - shutil.rmtree(variant_dir) + if variant_dir.is_dir(): + shutil.rmtree(variant_dir) - if not variant_dir.is_dir(): - variant_dir.mkdir() + if not variant_dir.is_dir(): + variant_dir.mkdir() - marlin.copytree(source_dir, variant_dir) + marlin.copytree(source_dir, variant_dir) diff --git a/buildroot/share/scripts/config-labels.py b/buildroot/share/scripts/config-labels.py index b721baf441..b571a434b7 100755 --- a/buildroot/share/scripts/config-labels.py +++ b/buildroot/share/scripts/config-labels.py @@ -47,150 +47,150 @@ different_out_dir = not (output_examples_dir == input_examples_dir) #---------------------------------------------- def process_file(subdir: str, filename: str): #---------------------------------------------- - global filenum - filenum += 1 + global filenum + filenum += 1 - print(str(filenum) + ' ' + filename + ': ' + subdir) + print(str(filenum) + ' ' + filename + ': ' + subdir) - def_line = (def_macro_name + ' "' + subdir.replace('\\', '/') + '"') + def_line = (def_macro_name + ' "' + subdir.replace('\\', '/') + '"') - #------------------------ - # Read file - #------------------------ - lines = [] - infilepath = Path(input_examples_dir, subdir, filename) - try: - # UTF-8 because some files contain unicode chars - with infilepath.open('rt', encoding="utf-8") as infile: - lines = infile.readlines() + #------------------------ + # Read file + #------------------------ + lines = [] + infilepath = Path(input_examples_dir, subdir, filename) + try: + # UTF-8 because some files contain unicode chars + with infilepath.open('rt', encoding="utf-8") as infile: + lines = infile.readlines() - except Exception as e: - print('Failed to read file: ' + str(e) ) - raise Exception + except Exception as e: + print('Failed to read file: ' + str(e) ) + raise Exception - lines = [line.rstrip('\r\n') for line in lines] + lines = [line.rstrip('\r\n') for line in lines] - #------------------------ - # Process lines - #------------------------ - file_modified = False + #------------------------ + # Process lines + #------------------------ + file_modified = False - # region state machine - # -1 = before pragma once; - # 0 = region to place define; - # 1 = past region to place define - region = -1 + # region state machine + # -1 = before pragma once; + # 0 = region to place define; + # 1 = past region to place define + region = -1 - outlines = [] - for line in lines: - outline = line + outlines = [] + for line in lines: + outline = line - if (region == -1) and (def_macro_name in line): - outline = None - file_modified = True + if (region == -1) and (def_macro_name in line): + outline = None + file_modified = True - elif (region == -1) and ('pragma once' in line): - region = 0 + elif (region == -1) and ('pragma once' in line): + region = 0 - elif (region == 0): - if (line.strip() == ''): - pass - elif (def_macro_name in line): - region = 1 - if line == def_line: # leave it as is - pass - else: - outline = def_line - file_modified = True - else: # some other string - outlines.append(def_line) - outlines.append('') - region = 1 - file_modified = True + elif (region == 0): + if (line.strip() == ''): + pass + elif (def_macro_name in line): + region = 1 + if line == def_line: # leave it as is + pass + else: + outline = def_line + file_modified = True + else: # some other string + outlines.append(def_line) + outlines.append('') + region = 1 + file_modified = True - elif (region == 1): - if (def_macro_name in line): - outline = None - file_modified = True - else: - pass + elif (region == 1): + if (def_macro_name in line): + outline = None + file_modified = True + else: + pass - # end if - if outline is not None: - outlines.append(outline) - # end for + # end if + if outline is not None: + outlines.append(outline) + # end for - #------------------------- - # Output file - #------------------------- - outdir = Path(output_examples_dir, subdir) - outfilepath = outdir / filename + #------------------------- + # Output file + #------------------------- + outdir = Path(output_examples_dir, subdir) + outfilepath = outdir / filename - if file_modified: - # Note: no need to create output dirs, as the initial copy_tree - # will do that. + if file_modified: + # Note: no need to create output dirs, as the initial copy_tree + # will do that. - print(' writing ' + str(outfilepath)) - try: - # Preserve unicode chars; Avoid CR-LF on Windows. - with outfilepath.open("w", encoding="utf-8", newline='\n') as outfile: - outfile.write("\n".join(outlines) + "\n") + print(' writing ' + str(outfilepath)) + try: + # Preserve unicode chars; Avoid CR-LF on Windows. + with outfilepath.open("w", encoding="utf-8", newline='\n') as outfile: + outfile.write("\n".join(outlines) + "\n") - except Exception as e: - print('Failed to write file: ' + str(e) ) - raise Exception - else: - print(' no change for ' + str(outfilepath)) + except Exception as e: + print('Failed to write file: ' + str(e) ) + raise Exception + else: + print(' no change for ' + str(outfilepath)) #---------- def main(): #---------- - global filenum - global input_examples_dir - global output_examples_dir - filenum = 0 + global filenum + global input_examples_dir + global output_examples_dir + filenum = 0 - #-------------------------------- - # Check for requirements - #-------------------------------- - input_examples_dir = input_examples_dir.strip() - input_examples_dir = input_examples_dir.rstrip('\\/') - output_examples_dir = output_examples_dir.strip() - output_examples_dir = output_examples_dir.rstrip('\\/') + #-------------------------------- + # Check for requirements + #-------------------------------- + input_examples_dir = input_examples_dir.strip() + input_examples_dir = input_examples_dir.rstrip('\\/') + output_examples_dir = output_examples_dir.strip() + output_examples_dir = output_examples_dir.rstrip('\\/') - for dir in (input_examples_dir, output_examples_dir): - if not Path(dir).exists(): - print('Directory not found: ' + dir) - sys.exit(1) + for dir in (input_examples_dir, output_examples_dir): + if not Path(dir).exists(): + print('Directory not found: ' + dir) + sys.exit(1) - #-------------------------------- - # Copy tree if necessary. - #-------------------------------- - # This includes files that are not otherwise included in the - # insertion of the define statement. - # - if different_out_dir: - print('Copying files to new directory: ' + output_examples_dir) - try: - copy_tree(input_examples_dir, output_examples_dir) - except Exception as e: - print('Failed to copy directory: ' + str(e) ) - raise Exception + #-------------------------------- + # Copy tree if necessary. + #-------------------------------- + # This includes files that are not otherwise included in the + # insertion of the define statement. + # + if different_out_dir: + print('Copying files to new directory: ' + output_examples_dir) + try: + copy_tree(input_examples_dir, output_examples_dir) + except Exception as e: + print('Failed to copy directory: ' + str(e) ) + raise Exception - #----------------------------- - # Find and process files - #----------------------------- - len_input_examples_dir = 1 + len(input_examples_dir) + #----------------------------- + # Find and process files + #----------------------------- + len_input_examples_dir = 1 + len(input_examples_dir) - for filename in files_to_mod: - input_path = Path(input_examples_dir) - filepathlist = input_path.rglob(filename) + for filename in files_to_mod: + input_path = Path(input_examples_dir) + filepathlist = input_path.rglob(filename) - for filepath in filepathlist: - fulldirpath = str(filepath.parent) - subdir = fulldirpath[len_input_examples_dir:] + for filepath in filepathlist: + fulldirpath = str(filepath.parent) + subdir = fulldirpath[len_input_examples_dir:] - process_file(subdir, filename) + process_file(subdir, filename) #============== print('--- Starting config-labels ---') diff --git a/buildroot/share/scripts/gen-tft-image.py b/buildroot/share/scripts/gen-tft-image.py index 9b7d19493e..f3786aef70 100644 --- a/buildroot/share/scripts/gen-tft-image.py +++ b/buildroot/share/scripts/gen-tft-image.py @@ -26,38 +26,38 @@ import sys,struct from PIL import Image def image2bin(image, output_file): - if output_file.endswith(('.c', '.cpp')): - f = open(output_file, 'wt') - is_cpp = True - f.write("const uint16_t image[%d] = {\n" % (image.size[1] * image.size[0])) - else: - f = open(output_file, 'wb') - is_cpp = False - pixs = image.load() - for y in range(image.size[1]): - for x in range(image.size[0]): - R = pixs[x, y][0] >> 3 - G = pixs[x, y][1] >> 2 - B = pixs[x, y][2] >> 3 - rgb = (R << 11) | (G << 5) | B - if is_cpp: - strHex = '0x{0:04X}, '.format(rgb) - f.write(strHex) - else: - f.write(struct.pack("B", (rgb & 0xFF))) - f.write(struct.pack("B", (rgb >> 8) & 0xFF)) - if is_cpp: - f.write("\n") - if is_cpp: - f.write("};\n") - f.close() + if output_file.endswith(('.c', '.cpp')): + f = open(output_file, 'wt') + is_cpp = True + f.write("const uint16_t image[%d] = {\n" % (image.size[1] * image.size[0])) + else: + f = open(output_file, 'wb') + is_cpp = False + pixs = image.load() + for y in range(image.size[1]): + for x in range(image.size[0]): + R = pixs[x, y][0] >> 3 + G = pixs[x, y][1] >> 2 + B = pixs[x, y][2] >> 3 + rgb = (R << 11) | (G << 5) | B + if is_cpp: + strHex = '0x{0:04X}, '.format(rgb) + f.write(strHex) + else: + f.write(struct.pack("B", (rgb & 0xFF))) + f.write(struct.pack("B", (rgb >> 8) & 0xFF)) + if is_cpp: + f.write("\n") + if is_cpp: + f.write("};\n") + f.close() if len(sys.argv) <= 2: - print("Utility to export a image in Marlin TFT friendly format.") - print("It will dump a raw bin RGB565 image or create a CPP file with an array of 16 bit image pixels.") - print("Usage: gen-tft-image.py INPUT_IMAGE.(png|bmp|jpg) OUTPUT_FILE.(cpp|bin)") - print("Author: rhapsodyv") - exit(1) + print("Utility to export a image in Marlin TFT friendly format.") + print("It will dump a raw bin RGB565 image or create a CPP file with an array of 16 bit image pixels.") + print("Usage: gen-tft-image.py INPUT_IMAGE.(png|bmp|jpg) OUTPUT_FILE.(cpp|bin)") + print("Author: rhapsodyv") + exit(1) output_img = sys.argv[2] img = Image.open(sys.argv[1]) diff --git a/buildroot/share/scripts/upload.py b/buildroot/share/scripts/upload.py index ef042fcded..caa1fbae23 100644 --- a/buildroot/share/scripts/upload.py +++ b/buildroot/share/scripts/upload.py @@ -25,320 +25,320 @@ import MarlinBinaryProtocol #-----------------# def Upload(source, target, env): - #-------# - # Debug # - #-------# - Debug = False # Set to True to enable script debug - def debugPrint(data): - if Debug: print(f"[Debug]: {data}") + #-------# + # Debug # + #-------# + Debug = False # Set to True to enable script debug + def debugPrint(data): + if Debug: print(f"[Debug]: {data}") - #------------------# - # Marlin functions # - #------------------# - def _GetMarlinEnv(marlinEnv, feature): - if not marlinEnv: return None - return marlinEnv[feature] if feature in marlinEnv else None + #------------------# + # Marlin functions # + #------------------# + def _GetMarlinEnv(marlinEnv, feature): + if not marlinEnv: return None + return marlinEnv[feature] if feature in marlinEnv else None - #----------------# - # Port functions # - #----------------# - def _GetUploadPort(env): - debugPrint('Autodetecting upload port...') - env.AutodetectUploadPort(env) - portName = env.subst('$UPLOAD_PORT') - if not portName: - raise Exception('Error detecting the upload port.') - debugPrint('OK') - return portName + #----------------# + # Port functions # + #----------------# + def _GetUploadPort(env): + debugPrint('Autodetecting upload port...') + env.AutodetectUploadPort(env) + portName = env.subst('$UPLOAD_PORT') + if not portName: + raise Exception('Error detecting the upload port.') + debugPrint('OK') + return portName - #-------------------------# - # Simple serial functions # - #-------------------------# - def _OpenPort(): - # Open serial port - if port.is_open: return - debugPrint('Opening upload port...') - port.open() - port.reset_input_buffer() - debugPrint('OK') + #-------------------------# + # Simple serial functions # + #-------------------------# + def _OpenPort(): + # Open serial port + if port.is_open: return + debugPrint('Opening upload port...') + port.open() + port.reset_input_buffer() + debugPrint('OK') - def _ClosePort(): - # Open serial port - if port is None: return - if not port.is_open: return - debugPrint('Closing upload port...') - port.close() - debugPrint('OK') + def _ClosePort(): + # Open serial port + if port is None: return + if not port.is_open: return + debugPrint('Closing upload port...') + port.close() + debugPrint('OK') - def _Send(data): - debugPrint(f'>> {data}') - strdata = bytearray(data, 'utf8') + b'\n' - port.write(strdata) - time.sleep(0.010) + def _Send(data): + debugPrint(f'>> {data}') + strdata = bytearray(data, 'utf8') + b'\n' + port.write(strdata) + time.sleep(0.010) - def _Recv(): - clean_responses = [] - responses = port.readlines() - for Resp in responses: - # Suppress invalid chars (coming from debug info) - try: - clean_response = Resp.decode('utf8').rstrip().lstrip() - clean_responses.append(clean_response) - debugPrint(f'<< {clean_response}') - except: - pass - return clean_responses + def _Recv(): + clean_responses = [] + responses = port.readlines() + for Resp in responses: + # Suppress invalid chars (coming from debug info) + try: + clean_response = Resp.decode('utf8').rstrip().lstrip() + clean_responses.append(clean_response) + debugPrint(f'<< {clean_response}') + except: + pass + return clean_responses - #------------------# - # SDCard functions # - #------------------# - def _CheckSDCard(): - debugPrint('Checking SD card...') - _Send('M21') - Responses = _Recv() - if len(Responses) < 1 or not any('SD card ok' in r for r in Responses): - raise Exception('Error accessing SD card') - debugPrint('SD Card OK') - return True + #------------------# + # SDCard functions # + #------------------# + def _CheckSDCard(): + debugPrint('Checking SD card...') + _Send('M21') + Responses = _Recv() + if len(Responses) < 1 or not any('SD card ok' in r for r in Responses): + raise Exception('Error accessing SD card') + debugPrint('SD Card OK') + return True - #----------------# - # File functions # - #----------------# - def _GetFirmwareFiles(UseLongFilenames): - debugPrint('Get firmware files...') - _Send(f"M20 F{'L' if UseLongFilenames else ''}") - Responses = _Recv() - if len(Responses) < 3 or not any('file list' in r for r in Responses): - raise Exception('Error getting firmware files') - debugPrint('OK') - return Responses + #----------------# + # File functions # + #----------------# + def _GetFirmwareFiles(UseLongFilenames): + debugPrint('Get firmware files...') + _Send(f"M20 F{'L' if UseLongFilenames else ''}") + Responses = _Recv() + if len(Responses) < 3 or not any('file list' in r for r in Responses): + raise Exception('Error getting firmware files') + debugPrint('OK') + return Responses - def _FilterFirmwareFiles(FirmwareList, UseLongFilenames): - Firmwares = [] - for FWFile in FirmwareList: - # For long filenames take the 3rd column of the firmwares list - if UseLongFilenames: - Space = 0 - Space = FWFile.find(' ') - if Space >= 0: Space = FWFile.find(' ', Space + 1) - if Space >= 0: FWFile = FWFile[Space + 1:] - if not '/' in FWFile and '.BIN' in FWFile.upper(): - Firmwares.append(FWFile[:FWFile.upper().index('.BIN') + 4]) - return Firmwares + def _FilterFirmwareFiles(FirmwareList, UseLongFilenames): + Firmwares = [] + for FWFile in FirmwareList: + # For long filenames take the 3rd column of the firmwares list + if UseLongFilenames: + Space = 0 + Space = FWFile.find(' ') + if Space >= 0: Space = FWFile.find(' ', Space + 1) + if Space >= 0: FWFile = FWFile[Space + 1:] + if not '/' in FWFile and '.BIN' in FWFile.upper(): + Firmwares.append(FWFile[:FWFile.upper().index('.BIN') + 4]) + return Firmwares - def _RemoveFirmwareFile(FirmwareFile): - _Send(f'M30 /{FirmwareFile}') - Responses = _Recv() - Removed = len(Responses) >= 1 and any('File deleted' in r for r in Responses) - if not Removed: - raise Exception(f"Firmware file '{FirmwareFile}' not removed") - return Removed + def _RemoveFirmwareFile(FirmwareFile): + _Send(f'M30 /{FirmwareFile}') + Responses = _Recv() + Removed = len(Responses) >= 1 and any('File deleted' in r for r in Responses) + if not Removed: + raise Exception(f"Firmware file '{FirmwareFile}' not removed") + return Removed - def _RollbackUpload(FirmwareFile): - if not rollback: return - print(f"Rollback: trying to delete firmware '{FirmwareFile}'...") - _OpenPort() - # Wait for SD card release - time.sleep(1) - # Remount SD card - _CheckSDCard() - print(' OK' if _RemoveFirmwareFile(FirmwareFile) else ' Error!') - _ClosePort() + def _RollbackUpload(FirmwareFile): + if not rollback: return + print(f"Rollback: trying to delete firmware '{FirmwareFile}'...") + _OpenPort() + # Wait for SD card release + time.sleep(1) + # Remount SD card + _CheckSDCard() + print(' OK' if _RemoveFirmwareFile(FirmwareFile) else ' Error!') + _ClosePort() - #---------------------# - # Callback Entrypoint # - #---------------------# - port = None - protocol = None - filetransfer = None - rollback = False + #---------------------# + # Callback Entrypoint # + #---------------------# + port = None + protocol = None + filetransfer = None + rollback = False - # Get Marlin evironment vars - MarlinEnv = env['MARLIN_FEATURES'] - marlin_pioenv = _GetMarlinEnv(MarlinEnv, 'PIOENV') - marlin_motherboard = _GetMarlinEnv(MarlinEnv, 'MOTHERBOARD') - marlin_board_info_name = _GetMarlinEnv(MarlinEnv, 'BOARD_INFO_NAME') - marlin_board_custom_build_flags = _GetMarlinEnv(MarlinEnv, 'BOARD_CUSTOM_BUILD_FLAGS') - marlin_firmware_bin = _GetMarlinEnv(MarlinEnv, 'FIRMWARE_BIN') - marlin_long_filename_host_support = _GetMarlinEnv(MarlinEnv, 'LONG_FILENAME_HOST_SUPPORT') is not None - marlin_longname_write = _GetMarlinEnv(MarlinEnv, 'LONG_FILENAME_WRITE_SUPPORT') is not None - marlin_custom_firmware_upload = _GetMarlinEnv(MarlinEnv, 'CUSTOM_FIRMWARE_UPLOAD') is not None - marlin_short_build_version = _GetMarlinEnv(MarlinEnv, 'SHORT_BUILD_VERSION') - marlin_string_config_h_author = _GetMarlinEnv(MarlinEnv, 'STRING_CONFIG_H_AUTHOR') + # Get Marlin evironment vars + MarlinEnv = env['MARLIN_FEATURES'] + marlin_pioenv = _GetMarlinEnv(MarlinEnv, 'PIOENV') + marlin_motherboard = _GetMarlinEnv(MarlinEnv, 'MOTHERBOARD') + marlin_board_info_name = _GetMarlinEnv(MarlinEnv, 'BOARD_INFO_NAME') + marlin_board_custom_build_flags = _GetMarlinEnv(MarlinEnv, 'BOARD_CUSTOM_BUILD_FLAGS') + marlin_firmware_bin = _GetMarlinEnv(MarlinEnv, 'FIRMWARE_BIN') + marlin_long_filename_host_support = _GetMarlinEnv(MarlinEnv, 'LONG_FILENAME_HOST_SUPPORT') is not None + marlin_longname_write = _GetMarlinEnv(MarlinEnv, 'LONG_FILENAME_WRITE_SUPPORT') is not None + marlin_custom_firmware_upload = _GetMarlinEnv(MarlinEnv, 'CUSTOM_FIRMWARE_UPLOAD') is not None + marlin_short_build_version = _GetMarlinEnv(MarlinEnv, 'SHORT_BUILD_VERSION') + marlin_string_config_h_author = _GetMarlinEnv(MarlinEnv, 'STRING_CONFIG_H_AUTHOR') - # Get firmware upload params - upload_firmware_source_name = str(source[0]) # Source firmware filename - upload_speed = env['UPLOAD_SPEED'] if 'UPLOAD_SPEED' in env else 115200 - # baud rate of serial connection - upload_port = _GetUploadPort(env) # Serial port to use + # Get firmware upload params + upload_firmware_source_name = str(source[0]) # Source firmware filename + upload_speed = env['UPLOAD_SPEED'] if 'UPLOAD_SPEED' in env else 115200 + # baud rate of serial connection + upload_port = _GetUploadPort(env) # Serial port to use - # Set local upload params - upload_firmware_target_name = os.path.basename(upload_firmware_source_name) - # Target firmware filename - upload_timeout = 1000 # Communication timout, lossy/slow connections need higher values - upload_blocksize = 512 # Transfer block size. 512 = Autodetect - upload_compression = True # Enable compression - upload_error_ratio = 0 # Simulated corruption ratio - upload_test = False # Benchmark the serial link without storing the file - upload_reset = True # Trigger a soft reset for firmware update after the upload + # Set local upload params + upload_firmware_target_name = os.path.basename(upload_firmware_source_name) + # Target firmware filename + upload_timeout = 1000 # Communication timout, lossy/slow connections need higher values + upload_blocksize = 512 # Transfer block size. 512 = Autodetect + upload_compression = True # Enable compression + upload_error_ratio = 0 # Simulated corruption ratio + upload_test = False # Benchmark the serial link without storing the file + upload_reset = True # Trigger a soft reset for firmware update after the upload - # Set local upload params based on board type to change script behavior - # "upload_delete_old_bins": delete all *.bin files in the root of SD Card - upload_delete_old_bins = marlin_motherboard in ['BOARD_CREALITY_V4', 'BOARD_CREALITY_V4210', 'BOARD_CREALITY_V422', 'BOARD_CREALITY_V423', - 'BOARD_CREALITY_V427', 'BOARD_CREALITY_V431', 'BOARD_CREALITY_V452', 'BOARD_CREALITY_V453', - 'BOARD_CREALITY_V24S1'] - # "upload_random_name": generate a random 8.3 firmware filename to upload - upload_random_filename = marlin_motherboard in ['BOARD_CREALITY_V4', 'BOARD_CREALITY_V4210', 'BOARD_CREALITY_V422', 'BOARD_CREALITY_V423', - 'BOARD_CREALITY_V427', 'BOARD_CREALITY_V431', 'BOARD_CREALITY_V452', 'BOARD_CREALITY_V453', - 'BOARD_CREALITY_V24S1'] and not marlin_long_filename_host_support + # Set local upload params based on board type to change script behavior + # "upload_delete_old_bins": delete all *.bin files in the root of SD Card + upload_delete_old_bins = marlin_motherboard in ['BOARD_CREALITY_V4', 'BOARD_CREALITY_V4210', 'BOARD_CREALITY_V422', 'BOARD_CREALITY_V423', + 'BOARD_CREALITY_V427', 'BOARD_CREALITY_V431', 'BOARD_CREALITY_V452', 'BOARD_CREALITY_V453', + 'BOARD_CREALITY_V24S1'] + # "upload_random_name": generate a random 8.3 firmware filename to upload + upload_random_filename = marlin_motherboard in ['BOARD_CREALITY_V4', 'BOARD_CREALITY_V4210', 'BOARD_CREALITY_V422', 'BOARD_CREALITY_V423', + 'BOARD_CREALITY_V427', 'BOARD_CREALITY_V431', 'BOARD_CREALITY_V452', 'BOARD_CREALITY_V453', + 'BOARD_CREALITY_V24S1'] and not marlin_long_filename_host_support - try: + try: - # Start upload job - print(f"Uploading firmware '{os.path.basename(upload_firmware_target_name)}' to '{marlin_motherboard}' via '{upload_port}'") + # Start upload job + print(f"Uploading firmware '{os.path.basename(upload_firmware_target_name)}' to '{marlin_motherboard}' via '{upload_port}'") - # Dump some debug info - if Debug: - print('Upload using:') - print('---- Marlin -----------------------------------') - print(f' PIOENV : {marlin_pioenv}') - print(f' SHORT_BUILD_VERSION : {marlin_short_build_version}') - print(f' STRING_CONFIG_H_AUTHOR : {marlin_string_config_h_author}') - print(f' MOTHERBOARD : {marlin_motherboard}') - print(f' BOARD_INFO_NAME : {marlin_board_info_name}') - print(f' CUSTOM_BUILD_FLAGS : {marlin_board_custom_build_flags}') - print(f' FIRMWARE_BIN : {marlin_firmware_bin}') - print(f' LONG_FILENAME_HOST_SUPPORT : {marlin_long_filename_host_support}') - print(f' LONG_FILENAME_WRITE_SUPPORT : {marlin_longname_write}') - print(f' CUSTOM_FIRMWARE_UPLOAD : {marlin_custom_firmware_upload}') - print('---- Upload parameters ------------------------') - print(f' Source : {upload_firmware_source_name}') - print(f' Target : {upload_firmware_target_name}') - print(f' Port : {upload_port} @ {upload_speed} baudrate') - print(f' Timeout : {upload_timeout}') - print(f' Block size : {upload_blocksize}') - print(f' Compression : {upload_compression}') - print(f' Error ratio : {upload_error_ratio}') - print(f' Test : {upload_test}') - print(f' Reset : {upload_reset}') - print('-----------------------------------------------') + # Dump some debug info + if Debug: + print('Upload using:') + print('---- Marlin -----------------------------------') + print(f' PIOENV : {marlin_pioenv}') + print(f' SHORT_BUILD_VERSION : {marlin_short_build_version}') + print(f' STRING_CONFIG_H_AUTHOR : {marlin_string_config_h_author}') + print(f' MOTHERBOARD : {marlin_motherboard}') + print(f' BOARD_INFO_NAME : {marlin_board_info_name}') + print(f' CUSTOM_BUILD_FLAGS : {marlin_board_custom_build_flags}') + print(f' FIRMWARE_BIN : {marlin_firmware_bin}') + print(f' LONG_FILENAME_HOST_SUPPORT : {marlin_long_filename_host_support}') + print(f' LONG_FILENAME_WRITE_SUPPORT : {marlin_longname_write}') + print(f' CUSTOM_FIRMWARE_UPLOAD : {marlin_custom_firmware_upload}') + print('---- Upload parameters ------------------------') + print(f' Source : {upload_firmware_source_name}') + print(f' Target : {upload_firmware_target_name}') + print(f' Port : {upload_port} @ {upload_speed} baudrate') + print(f' Timeout : {upload_timeout}') + print(f' Block size : {upload_blocksize}') + print(f' Compression : {upload_compression}') + print(f' Error ratio : {upload_error_ratio}') + print(f' Test : {upload_test}') + print(f' Reset : {upload_reset}') + print('-----------------------------------------------') - # Custom implementations based on board parameters - # Generate a new 8.3 random filename - if upload_random_filename: - upload_firmware_target_name = f"fw-{''.join(random.choices('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', k=5))}.BIN" - print(f"Board {marlin_motherboard}: Overriding firmware filename to '{upload_firmware_target_name}'") + # Custom implementations based on board parameters + # Generate a new 8.3 random filename + if upload_random_filename: + upload_firmware_target_name = f"fw-{''.join(random.choices('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', k=5))}.BIN" + print(f"Board {marlin_motherboard}: Overriding firmware filename to '{upload_firmware_target_name}'") - # Delete all *.bin files on the root of SD Card (if flagged) - if upload_delete_old_bins: - # CUSTOM_FIRMWARE_UPLOAD is needed for this feature - if not marlin_custom_firmware_upload: - raise Exception(f"CUSTOM_FIRMWARE_UPLOAD must be enabled in 'Configuration_adv.h' for '{marlin_motherboard}'") + # Delete all *.bin files on the root of SD Card (if flagged) + if upload_delete_old_bins: + # CUSTOM_FIRMWARE_UPLOAD is needed for this feature + if not marlin_custom_firmware_upload: + raise Exception(f"CUSTOM_FIRMWARE_UPLOAD must be enabled in 'Configuration_adv.h' for '{marlin_motherboard}'") - # Init & Open serial port - port = serial.Serial(upload_port, baudrate = upload_speed, write_timeout = 0, timeout = 0.1) - _OpenPort() + # Init & Open serial port + port = serial.Serial(upload_port, baudrate = upload_speed, write_timeout = 0, timeout = 0.1) + _OpenPort() - # Check SD card status - _CheckSDCard() + # Check SD card status + _CheckSDCard() - # Get firmware files - FirmwareFiles = _GetFirmwareFiles(marlin_long_filename_host_support) - if Debug: - for FirmwareFile in FirmwareFiles: - print(f'Found: {FirmwareFile}') + # Get firmware files + FirmwareFiles = _GetFirmwareFiles(marlin_long_filename_host_support) + if Debug: + for FirmwareFile in FirmwareFiles: + print(f'Found: {FirmwareFile}') - # Get all 1st level firmware files (to remove) - OldFirmwareFiles = _FilterFirmwareFiles(FirmwareFiles[1:len(FirmwareFiles)-2], marlin_long_filename_host_support) # Skip header and footers of list - if len(OldFirmwareFiles) == 0: - print('No old firmware files to delete') - else: - print(f"Remove {len(OldFirmwareFiles)} old firmware file{'s' if len(OldFirmwareFiles) != 1 else ''}:") - for OldFirmwareFile in OldFirmwareFiles: - print(f" -Removing- '{OldFirmwareFile}'...") - print(' OK' if _RemoveFirmwareFile(OldFirmwareFile) else ' Error!') + # Get all 1st level firmware files (to remove) + OldFirmwareFiles = _FilterFirmwareFiles(FirmwareFiles[1:len(FirmwareFiles)-2], marlin_long_filename_host_support) # Skip header and footers of list + if len(OldFirmwareFiles) == 0: + print('No old firmware files to delete') + else: + print(f"Remove {len(OldFirmwareFiles)} old firmware file{'s' if len(OldFirmwareFiles) != 1 else ''}:") + for OldFirmwareFile in OldFirmwareFiles: + print(f" -Removing- '{OldFirmwareFile}'...") + print(' OK' if _RemoveFirmwareFile(OldFirmwareFile) else ' Error!') - # Close serial - _ClosePort() + # Close serial + _ClosePort() - # Cleanup completed - debugPrint('Cleanup completed') + # Cleanup completed + debugPrint('Cleanup completed') - # WARNING! The serial port must be closed here because the serial transfer that follow needs it! + # WARNING! The serial port must be closed here because the serial transfer that follow needs it! - # Upload firmware file - debugPrint(f"Copy '{upload_firmware_source_name}' --> '{upload_firmware_target_name}'") - protocol = MarlinBinaryProtocol.Protocol(upload_port, upload_speed, upload_blocksize, float(upload_error_ratio), int(upload_timeout)) - #echologger = MarlinBinaryProtocol.EchoProtocol(protocol) - protocol.connect() - # Mark the rollback (delete broken transfer) from this point on - rollback = True - filetransfer = MarlinBinaryProtocol.FileTransferProtocol(protocol) - transferOK = filetransfer.copy(upload_firmware_source_name, upload_firmware_target_name, upload_compression, upload_test) - protocol.disconnect() + # Upload firmware file + debugPrint(f"Copy '{upload_firmware_source_name}' --> '{upload_firmware_target_name}'") + protocol = MarlinBinaryProtocol.Protocol(upload_port, upload_speed, upload_blocksize, float(upload_error_ratio), int(upload_timeout)) + #echologger = MarlinBinaryProtocol.EchoProtocol(protocol) + protocol.connect() + # Mark the rollback (delete broken transfer) from this point on + rollback = True + filetransfer = MarlinBinaryProtocol.FileTransferProtocol(protocol) + transferOK = filetransfer.copy(upload_firmware_source_name, upload_firmware_target_name, upload_compression, upload_test) + protocol.disconnect() - # Notify upload completed - protocol.send_ascii('M117 Firmware uploaded' if transferOK else 'M117 Firmware upload failed') + # Notify upload completed + protocol.send_ascii('M117 Firmware uploaded' if transferOK else 'M117 Firmware upload failed') - # Remount SD card - print('Wait for SD card release...') - time.sleep(1) - print('Remount SD card') - protocol.send_ascii('M21') + # Remount SD card + print('Wait for SD card release...') + time.sleep(1) + print('Remount SD card') + protocol.send_ascii('M21') - # Transfer failed? - if not transferOK: - protocol.shutdown() - _RollbackUpload(upload_firmware_target_name) - else: - # Trigger firmware update - if upload_reset: - print('Trigger firmware update...') - protocol.send_ascii('M997', True) - protocol.shutdown() + # Transfer failed? + if not transferOK: + protocol.shutdown() + _RollbackUpload(upload_firmware_target_name) + else: + # Trigger firmware update + if upload_reset: + print('Trigger firmware update...') + protocol.send_ascii('M997', True) + protocol.shutdown() - print('Firmware update completed' if transferOK else 'Firmware update failed') - return 0 if transferOK else -1 + print('Firmware update completed' if transferOK else 'Firmware update failed') + return 0 if transferOK else -1 - except KeyboardInterrupt: - print('Aborted by user') - if filetransfer: filetransfer.abort() - if protocol: - protocol.disconnect() - protocol.shutdown() - _RollbackUpload(upload_firmware_target_name) - _ClosePort() - raise + except KeyboardInterrupt: + print('Aborted by user') + if filetransfer: filetransfer.abort() + if protocol: + protocol.disconnect() + protocol.shutdown() + _RollbackUpload(upload_firmware_target_name) + _ClosePort() + raise - except serial.SerialException as se: - # This exception is raised only for send_ascii data (not for binary transfer) - print(f'Serial excepion: {se}, transfer aborted') - if protocol: - protocol.disconnect() - protocol.shutdown() - _RollbackUpload(upload_firmware_target_name) - _ClosePort() - raise Exception(se) + except serial.SerialException as se: + # This exception is raised only for send_ascii data (not for binary transfer) + print(f'Serial excepion: {se}, transfer aborted') + if protocol: + protocol.disconnect() + protocol.shutdown() + _RollbackUpload(upload_firmware_target_name) + _ClosePort() + raise Exception(se) - except MarlinBinaryProtocol.FatalError: - print('Too many retries, transfer aborted') - if protocol: - protocol.disconnect() - protocol.shutdown() - _RollbackUpload(upload_firmware_target_name) - _ClosePort() - raise + except MarlinBinaryProtocol.FatalError: + print('Too many retries, transfer aborted') + if protocol: + protocol.disconnect() + protocol.shutdown() + _RollbackUpload(upload_firmware_target_name) + _ClosePort() + raise - except Exception as ex: - print(f"\nException: {ex}, transfer aborted") - if protocol: - protocol.disconnect() - protocol.shutdown() - _RollbackUpload(upload_firmware_target_name) - _ClosePort() - print('Firmware not updated') - raise + except Exception as ex: + print(f"\nException: {ex}, transfer aborted") + if protocol: + protocol.disconnect() + protocol.shutdown() + _RollbackUpload(upload_firmware_target_name) + _ClosePort() + print('Firmware not updated') + raise # Attach custom upload callback env.Replace(UPLOADCMD=Upload)