Skip to content

Commit 27affe9

Browse files
committed
Out-of-band string logging for PABotBase2.
1 parent 1f11193 commit 27affe9

7 files changed

Lines changed: 202 additions & 37 deletions

Common/PABotBase2/PABotBase2CC_MessageDumper.cpp

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ std::string tostr(const PacketHeader* header){
4040
case PABB2_CONNECTION_OPCODE_RET_VERSION:
4141
str += "PABB2_CONNECTION_OPCODE_RET_VERSION: seqnum = ";
4242
str += std::to_string(header->seqnum);
43-
str += ", version = " + std::to_string(((const PacketHeader_Ack_u32*)header)->data);
43+
str += ", version = " + std::to_string(((const PacketHeader_u32*)header)->data);
4444
return str;
4545

4646
case PABB2_CONNECTION_OPCODE_ASK_PACKET_SIZE:
@@ -50,7 +50,7 @@ std::string tostr(const PacketHeader* header){
5050
case PABB2_CONNECTION_OPCODE_RET_PACKET_SIZE:
5151
str += "PABB2_CONNECTION_OPCODE_RET_PACKET_SIZE: seqnum = ";
5252
str += std::to_string(header->seqnum);
53-
str += ", bytes = " + std::to_string(((const PacketHeader_Ack_u16*)header)->data);
53+
str += ", bytes = " + std::to_string(((const PacketHeader_u16*)header)->data);
5454
return str;
5555

5656
case PABB2_CONNECTION_OPCODE_ASK_BUFFER_SLOTS:
@@ -60,7 +60,7 @@ std::string tostr(const PacketHeader* header){
6060
case PABB2_CONNECTION_OPCODE_RET_BUFFER_SLOTS:
6161
str += "PABB2_CONNECTION_OPCODE_RET_BUFFER_SLOTS: seqnum = ";
6262
str += std::to_string(header->seqnum);
63-
str += ", slots = " + std::to_string(((const PacketHeader_Ack_u8*)header)->data);
63+
str += ", slots = " + std::to_string(((const PacketHeader_u8*)header)->data);
6464
return str;
6565

6666
case PABB2_CONNECTION_OPCODE_ASK_BUFFER_BYTES:
@@ -70,7 +70,7 @@ std::string tostr(const PacketHeader* header){
7070
case PABB2_CONNECTION_OPCODE_RET_BUFFER_BYTES:
7171
str += "PABB2_CONNECTION_OPCODE_RET_BUFFER_BYTES: seqnum = ";
7272
str += std::to_string(header->seqnum);
73-
str += ", bytes = " + std::to_string(((const PacketHeader_Ack_u16*)header)->data);
73+
str += ", bytes = " + std::to_string(((const PacketHeader_u16*)header)->data);
7474
return str;
7575

7676
case PABB2_CONNECTION_OPCODE_ASK_STREAM_DATA:
@@ -96,18 +96,66 @@ std::string tostr(const PacketHeader* header){
9696
case PABB2_CONNECTION_OPCODE_INFO_U8:
9797
str += "PABB2_CONNECTION_OPCODE_INFO_U8: seqnum = ";
9898
str += std::to_string(header->seqnum);
99-
str += ", data = " + std::to_string(((const PacketHeader_Ack_u8*)header)->data);
99+
str += ", data = " + std::to_string(((const PacketHeader_u8*)header)->data);
100100
return str;
101101
case PABB2_CONNECTION_OPCODE_INFO_U16:
102102
str += "PABB2_CONNECTION_OPCODE_INFO_U16: seqnum = ";
103103
str += std::to_string(header->seqnum);
104-
str += ", data = " + std::to_string(((const PacketHeader_Ack_u16*)header)->data);
104+
str += ", data = " + std::to_string(((const PacketHeader_u16*)header)->data);
105+
return str;
106+
case PABB2_CONNECTION_OPCODE_INFO_H32:
107+
str += "PABB2_CONNECTION_OPCODE_INFO_H32: seqnum = ";
108+
str += std::to_string(header->seqnum);
109+
str += ", data = " + tostr_hex(((const PacketHeader_u32*)header)->data);
105110
return str;
106111
case PABB2_CONNECTION_OPCODE_INFO_U32:
107112
str += "PABB2_CONNECTION_OPCODE_INFO_U32: seqnum = ";
108113
str += std::to_string(header->seqnum);
109-
str += ", data = " + std::to_string(((const PacketHeader_Ack_u32*)header)->data);
114+
str += ", data = " + std::to_string(((const PacketHeader_u32*)header)->data);
110115
return str;
116+
case PABB2_CONNECTION_OPCODE_INFO_I32:
117+
str += "PABB2_CONNECTION_OPCODE_INFO_I32: seqnum = ";
118+
str += std::to_string(header->seqnum);
119+
str += ", data = " + std::to_string((int32_t)((const PacketHeader_u32*)header)->data);
120+
return str;
121+
case PABB2_CONNECTION_OPCODE_INFO_STR:
122+
str += "PABB2_CONNECTION_OPCODE_INFO_STR: ";
123+
str += std::to_string(header->seqnum);
124+
str += std::string(
125+
(const char*)(header + 1),
126+
header->packet_bytes - sizeof(PacketHeader) - sizeof(uint32_t)
127+
);
128+
return str;
129+
case PABB2_CONNECTION_OPCODE_INFO_LABEL_H32:{
130+
const PacketHeader_u32* packet = (const PacketHeader_u32*)header;
131+
str += "PABB2_CONNECTION_OPCODE_INFO_LABEL_H32: ";
132+
str += std::string(
133+
(const char*)(packet + 1),
134+
header->packet_bytes - sizeof(PacketHeader_u32) - sizeof(uint32_t)
135+
);
136+
str += ": " + tostr_hex(packet->data);
137+
return str;
138+
}
139+
case PABB2_CONNECTION_OPCODE_INFO_LABEL_U32:{
140+
const PacketHeader_u32* packet = (const PacketHeader_u32*)header;
141+
str += "PABB2_CONNECTION_OPCODE_INFO_LABEL_U32: ";
142+
str += std::string(
143+
(const char*)(packet + 1),
144+
header->packet_bytes - sizeof(PacketHeader_u32) - sizeof(uint32_t)
145+
);
146+
str += ": " + std::to_string(packet->data);
147+
return str;
148+
}
149+
case PABB2_CONNECTION_OPCODE_INFO_LABEL_I32:{
150+
const PacketHeader_u32* packet = (const PacketHeader_u32*)header;
151+
str += "PABB2_CONNECTION_OPCODE_INFO_LABEL_I32: ";
152+
str += std::string(
153+
(const char*)(packet + 1),
154+
header->packet_bytes - sizeof(PacketHeader_u32) - sizeof(uint32_t)
155+
);
156+
str += ": " + std::to_string((int32_t)packet->data);
157+
return str;
158+
}
111159

112160
case PABB2_CONNECTION_OPCODE_INVALID_LENGTH:
113161
str += "PABB2_CONNECTION_OPCODE_INVALID_LENGTH: seqnum = ";

Common/PABotBase2/ReliableConnectionLayer/PABotBase2CC_ReliableStreamConnection.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ void ReliableStreamConnection::send_ack(uint8_t seqnum, uint8_t opcode){
204204
void ReliableStreamConnection::send_ack_u16(uint8_t seqnum, uint8_t opcode, uint16_t data){
205205
// Must call inside lock.
206206
struct{
207-
PacketHeader_Ack_u16 header;
207+
PacketHeader_u16 header;
208208
uint8_t crc[sizeof(uint32_t)];
209209
} packet;
210210
packet.header.magic_number = PABB2_CONNECTION_MAGIC_NUMBER;
@@ -345,7 +345,13 @@ void ReliableStreamConnection::on_packet(const PacketHeader* packet){
345345
case PABB2_CONNECTION_OPCODE_INFO:
346346
case PABB2_CONNECTION_OPCODE_INFO_U8:
347347
case PABB2_CONNECTION_OPCODE_INFO_U16:
348+
case PABB2_CONNECTION_OPCODE_INFO_H32:
348349
case PABB2_CONNECTION_OPCODE_INFO_U32:
350+
case PABB2_CONNECTION_OPCODE_INFO_I32:
351+
case PABB2_CONNECTION_OPCODE_INFO_STR:
352+
case PABB2_CONNECTION_OPCODE_INFO_LABEL_H32:
353+
case PABB2_CONNECTION_OPCODE_INFO_LABEL_U32:
354+
case PABB2_CONNECTION_OPCODE_INFO_LABEL_I32:
349355
// cout << "Received ack" << endl;
350356
if (!m_log_everything){
351357
m_logger.log("[RSC]: Receive: " + tostr(packet), COLOR_PURPLE);
@@ -361,13 +367,13 @@ void ReliableStreamConnection::on_packet(const PacketHeader* packet){
361367
}
362368
void ReliableStreamConnection::process_UNKNOWN_OPCODE(const PacketHeader* packet){
363369
std::lock_guard<Mutex> lg(m_lock);
364-
if (packet->packet_bytes < sizeof(PacketHeader_Ack_u8) + sizeof(uint32_t)){
370+
if (packet->packet_bytes < sizeof(PacketHeader_u8) + sizeof(uint32_t)){
365371
m_error = "Unknown opcode packet is too small: " + std::to_string(packet->packet_bytes);
366372
m_logger.log("[RSC]: " + m_error, COLOR_RED);
367373
return;
368374
}
369375

370-
const PacketHeader_Ack_u8* message = (const PacketHeader_Ack_u8*)packet;
376+
const PacketHeader_u8* message = (const PacketHeader_u8*)packet;
371377
m_logger.log(
372378
"[RSC]: PABB2_CONNECTION_OPCODE_INVALID_OPCODE: Device reported an invalid opcode: " +
373379
std::to_string(message->data),
@@ -385,14 +391,14 @@ void ReliableStreamConnection::process_RET_VERSION(const PacketHeader* packet){
385391
// m_logger.log(tostr(packet), COLOR_DARKGREEN);
386392
do{
387393
std::lock_guard<Mutex> lg(m_lock);
388-
if (packet->packet_bytes < sizeof(PacketHeader_Ack_u32) + sizeof(uint32_t)){
394+
if (packet->packet_bytes < sizeof(PacketHeader_u32) + sizeof(uint32_t)){
389395
m_error = "Version response is too small: " + std::to_string(packet->packet_bytes);
390396
m_logger.log("[RSC]: " + m_error, COLOR_RED);
391397
break;
392398
}
393399
m_reliable_sender.remove(packet->seqnum);
394400

395-
const PacketHeader_Ack_u32* message = (const PacketHeader_Ack_u32*)packet;
401+
const PacketHeader_u32* message = (const PacketHeader_u32*)packet;
396402
uint32_t protocol = message->data;
397403
m_remote_protocol = protocol;
398404
std::string str = "Remote Protocol: " + std::to_string(protocol);
@@ -414,14 +420,14 @@ void ReliableStreamConnection::process_RET_VERSION(const PacketHeader* packet){
414420
m_cv.notify_all();
415421
}
416422
void ReliableStreamConnection::process_RET_PACKET_SIZE(const PacketHeader* packet){
417-
if (packet->packet_bytes < sizeof(PacketHeader_Ack_u16) + sizeof(uint32_t)){
423+
if (packet->packet_bytes < sizeof(PacketHeader_u16) + sizeof(uint32_t)){
418424
m_logger.log(
419425
"[RSC]: Packet size response is too small: " + std::to_string(packet->packet_bytes),
420426
COLOR_RED
421427
);
422428
return;
423429
}
424-
const PacketHeader_Ack_u16* message = (const PacketHeader_Ack_u16*)packet;
430+
const PacketHeader_u16* message = (const PacketHeader_u16*)packet;
425431
m_logger.log(
426432
"[RSC]: Setting Packet Size to: " + std::to_string(message->data),
427433
COLOR_BLUE
@@ -434,14 +440,14 @@ void ReliableStreamConnection::process_RET_PACKET_SIZE(const PacketHeader* packe
434440
m_cv.notify_all();
435441
}
436442
void ReliableStreamConnection::process_RET_BUFFER_SLOTS(const PacketHeader* packet){
437-
if (packet->packet_bytes < sizeof(PacketHeader_Ack_u8) + sizeof(uint32_t)){
443+
if (packet->packet_bytes < sizeof(PacketHeader_u8) + sizeof(uint32_t)){
438444
m_logger.log(
439445
"[RSC]: Buffer slot response is too small: " + std::to_string(packet->packet_bytes),
440446
COLOR_RED
441447
);
442448
return;
443449
}
444-
const PacketHeader_Ack_u8* message = (const PacketHeader_Ack_u8*)packet;
450+
const PacketHeader_u8* message = (const PacketHeader_u8*)packet;
445451
m_logger.log(
446452
"[RSC]: Setting Buffer Slots to: " + std::to_string(message->data),
447453
COLOR_BLUE
@@ -454,14 +460,14 @@ void ReliableStreamConnection::process_RET_BUFFER_SLOTS(const PacketHeader* pack
454460
m_cv.notify_all();
455461
}
456462
void ReliableStreamConnection::process_RET_BUFFER_BYTES(const PacketHeader* packet){
457-
if (packet->packet_bytes < sizeof(PacketHeader_Ack_u16) + sizeof(uint32_t)){
463+
if (packet->packet_bytes < sizeof(PacketHeader_u16) + sizeof(uint32_t)){
458464
m_logger.log(
459465
"[RSC]: Buffer slot response is too small: " + std::to_string(packet->packet_bytes),
460466
COLOR_RED
461467
);
462468
return;
463469
}
464-
const PacketHeader_Ack_u16* message = (const PacketHeader_Ack_u16*)packet;
470+
const PacketHeader_u16* message = (const PacketHeader_u16*)packet;
465471
m_logger.log(
466472
"[RSC]: Setting Buffer Slots to: " + std::to_string(message->data),
467473
COLOR_BLUE

Common/PABotBase2/ReliableConnectionLayer/PABotBase2FW_ReliableStreamConnection.cpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
*
55
*/
66

7-
//#include <stdio.h>
7+
#include <string.h>
8+
#include <algorithm>
89
#include "PABotBase2_ConnectionDebug.h"
910
#include "PABotBase2FW_ReliableStreamConnection.h"
1011

@@ -26,9 +27,31 @@ namespace PABotBase2{
2627
ReliableStreamConnectionFW::ReliableStreamConnectionFW(UnreliableStreamConnectionPolling& unreliable_connection)
2728
: m_unreliable_connection(unreliable_connection)
2829
, m_reliable_sender(unreliable_connection, (uint8_t)(PABB2_MAX_INCOMING_PACKET_SIZE % 256))
30+
, m_last_retransmit(pabb_current_time())
2931
{}
3032

3133

34+
35+
void ReliableStreamConnectionFW::send_oob_info_str(const char* str){
36+
const size_t MAX_LENGTH = 256 - sizeof(PacketHeader) - sizeof(uint32_t);
37+
size_t len = strlen(str);
38+
m_reliable_sender.send_oob_packet_data(
39+
0, PABB2_CONNECTION_OPCODE_INFO_STR,
40+
(uint8_t)std::min(len, MAX_LENGTH), str
41+
);
42+
}
43+
void ReliableStreamConnectionFW::send_oob_info_label_i32(uint8_t opcode, const char* str, uint32_t data){
44+
const size_t MAX_LENGTH = 256 - sizeof(PacketHeader_u32) - sizeof(uint32_t);
45+
size_t len = strlen(str);
46+
m_reliable_sender.send_oob_packet_u32_data(
47+
0, opcode,
48+
data,
49+
(uint8_t)std::min(len, MAX_LENGTH), str
50+
);
51+
}
52+
53+
54+
3255
void ReliableStreamConnectionFW::wait_for_event(uint16_t milliseconds){
3356
// If we have unacked sends, we cap the wait time since those may need to
3457
// be retransmitted.
@@ -37,10 +60,20 @@ void ReliableStreamConnectionFW::wait_for_event(uint16_t milliseconds){
3760
}
3861
return m_unreliable_connection.wait_for_recv_available(milliseconds);
3962
}
63+
bool ReliableStreamConnectionFW::iterate_retransmits(){
64+
WallClock now = pabb_current_time();
65+
WallClock next_retransmit = m_last_retransmit + pabb_milliseconds(PABB2_ReliableConnectionFW_POLL_MS);
66+
if (pabb_time_wrapsafe_cmplt(now, next_retransmit)){
67+
return false;
68+
}
69+
70+
m_last_retransmit = now;
71+
return m_reliable_sender.iterate_retransmits();
72+
}
4073
bool ReliableStreamConnectionFW::run_events(){
4174
const PacketHeader* packet = m_parser.pull_bytes(m_unreliable_connection);
42-
if (packet == NULL){
43-
return m_reliable_sender.iterate_retransmits();
75+
if (packet == nullptr){
76+
return iterate_retransmits();
4477
}
4578

4679
// Check the packet status.

Common/PABotBase2/ReliableConnectionLayer/PABotBase2FW_ReliableStreamConnection.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,19 @@
1616
#define PABB2_ReliableConnectionFW_POLL_MS 50
1717
#endif
1818

19+
#ifdef PABB2_ENABLE
20+
#include "PabbTime.h"
21+
#else
22+
#include "Common/Cpp/Time.h"
23+
inline PokemonAutomation::WallClock pabb_current_time(){
24+
return PokemonAutomation::current_time();
25+
}
26+
inline PokemonAutomation::Milliseconds pabb_milliseconds(int64_t milliseconds){
27+
return PokemonAutomation::Milliseconds(milliseconds);
28+
}
29+
#define pabb_time_wrapsafe_cmplt(x, y) ((x) < (y))
30+
#endif
31+
1932
namespace PokemonAutomation{
2033
namespace PABotBase2{
2134

@@ -56,6 +69,16 @@ class ReliableStreamConnectionFW final : public ReliableStreamConnectionPolling{
5669
void send_oob_info_u32(uint32_t data){
5770
m_reliable_sender.send_oob_packet_u32(0, PABB2_CONNECTION_OPCODE_INFO_U32, data);
5871
}
72+
void send_oob_info_str(const char* str);
73+
void send_oob_info_label_h32(const char* str, const uint32_t& data){
74+
send_oob_info_label_i32(PABB2_CONNECTION_OPCODE_INFO_LABEL_H32, str, data);
75+
}
76+
void send_oob_info_label_u32(const char* str, const uint32_t& data){
77+
send_oob_info_label_i32(PABB2_CONNECTION_OPCODE_INFO_LABEL_U32, str, data);
78+
}
79+
void send_oob_info_label_i32(const char* str, const int32_t& data){
80+
send_oob_info_label_i32(PABB2_CONNECTION_OPCODE_INFO_LABEL_I32, str, data);
81+
}
5982

6083

6184
public:
@@ -65,12 +88,18 @@ class ReliableStreamConnectionFW final : public ReliableStreamConnectionPolling{
6588
}
6689

6790

91+
private:
92+
void send_oob_info_label_i32(uint8_t opcode, const char* str, uint32_t data);
93+
bool iterate_retransmits();
94+
95+
6896
private:
6997
UnreliableStreamConnectionPolling& m_unreliable_connection;
7098
PacketSender m_reliable_sender;
7199
PacketParser m_parser;
72100
StreamCoalescer m_stream_coalescer;
73101

102+
WallClock m_last_retransmit;
74103
bool m_reset_flag = false;
75104
};
76105

Common/PABotBase2/ReliableConnectionLayer/PABotBase2_PacketProtocol.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,21 @@ struct PABB_PACK PacketHeader{
4949
#define PABB2_CONNECTION_OPCODE_RET_RESET 0x41
5050

5151

52-
struct PABB_PACK PacketHeader_Ack_u8{
52+
struct PABB_PACK PacketHeader_u8{
5353
uint8_t magic_number;
5454
uint8_t seqnum;
5555
uint8_t packet_bytes;
5656
uint8_t opcode;
5757
uint8_t data;
5858
};
59-
struct PABB_PACK PacketHeader_Ack_u16{
59+
struct PABB_PACK PacketHeader_u16{
6060
uint8_t magic_number;
6161
uint8_t seqnum;
6262
uint8_t packet_bytes;
6363
uint8_t opcode;
6464
uint16_t data;
6565
};
66-
struct PABB_PACK PacketHeader_Ack_u32{
66+
struct PABB_PACK PacketHeader_u32{
6767
uint8_t magic_number;
6868
uint8_t seqnum;
6969
uint8_t packet_bytes;
@@ -109,7 +109,13 @@ struct PABB_PACK PacketHeaderData{
109109
#define PABB2_CONNECTION_OPCODE_INFO 0x20
110110
#define PABB2_CONNECTION_OPCODE_INFO_U8 0x21
111111
#define PABB2_CONNECTION_OPCODE_INFO_U16 0x22
112-
#define PABB2_CONNECTION_OPCODE_INFO_U32 0x23
112+
#define PABB2_CONNECTION_OPCODE_INFO_H32 0x23
113+
#define PABB2_CONNECTION_OPCODE_INFO_U32 0x24
114+
#define PABB2_CONNECTION_OPCODE_INFO_I32 0x25
115+
#define PABB2_CONNECTION_OPCODE_INFO_STR 0x26
116+
#define PABB2_CONNECTION_OPCODE_INFO_LABEL_H32 0x27
117+
#define PABB2_CONNECTION_OPCODE_INFO_LABEL_U32 0x28
118+
#define PABB2_CONNECTION_OPCODE_INFO_LABEL_I32 0x29
113119

114120
#define PABB2_CONNECTION_OPCODE_INVALID_LENGTH 0x30
115121
#define PABB2_CONNECTION_OPCODE_INVALID_CHECKSUM_FAIL 0x31

0 commit comments

Comments
 (0)