Files
OrcaSlicer-KX/src/slic3r/GUI/DeviceCore/DevExtruderSystem.h
xin.zhang 4a787f6ff8 ENH: clean codes about device
JIRA: [STUDIO-13609]
Change-Id: I591de7033360b9570600006cfbce2148a8d031d5
(cherry picked from commit e9c774be8f4c89b8dafa14ef56913612fb68bd0c)
2025-10-02 09:30:48 +08:00

189 lines
6.6 KiB
C++

#pragma once
#include "libslic3r/CommonDefs.hpp"
#include "slic3r/Utils/json_diff.hpp"
#include <wx/string.h>
#include "DevDefs.h"
namespace Slic3r
{
//Previous definitions
class MachineObject;
class DevExtderSystem;
struct DevAmsSlotInfo
{
std::string ams_id;
std::string slot_id;
public:
bool operator==(const DevAmsSlotInfo& other) const { return ams_id == other.ams_id && slot_id == other.slot_id;}
};
enum DevExtderSwitchState
{
ES_IDLE = 0,
ES_BUSY,
ES_SWITCHING,
ES_SWITCHING_FAILED
};
class DevExtder
{
friend class MachineObject;
friend class ExtderSystemParser;
public:
DevExtder(DevExtderSystem* owner/*should not be nullptr*/, int id = -1) : system(owner), m_ext_id(id){};
public:
// Ext
int GetExtId() const { return m_ext_id; }
// display
wxString GetDisplayLoc() const;
wxString GetDisplayName() const;
// installed nozzle info
bool HasNozzleInstalled() const = delete;//{ return m_has_nozzle; }
int GetNozzleId() const { return m_current_nozzle_id; }
int GetTargetNozzleId() const = delete;//{ return m_target_nozzle_id; }
NozzleType GetNozzleType() const;
NozzleFlowType GetNozzleFlowType() const;
float GetNozzleDiameter() const;
// temperature
int GetCurrentTemp() const { return m_cur_temp; }
int GetTargetTemp() const { return m_target_temp; }
// filament
bool HasFilamentInExt() const { return m_ext_has_filament; }
bool HasFilamentInBuffer() const = delete; //{ return m_buffer_has_filament; }
bool HasFilamBackup() const { return !m_filam_bak.empty(); }
std::vector<int> GetFilamBackup() const { return m_filam_bak; }
// ams binding on current extruder
const DevAmsSlotInfo& GetSlotPre() const { return m_spre; }
const DevAmsSlotInfo& GetSlotNow() const { return m_snow; }
const DevAmsSlotInfo& GetSlotTarget() const { return m_star; }
private:
void SetExtId(int val) { m_ext_id = val; }
private:
DevExtderSystem* system = nullptr;
// extruder id
int m_ext_id; // 0-right 1-left
// current nozzle
bool m_has_nozzle = false;
int m_current_nozzle_id = 0; // nozzle id now. for some machine, the extruder may have serveral nozzles
int m_target_nozzle_id = 0; // target nozzle id
// temperature
int m_cur_temp = 0;
int m_target_temp = 0;
// filament
bool m_ext_has_filament = false;
bool m_buffer_has_filament = false;
std::vector<int> m_filam_bak;// the refill filam
// binded ams
DevAmsSlotInfo m_spre; // tray_pre
DevAmsSlotInfo m_snow; // tray_now
DevAmsSlotInfo m_star; // tray_tar
int m_ams_stat = 0;
int m_rfid_stat = 0;
};
// ExtderSystem is the extruder management system for the device.
// It consists of multiple extruders (Extder) and nozzles.
// Each extruder can be associated with different nozzles, and the number of extruders
// does not necessarily equal the number of nozzles.
// Note: The IDs of extruders and nozzles may not match or correspond one-to-one.
class DevExtderSystem
{
friend class MachineObject;
friend class ExtderSystemParser;
public:
DevExtderSystem(MachineObject* obj);
~DevExtderSystem() = default;
public:
MachineObject* Owner() const { return m_owner; }
// access extder info
int GetTotalExtderCount() const { assert(m_extders.size() == m_total_extder_count); return m_total_extder_count; }
int GetTotalExtderSize() const { return static_cast<int>(m_extders.size()); }
int GetCurrentExtderId() const { return m_current_extder_id; }
int GetTargetExtderId() const = delete;//{ return m_target_extder_id; }
// switching
DevExtderSwitchState GetSwitchState() const { return m_switch_extder_state; }
bool IsSwitching() const { return m_switch_extder_state == DevExtderSwitchState::ES_SWITCHING;};
bool IsSwitchingFailed() const { return m_switch_extder_state == DevExtderSwitchState::ES_SWITCHING_FAILED; };
bool CanQuitSwitching() const;
bool CanRetrySwitching() const { return IsSwitchingFailed(); };
int CtrlRetrySwitching();
int CtrlQuitSwitching();
std::optional<DevExtder> GetCurrentExtder() const;
std::optional<DevExtder> GetLoadingExtder() const;
std::optional<DevExtder> GetExtderById(int extder_id) const;
const std::vector<DevExtder>& GetExtruders() const { return m_extders;};
// get nozzle info which is installed on the extruder
NozzleType GetNozzleType(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetNozzleType() : NozzleType::ntUndefine; }
NozzleFlowType GetNozzleFlowType(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetNozzleFlowType() : NozzleFlowType::NONE_FLOWTYPE;; }
float GetNozzleDiameter(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetNozzleDiameter() : 0.0; }
int GetNozzleTempCurrent(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetCurrentTemp() : 0; }
int GetNozzleTempTarget(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetTargetTemp() : 0; }
// get slot info which is connected to the extruder
std::string GetCurrentAmsId() const;
std::string GetCurrentSlotId() const;
std::string GetTargetAmsId() const;
std::string GetTargetSlotId() const;
// filament
bool IsBusyLoading() const { return m_current_busy_for_loading; }
int GetLoadingExtderId() const { return m_current_loading_extder_id; }
bool HasFilamentBackup() const;
bool HasFilamentInExt(int exter_id) { return GetExtderById(exter_id) ? GetExtderById(exter_id)->HasFilamentInExt() : false; }
protected:
void AddExtder(const DevExtder& ext) { m_extders[ext.GetExtId()] = ext; };
private:
MachineObject* m_owner = nullptr;
// extruders
int m_total_extder_count = 1;
std::vector<DevExtder> m_extders;
// current extruder and swtching info
int m_current_extder_id = MAIN_EXTRUDER_ID;
// switching
DevExtderSwitchState m_switch_extder_state = DevExtderSwitchState::ES_IDLE;
int m_target_extder_id = MAIN_EXTRUDER_ID;
// loading extruder
bool m_current_busy_for_loading{ false };
int m_current_loading_extder_id = INVALID_EXTRUDER_ID;
};
class ExtderSystemParser
{
public:
static void ParseV1_0(const nlohmann::json& extruder_json, DevExtderSystem* system);
static void ParseV2_0(const nlohmann::json& extruder_json, DevExtderSystem* system);
};
};