From 078470cc686c1e9da2bb2d6cd32f27192e51356b Mon Sep 17 00:00:00 2001 From: Hirek Date: Tue, 25 Feb 2025 07:45:27 +0100 Subject: [PATCH] Move DiscordRPC to separate threaad --- Globals.h | 14 +++---- application.cpp | 108 ++++++++++++++++++++++++++---------------------- application.h | 2 + 3 files changed, 68 insertions(+), 56 deletions(-) diff --git a/Globals.h b/Globals.h index 16c9b3b7..d54b9f4a 100644 --- a/Globals.h +++ b/Globals.h @@ -17,6 +17,8 @@ http://mozilla.org/MPL/2.0/. #include "utilities.h" #include "motiontelemetry.h" #include "ref/discord-rpc/include/discord_rpc.h" +#include + #ifdef WITH_UART #include "uart.h" #endif @@ -24,17 +26,15 @@ http://mozilla.org/MPL/2.0/. #include "zmq_input.h" #endif -struct DiscordData -{ - DiscordRichPresence dcRcp; - char *scnName = ""; -}; - struct global_settings { // members // data items // TODO: take these out of the settings - DiscordData dcData; + + /// + /// Mapa z watkami w formacie + /// + std::map threads = {}; bool shiftState{ false }; //m7todo: brzydko bool ctrlState{ false }; bool altState{ false }; diff --git a/application.cpp b/application.cpp index 3bd1b63e..6e145311 100644 --- a/application.cpp +++ b/application.cpp @@ -176,6 +176,60 @@ int eu07_application::run_crashgui() } return -1; } +void eu07_application::DiscordRPCService() +{ + // initialize discord-rpc + WriteLog("Initializing Discord Rich Presence..."); + static const char *discord_app_id = "1343662664504840222"; + DiscordEventHandlers handlers; + memset(&handlers, 0, sizeof(handlers)); + Discord_Initialize(discord_app_id, &handlers, 1, nullptr); + + std::string rpcScnName = Global.SceneryFile; + if (rpcScnName[0] == '$') + rpcScnName.erase(0, 1); + rpcScnName.erase(rpcScnName.size() - 4, 4); + if (rpcScnName.find('_') != std::string::npos) + { + std::replace(rpcScnName.begin(), rpcScnName.end(), '_', ' '); + } + + // calculate startup timestamp + auto now = std::chrono::system_clock::now(); + auto now_c = std::chrono::system_clock::to_time_t(now); + + // Init RPC object + static DiscordRichPresence discord_rpc; + memset(&discord_rpc, 0, sizeof(discord_rpc)); + // realworld timestamp from datetime + discord_rpc.startTimestamp = static_cast(now_c); + static std::string state = "Sceneria: " + rpcScnName; + discord_rpc.state = state.c_str(); + discord_rpc.details = "Ładowanie scenerii"; + discord_rpc.largeImageKey = "logo"; + discord_rpc.largeImageText = "MaSzyna"; + + // First RPC upload + Discord_UpdatePresence(&discord_rpc); + + // run loop + while (!glfwWindowShouldClose(m_windows.front()) && !m_modestack.empty()) + { + // Discord RPC updater + if (simulation::is_ready) + { + std::string PlayerVehicle = simulation::Train->name(); + // make to upper + for (auto &c : PlayerVehicle) + c = toupper(c); + + PlayerVehicle = "Prowadzi: " + PlayerVehicle; + discord_rpc.details = PlayerVehicle.c_str(); + Discord_UpdatePresence(&discord_rpc); + } + std::this_thread::sleep_for(std::chrono::milliseconds(5000)); // update RPC every 5 secs + } +} int eu07_application::init( int Argc, char *Argv[] ) { @@ -241,46 +295,15 @@ eu07_application::init( int Argc, char *Argv[] ) { if (!init_network()) return -1; - // initialize discord-rpc - WriteLog("Initializing Discord Rich Presence..."); - static const char *discord_app_id = "1343662664504840222"; - DiscordEventHandlers handlers; - memset(&handlers, 0, sizeof(handlers)); - Discord_Initialize(discord_app_id, &handlers, 1, nullptr); - - std::string rpcScnName = Global.SceneryFile; - if (rpcScnName[0] == '$') - rpcScnName.erase(0, 1); - rpcScnName.erase(rpcScnName.size() - 4, 4); - if (rpcScnName.find('_') != std::string::npos) - { - std::replace(rpcScnName.begin(), rpcScnName.end(), '_', ' '); - } - - // calculate startup timestamp - auto now = std::chrono::system_clock::now(); - auto now_c = std::chrono::system_clock::to_time_t(now); - - // Init RPC object - static DiscordRichPresence discord_rpc; - memset(&discord_rpc, 0, sizeof(discord_rpc)); - // realworld timestamp from datetime - discord_rpc.startTimestamp = static_cast(now_c); - static std::string state = "Sceneria: " + rpcScnName; - discord_rpc.state = state.c_str(); - discord_rpc.details = "Ładowanie scenerii"; - discord_rpc.largeImageKey = "logo"; - discord_rpc.largeImageText = "MaSzyna"; - Global.dcData.dcRcp = discord_rpc; - - // First RPC upload - Discord_UpdatePresence(&Global.dcData.dcRcp); - - + // Run DiscordRPC service + std::thread sDiscordRPC(&eu07_application::DiscordRPCService, this); + Global.threads.emplace("DiscordRPC", std::move(sDiscordRPC)); return result; } + + double eu07_application::generate_sync() { if (Timer::GetDeltaTime() == 0.0) return 0.0; @@ -321,19 +344,6 @@ eu07_application::run() { // main application loop while (!glfwWindowShouldClose( m_windows.front() ) && !m_modestack.empty()) { - // Discord RPC updater - if (simulation::is_ready) - { - std::string PlayerVehicle = simulation::Train->name(); - // make to upper - for (auto &c : PlayerVehicle) c = toupper(c); - - PlayerVehicle = "Prowadzi: " + PlayerVehicle; - Global.dcData.dcRcp.details = PlayerVehicle.c_str(); - Discord_UpdatePresence(&Global.dcData.dcRcp); - } - - Timer::subsystem.mainloop_total.start(); glfwPollEvents(); diff --git a/application.h b/application.h index 4d6b2955..3cc73ff0 100644 --- a/application.h +++ b/application.h @@ -37,6 +37,8 @@ public: int run(); // issues request for a worker thread to perform specified task. returns: true if task was scheduled + + void eu07_application::DiscordRPCService(); // discord rich presence service function (runs as separate thread) bool request( python_taskqueue::task_request const &Task ); // ensures the main thread holds the python gil and can safely execute python calls