From 84b823ffa76c546c8549092b878716e3fb33b130 Mon Sep 17 00:00:00 2001 From: harry Date: Sat, 13 Apr 2024 15:57:09 -0400 Subject: [PATCH] Added more netplay status data to host status dialog. --- src/drivers/Qt/NetPlay.cpp | 87 +++++++++++++++++++++++++++++++++++++- src/drivers/Qt/NetPlay.h | 21 +++++++-- 2 files changed, 103 insertions(+), 5 deletions(-) diff --git a/src/drivers/Qt/NetPlay.cpp b/src/drivers/Qt/NetPlay.cpp index c8033739..6fd0c7ab 100644 --- a/src/drivers/Qt/NetPlay.cpp +++ b/src/drivers/Qt/NetPlay.cpp @@ -865,7 +865,7 @@ void NetPlayServer::serverProcessMessage( NetPlayClient *client, void *msgBuf, s client->gpData[3] = msg->ctrlState[3]; client->setPaused( (msg->flags & netPlayClientState::PauseFlag ) ? true : false ); - client->setDesync( (msg->flags & netPlayClientState::DesyncFlag) ? true : false ); + //client->setDesync( (msg->flags & netPlayClientState::DesyncFlag) ? true : false ); client->romMatch = (romCrc32 == msg->romCrc32); @@ -885,8 +885,16 @@ void NetPlayServer::serverProcessMessage( NetPlayClient *client, void *msgBuf, s { printf("Client %s Frame:%u is NOT in Sync: OPS:%i RAM:%i\n", client->userName.toLocal8Bit().constData(), msg->frameRun, opsSync, ramSync); + + if (0 == client->desyncCount) + { + client->desyncSinceReset++; + client->totalDesyncCount++; + } client->desyncCount++; + client->setDesync(true); + if (client->desyncCount > forceResyncCount) { FCEU_WRAPPER_LOCK(); @@ -904,6 +912,7 @@ void NetPlayServer::serverProcessMessage( NetPlayClient *client, void *msgBuf, s } else { + client->setDesync(false); client->desyncCount = 0; } } @@ -1682,11 +1691,21 @@ int NetPlayClient::requestSync(void) return 0; } //----------------------------------------------------------------------------- -void NetPlayClient::recordPingResult( uint64_t delay_ms ) +void NetPlayClient::recordPingResult( const uint64_t delay_ms ) { pingNumSamples++; pingDelayLast = delay_ms; pingDelaySum += delay_ms; + + if (delay_ms < pingDelayMin) + { + pingDelayMin = delay_ms; + } + + if (delay_ms > pingDelayMax) + { + pingDelayMax = delay_ms; + } } //----------------------------------------------------------------------------- void NetPlayClient::resetPingData() @@ -1694,6 +1713,8 @@ void NetPlayClient::resetPingData() pingNumSamples = 0; pingDelayLast = 0; pingDelaySum = 0; + pingDelayMax = 0; + pingDelayMin = 1000; } //----------------------------------------------------------------------------- double NetPlayClient::getAvgPingDelay() @@ -2864,6 +2885,40 @@ void NetPlayClientTreeItem::updateData() setText( 1, QObject::tr(roleString) ); setText( 2, state); setText( 3, QString::number(client->currentFrame) ); + + if (isExpanded()) + { + FCEU::FixedString<256> infoLine; + const int numChildren = childCount(); + + //printf("Calculating Expanded Item\n"); + + for (int i=0; i( child(i) ); + switch (item->type) + { + case NetPlayClientTreeItem::PingInfo: + { + infoLine.sprintf("Ping ms: Avg %.2f Min: %llu Max: %llu", + client->getAvgPingDelay(), client->getMinPingDelay(), client->getMaxPingDelay() ); + item->setFirstColumnSpanned(true); + item->setText( 0, QObject::tr(infoLine.c_str()) ); + } + break; + case NetPlayClientTreeItem::DesyncInfo: + { + infoLine.sprintf("Desync Count: Since Last Sync: %u Total: %u", + client->desyncSinceReset, client->totalDesyncCount ); + item->setFirstColumnSpanned(true); + item->setText( 0, QObject::tr(infoLine.c_str()) ); + } + break; + default: + break; + } + } + } } } //---------------------------------------------------------------------------- @@ -2889,11 +2944,22 @@ void NetPlayHostStatusDialog::loadClientTree() { return; } + QFont font; + + font.setFamily("Courier New"); + font.setStyle( QFont::StyleNormal ); + font.setStyleHint( QFont::Monospace ); + auto* serverTopLvlItem = new NetPlayClientTreeItem(); serverTopLvlItem->server = server; serverTopLvlItem->updateData(); + serverTopLvlItem->setFont( 0, font ); + serverTopLvlItem->setFont( 1, font ); + serverTopLvlItem->setFont( 2, font ); + serverTopLvlItem->setFont( 3, font ); + clientTree->addTopLevelItem( serverTopLvlItem ); auto& clientList = server->getClientList(); @@ -2905,6 +2971,23 @@ void NetPlayHostStatusDialog::loadClientTree() clientTopLvlItem->client = client; clientTopLvlItem->updateData(); + auto* clientPingInfo = new NetPlayClientTreeItem(); + clientPingInfo->setFont( 0, font ); + clientPingInfo->type = NetPlayClientTreeItem::PingInfo; + clientPingInfo->setFirstColumnSpanned(true); + clientTopLvlItem->addChild( clientPingInfo ); + + auto* clientDesyncInfo = new NetPlayClientTreeItem(); + clientDesyncInfo->setFont( 0, font ); + clientDesyncInfo->type = NetPlayClientTreeItem::DesyncInfo; + clientDesyncInfo->setFirstColumnSpanned(true); + clientTopLvlItem->addChild( clientDesyncInfo ); + + clientTopLvlItem->setFont( 0, font ); + clientTopLvlItem->setFont( 1, font ); + clientTopLvlItem->setFont( 2, font ); + clientTopLvlItem->setFont( 3, font ); + clientTree->addTopLevelItem( clientTopLvlItem ); } diff --git a/src/drivers/Qt/NetPlay.h b/src/drivers/Qt/NetPlay.h index e032754e..448e7781 100644 --- a/src/drivers/Qt/NetPlay.h +++ b/src/drivers/Qt/NetPlay.h @@ -167,7 +167,7 @@ class NetPlayServer : public QTcpServer int role = -1; int roleMask = 0; NetPlayClient* clientPlayer[4] = { nullptr }; - int forceResyncCount = 10; + uint32_t forceResyncCount = 10; uint32_t cycleCounter = 0; uint32_t maxLeadFrames = 10u; uint32_t clientWaitCounter = 0; @@ -281,16 +281,21 @@ class NetPlayClient : public QObject void setPaused(bool value){ paused = value; } bool hasDesync(){ return desync; } void setDesync(bool value){ desync = value; } - void recordPingResult( uint64_t delay_ms ); + void recordPingResult( const uint64_t delay_ms ); void resetPingData(void); double getAvgPingDelay(); + unsigned long long getLastPingDelay(){ return pingDelayLast; }; + unsigned long long getMinPingDelay(){ return pingDelayMin; }; + unsigned long long getMaxPingDelay(){ return pingDelayMax; }; void setDebugLog(QFile* file){ debugLog = file; }; QString userName; QString password; int role = -1; int state = 0; - int desyncCount = 0; + unsigned int desyncCount = 0; + unsigned int desyncSinceReset = 0; + unsigned int totalDesyncCount = 0; bool syncOk = false; bool romMatch = false; unsigned int currentFrame = 0; @@ -336,6 +341,8 @@ class NetPlayClient : public QObject uint64_t pingDelaySum = 0; uint64_t pingDelayLast = 0; + uint64_t pingDelayMin = 1000; + uint64_t pingDelayMax = 0; uint64_t pingNumSamples = 0; uint32_t romCrc32 = 0; uint32_t numMsgBoxObjs = 0; @@ -436,6 +443,14 @@ class NetPlayClientTreeItem : public QTreeWidgetItem } + enum Type + { + StatusInfo = 0, + PingInfo, + DesyncInfo + }; + + int type = StatusInfo; NetPlayClient* client = nullptr; NetPlayServer* server = nullptr;