Skip to content

Optimize MMU behaviour#353

Merged
DRracer merged 11 commits into
prusa3d:mainfrom
DRracer:bfw-7856
Dec 1, 2025
Merged

Optimize MMU behaviour#353
DRracer merged 11 commits into
prusa3d:mainfrom
DRracer:bfw-7856

Conversation

@DRracer

@DRracer DRracer commented Nov 24, 2025

Copy link
Copy Markdown
Collaborator

This PR is a collection of improvements in order to make tool changing even faster.
Of course, a corresponding counterpart on the printer's side will be necessary - i.e. this will NOT work on MK3-row of machines, so do not even attempt to use it unless you are willing to backport the changes to the 8bit printer's FW.

Hence the increased version of the MMU FW to 3.0.4.

The key ideas:

  • loading to nozzle: disengaging the Idler can happen while the printer is already pushing fillament down the nube
  • unloading: MMU can prepare the Idler into an intermediate position and start pulling as soon as the FSensor turns off
  • obviously, the unit tests had to be changed to reflect new behaviour

Some optimizations added to save space:

  • registers: dropped support for reading/writing raw memory areas, it hasn't been used (almost)
  • unified common LED behaviour into functions (that saved ~140B which is great)

@github-actions

github-actions Bot commented Nov 24, 2025

Copy link
Copy Markdown

All values in bytes. Δ Delta to base

ΔFlash ΔSRAM Used Flash Used SRAM Free Flash Free SRAM
166 6 28164 1673 508 887

@github-actions

github-actions Bot commented Nov 24, 2025

Copy link
Copy Markdown

Automated Test Code Coverage Report

View details...

File Lines Exec Cover
src/application.cpp 169 14 8%
src/application.h 3 3 100%
src/hal/circular_buffer.h 52 52 100%
src/hal/eeprom.h 1 0 0%
src/hal/gpio.h 18 7 38%
src/hal/progmem.h 6 6 100%
src/hal/tmc2130.cpp 113 9 7%
src/hal/tmc2130.h 31 27 87%
src/logic/command_base.cpp 139 118 84%
src/logic/command_base.h 4 3 75%
src/logic/cut_filament.cpp 117 80 68%
src/logic/eject_filament.cpp 77 60 77%
src/logic/feed_to_bondtech.cpp 60 57 95%
src/logic/feed_to_bondtech.h 1 1 100%
src/logic/feed_to_finda.cpp 48 45 93%
src/logic/feed_to_finda.h 1 1 100%
src/logic/home.cpp 18 12 66%
src/logic/load_filament.cpp 84 76 90%
src/logic/load_filament.h 1 0 0%
src/logic/move_selector.cpp 21 0 0%
src/logic/no_command.h 2 1 50%
src/logic/retract_from_finda.cpp 27 21 77%
src/logic/retract_from_finda.h 1 1 100%
src/logic/set_mode.cpp 5 0 0%
src/logic/set_mode.h 1 0 0%
src/logic/start_up.cpp 38 26 68%
src/logic/start_up.h 4 4 100%
src/logic/tool_change.cpp 107 85 79%
src/logic/unload_filament.cpp 81 61 75%
src/logic/unload_to_finda.cpp 50 46 92%
src/logic/unload_to_finda.h 1 1 100%
src/modules/axisunit.h 21 21 100%
src/modules/buttons.cpp 11 11 100%
src/modules/buttons.h 7 7 100%
src/modules/crc.h 13 13 100%
src/modules/debouncer.cpp 28 24 85%
src/modules/debouncer.h 7 7 100%
src/modules/finda.cpp 7 3 42%
src/modules/finda.h 2 2 100%
src/modules/fsensor.cpp 6 6 100%
src/modules/fsensor.h 3 3 100%
src/modules/globals.cpp 47 42 89%
src/modules/globals.h 34 24 70%
src/modules/idler.cpp 80 73 91%
src/modules/idler.h 12 12 100%
src/modules/leds.cpp 56 54 96%
src/modules/leds.h 16 15 93%
src/modules/math.h 6 6 100%
src/modules/motion.cpp 59 40 67%
src/modules/motion.h 66 64 96%
src/modules/movable_base.cpp 73 69 94%
src/modules/movable_base.h 16 16 100%
src/modules/permanent_storage.cpp 144 89 61%
src/modules/protocol.cpp 216 184 85%
src/modules/protocol.h 72 70 97%
src/modules/pulley.cpp 26 25 96%
src/modules/pulley.h 9 5 55%
src/modules/pulse_gen.cpp 95 89 93%
src/modules/pulse_gen.h 53 51 96%
src/modules/selector.cpp 69 62 89%
src/modules/selector.h 5 5 100%
src/modules/speed_table.h 26 24 92%
src/modules/user_input.cpp 39 39 100%
src/modules/user_input.h 12 12 100%
src/modules/voltage.cpp 4 0 0%
src/registers.cpp 86 22 25%
src/unit.h 12 12 100%
TOTAL 2719 2018 74%

TOTAL: 2719 lines of code, 2018 lines executed, 74% covered.

Comment thread src/registers.cpp Outdated
gudnimg
gudnimg previously approved these changes Nov 29, 2025

@gudnimg gudnimg left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes look good to me. I don't spot any issues with the code. 👍

Comment thread src/logic/cut_filament.cpp
D.R.racer added 5 commits December 1, 2025 09:09
Beware: behaviour breaking change, from now on non-reworked MK4 and MK3 cannot work with the MMU
because there is no way to turn off their fsensor and trigger the unload.

Hence the version bump to 3.0.4

But, on MMU-reworked MK4 and C1 this saves 2s per toolchange
D.R.racer added 6 commits December 1, 2025 09:11
In the entire code base, we basically use 4 LED scenarios:
- all off
- active slot green on
- active slot green blinking
- active slot red blinking

Compacting this behaviour into 4 functions saves in total ~140B - which is huge.
It's not an entirely clean solution, LEDs should not know anything about globals::ActiveSlot, but the savings are more important.
Ideally, such an optimization could have been done by the compiler.

@gudnimg gudnimg left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀

@DRracer DRracer merged commit 48d4d92 into prusa3d:main Dec 1, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants