Skip to content

Commit 02fd340

Browse files
committed
SBB3 ping
1 parent f785aa3 commit 02fd340

File tree

4 files changed

+68
-7
lines changed

4 files changed

+68
-7
lines changed

SerialPrograms/Source/NintendoSwitch/Controllers/SysbotBase/SysbotBase_Connection.cpp

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@
99
//#include "CommonFramework/Logging/Logger.h"
1010
#include "CommonFramework/GlobalSettingsPanel.h"
1111
#include "CommonFramework/Options/Environment/ThemeSelectorOption.h"
12+
#include "NintendoSwitch/NintendoSwitch_Settings.h"
1213
#include "SysbotBase_Connection.h"
1314

1415
//#include <iostream>
1516
//using std::cout;
1617
//using std::endl;
1718

19+
20+
1821
namespace PokemonAutomation{
1922
namespace SysbotBase{
2023

@@ -139,7 +142,18 @@ void TcpSysbotBase_Connection::thread_loop(){
139142
}
140143

141144
m_last_ping_send = current_time();
142-
write_data("getVersion\r\n");
145+
if (supports_command_queue() && NintendoSwitch::ConsoleSettings::instance().ENABLE_SBB3_PINGS){
146+
// If we're more than 60 pings behind, just start clearing them.
147+
while (m_active_pings.size() > 60){
148+
m_active_pings.erase(m_active_pings.begin());
149+
}
150+
151+
m_active_pings[m_ping_seqnum] = m_last_ping_send;
152+
write_data("ping " + std::to_string(m_ping_seqnum) + "\r\n");
153+
m_ping_seqnum++;
154+
}else{
155+
write_data("getVersion\r\n");
156+
}
143157
m_cv.wait_for(lg, std::chrono::seconds(1));
144158
}
145159
}
@@ -229,16 +243,50 @@ void TcpSysbotBase_Connection::process_message(const std::string& message, WallC
229243
}
230244
}
231245

