ENH: Optimization of File Transfer System Part1

jira: [STUDIO-11777]

Change-Id: I733fd3532caa19546763ab8a72eb7667d5ffec53
This commit is contained in:
milk 2025-04-21 21:00:14 +08:00 committed by lane.wei
parent b8dde8ae7f
commit aa52c99076
6 changed files with 124 additions and 34 deletions

View File

@ -593,6 +593,13 @@ bool MachineObject::is_lan_mode_printer()
return result; return result;
} }
std::string MachineObject::convertToIp(long long ip)
{
std::stringstream ss;
ss << ((ip >> 0) & 0xFF) << "." << ((ip >> 8) & 0xFF) << "." << ((ip >> 16) & 0xFF) << "." << ((ip >> 24) & 0xFF);
return ss.str();
}
PrinterSeries MachineObject::get_printer_series() const PrinterSeries MachineObject::get_printer_series() const
{ {
std::string series = DeviceManager::get_printer_series(printer_type); std::string series = DeviceManager::get_printer_series(printer_type);
@ -3797,8 +3804,24 @@ int MachineObject::parse_json(std::string payload, bool key_field_only)
if (jj["net"].contains("conf")) { if (jj["net"].contains("conf")) {
network_wired = (jj["net"]["conf"].get<int>() & (0x1)) != 0; network_wired = (jj["net"]["conf"].get<int>() & (0x1)) != 0;
} }
if (jj["net"].contains("info")) {
for (auto info_item = jj["net"]["info"].begin(); info_item != jj["net"]["info"].end(); info_item++) {
if (info_item->contains("ip")) {
auto tmp_dev_ip = (*info_item)["ip"].get<int64_t>();
if (tmp_dev_ip == 0)
continue ;
else {
set_dev_ip(convertToIp(tmp_dev_ip));
}
} else {
break;
}
}
}
} }
} }
#pragma endregion #pragma endregion
#pragma region online #pragma region online

View File

@ -647,6 +647,7 @@ public:
int subscribe_counter{3}; int subscribe_counter{3};
std::string dev_connection_type; /* lan | cloud */ std::string dev_connection_type; /* lan | cloud */
std::string connection_type() { return dev_connection_type; } std::string connection_type() { return dev_connection_type; }
std::string dev_connection_name; /* lan | eth */ std::string dev_connection_name; /* lan | eth */
void set_dev_ip(std::string ip) {dev_ip = ip;} void set_dev_ip(std::string ip) {dev_ip = ip;}
std::string get_ftp_folder(); std::string get_ftp_folder();
@ -658,6 +659,7 @@ public:
void erase_user_access_code(); void erase_user_access_code();
std::string get_user_access_code(); std::string get_user_access_code();
bool is_lan_mode_printer(); bool is_lan_mode_printer();
std::string convertToIp(long long ip);
//PRINTER_TYPE printer_type = PRINTER_3DPrinter_UKNOWN; //PRINTER_TYPE printer_type = PRINTER_3DPrinter_UKNOWN;
std::string printer_type; /* model_id */ std::string printer_type; /* model_id */

View File

