Fixed active AMS slot display

This commit is contained in:
maziggy
2026-01-03 10:38:26 +01:00
parent 5dae3d3021
commit 226094982d
2 changed files with 59 additions and 26 deletions
+6 -2
View File
@@ -353,11 +353,12 @@ def _load_objects_from_archive(archive, printer_id: int, logger) -> None:
with open(file_path, "rb") as f:
threemf_data = f.read()
# Extract with positions for UI overlay
printable_objects = extract_printable_objects_from_3mf(threemf_data, include_positions=True)
printable_objects, bbox_all = extract_printable_objects_from_3mf(threemf_data, include_positions=True)
if printable_objects:
client = printer_manager.get_client(printer_id)
if client:
client.state.printable_objects = printable_objects
client.state.printable_objects_bbox_all = bbox_all
client.state.skipped_objects = []
logger.info(f"Loaded {len(printable_objects)} printable objects for printer {printer_id}")
except Exception as e:
@@ -774,12 +775,15 @@ async def on_print_start(printer_id: int, data: dict):
with open(temp_path, "rb") as f:
threemf_data = f.read()
# Extract with positions for UI overlay
printable_objects = extract_printable_objects_from_3mf(threemf_data, include_positions=True)
printable_objects, bbox_all = extract_printable_objects_from_3mf(
threemf_data, include_positions=True
)
if printable_objects:
# Store objects in printer state
client = printer_manager.get_client(printer_id)
if client:
client.state.printable_objects = printable_objects
client.state.printable_objects_bbox_all = bbox_all
client.state.skipped_objects = [] # Reset skipped objects for new print
logger.info(f"Loaded {len(printable_objects)} printable objects for printer {printer_id}")
except Exception as e:
+53 -24
View File
@@ -733,6 +733,7 @@ class BambuMQTTClient:
)
# Parse tray_now from AMS dict - this is the currently loaded tray global ID
# Note: tray_tar is also available but on H2D it's just slot number (0-3), not global ID
if "tray_now" in ams_data:
raw_tray_now = ams_data["tray_now"]
# Convert string to int if needed
@@ -775,33 +776,61 @@ class BambuMQTTClient:
active_ext = self.state.active_extruder # 0=right, 1=left
ams_map = self.state.ams_extruder_map # {ams_id: extruder_id}
# Find the AMS connected to the active extruder
active_ams_id = None
for ams_id_str, ext_id in ams_map.items():
if ext_id == active_ext:
try:
active_ams_id = int(ams_id_str)
except ValueError:
pass
break
if active_ams_id is not None:
# Calculate global tray ID using the active AMS
global_tray_id = active_ams_id * 4 + parsed_tray_now
logger.info(
f"[{self.serial_number}] H2D tray_now disambiguation: "
f"slot {parsed_tray_now} + active_extruder {active_ext} -> AMS {active_ams_id} -> global ID {global_tray_id}"
)
self.state.tray_now = global_tray_id
else:
# No AMS found for active extruder - check if we already have a resolved global ID
current_tray = self.state.tray_now
if current_tray > 3 and current_tray != 255 and (current_tray % 4) == parsed_tray_now:
# Current tray_now is already a valid global ID that matches this slot
# First, check if current tray_now is already a valid global ID
# that matches this slot AND is connected to the active extruder
current_tray = self.state.tray_now
if current_tray > 3 and current_tray != 255 and (current_tray % 4) == parsed_tray_now:
current_ams = current_tray // 4
current_ams_extruder = ams_map.get(str(current_ams))
if current_ams_extruder == active_ext:
# Current tray is valid, matches slot, and on correct extruder - keep it
logger.debug(
f"[{self.serial_number}] H2D tray_now: keeping existing global ID {current_tray} "
f"(matches incoming slot {parsed_tray_now})"
f"(slot {parsed_tray_now}, AMS {current_ams} on extruder {active_ext})"
)
# Don't update tray_now - it's already correct
pass
else:
# Current AMS is on wrong extruder - need to find correct AMS
active_ams_id = None
for ams_id_str, ext_id in ams_map.items():
if ext_id == active_ext:
try:
active_ams_id = int(ams_id_str)
except ValueError:
pass
break
if active_ams_id is not None:
global_tray_id = active_ams_id * 4 + parsed_tray_now
logger.info(
f"[{self.serial_number}] H2D tray_now disambiguation: "
f"slot {parsed_tray_now} + active_extruder {active_ext} -> AMS {active_ams_id} -> global ID {global_tray_id}"
)
self.state.tray_now = global_tray_id
else:
logger.warning(
f"[{self.serial_number}] H2D tray_now: no ams_extruder_map for active_extruder {active_ext}"
)
self.state.tray_now = parsed_tray_now
else:
# No valid current tray - find an AMS connected to the active extruder
active_ams_id = None
for ams_id_str, ext_id in ams_map.items():
if ext_id == active_ext:
try:
active_ams_id = int(ams_id_str)
except ValueError:
pass
break
if active_ams_id is not None:
# Calculate global tray ID using the active AMS
global_tray_id = active_ams_id * 4 + parsed_tray_now
logger.info(
f"[{self.serial_number}] H2D tray_now disambiguation: "
f"slot {parsed_tray_now} + active_extruder {active_ext} -> AMS {active_ams_id} -> global ID {global_tray_id}"
)
self.state.tray_now = global_tray_id
else:
# Fallback: use slot as-is
logger.warning(