FIX: update bambu source api

Change-Id: I1689733af6cd8778f017a732dd36ad91bff80ea8
(cherry picked from commit 40bc2c251e00d6d95289fdd9def11f9e1bd9202f)
This commit is contained in:
chunmao.guo 2022-08-17 10:12:10 +08:00 committed by Lane.Wei
parent 00284f52b8
commit 66c5d39e28
3 changed files with 81 additions and 58 deletions

View file

@ -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_

View file

@ -10,6 +10,8 @@
#include <cstring>
//#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<int(Bambu_Sample& sample)> 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<PrinterFileSystem*>(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<boost::mutex> &l, Bamb
void PrinterFileSystem::Reconnect(boost::unique_lock<boost::mutex> &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<boost::mutex> &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<boost::mutex> &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;
}

View file

@ -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<typename T> using Translator = std::function<int(json const &, T &, unsigned char const *)>;
@ -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;