Move DiscordRPC to separate threaad

This commit is contained in:
2025-02-25 07:45:27 +01:00
parent 8049a3d986
commit 078470cc68
3 changed files with 68 additions and 56 deletions

View File

@@ -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 <map>
#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;
/// <summary>
/// Mapa z watkami w formacie <std::string nazwa, std::thread watek>
/// </summary>
std::map<std::string, std::thread> threads = {};
bool shiftState{ false }; //m7todo: brzydko
bool ctrlState{ false };
bool altState{ false };

View File

@@ -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<int64_t>(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<int64_t>(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();

View File

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