246+
size_t pos = str.find("ping");
247+
if (pos != std::string::npos){
248+
const char* ptr = &str[pos];
249+
while (true){
250+
char ch = ptr[0];
251+
if (ch < 32 || ch == ' ' || ch == '\t'){
252+
ptr++;
253+
continue;
254+
}
255+
break;
256+
}
257+
size_t ping_seqnum = atoll(ptr);
258+
259+
std::lock_guard<std::mutex> lg(m_lock);
260+
m_last_ping_receive = timestamp;
261+
auto iter = m_active_pings.find(ping_seqnum);
262+
if (iter == m_active_pings.end()){
263+
m_logger.log("Received Unexpected Ping: " + std::to_string(ping_seqnum));
264+
return;
265+
}
266+
267+
std::chrono::microseconds latency = std::chrono::duration_cast<std::chrono::microseconds>(timestamp - iter->second);
268+
std::string text = "Response Time: " + pretty_print(latency.count()) + " ms";
269+
if (latency < 10ms){
270+
set_status_line1(text, COLOR_BLUE);
271+
}else if (latency < 50ms){
272+
set_status_line1(text, COLOR_DARKGREEN);
273+
}else{
274+
set_status_line1(text, COLOR_ORANGE);
275+
}
276+
277+
m_active_pings.erase(iter);
278+
}
279+
232280
}
233281
void TcpSysbotBase_Connection::set_mode(const std::string& sbb_version){
234282
if (sbb_version.rfind("2.", 0) == 0){
235283
m_logger.log("Detected sbb2. Using old (slow) command set.", COLOR_ORANGE);
236284
write_data("configure mainLoopSleepTime 0\r\n");
237-
m_supports_command_queue = false;
285+
m_supports_command_queue.store(false, std::memory_order_relaxed);
238286
}else if (PreloadSettings::instance().DEVELOPER_MODE && sbb_version.rfind("3.", 0) == 0){
239287
m_logger.log("Detected sbb3. Using CC command queue.", COLOR_BLUE);
240288
write_data("configure enablePA 1\r\n");
241-
m_supports_command_queue = true;
289+
m_supports_command_queue.store(true, std::memory_order_relaxed);
242290
}else{
243291
m_logger.log("Unrecognized sbb version: " + sbb_version, COLOR_RED);
244292
return;

SerialPrograms/Source/NintendoSwitch/Controllers/SysbotBase/SysbotBase_Connection.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class TcpSysbotBase_Connection : public ControllerConnection, private ClientSock
4444

4545
virtual ControllerModeStatus controller_mode_status() const override;
4646
bool supports_command_queue() const{
47-
return m_supports_command_queue;
47+
return m_supports_command_queue.load(std::memory_order_relaxed);
4848
}
4949

5050
void write_data(const std::string& data);
@@ -62,12 +62,16 @@ class TcpSysbotBase_Connection : public ControllerConnection, private ClientSock
6262
Logger& m_logger;
6363
ClientSocket m_socket;
6464

65-
bool m_supports_command_queue;
65+
std::atomic<bool> m_supports_command_queue;
6666

6767
std::string m_connecting_message;
6868
// std::string m_version;
6969
WallClock m_last_ping_send;
7070
WallClock m_last_ping_receive;
71+
72+
uint64_t m_ping_seqnum = 0;
73+
std::map<uint64_t, WallClock> m_active_pings;
74+
7175
std::deque<char> m_receive_buffer;
7276

7377
SpinLock m_send_lock;

SerialPrograms/Source/NintendoSwitch/NintendoSwitch_Settings.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,18 @@ ConsoleSettings::ConsoleSettings()
9898
true
9999
)
100100
, TOLERATE_SYSTEM_UPDATE_MENU_SLOW(
101-
"<b>Tolerate System Update Menu (slow):</b><br"
102-
">Some programs can bypass the system update menu, but will take a noticeable performance hit. "
101+
"<b>Tolerate System Update Menu (slow):</b><br>"
102+
"Some programs can bypass the system update menu, but will take a noticeable performance hit. "
103103
"Setting this to true enables this.",
104104
LockMode::LOCK_WHILE_RUNNING,
105105
false
106106
)
107+
, ENABLE_SBB3_PINGS(
108+
"<b>Enable sys-botbase 3 Pings:</b><br>"
109+
"Use sys-botbase's ping command for latency measurement instead of \"getVersion\".",
110+
LockMode::UNLOCK_WHILE_RUNNING,
111+
false
112+
)
107113
, SWITCH1_DIGIT_ENTRY(false)
108114
, SWITCH1_KEYBOARD_ENTRY(false)
109115
, SWITCH2_DIGIT_ENTRY(true)
@@ -119,6 +125,7 @@ ConsoleSettings::ConsoleSettings()
119125
PA_ADD_OPTION(TOLERATE_SYSTEM_UPDATE_MENU_SLOW);
120126
PA_ADD_OPTION(TIMING_OPTIONS);
121127
if (PreloadSettings::instance().DEVELOPER_MODE){
128+
PA_ADD_OPTION(ENABLE_SBB3_PINGS);
122129
PA_ADD_OPTION(SWITCH1_DIGIT_ENTRY);
123130
PA_ADD_OPTION(SWITCH1_KEYBOARD_ENTRY);
124131
PA_ADD_OPTION(SWITCH2_DIGIT_ENTRY);

SerialPrograms/Source/NintendoSwitch/NintendoSwitch_Settings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class ConsoleSettings : public BatchOption{
5151

5252
TimingOptions TIMING_OPTIONS;
5353

54+
BooleanCheckBoxOption ENABLE_SBB3_PINGS;
55+
5456
DigitEntryTimingsOption SWITCH1_DIGIT_ENTRY;
5557
KeyboardEntryTimingsOption SWITCH1_KEYBOARD_ENTRY;
5658
DigitEntryTimingsOption SWITCH2_DIGIT_ENTRY;

0 commit comments

Comments
 (0)