diff --git a/src/slic3r/GUI/Printer/BambuTunnel.h b/src/slic3r/GUI/Printer/BambuTunnel.h index 316b52a35..11504a70c 100644 --- a/src/slic3r/GUI/Printer/BambuTunnel.h +++ b/src/slic3r/GUI/Printer/BambuTunnel.h @@ -1,28 +1,35 @@ -#pragma once +#ifndef _BAMBU__TUNNEL_H_ +#define _BAMBU__TUNNEL_H_ #ifdef BAMBU_DYNAMIC # define BAMBU_EXPORT # define BAMBU_FUNC(x) (*x) #else -# ifdef __WIN32__ -# define BAMBU_EXPORT __declspec(dllexport) +# ifdef _WIN32 +# ifdef BAMBU_EXPORTS +# define BAMBU_EXPORT __declspec(dllexport) +# else +# define BAMBU_EXPORT __declspec(dllimport) +# endif // BAMBU_EXPORTS # else # define BAMBU_EXPORT # endif // __WIN32__ # define BAMBU_FUNC(x) x -#endif +#endif // BAMBU_DYNAMIC #ifdef __cplusplus extern "C" { #endif // __cplusplus -struct Bambu_Session; -#ifdef __WIN32__ -typedef wchar_t Bambu_Message; +#ifdef _WIN32 + typedef wchar_t tchar; #else -typedef char Bambu_Message; + typedef char tchar; #endif -typedef void (*Logger)(Bambu_Session * session, int level, Bambu_Message const * msg); + +typedef void* Bambu_Tunnel; + +typedef void (*Logger)(void * context, int level, tchar const* msg); enum Bambu_StreamType { @@ -89,48 +96,39 @@ enum Bambu_Error { Bambu_success, Bambu_stream_end, - Bambu_would_block -}; - -struct Bambu_Session -{ - int gSID = -1; - int avIndex = -1; - int block = 0; - int block_next = 0; - Logger logger = nullptr; - void * buffer = nullptr; - int buffer_size = 0; - void * extra = 0; - void * dump_file1 = nullptr; - void * dump_file2 = nullptr; - - void Log(int unused, int level, wchar_t const * format, ...); + Bambu_would_block, + Bambu_buffer_limit }; #ifdef BAMBU_DYNAMIC struct BambuLib { #endif -BAMBU_EXPORT int BAMBU_FUNC(Bambu_Open)(Bambu_Session* session, char const* uid); +BAMBU_EXPORT int BAMBU_FUNC(Bambu_Create)(Bambu_Tunnel* tunnel, char const* path); -BAMBU_EXPORT int BAMBU_FUNC(Bambu_StartStream)(Bambu_Session* session); +BAMBU_EXPORT void BAMBU_FUNC(Bambu_SetLogger)(Bambu_Tunnel tunnel, Logger logger, void * context); -BAMBU_EXPORT int BAMBU_FUNC(Bambu_GetStreamCount)(Bambu_Session* session); +BAMBU_EXPORT int BAMBU_FUNC(Bambu_Open)(Bambu_Tunnel tunnel); -BAMBU_EXPORT int BAMBU_FUNC(Bambu_GetStreamInfo)(Bambu_Session* session, int index, Bambu_StreamInfo* info); +BAMBU_EXPORT int BAMBU_FUNC(Bambu_StartStream)(Bambu_Tunnel tunnel, bool video); -BAMBU_EXPORT unsigned long BAMBU_FUNC(Bambu_GetDuration)(Bambu_Session* session); +BAMBU_EXPORT int BAMBU_FUNC(Bambu_GetStreamCount)(Bambu_Tunnel tunnel); -BAMBU_EXPORT int BAMBU_FUNC(Bambu_Seek)(Bambu_Session* session, unsigned long time); +BAMBU_EXPORT int BAMBU_FUNC(Bambu_GetStreamInfo)(Bambu_Tunnel tunnel, int index, Bambu_StreamInfo* info); -BAMBU_EXPORT int BAMBU_FUNC(Bambu_ReadSample)(Bambu_Session* session, Bambu_Sample* sample); +BAMBU_EXPORT unsigned long BAMBU_FUNC(Bambu_GetDuration)(Bambu_Tunnel tunnel); -BAMBU_EXPORT int BAMBU_FUNC(Bambu_SendMessage)(Bambu_Session* session, int ctrl, char const* data, int len); +BAMBU_EXPORT int BAMBU_FUNC(Bambu_Seek)(Bambu_Tunnel tunnel, unsigned long time); -BAMBU_EXPORT int BAMBU_FUNC(Bambu_RecvMessage)(Bambu_Session* session, int* ctrl, char* data, int* len); +BAMBU_EXPORT int BAMBU_FUNC(Bambu_ReadSample)(Bambu_Tunnel tunnel, Bambu_Sample* sample); -BAMBU_EXPORT void BAMBU_FUNC(Bambu_Close)(Bambu_Session* session); +BAMBU_EXPORT int BAMBU_FUNC(Bambu_SendMessage)(Bambu_Tunnel tunnel, int ctrl, char const* data, int len); + +BAMBU_EXPORT int BAMBU_FUNC(Bambu_RecvMessage)(Bambu_Tunnel tunnel, int* ctrl, char* data, int* len); + +BAMBU_EXPORT void BAMBU_FUNC(Bambu_Close)(Bambu_Tunnel tunnel); + +BAMBU_EXPORT void BAMBU_FUNC(Bambu_Destroy)(Bambu_Tunnel tunnel); BAMBU_EXPORT int BAMBU_FUNC(Bambu_Init)(); @@ -138,7 +136,7 @@ BAMBU_EXPORT void BAMBU_FUNC(Bambu_Deinit)(); BAMBU_EXPORT char const* BAMBU_FUNC(Bambu_GetLastErrorMsg)(); -BAMBU_EXPORT void BAMBU_FUNC(Bambu_FreeLogMsg)(Bambu_Message const* msg); +BAMBU_EXPORT void BAMBU_FUNC(Bambu_FreeLogMsg)(tchar const* msg); #ifdef BAMBU_DYNAMIC }; @@ -147,3 +145,5 @@ BAMBU_EXPORT void BAMBU_FUNC(Bambu_FreeLogMsg)(Bambu_Message const* msg); #ifdef __cplusplus } #endif // __cplusplus + +#endif // _BAMBU__TUNNEL_H_ diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp index 20cd478ef..e1369bca9 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp @@ -10,6 +10,8 @@ #include +//#define PRINTER_FILE_SYSTEM_TEST + wxDEFINE_EVENT(EVT_STATUS_CHANGED, wxCommandEvent); wxDEFINE_EVENT(EVT_MODE_CHANGED, wxCommandEvent); wxDEFINE_EVENT(EVT_FILE_CHANGED, wxCommandEvent); @@ -22,7 +24,7 @@ static wxBitmap default_thumbnail; struct StaticBambuLib : BambuLib { static StaticBambuLib & get(); - static int Fake_Bambu_Open(Bambu_Session * session, char const* uid) { return -2; } + static int Fake_Bambu_Create(Bambu_Tunnel*, char const*) { return -2; } }; PrinterFileSystem::PrinterFileSystem() @@ -31,12 +33,16 @@ PrinterFileSystem::PrinterFileSystem() if (!default_thumbnail.IsOk()) default_thumbnail = wxImage(Slic3r::encode_path(Slic3r::var("live_stream_default.png").c_str())); m_session.owner = this; - //auto time = wxDateTime::Now(); - //for (int i = 0; i < 240; ++i) { - // m_file_list.push_back({"", time.GetTicks(), 0, default_thumbnail, FF_DOWNLOAD, i - 130}); - // time.Add(wxDateSpan::Days(-1)); - //} - //BuildGroups(); +#ifdef PRINTER_FILE_SYSTEM_TEST + auto time = wxDateTime::Now(); + for (int i = 0; i < 800; ++i) { + auto name = wxString::Format(L"img-%03d.jpg", i + 1); + wxImage im(L"D:\\work\\pic\\" + name); + m_file_list.push_back({name.ToUTF8().data(), time.GetTicks(), 0, im, i < 20 ? FF_DOWNLOAD : 0, i * 10 - 40}); + time.Add(wxDateSpan::Days(-1)); + } + BuildGroups(); +#endif } PrinterFileSystem::~PrinterFileSystem() @@ -234,7 +240,7 @@ int PrinterFileSystem::RecvData(std::function const & int result = 0; while (true) { Bambu_Sample sample; - result = Bambu_ReadSample(&m_session, &sample); + result = Bambu_ReadSample(m_session.tunnel, &sample); if (result == Bambu_success) { result = callback(sample); if (result == 1) @@ -556,15 +562,15 @@ void PrinterFileSystem::SendChangedEvent(wxEventType type, size_t index, std::st wxPostEvent(this, event); } -void PrinterFileSystem::DumpLog(Bambu_Session *session, int level, Bambu_Message const *msg) +void PrinterFileSystem::DumpLog(void * thiz, int, tchar const *msg) { BOOST_LOG_TRIVIAL(info) << "PrinterFileSystem: " << msg; - StaticBambuLib::get().Bambu_FreeLogMsg(msg); + static_cast(thiz)->Bambu_FreeLogMsg(msg); } boost::uint32_t PrinterFileSystem::SendRequest(int type, json const &req, callback_t2 const &callback) { - if (m_session.gSID < 0) { + if (m_session.tunnel == nullptr) { boost::unique_lock l(m_mutex); m_cond.notify_all(); return 0; @@ -640,7 +646,7 @@ void PrinterFileSystem::RecvMessageThread() if (!m_messages.empty()) { auto & msg = m_messages.front(); l.unlock(); - int n = Bambu_SendMessage(&m_session, CTRL_TYPE, msg.c_str(), msg.length()); + int n = Bambu_SendMessage(m_session.tunnel, CTRL_TYPE, msg.c_str(), msg.length()); l.lock(); if (n == 0) m_messages.pop_front(); @@ -650,7 +656,7 @@ void PrinterFileSystem::RecvMessageThread() } } l.unlock(); - int n = Bambu_ReadSample(&m_session, &sample); + int n = Bambu_ReadSample(m_session.tunnel, &sample); l.lock(); if (n == 0) { HandleResponse(l, sample); @@ -726,9 +732,12 @@ void PrinterFileSystem::HandleResponse(boost::unique_lock &l, Bamb void PrinterFileSystem::Reconnect(boost::unique_lock &l, int result) { - if (m_session.gSID >= 0) { + if (m_session.tunnel) { + auto tunnel = m_session.tunnel; + m_session.tunnel = nullptr; l.unlock(); - Bambu_Close(&m_session); + Bambu_Close(tunnel); + Bambu_Destroy(tunnel); l.lock(); } if (m_session.owner == nullptr) @@ -761,11 +770,16 @@ void PrinterFileSystem::Reconnect(boost::unique_lock &l, int resul l.unlock(); m_status = Status::Connecting; SendChangedEvent(EVT_STATUS_CHANGED, m_status); - m_session.logger = &PrinterFileSystem::DumpLog; - int ret = Bambu_Open(&m_session, url.c_str() + 9); // skip bambu:/// sync + Bambu_Tunnel tunnel = nullptr; + int ret = Bambu_Create(&tunnel, url.c_str()); + if (ret == 0) { + Bambu_SetLogger(tunnel, DumpLog, this); + ret = Bambu_Open(tunnel); + } if (ret == 0) - ret = Bambu_StartStream(&m_session); + ret = Bambu_StartStream(tunnel, false); l.lock(); + m_session.tunnel = tunnel; if (ret == 0) break; m_last_error = ret; @@ -776,7 +790,9 @@ void PrinterFileSystem::Reconnect(boost::unique_lock &l, int resul } m_status = Status::ListSyncing; SendChangedEvent(EVT_STATUS_CHANGED, m_status); +#ifndef PRINTER_FILE_SYSTEM_TEST PostCallback([this] { ListAllFiles(); }); +#endif } @@ -818,6 +834,9 @@ StaticBambuLib &StaticBambuLib::get() { static StaticBambuLib lib; // first load the library + + if (lib.Bambu_Open) + return lib; if (!module) { module = Slic3r::NetworkAgent::get_bambu_source_entry(); @@ -827,14 +846,17 @@ StaticBambuLib &StaticBambuLib::get() BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ", can not Load Library"; } + GET_FUNC(Bambu_Create); GET_FUNC(Bambu_Open); GET_FUNC(Bambu_StartStream); GET_FUNC(Bambu_SendMessage); GET_FUNC(Bambu_ReadSample); GET_FUNC(Bambu_Close); + GET_FUNC(Bambu_Destroy); + GET_FUNC(Bambu_SetLogger); GET_FUNC(Bambu_FreeLogMsg); if (!lib.Bambu_Open) - lib.Bambu_Open = Fake_Bambu_Open; + lib.Bambu_Create = Fake_Bambu_Create; return lib; } diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.h b/src/slic3r/GUI/Printer/PrinterFileSystem.h index eb84525de..0ba9b6dd0 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.h +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.h @@ -174,7 +174,7 @@ private: void SendChangedEvent(wxEventType type, size_t index = (size_t)-1, std::string const &str = {}, long extra = 0); - static void DumpLog(Bambu_Session *session, int level, Bambu_Message const *msg); + static void DumpLog(void* context, int level, tchar const *msg); private: template using Translator = std::function; @@ -265,8 +265,9 @@ private: int m_task_flags = 0; private: - struct Session : Bambu_Session + struct Session { + Bambu_Tunnel tunnel = nullptr; PrinterFileSystem * owner; }; Session m_session;