#!/bin/bash # https://docs.vorondesign.com/community/howto/drachenkatze/automating_klipper_mcu_updates.html # https://canbus.esoterical.online/mainboard_klipper_updating.html # Status tracking declare -A FLASH_STATUS declare -A FLASH_OUTPUT # CAN devices to check (name -> uuid) — CAN BRIDGE MUST BE LAST declare -A CAN_DEVICES declare -a CAN_DEVICE_ORDER # preserve order since bash associative arrays don't CAN_DEVICES["MC_1 (BoxTurtle)"]="acc4091027b4" CAN_DEVICES["EBB42"]="4b5324a91849" CAN_DEVICES["Turtle_1"]="59a2feeada77" CAN_DEVICES["Main MCU"]="5a2b9f704f54" # CAN bridge — LAST CAN_DEVICE_ORDER=("MC_1 (BoxTurtle)" "EBB42" "Turtle_1" "Main MCU") # NHK and iHeater are serial devices, not CAN — skipped from CAN check flash_device() { local name="$1" shift local output output=$("$@" 2>&1) local exit_code=$? FLASH_OUTPUT["$name"]="$output" if [ $exit_code -eq 0 ]; then FLASH_STATUS["$name"]="✅ SUCCESS" else FLASH_STATUS["$name"]="❌ FAILED (exit $exit_code)" fi echo "$output" return $exit_code } print_summary() { printf "\n========================================\n" printf " FIRMWARE UPDATE SUMMARY\n" printf "========================================\n" local all_ok=true for name in "Main MCU" "MC_1 (BoxTurtle)" "NHK" "EBB42" "Turtle_1" "iHeater"; do local status="${FLASH_STATUS[$name]:-⚠️ SKIPPED}" printf "%-20s %s\n" "$name" "$status" if [[ "$status" != *"SUCCESS"* ]]; then all_ok=false fi done printf "========================================\n" if $all_ok; then printf "All devices updated successfully! 🎉\n" else printf "Some devices failed or were skipped.\n" printf "\nFailed device details:\n" for name in "Main MCU" "MC_1 (BoxTurtle)" "NHK" "EBB42" "Turtle_1" "iHeater"; do if [[ "${FLASH_STATUS[$name]}" == *"FAILED"* ]]; then printf "\n--- %s ---\n" "$name" printf "%s\n" "${FLASH_OUTPUT[$name]}" fi done fi printf "========================================\n" } printf "Pulling klipper changes\n" sudo service klipper stop cd ~/katapult printf "\nUpdate MC_1 firmware\n" # MC_1 make clean make clean KCONFIG_CONFIG=BoxTurtleMC make KCONFIG_CONFIG=BoxTurtleMC flash_device "MC_1 (BoxTurtle)" python3 ~/katapult/scripts/flashtool.py -i can0 -f ~/katapult/out/katapult.bin -u acc4091027b4 printf "Update nhk firmware\n" # nhk # https://docs.ldomotors.com/en/Toolboard/nitehawk-sb-v2 make clean make clean KCONFIG_CONFIG=nhk make KCONFIG_CONFIG=nhk flash_device "NHK" make flash KCONFIG_CONFIG=nhk FLASH_DEVICE=/dev/serial/by-id/usb-Klipper_stm32g0b1xx_550039000A50315058393320-if00 printf "Update EBB42 firmware\n" # EBB42 # https://canbus.esoterical.online/toolhead_flashing/common_hardware/BigTreeTech%20EBB42%20V1.2/README.html make clean make clean KCONFIG_CONFIG=EBB42 make KCONFIG_CONFIG=EBB42 flash_device "EBB42" python3 ~/katapult/scripts/flashtool.py -i can0 -f ~/katapult/out/katapult.bin -u 4b5324a91849 printf "Update Turtle_1 firmware\n" # Turtle_1 make clean make clean KCONFIG_CONFIG=Turtle_1 make KCONFIG_CONFIG=Turtle_1 flash_device "Turtle_1" python3 ~/katapult/scripts/flashtool.py -i can0 -f ~/katapult/out/katapult.bin -u 59a2feeada77 printf "Update Mcu firmware\n" # Main Mcu make clean make clean KCONFIG_CONFIG=leviathan make KCONFIG_CONFIG=leviathan flash_device "Main MCU" python3 ~/katapult/scripts/flashtool.py -i can0 -f ~/katapult/out/katapult.bin -u 5a2b9f704f54 #flash_device "Main MCU" python3 ~/katapult/scripts/flashtool.py -f ~/katapult/out/katapult.bin -d /dev/serial/by-id/usb-Klipper_stm32f446xx_3B0017000251303532383235-if00 printf "Update iHeater firmware\n" # iHeater make clean make clean KCONFIG_CONFIG=iHeater make KCONFIG_CONFIG=iHeater flash_device "iHeater" python3 ~/katapult/scripts/flashtool.py -f ~/katapult/out/katapult.bin -d /dev/serial/by-id/usb-Klipper_stm32f042x6_0C0020000E43304754393320-if00