diff --git a/Cleanup.cmd b/Cleanup.cmd
index 69a8c2eab6..61d45f2e79 100644
--- a/Cleanup.cmd
+++ b/Cleanup.cmd
@@ -3,7 +3,7 @@ cd %~dp0\ClientProject
@call Cleanup.cmd
cd %~dp0\NativePrograms
-@call !Cleanup.cmd
+@call Cleanup.cmd
cd %~dp0\GeneratorSource
@call Cleanup.cmd
diff --git a/ClientProject/PokemonAutomationClient/PokemonAutomationClient.vcxproj b/ClientProject/PokemonAutomationClient/PokemonAutomationClient.vcxproj
index 87c5852f34..90ba8951d9 100644
--- a/ClientProject/PokemonAutomationClient/PokemonAutomationClient.vcxproj
+++ b/ClientProject/PokemonAutomationClient/PokemonAutomationClient.vcxproj
@@ -156,14 +156,17 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -193,9 +196,11 @@
-
-
-
+
+
+
+
+
true
true
diff --git a/ClientProject/PokemonAutomationClient/PokemonAutomationClient.vcxproj.filters b/ClientProject/PokemonAutomationClient/PokemonAutomationClient.vcxproj.filters
index b4513e3867..db7fa29eb3 100644
--- a/ClientProject/PokemonAutomationClient/PokemonAutomationClient.vcxproj.filters
+++ b/ClientProject/PokemonAutomationClient/PokemonAutomationClient.vcxproj.filters
@@ -27,9 +27,6 @@
{227cd5ac-1fca-4f18-a5c4-e517dd526f05}
-
- {8d23dd57-0446-4723-8b44-05293f49c650}
-
{ca670832-1439-443e-a6b2-6bf5b48ad8d3}
@@ -39,6 +36,9 @@
{10ade231-7f71-4505-a596-091dfe263106}
+
+ {8d23dd57-0446-4723-8b44-05293f49c650}
+
@@ -65,27 +65,12 @@
Source Files\ClientSource\Libraries
-
- Source Files\ClientSource\Libraries
-
Source Files\ClientSource\Libraries
-
- Source Files\Common\Clientside
-
-
- Source Files\Common\Clientside
-
Source Files\ClientSource\Connection
-
- Source Files\Common\Clientside
-
-
- Source Files\Common\Clientside
-
Source Files\Common\PokemonSwSh
@@ -128,6 +113,30 @@
Source Files\Common\SwitchFramework
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common
+
@@ -169,15 +178,6 @@
Source Files\ClientSource\Programs
-
- Source Files\Common\Clientside
-
-
- Source Files\Common\Clientside
-
-
- Source Files\Common\Clientside
-
Source Files\Common\PokemonSwSh
@@ -220,5 +220,20 @@
Source Files\Common\SwitchFramework
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
+
+ Source Files\Common\Cpp
+
\ No newline at end of file
diff --git a/ClientSource/Connection/BotBase.h b/ClientSource/Connection/BotBase.h
index 83dcae8e76..1ddeb61697 100644
--- a/ClientSource/Connection/BotBase.h
+++ b/ClientSource/Connection/BotBase.h
@@ -9,6 +9,7 @@
#include
#include
+#include
#include "Common/MessageProtocol.h"
namespace PokemonAutomation{
@@ -44,34 +45,48 @@ class BotBase{
virtual ~BotBase() = default;
virtual State state() const = 0;
virtual void wait_for_all_requests() = 0;
+ virtual void stop_all_commands() = 0;
public:
// Request Dispatch
// Return if request cannot be dispatched immediately.
template
- bool try_issue_request(SendParams& send_params);
+ bool try_issue_request(
+ const std::atomic* cancelled,
+ SendParams& send_params
+ );
// Block the thread until the request is sent.
template
- void issue_request(SendParams& send_params);
+ void issue_request(
+ const std::atomic* cancelled,
+ SendParams& send_params
+ );
- // Block the thread until the request is send and the response is received.
+ // Block the thread until the request is sent and the response is received.
template <
uint8_t SendType, uint8_t RecvType,
typename SendParams, typename RecvParams
>
- void issue_request_and_wait(SendParams& send_params, RecvParams& recv_params);
+ void issue_request_and_wait(
+ const std::atomic* cancelled,
+ SendParams& send_params,
+ RecvParams& recv_params
+ );
protected:
virtual bool try_issue_request(
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes
) = 0;
virtual void issue_request(
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes
) = 0;
virtual void issue_request_and_wait(
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
uint8_t recv_type, char* recv_params, size_t recv_bytes
) = 0;
@@ -79,28 +94,78 @@ class BotBase{
+// A wrapper for BotBase that allows for asynchronous cancelling.
+class BotBaseContext{
+public:
+ BotBaseContext(BotBase& botbase)
+ : m_botbase(&botbase)
+ , m_cancelled(false)
+ {}
+
+ BotBase& botbase() const{ return *m_botbase; }
+// operator BotBase&() const{
+// return *m_botbase;
+// }
+ BotBase* operator->() const{
+ check_cancelled();
+ return m_botbase;
+ }
+ void check_cancelled() const{
+ if (m_cancelled.load(std::memory_order_acquire)){
+ throw CancelledException();
+ }
+ }
+ void cancel(){
+ m_cancelled.store(true, std::memory_order_release);
+ m_botbase->stop_all_commands();
+ }
+
+ const std::atomic& cancelled_bool() const{
+ return m_cancelled;
+ }
+
+private:
+ BotBase* m_botbase;
+ std::atomic m_cancelled;
+};
+
+
+
+
+
// Implementations
template
-bool BotBase::try_issue_request(SendParams& send_params){
+bool BotBase::try_issue_request(
+ const std::atomic* cancelled,
+ SendParams& send_params
+){
static_assert(sizeof(SendParams) <= PABB_MAX_MESSAGE_SIZE, "Message is too large.");
- return try_issue_request(SendType, (char*)&send_params, sizeof(SendParams));
+ return try_issue_request(cancelled, SendType, (char*)&send_params, sizeof(SendParams));
}
template
-void BotBase::issue_request(SendParams& send_params){
+void BotBase::issue_request(
+ const std::atomic* cancelled,
+ SendParams& send_params
+){
static_assert(sizeof(SendParams) <= PABB_MAX_MESSAGE_SIZE, "Message is too large.");
- issue_request(SendType, (char*)&send_params, sizeof(SendParams));
+ issue_request(cancelled, SendType, (char*)&send_params, sizeof(SendParams));
}
template <
uint8_t SendType, uint8_t RecvType,
typename SendParams, typename RecvParams
>
-void BotBase::issue_request_and_wait(SendParams& send_params, RecvParams& recv_params){
+void BotBase::issue_request_and_wait(
+ const std::atomic* cancelled,
+ SendParams& send_params,
+ RecvParams& recv_params
+){
static_assert(sizeof(SendParams) <= PABB_MAX_MESSAGE_SIZE, "Message is too large.");
static_assert(sizeof(RecvParams) <= PABB_MAX_MESSAGE_SIZE, "Message is too large.");
static_assert(PABB_MSG_IS_REQUEST(SendType), "Message must be a request.");
issue_request_and_wait(
+ cancelled,
SendType, (char*)&send_params, sizeof(SendParams),
RecvType, (char*)&recv_params, sizeof(RecvParams)
);
diff --git a/ClientSource/Connection/PABotBase.cpp b/ClientSource/Connection/PABotBase.cpp
index 36d79c0312..1fb795b97b 100644
--- a/ClientSource/Connection/PABotBase.cpp
+++ b/ClientSource/Connection/PABotBase.cpp
@@ -8,6 +8,8 @@
#include
#include
#include "Common/MessageProtocol.h"
+#include "Common/Cpp/Exception.h"
+#include "Common/Cpp/PanicDump.h"
#include "PABotBase.h"
namespace PokemonAutomation{
@@ -24,7 +26,7 @@ PABotBase::PABotBase(
, m_retransmit_delay(retransmit_delay)
, m_last_ack(std::chrono::system_clock::now())
, m_state(State::RUNNING)
- , m_retransmit_thread(&PABotBase::retransmit_thread, this)
+ , m_retransmit_thread(run_with_catch, "PABotBase::retransmit_thread()", [=]{ retransmit_thread(); })
{
set_sniffer(logger);
}
@@ -38,7 +40,7 @@ void PABotBase::connect(){
// Send seqnum reset.
pabb_MsgInfoSeqnumReset params;
pabb_MsgAckRequest response;
- issue_request_and_wait(params, response);
+ issue_request_and_wait(nullptr, params, response);
}
void PABotBase::stop(){
// cout << "stop" << endl;
@@ -95,6 +97,26 @@ void PABotBase::wait_for_all_requests(){
throw CancelledException();
}
}
+void PABotBase::stop_all_commands(){
+ pabb_MsgRequestProtocolVersion params;
+ pabb_MsgAckRequest response;
+ issue_request_and_wait(nullptr, params, response);
+ {
+ std::lock_guard lg0(m_sleep_lock);
+ SpinLockGuard lg1(m_state_lock, "PABotBase::stop_all_commands()");
+
+ // Remove all commands that are before the stop seqnum.
+ uint64_t seqnum = infer_full_seqnum(m_pending_commands, response.seqnum);
+ while (true){
+ auto iter = m_pending_commands.begin();
+ if (iter == m_pending_commands.end() || iter->first > seqnum){
+ break;
+ }
+ m_pending_commands.erase(iter);
+ }
+ m_cv.notify_all();
+ }
+}
void PABotBase::remove_request(std::map::iterator iter){
// Must be called under both sleep and state locks.
m_pending_requests.erase(iter);
@@ -374,14 +396,18 @@ void PABotBase::retransmit_thread(){
bool PABotBase::try_issue_request(
std::map::iterator& iter,
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
bool silent_remove, size_t queue_limit
){
if (send_bytes > PABB_MAX_MESSAGE_SIZE){
- throw "Message is too long.";
+ PA_THROW_StringException("Message is too long.");
}
SpinLockGuard lg(m_state_lock, "PABotBase::try_issue_request()");
+ if (cancelled != nullptr && cancelled->load(std::memory_order_acquire)){
+ throw CancelledException();
+ }
State state = m_state.load(std::memory_order_acquire);
if (state != State::RUNNING){
@@ -403,7 +429,7 @@ bool PABotBase::try_issue_request(
std::forward_as_tuple()
);
if (!ret.second){
- throw "Duplicate sequence number: " + std::to_string(seqnum);
+ PA_THROW_StringException("Duplicate sequence number: " + std::to_string(seqnum));
}
m_send_seq = seqnum + 1;
@@ -422,14 +448,18 @@ bool PABotBase::try_issue_request(
}
bool PABotBase::try_issue_command(
std::map::iterator& iter,
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
bool silent_remove, size_t queue_limit
){
if (send_bytes > PABB_MAX_MESSAGE_SIZE){
- throw "Message is too long.";
+ PA_THROW_StringException("Message is too long.");
}
SpinLockGuard lg(m_state_lock, "PABotBase::try_issue_command()");
+ if (cancelled != nullptr && cancelled->load(std::memory_order_acquire)){
+ throw CancelledException();
+ }
State state = m_state.load(std::memory_order_acquire);
if (state != State::RUNNING){
@@ -457,7 +487,7 @@ bool PABotBase::try_issue_command(
std::forward_as_tuple()
);
if (!ret.second){
- throw "Duplicate sequence number: " + std::to_string(seqnum);
+ PA_THROW_StringException("Duplicate sequence number: " + std::to_string(seqnum));
}
m_send_seq = seqnum + 1;
@@ -476,6 +506,7 @@ bool PABotBase::try_issue_command(
}
bool PABotBase::issue_request(
std::map::iterator& iter,
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
bool silent_remove
){
@@ -500,12 +531,16 @@ bool PABotBase::issue_request(
while (true){
if (try_issue_request(
iter,
+ cancelled,
send_type, send_params, send_bytes,
silent_remove, MAX_PENDING_REQUESTS
)){
return true;
}
std::unique_lock lg(m_sleep_lock);
+ if (cancelled != nullptr && cancelled->load(std::memory_order_acquire)){
+ throw CancelledException();
+ }
if (m_state.load(std::memory_order_acquire) != State::RUNNING){
throw CancelledException();
}
@@ -514,6 +549,7 @@ bool PABotBase::issue_request(
}
bool PABotBase::issue_command(
std::map::iterator& iter,
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
bool silent_remove
){
@@ -538,12 +574,16 @@ bool PABotBase::issue_command(
while (true){
if (try_issue_command(
iter,
+ cancelled,
send_type, send_params, send_bytes,
silent_remove, MAX_PENDING_REQUESTS
)){
return true;
}
std::unique_lock lg(m_sleep_lock);
+ if (cancelled != nullptr && cancelled->load(std::memory_order_acquire)){
+ throw CancelledException();
+ }
if (m_state.load(std::memory_order_acquire) != State::RUNNING){
throw CancelledException();
}
@@ -553,37 +593,40 @@ bool PABotBase::issue_command(
bool PABotBase::try_issue_request(
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes
){
if (!PABB_MSG_IS_COMMAND(send_type)){
std::map::iterator iter;
- return try_issue_request(iter, send_type, send_params, send_bytes, true, MAX_PENDING_REQUESTS);
+ return try_issue_request(iter, cancelled, send_type, send_params, send_bytes, true, MAX_PENDING_REQUESTS);
}else{
std::map::iterator iter;
- return try_issue_command(iter, send_type, send_params, send_bytes, true, MAX_PENDING_REQUESTS);
+ return try_issue_command(iter, cancelled, send_type, send_params, send_bytes, true, MAX_PENDING_REQUESTS);
}
}
void PABotBase::issue_request(
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes
){
if (!PABB_MSG_IS_COMMAND(send_type)){
std::map::iterator iter;
- issue_request(iter, send_type, send_params, send_bytes, true);
+ issue_request(iter, cancelled, send_type, send_params, send_bytes, true);
}else{
std::map::iterator iter;
- issue_command(iter, send_type, send_params, send_bytes, true);
+ issue_command(iter, cancelled, send_type, send_params, send_bytes, true);
}
}
void PABotBase::issue_request_and_wait(
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
uint8_t recv_type, char* recv_params, size_t recv_bytes
){
if (!PABB_MSG_IS_REQUEST(send_type)){
- throw "This function only supports requests.";
+ PA_THROW_StringException("This function only supports requests.");
}
std::map::iterator iter;
- issue_request(iter, send_type, send_params, send_bytes, false);
+ issue_request(iter, cancelled, send_type, send_params, send_bytes, false);
// Wait for ack.
while (true){
@@ -609,13 +652,13 @@ void PABotBase::issue_request_and_wait(
if (type != recv_type){
SpinLockGuard slg(m_state_lock, "PABotBase::issue_request_and_wait() - 1");
remove_request(iter);
- throw "Received incorrect response type: " + std::to_string(type);
+ PA_THROW_StringException("Received incorrect response type: " + std::to_string(type));
}
const std::string& body = iter->second.ack.body;
if (body.size() != recv_bytes){
SpinLockGuard slg(m_state_lock, "PABotBase::issue_request_and_wait() - 2");
remove_request(iter);
- throw "Received incorrect response size: " + std::to_string(body.size());
+ PA_THROW_StringException("Received incorrect response size: " + std::to_string(body.size()));
}
memcpy(recv_params, body.c_str(), body.size());
@@ -629,19 +672,19 @@ void PABotBase::issue_request_and_wait(
uint32_t PABotBase::protocol_version(){
pabb_MsgRequestProtocolVersion params;
pabb_MsgAckRequestI32 response;
- issue_request_and_wait(params, response);
+ issue_request_and_wait(nullptr, params, response);
return response.data;
}
uint32_t PABotBase::program_version(){
pabb_MsgRequestProgramVersion params;
pabb_MsgAckRequestI32 response;
- issue_request_and_wait(params, response);
+ issue_request_and_wait(nullptr, params, response);
return response.data;
}
uint8_t PABotBase::program_id(){
pabb_MsgRequestProgramID params;
pabb_MsgAckRequestI8 response;
- issue_request_and_wait(params, response);
+ issue_request_and_wait(nullptr, params, response);
return response.data;
}
diff --git a/ClientSource/Connection/PABotBase.h b/ClientSource/Connection/PABotBase.h
index a44382089e..3da01e6dee 100644
--- a/ClientSource/Connection/PABotBase.h
+++ b/ClientSource/Connection/PABotBase.h
@@ -29,7 +29,7 @@
#include
#include
#include
-#include "Common/Clientside/SpinLock.h"
+#include "Common/Cpp/SpinLock.h"
#include "ClientSource/Connection/PABotBaseConnection.h"
#include "ClientSource/Libraries/Logging.h"
#include "BotBase.h"
@@ -76,6 +76,10 @@ class PABotBase : public BotBase, private PABotBaseConnection{
// Waits for all pending requests to finish.
virtual void wait_for_all_requests() override;
+ // Stop all pending commands. This wipes the command queue on both sides
+ // and stops any currently executing command.
+ virtual void stop_all_commands() override;
+
public:
// For Command Implementations
@@ -125,32 +129,39 @@ class PABotBase : public BotBase, private PABotBaseConnection{
private:
bool try_issue_request(
std::map::iterator& iter,
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
bool silent_remove, size_t queue_limit
);
bool try_issue_command(
std::map::iterator& iter,
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
bool silent_remove, size_t queue_limit
);
bool issue_request(
std::map::iterator& iter,
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
bool silent_remove
);
bool issue_command(
std::map::iterator& iter,
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
bool silent_remove
);
virtual bool try_issue_request(
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes
) override;
virtual void issue_request(
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes
) override;
virtual void issue_request_and_wait(
+ const std::atomic* cancelled,
uint8_t send_type, char* send_params, size_t send_bytes,
uint8_t recv_type, char* recv_params, size_t recv_bytes
) override;
diff --git a/ClientSource/Connection/PABotBaseConnection.cpp b/ClientSource/Connection/PABotBaseConnection.cpp
index 3d67aa64d6..94422f9964 100644
--- a/ClientSource/Connection/PABotBaseConnection.cpp
+++ b/ClientSource/Connection/PABotBaseConnection.cpp
@@ -7,6 +7,7 @@
#include
#include "Common/CRC32.h"
#include "Common/MessageProtocol.h"
+#include "Common/Cpp/Exception.h"
#include "ClientSource/Libraries/Logging.h"
#include "ClientSource/Libraries/MessageConverter.h"
#include "PABotBaseConnection.h"
@@ -53,7 +54,7 @@ void PABotBaseConnection::send_message(const BotBaseMessage& message, bool is_re
size_t total_bytes = PABB_PROTOCOL_OVERHEAD + message.body.size();
if (total_bytes > PABB_MAX_PACKET_SIZE){
- throw "Message is too long.";
+ PA_THROW_StringException("Message is too long.");
}
std::string buffer;
diff --git a/ClientSource/Connection/PABotBaseConnection.h b/ClientSource/Connection/PABotBaseConnection.h
index c11c29c282..8d195726e6 100644
--- a/ClientSource/Connection/PABotBaseConnection.h
+++ b/ClientSource/Connection/PABotBaseConnection.h
@@ -19,7 +19,6 @@
#include
#include "Common/Compiler.h"
#include "Common/MessageProtocol.h"
-#include "ClientSource/Libraries/Compiler.h"
#include "BotBase.h"
#include "StreamInterface.h"
diff --git a/ClientSource/Connection/SerialConnectionPOSIX.h b/ClientSource/Connection/SerialConnectionPOSIX.h
index ac759c5205..450fd8f7e5 100644
--- a/ClientSource/Connection/SerialConnectionPOSIX.h
+++ b/ClientSource/Connection/SerialConnectionPOSIX.h
@@ -13,7 +13,9 @@
#include
#include
#include
-#include "Common/Clientside/SpinLock.h"
+#include "Common/Cpp/Exception.h"
+#include "Common/Cpp/SpinLock.h"
+#include "Common/Cpp/PanicDump.h"
#include "StreamInterface.h"
//#include
@@ -34,7 +36,7 @@ class SerialConnection : public StreamConnection{
case 57600: baud = B57600; break;
case 115200: baud = B115200;break;
default:
- throw "Unsupported Baud Rate: " + std::to_string(baud_rate);
+ PA_THROW_StringException("Unsupported Baud Rate: " + std::to_string(baud_rate));
}
// std::cout << "desired baud = " << baud << std::endl;
@@ -45,13 +47,13 @@ class SerialConnection : public StreamConnection{
if (error == EACCES){
str += " (permission denied)\nPlease run as sudo.";
}
- throw str;
+ PA_THROW_StringException(std::move(str));
}
struct termios options;
if (tcgetattr(m_fd, &options) == -1){
int error = errno;
- throw "tcgetattr() failed. Error = " + std::to_string(error);
+ PA_THROW_StringException("tcgetattr() failed. Error = " + std::to_string(error));
}
// std::cout << "read baud = " << cfgetispeed(&options) << std::endl;
// std::cout << "write baud = " << cfgetospeed(&options) << std::endl;
@@ -59,11 +61,11 @@ class SerialConnection : public StreamConnection{
// Baud Rate
if (cfsetispeed(&options, baud) == -1){
int error = errno;
- throw "cfsetispeed() failed. Error = " + std::to_string(error);
+ PA_THROW_StringException("cfsetispeed() failed. Error = " + std::to_string(error));
}
if (cfsetospeed(&options, baud) == -1){
int error = errno;
- throw "cfsetospeed() failed. Error = " + std::to_string(error);
+ PA_THROW_StringException("cfsetospeed() failed. Error = " + std::to_string(error));
}
// std::cout << "write baud = " << cfgetispeed(&options) << std::endl;
// std::cout << "write baud = " << cfgetospeed(&options) << std::endl;
@@ -102,27 +104,28 @@ class SerialConnection : public StreamConnection{
if (tcsetattr(m_fd, TCSANOW, &options) == -1){
int error = errno;
- throw "tcsetattr() failed. Error = " + std::to_string(error);
+ PA_THROW_StringException("tcsetattr() failed. Error = " + std::to_string(error));
}
if (tcgetattr(m_fd, &options) == -1){
int error = errno;
- throw "tcgetattr() failed. Error = " + std::to_string(error);
+ PA_THROW_StringException("tcgetattr() failed. Error = " + std::to_string(error));
}
if (cfgetispeed(&options) != baud){
// std::cout << "actual baud = " << cfgetispeed(&options) << std::endl;
- throw "Unable to set input baud rate.";
+ PA_THROW_StringException("Unable to set input baud rate.");
}
if (cfgetospeed(&options) != baud){
// std::cout << "actual baud = " << cfgetospeed(&options) << std::endl;
- throw "Unable to set output baud rate.";
+ PA_THROW_StringException("Unable to set output baud rate.");
}
// Start receiver thread.
try{
- m_listener = std::thread(&SerialConnection::recv_loop, this);
+ m_listener = std::thread(run_with_catch, "SerialConnection::SerialConnection()", [=]{ recv_loop(); });
}catch (...){
close(m_fd);
+ throw;
}
}
diff --git a/ClientSource/Connection/SerialConnectionWinAPI.h b/ClientSource/Connection/SerialConnectionWinAPI.h
index 4e2bb6540f..15e7146784 100644
--- a/ClientSource/Connection/SerialConnectionWinAPI.h
+++ b/ClientSource/Connection/SerialConnectionWinAPI.h
@@ -12,8 +12,10 @@
#include
#include
#include "Common/Compiler.h"
-#include "Common/Clientside/Unicode.h"
-#include "Common/Clientside/SpinLock.h"
+#include "Common/Cpp/Exception.h"
+#include "Common/Cpp/Unicode.h"
+#include "Common/Cpp/SpinLock.h"
+#include "Common/Cpp/PanicDump.h"
#include "ClientSource/Libraries/Logging.h"
#include "StreamInterface.h"
@@ -42,7 +44,7 @@ class SerialConnection : public StreamConnection{
);
if (m_handle == INVALID_HANDLE_VALUE){
DWORD error = GetLastError();
- throw "Unable to open serial connection. Error = " + std::to_string(error);
+ PA_THROW_StringException("Unable to open serial connection. Error = " + std::to_string(error));
}
DCB serial_params{0};
@@ -51,7 +53,7 @@ class SerialConnection : public StreamConnection{
if (!GetCommState(m_handle, &serial_params)){
DWORD error = GetLastError();
CloseHandle(m_handle);
- throw "GetCommState() failed. Error = " + std::to_string(error);
+ PA_THROW_StringException("GetCommState() failed. Error = " + std::to_string(error));
}
// cout << "BaudRate = " << (int)serial_params.BaudRate << endl;
// cout << "ByteSize = " << (int)serial_params.ByteSize << endl;
@@ -64,7 +66,7 @@ class SerialConnection : public StreamConnection{
if (!SetCommState(m_handle, &serial_params)){
DWORD error = GetLastError();
CloseHandle(m_handle);
- throw "SetCommState() failed. Error = " + std::to_string(error);
+ PA_THROW_StringException("SetCommState() failed. Error = " + std::to_string(error));
}
#if 1
@@ -72,7 +74,7 @@ class SerialConnection : public StreamConnection{
if (!GetCommTimeouts(m_handle, &timeouts)){
DWORD error = GetLastError();
CloseHandle(m_handle);
- throw "GetCommTimeouts() failed. Error = " + std::to_string(error);
+ PA_THROW_StringException("GetCommTimeouts() failed. Error = " + std::to_string(error));
}
//std::cout << "ReadIntervalTimeout = " << timeouts.ReadIntervalTimeout << std::endl;
@@ -94,15 +96,16 @@ class SerialConnection : public StreamConnection{
if (!SetCommTimeouts(m_handle, &timeouts)){
DWORD error = GetLastError();
CloseHandle(m_handle);
- throw "SetCommTimeouts() failed. Error = " + std::to_string(error);
+ PA_THROW_StringException("SetCommTimeouts() failed. Error = " + std::to_string(error));
}
#endif
// Start receiver thread.
try{
- m_listener = std::thread(&SerialConnection::recv_loop, this);
+ m_listener = std::thread(run_with_catch, "SerialConnection::SerialConnection()", [=]{ recv_loop(); });
}catch (...){
CloseHandle(m_handle);
+ throw;
}
}
virtual ~SerialConnection(){
diff --git a/ClientSource/Libraries/Compiler.h b/ClientSource/Libraries/Compiler.h
deleted file mode 100644
index 2243a0cbd0..0000000000
--- a/ClientSource/Libraries/Compiler.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Pokemon Automation Push Button Framework
- *
- * From: https://github.com/PokemonAutomation/Arduino-Source
- *
- */
-
-
-// Disable specific warnings.
-
-#if _MSC_VER
-
-#pragma warning(disable:4100) // Unreferenced Formal Parameter
-#pragma warning(disable:4127) // Conditional expresstion is constant
-#pragma warning(disable:4996) // Unsafe function
-
-#else
-
-
-
-#endif
diff --git a/ClientSource/Libraries/Logging.cpp b/ClientSource/Libraries/Logging.cpp
index a8b0219d02..052f2b40b0 100644
--- a/ClientSource/Libraries/Logging.cpp
+++ b/ClientSource/Libraries/Logging.cpp
@@ -10,6 +10,7 @@
#include
#include
#include "Common/MessageProtocol.h"
+#include "Common/Cpp/Exception.h"
#include "Common/PokemonSwSh/PokemonSwShMisc.h"
#include "MessageConverter.h"
#include "Logging.h"
@@ -19,7 +20,7 @@ namespace PokemonAutomation{
std::string to_string_padded(size_t digits, uint64_t x){
std::string str = std::to_string(x);
if (digits < str.size()){
- throw "Number is too big to convert to fixed length string.";
+ PA_THROW_StringException("Number is too big to convert to fixed length string.");
}
return std::string(digits - str.size(), '0') + str;
}
diff --git a/ClientSource/Libraries/Logging.h b/ClientSource/Libraries/Logging.h
index 52b13cf347..ba3eb5b77d 100644
--- a/ClientSource/Libraries/Logging.h
+++ b/ClientSource/Libraries/Logging.h
@@ -24,7 +24,7 @@ std::string current_time();
class MessageLogger : public MessageSniffer{
public:
MessageLogger(bool log_everything = false)
- : m_low_everything_owner(false)
+ : m_low_everything_owner(log_everything)
, m_log_everything(m_low_everything_owner)
{}
MessageLogger(std::atomic& log_everything)
diff --git a/ClientSource/Libraries/MessageConverter.cpp b/ClientSource/Libraries/MessageConverter.cpp
index 41edc6276a..f3c12832a8 100644
--- a/ClientSource/Libraries/MessageConverter.cpp
+++ b/ClientSource/Libraries/MessageConverter.cpp
@@ -8,7 +8,7 @@
#include