From 9b4ec0760c596843e176e7010e1cae508cb579cf Mon Sep 17 00:00:00 2001 From: Sander Speetjens Date: Mon, 21 Apr 2025 15:29:05 +0200 Subject: [PATCH] client Not fully working still linking errors --- client/CMakeLists.txt | 41 +++++++++++++++++++++++++++--- client/mainwindow.cpp | 28 +++++++++++++------- client/simulator_base.hpp | 2 ++ client/simulators/can_debugger.cpp | 2 ++ client/simulators/test.cpp | 2 ++ 5 files changed, 62 insertions(+), 13 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 93b3716..2d079e0 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -7,14 +7,47 @@ add_subdirectory(qwt) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -file(GLOB_RECURSE SOURCES "*.[hc]pp") -file(GLOB_RECURSE UI_SOURCES "*.ui") +file(GLOB_RECURSE ui "ui/*.[hc]pp") set(PROJECT_SOURCES - ${SOURCES} - ${UI_SOURCES} + ${ui} + helpers.cpp + helpers.hpp + IterableEnum.hpp + main.cpp + mainwindow.cpp + mainwindow.hpp + mainwindow.ui + networkerror.cpp + networkerror.hpp + networkerror.ui + simulator_base.cpp + simulator_base.hpp + web_socket_wrapper.cpp + web_socket_wrapper.hpp ) +file(GLOB_RECURSE sims "simulators/*.cpp") + +# Loop through each .cpp file and create a library for it +foreach(sim ${sims}) + # Extract the base name of the file (without the directory and extension) + get_filename_component(LIB_NAME ${sim} NAME_WE) + + # Create a library for each .cpp file + add_library(ui_${LIB_NAME} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/simulators/${LIB_NAME}.hpp ${CMAKE_CURRENT_SOURCE_DIR}/simulators/${LIB_NAME}.cpp ${CMAKE_CURRENT_SOURCE_DIR}/simulators/${LIB_NAME}.ui simulator_base.cpp) + target_link_libraries(ui_${LIB_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets qwt magic_enum::magic_enum nlohmann_json::nlohmann_json) + target_include_directories(ui_${LIB_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}/ui ${PROJECT_BINARY_DIR}/) + + set_target_properties( + ui_${LIB_NAME} + PROPERTIES + AUTOUIC ON + AUTOMOC ON + AUTORCC ON + ) +endforeach() + if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) qt_add_executable(Simulator-CVS_I10 MANUAL_FINALIZATION diff --git a/client/mainwindow.cpp b/client/mainwindow.cpp index a5c8cb4..98044b6 100644 --- a/client/mainwindow.cpp +++ b/client/mainwindow.cpp @@ -1,21 +1,31 @@ #include "mainwindow.hpp" #include "ui_mainwindow.h" -#include "can_debugger.hpp" -#include "cvs_i10.hpp" -#include "scope_mux_tester.hpp" -#include "test.hpp" +typedef Simulator_base *(*Get_UI)(Web_socket_wrapper*, QWidget*); MainWindow::MainWindow(QUrl ws_url, QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_web_socket(new Web_socket_wrapper(ws_url)), m_error_dialog(new NetworkError(this)) { ui->setupUi(this); - INSERT_SIMULATOR(Cable_Tester); - INSERT_SIMULATOR(Can_Debugger); - INSERT_SIMULATOR(Scope_Mux_Tester); - INSERT_SIMULATOR(CVS_I10); - INSERT_SIMULATOR(Test_Sim); + QLibrary lib; + QDirIterator it(QCoreApplication::applicationDirPath(), QStringList() << "*.so" << "*.dll", QDir::Files, QDirIterator::Subdirectories); + while (it.hasNext()) + { + lib.setFileName(it.next()); + lib.load(); + auto loaded_ui = Get_UI(lib.resolve("get_ui")); + if (loaded_ui == nullptr) + { + SPDLOG_INFO("{} NOT FOUND", lib.fileName().toStdString()); + continue; + } + auto widget = loaded_ui(m_web_socket.get(), this); + m_sims.insert(std::make_pair(widget->sim_name(), widget)); + lib.unload(); + } + // Insert debug sims here + //INSERT_SIMULATOR(SIM_NAME); m_error_dialog->set_error("Connection timed out\nCheck if the server is running"); ui->connection->setText("Connected to " + ws_url.toString()); diff --git a/client/simulator_base.hpp b/client/simulator_base.hpp index b63c07b..f0061f7 100644 --- a/client/simulator_base.hpp +++ b/client/simulator_base.hpp @@ -14,6 +14,8 @@ using json = nlohmann::json; #define PUSH_UI_ITEM(item) push_ui_item(ui->item) +#define EXPORT_UI(client) \ +extern "C" Q_DECL_EXPORT Simulator_base* get_ui(Web_socket_wrapper *api, QWidget *parent) { return new client(api, parent); } class Simulator_base : public QMainWindow { diff --git a/client/simulators/can_debugger.cpp b/client/simulators/can_debugger.cpp index 298b000..01a5701 100644 --- a/client/simulators/can_debugger.cpp +++ b/client/simulators/can_debugger.cpp @@ -1,6 +1,8 @@ #include "can_debugger.hpp" #include "ui_can_debugger.h" +EXPORT_UI(Can_Debugger); + Can_Debugger::Can_Debugger(Web_socket_wrapper *web_socket, QWidget *parent) : Simulator_base("Can Debugger", web_socket, parent), ui(new Ui::Can_Debugger) { diff --git a/client/simulators/test.cpp b/client/simulators/test.cpp index a53d5fc..f35ca86 100644 --- a/client/simulators/test.cpp +++ b/client/simulators/test.cpp @@ -1,6 +1,8 @@ #include "test.hpp" #include "ui_test.h" +EXPORT_UI(Test_Sim); + Test_Sim::Test_Sim(Web_socket_wrapper *web_socket, QWidget *parent) : Simulator_base("Test Sim", web_socket, parent), ui(new Ui::Test_Sim) {