Плагин и патчи#

Два артефакта живут в репозитории как исходники под версионным контролем и задокументированы здесь. Они остаются кодом — сайт их описывает, репозиторий их хранит.

sovol_codes — плагин кодов экрана-крутилки#

Вендорский форк Klipper показывает числовые коды на экране-крутилке (101, 103, диапазон shutdown 60+), редактируя upstream-файлы ядра на местеklippy/extras/homing.py, klippy/klippy.py, klippy/kinematics/corexy.py. Это связывает продуктовый UI с ядром Klipper, и поэтому принтер застрял на сквошнутом вендорском снапшоте вместо трекинга upstream.

Плагин sovol_codes.py воспроизводит те же коды экрана с нулём правок в ядре, используя только публичные точки расширения Klipper:

  • gcode.register_output_handler(cb) видит каждое сообщение, которое выдаёт Klipper, так что описательный текст маппится в свой код (101 x) без вмешательства в путь, который его породил.
  • register_event_handler("klippy:shutdown", …) ловит причину shutdown для кодов 60+ (плагин регистрирует и переименованное вендором событие).
  • Совпадение пишется прямо в display_status.message — то же поле, что задаёт M117, но без прогона gcode-команды через диспетчер, так что это работает и в состоянии ready, и в shutdown.

Таблица message → code — это официальный список кодов экрана SOVOL ZERO, реализованный как чистая функция lookup_code(), полностью покрытая юнит-тестами без нужды в рантайме Klipper (python3 -m unittest test_sovol_codes -v). Установка и включение — на странице плагинов.

Пределы точности против вендорского экрана#

Референсный список описывает экран вендорской прошивки; часть кодов идёт из сообщений, которые существуют только в модифицированном Klipper от Sovol, а текст экрана не всегда совпадает с буквальным сообщением Klipper. Плагин намеренно честен насчёт пробелов, а не подгоняет выдуманные строки:

  • Покрытие сток против вендора. Коды, чья якорная строка есть в стоковом upstream (большинство 101124 плюс причины shutdown 6072), срабатывают на чистом чекауте Klipper3d/klipper. Коды 73, 109, 110, 117, 123, 125 идут из вендор-онли кода и срабатывают только на вендорском / коммьюнити-форке, который несёт эти сообщения.
  • Код 109 использует реальную формулировку, а не текст из списка — аддон поднимает “Toolhead probe more than ten times”, так что правило якорится на этой строке.
  • Коды 104 и 105 выдаются без буквы оси — upstream формирует их как статические строки только с координатами, так что индекс оси теряется ещё до появления строки.
  • Коды 112 и 113 (LDC1612 I2C bus busy / error) не матчатся вообще — такой строки на стороне хоста не существует; LDC1612 репортит ошибки как числовые перечисления от MCU, а не как стабильный текст.

Это не кандидат в mainline Klipper: числовые коды — продукто-специфичный UI для тачскрина Sovol, а Klipper намеренно держит человекочитаемые сообщения и оставляет презентацию верхнему слою. Опциональный плагин в extras/ на немодифицированном upstream — ровно правильный дом: принтер может одновременно следовать mainline и сохранять свои коды экрана.

Происхождение вендорских патчей#

Директория klipper-patches/ держит содержательные (не version-bump) вендорские коммиты, извлечённые как файлы git format-patch. Они существуют как запись того, что вендор изменил — полезно, когда решаешь, что будет потеряно при прошивке стокового Klipper или коммьюнити-форка.

Klipper на принтере — вендорский форк Sovol на 1.4.5 (8a8b5e8) со сквошнутой upstream-историей: авторства Kevin O'Connor не осталось, так что базовую upstream-версию из git не восстановить. Это непрозрачный снапшот, а не чистый ребейз.

КоммитЧто делаетРелевантность для upstream
503f61dЗаново включает все типы input-shaper; добавляет 15 мм запаса по Z в процедуре контактного пробингаНикакой — восстанавливает upstream-дефолт
36d4468Переделывает путь Z prompt-кода “105” во время калибровкиТолько вендорский UI
e88b61cДобавляет подъём по оси Z в поток калибровки стола по eddy-currentТолько вендорский поток
9366ec4Дорабатывает проприетарные prompt-коды “101”/“103”Только вендорский UI

Ничего из этого не является фиксом, которого upstream не хватает. «Разблокировка» input-shaper лишь возвращает в коде закомментированный upstream-дефолтный список AUTOTUNE_SHAPERS, который Sovol заменил на ['mzv'] (MZV-онли лок, на который жаловались в обзорах). Остальное вшивает проприетарные экранные prompt-коды Sovol в прошивку — инструментовка вендорского UI, привязанная к тачскрину, а не багфиксы. Реальная забота обратна: сквошнутый форк — скорее всего устаревшая upstream-база, несущая вендорский мусор, так что этот принтер скорее недосчитывается upstream-фиксов, чем держит хоть один.