#pragma once #include "DevDefs.h" #include #include namespace Slic3r { // Previous definitions class MachineObject; class DevExtder; class DevAmsTray; // Filament Track Switch (H2-family hardware). // The filament blacklist consumes IsInstalled() for the `has_filament_switch` // rule (e.g. PLA Silk). m_is_installed defaults to false and is only raised when // the device reports the switch over MQTT (aux bit 29), so the rule stays inert on // every printer that does not report an installed switch. class DevFilaSwitch { public: enum class CaliStatus : int { CALI_IDLE = 0, CALI_STEPING = 1, }; enum class CaliStep : int { CALI_IDLE = 0, CALI_SWITCHING = 1, CALI_SWITCH_CHECK = 2, CALI_FILA_CHECK = 3, CALI_FILA_TO_AMS = 4, CALI_FILA_TO_SWITCH = 5, CALI_FILA_BACK = 9, CALI_FINISHED = 14, }; enum SwitchPos : int { POS_IN_B = 0, POS_IN_A = 1, }; public: DevFilaSwitch(MachineObject* owner); virtual ~DevFilaSwitch() = default; public: bool IsInstalled() const { return m_is_installed; }; // Ready once installed and every AMS has resolved both its extruder binding and its // switcher track position from the device. The send dialog and sidebar sync UX only // treat the switch as usable when this is true. bool IsReady() const; std::optional IsInA_HasFilament() const { return m_in_a_has_filament; }; std::optional IsInB_HasFilament() const { return m_in_b_has_filament; }; std::optional GetInA_Slot() const; std::optional GetInB_Slot() const; std::optional GetInA_SlotId() const { return m_in_a_slot; }; std::optional GetInB_SlotId() const { return m_in_b_slot; }; std::optional GetOutA_Extruder() const; std::optional GetOutB_Extruder() const; std::optional GetOutA_ExtruderId() const { return m_out_a_extruder_id; }; std::optional GetOutB_ExtruderId() const { return m_out_b_extruder_id; }; CaliStatus GetCaliStatus() const { return m_cali_status; }; void Reset(); void ParseFilaSwitchInfo(const nlohmann::json& print_jj); private: MachineObject* m_owner; bool m_is_installed = false; std::optional m_in_a_has_filament; std::optional m_in_b_has_filament; std::optional m_in_a_slot; std::optional m_in_b_slot; std::optional m_out_a_extruder_id; std::optional m_out_b_extruder_id; CaliStatus m_cali_status = CaliStatus::CALI_IDLE; }; };