@ -1528,7 +1528,7 @@ void PrinterFileSystem::Reconnect(boost::unique_lock<boost::mutex> &l, int resul
if (m_session.owner == nullptr) if (m_session.owner == nullptr)
return; return;
json r; json r;
while (!m_callbacks.empty()) { while(!m_callbacks.empty()) {
auto c = m_callbacks.front(); auto c = m_callbacks.front();
m_callbacks.pop_front(); m_callbacks.pop_front();
++m_sequence; ++m_sequence;
@ -1541,6 +1541,8 @@ void PrinterFileSystem::Reconnect(boost::unique_lock<boost::mutex> &l, int resul
while (m_stopped) { while (m_stopped) {
if (m_session.owner == nullptr) if (m_session.owner == nullptr)
return; return;
m_status = Status::Stopped;
SendChangedEvent(EVT_STATUS_CHANGED, m_status);
m_cond.wait(l); m_cond.wait(l);
} }
wxLogMessage("PrinterFileSystem::Reconnect Initializing"); wxLogMessage("PrinterFileSystem::Reconnect Initializing");
@ -1567,6 +1569,7 @@ void PrinterFileSystem::Reconnect(boost::unique_lock<boost::mutex> &l, int resul
Bambu_Tunnel tunnel = nullptr; Bambu_Tunnel tunnel = nullptr;
int ret = Bambu_Create(&tunnel, url.c_str()); int ret = Bambu_Create(&tunnel, url.c_str());
if (ret == 0) { if (ret == 0) {
Bambu_SetLogger(tunnel, DumpLog, this); Bambu_SetLogger(tunnel, DumpLog, this);
ret = Bambu_Open(tunnel); ret = Bambu_Open(tunnel);
} }
@ -1575,7 +1578,7 @@ void PrinterFileSystem::Reconnect(boost::unique_lock<boost::mutex> &l, int resul
ret = Bambu_StartStreamEx ret = Bambu_StartStreamEx
? Bambu_StartStreamEx(tunnel, CTRL_TYPE) ? Bambu_StartStreamEx(tunnel, CTRL_TYPE)
: Bambu_StartStream(tunnel, false); : Bambu_StartStream(tunnel, false);
if (ret == Bambu_would_block) if (ret == Bambu_would_block) {}
boost::this_thread::sleep(boost::posix_time::milliseconds(100)); boost::this_thread::sleep(boost::posix_time::milliseconds(100));
} while (ret == Bambu_would_block && !m_stopped); } while (ret == Bambu_would_block && !m_stopped);
l.lock(); l.lock();
@ -1595,6 +1598,7 @@ void PrinterFileSystem::Reconnect(boost::unique_lock<boost::mutex> &l, int resul
} }
wxLogMessage("PrinterFileSystem::Reconnect Failed"); wxLogMessage("PrinterFileSystem::Reconnect Failed");
m_status = Status::Failed; m_status = Status::Failed;
SendChangedEvent(EVT_STATUS_CHANGED, m_status, "", url.size() < 2 ? 1 : m_last_error); SendChangedEvent(EVT_STATUS_CHANGED, m_status, "", url.size() < 2 ? 1 : m_last_error);
m_cond.timed_wait(l, boost::posix_time::seconds(10)); m_cond.timed_wait(l, boost::posix_time::seconds(10));
} }

View File

@ -215,6 +215,7 @@ public:
ListSyncing, ListSyncing,
ListReady, ListReady,
Failed, Failed,
Stopped,
}; };
Status GetStatus() const { return m_status; } Status GetStatus() const { return m_status; }

View File

@ -749,7 +749,7 @@ void SendToPrinterDialog::on_cancel(wxCloseEvent &event)
} }
} }
#endif #endif
m_tcp_try_connect = true;
this->EndModal(wxID_CANCEL); this->EndModal(wxID_CANCEL);
} }
@ -778,7 +778,6 @@ void SendToPrinterDialog::on_ok(wxCommandEvent &event)
} }
assert(obj_->dev_id == m_printer_last_select); assert(obj_->dev_id == m_printer_last_select);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ", print_job: for send task, current printer id = " << m_printer_last_select << std::endl; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ", print_job: for send task, current printer id = " << m_printer_last_select << std::endl;
show_status(PrintDialogStatus::PrintStatusSending); show_status(PrintDialogStatus::PrintStatusSending);
@ -1127,7 +1126,7 @@ void SendToPrinterDialog::on_selection_changed(wxCommandEvent &event)
auto selection = m_comboBox_printer->GetSelection(); auto selection = m_comboBox_printer->GetSelection();
DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
if (!dev) return; if (!dev) return;
m_tcp_try_connect = true;
MachineObject* obj = nullptr; MachineObject* obj = nullptr;
for (int i = 0; i < m_list.size(); i++) { for (int i = 0; i < m_list.size(); i++) {
if (i == selection) { if (i == selection) {
@ -1237,7 +1236,7 @@ void SendToPrinterDialog::update_show_status()
return; return;
} }
#else #else
if (obj_->connection_type() == "lan" || !obj_->is_support_brtc) { if (!obj_->is_support_brtc) {
if (m_file_sys) { if (m_file_sys) {
m_device_select.clear(); m_device_select.clear();
m_file_sys->Stop(true); m_file_sys->Stop(true);
@ -1245,7 +1244,7 @@ void SendToPrinterDialog::update_show_status()
} }
show_status(PrintDialogStatus::PrintStatusReadingFinished); show_status(PrintDialogStatus::PrintStatusReadingFinished);
return; return;
} else if (obj_->connection_type() == "cloud") { } else/* if (obj_->connection_type() == "cloud")*/ {
Enable(obj_ && obj_->is_connected()); Enable(obj_ && obj_->is_connected());
std::string dev_id = obj_->dev_ip; std::string dev_id = obj_->dev_ip;
if (m_file_sys) { if (m_file_sys) {
@ -1270,6 +1269,7 @@ void SendToPrinterDialog::update_show_status()
wxString msg; wxString msg;
int status = e.GetInt(); int status = e.GetInt();
int extra = e.GetExtraLong(); int extra = e.GetExtraLong();
switch (status) { switch (status) {
case PrinterFileSystem::Initializing: case PrinterFileSystem::Initializing:
case PrinterFileSystem::Connecting: show_status(PrintDialogStatus::PrintStatusReading); break; case PrinterFileSystem::Connecting: show_status(PrintDialogStatus::PrintStatusReading); break;
@ -1291,7 +1291,21 @@ void SendToPrinterDialog::update_show_status()
break; break;
} }
case PrinterFileSystem::Failed: msg = _L("Please check the network and try again, You can restart or update the printer if the issue persists."); break; case PrinterFileSystem::Failed: {
m_tcp_try_connect = false;
/*static int i = 0;
OutputDebugStringA(std::to_string(i).c_str());
OutputDebugStringA("\n");
if (i++ < 2)*/
/* msg = _L("Attempting TCP connection, please wait.");
else*/
msg = _L("Please check the network and try again, You can restart or update the printer if the issue persists.");
//fs->Stop();
break;
}
case PrinterFileSystem::Stopped: {
// fs->Retry();
}
} }
if (!msg.empty()) { if (!msg.empty()) {
@ -1457,6 +1471,7 @@ void SendToPrinterDialog::show_status(PrintDialogStatus status, std::vector<wxSt
Enable_Send_Button(false); Enable_Send_Button(false);
Enable_Refresh_Button(true); Enable_Refresh_Button(true);
} }
else if (status == PrintDialogStatus::PrintStatusReadingFinished) { else if (status == PrintDialogStatus::PrintStatusReadingFinished) {
update_print_status_msg(wxEmptyString, false, true); update_print_status_msg(wxEmptyString, false, true);
Enable_Send_Button(true); Enable_Send_Button(true);
@ -1675,10 +1690,13 @@ bool SendToPrinterDialog::Show(bool show)
update_user_machine_list(); update_user_machine_list();
} }
if (show) { if (show) {
m_refresh_timer->Start(LIST_REFRESH_INTERVAL); m_refresh_timer->Start(LIST_REFRESH_INTERVAL);
} else { } else {
m_refresh_timer->Stop(); m_refresh_timer->Stop();
m_tcp_try_connect = true;
} }
Layout(); Layout();
@ -1732,31 +1750,71 @@ void SendToPrinterDialog::fetchUrl(boost::weak_ptr<PrinterFileSystem> wfs)
NetworkAgent *agent = wxGetApp().getAgent(); NetworkAgent *agent = wxGetApp().getAgent();
std::string agent_version = agent ? agent->get_version() : ""; std::string agent_version = agent ? agent->get_version() : "";
if (agent) {
std::string protocols[] = {"", "\"tutk\"", "\"agora\"", "\"tutk\",\"agora\""}; if (agent) {
agent->get_camera_url(obj->dev_id + "|" + dev_ver + "|" + protocols[remote_proto], if (obj->connection_type() == "lan") {
[this, wfs, m = dev_id, v = agent->get_version(), dv = dev_ver](std::string url) { // In LAN mode, use TCP connection
if (boost::algorithm::starts_with(url, "bambu:///")) { std::string devIP = obj->dev_ip;
url += "&device=" + m; std::string accessCode = obj->get_access_code();
url += "&net_ver=" + v; std::string tcp_url = "bambu:///local/" + devIP + "?port=6000&user=" + "bblp" + "&passwd=" + accessCode;
url += "&dev_ver=" + dv;
url += "&refresh_url=" + boost::lexical_cast<std::string>(&refresh_agora_url); CallAfter([=] {
url += "&cli_id=" + wxGetApp().app_config->get("slicer_uuid"); boost::shared_ptr fs(wfs.lock());
url += "&cli_ver=" + std::string(SLIC3R_VERSION); if (!fs) return;
} if (boost::algorithm::starts_with(tcp_url, "bambu:///")) {
BOOST_LOG_TRIVIAL(info) << "SendToPrinter::fetchUrl: camera_url: " << hide_passwd(url, {"?uid=", "authkey=", "passwd="}); fs->SetUrl(tcp_url);
std::cout << "SendToPrinter::fetchUrl: camera_url: " << hide_passwd(url, {"?uid=", "authkey=", "passwd="}); } else {
CallAfter([=] { fs->SetUrl("3");
boost::shared_ptr fs(wfs.lock()); }
if (!fs) return; });
if (boost::algorithm::starts_with(url, "bambu:///")) { } else {
fs->SetUrl(url); // In non-LAN mode, try TCP connection first
} else { if (m_tcp_try_connect) {
fs->SetUrl("3"); std::string devIP = obj->dev_ip;
} std::string accessCode = obj->get_access_code();
}); std::string tcp_url = "bambu:///local/" + devIP + "?port=6000&user=" + "bblp" + "&passwd=" + accessCode;
});
} CallAfter([=] {
boost::shared_ptr fs(wfs.lock());
if (!fs) return;
if (boost::algorithm::starts_with(tcp_url, "bambu:///")) {
fs->SetUrl(tcp_url);
}
});
}
else {
// If the TCP connection fails, switch to TUTK connection
std::string protocols[] = {"", "\"tutk\"", "\"agora\"", "\"tutk\",\"agora\""};
agent->get_camera_url(obj->dev_id + "|" + dev_ver + "|" + protocols[1], // ʹÓà "tutk"
[this, wfs, m = dev_id, v = agent->get_version(), dv = dev_ver](std::string url) {
if (boost::algorithm::starts_with(url, "bambu:///")) {
url += "&device=" + m;
url += "&net_ver=" + v;
url += "&dev_ver=" + dv;
url += "&refresh_url=" + boost::lexical_cast<std::string>(&refresh_agora_url);
url += "&cli_id=" + wxGetApp().app_config->get("slicer_uuid");
url += "&cli_ver=" + std::string(SLIC3R_VERSION);
}
BOOST_LOG_TRIVIAL(info) << "SendToPrinter::fetchUrl: camera_url: " << hide_passwd(url, {"?uid=", "authkey=", "passwd="});
std::cout << "SendToPrinter::fetchUrl: camera_url: " << hide_passwd(url, {"?uid=", "authkey=", "passwd="});
CallAfter([=] {
boost::shared_ptr fs(wfs.lock());
if (!fs) return;
if (boost::algorithm::starts_with(url, "bambu:///")) {
fs->SetUrl(url);
} else {
fs->SetUrl("3");
}
});
});
}
}
}
return; return;
} }

View File

@ -49,6 +49,7 @@ private:
void init_bind(); void init_bind();
void init_timer(); void init_timer();
int m_print_plate_idx; int m_print_plate_idx;
int m_current_filament_id; int m_current_filament_id;
int m_print_error_code = 0; int m_print_error_code = 0;
@ -59,6 +60,7 @@ private:
bool m_need_adaptation_screen{ false }; bool m_need_adaptation_screen{ false };
bool m_export_3mf_cancel{ false }; bool m_export_3mf_cancel{ false };
bool m_is_canceled{ false }; bool m_is_canceled{ false };
bool m_tcp_try_connect{true};
std::string m_print_error_msg; std::string m_print_error_msg;
std::string m_print_error_extra; std::string m_print_error_extra;
std::string m_print_info; std::string m_print_info;
@ -126,7 +128,7 @@ private:
bool m_waiting_enable{ false }; bool m_waiting_enable{ false };
boost::shared_ptr<PrinterFileSystem> m_file_sys; boost::shared_ptr<PrinterFileSystem> m_file_sys;
std::vector<std::string> m_ability_list; std::vector<std::string> m_ability_list;
public: public:
SendToPrinterDialog(Plater* plater = nullptr); SendToPrinterDialog(Plater* plater = nullptr);
~SendToPrinterDialog(); ~SendToPrinterDialog();