From 9e77e1010ea70cbf9abb782e39b1a52a49fef718 Mon Sep 17 00:00:00 2001 From: Rodrigo Alfonso Date: Wed, 1 Jan 2025 20:21:11 -0300 Subject: [PATCH] Adding LinkWireless::isServerClosed --- README.md | 1 + examples/LinkWireless_demo/src/main.cpp | 19 +++++++++++-------- lib/LinkWireless.hpp | 5 +++++ lib/c_bindings/C_LinkWireless.cpp | 4 ++++ lib/c_bindings/C_LinkWireless.h | 1 + 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a10cc07..44c0d6e 100644 --- a/README.md +++ b/README.md @@ -250,6 +250,7 @@ You can also change these compile-time constants: | `getState()` | **LinkWireless::State** | Returns the current state (one of `LinkWireless::State::NEEDS_RESET`, `LinkWireless::State::AUTHENTICATED`, `LinkWireless::State::SEARCHING`, `LinkWireless::State::SERVING`, `LinkWireless::State::CONNECTING`, or `LinkWireless::State::CONNECTED`). | | `isConnected()` | **bool** | Returns `true` if the player count is higher than `1`. | | `isSessionActive()` | **bool** | Returns `true` if the state is `SERVING` or `CONNECTED`. | +| `isServerClosed()` | **bool** | Returns `true` if the server was closed with `closeServer()`. | | `playerCount()` | **u8** _(1~5)_ | Returns the number of connected players. | | `currentPlayerId()` | **u8** _(0~4)_ | Returns the current player ID. | | `getLastError([clear])` | **LinkWireless::Error** | If one of the other methods returns `false`, you can inspect this to know the cause. After this call, the last error is cleared if `clear` is `true` (default behavior). | diff --git a/examples/LinkWireless_demo/src/main.cpp b/examples/LinkWireless_demo/src/main.cpp index 8339a21..3d519c7 100644 --- a/examples/LinkWireless_demo/src/main.cpp +++ b/examples/LinkWireless_demo/src/main.cpp @@ -353,24 +353,27 @@ void messageLoop() { if (didPress(KEY_UP, switching)) { #ifdef PROFILING_ENABLED // In the profiler ROM, pressing UP will update the broadcast data - if (linkWireless->getState() == LinkWireless::State::SERVING) { + if (linkWireless->getState() == LinkWireless::State::SERVING && + !(keys & KEY_START)) { linkWireless->serve("LinkWireless", ("N = " + std::to_string(counters[0])).c_str(), counters[0]); if (linkWireless->getLastError() == LinkWireless::Error::BUSY_TRY_AGAIN) { - log("Busy!"); + log("Busy! Can't update."); waitFor(KEY_DOWN); } } // In the profiler ROM, pressing START+UP will close the server - if ((keys & KEY_START) && - linkWireless->getState() == LinkWireless::State::SERVING) { - linkWireless->closeServer(); - if (linkWireless->getLastError() == - LinkWireless::Error::BUSY_TRY_AGAIN) { - log("Busy!"); + if (linkWireless->getState() == LinkWireless::State::SERVING && + !linkWireless->isServerClosed() && (keys & KEY_START)) { + if (linkWireless->closeServer()) { + log("Server closed!"); + waitFor(KEY_DOWN); + } else if (linkWireless->getLastError() == + LinkWireless::Error::BUSY_TRY_AGAIN) { + log("Busy! Can't close."); waitFor(KEY_DOWN); } } diff --git a/lib/LinkWireless.hpp b/lib/LinkWireless.hpp index 7f83f41..375e577 100644 --- a/lib/LinkWireless.hpp +++ b/lib/LinkWireless.hpp @@ -733,6 +733,11 @@ class LinkWireless { return state == SERVING || state == CONNECTED; } + /** + * @brief Returns `true` if the server was closed with `closeServer()`. + */ + [[nodiscard]] bool isServerClosed() { return sessionState.serverClosed; } + /** * @brief Returns the number of connected players. */ diff --git a/lib/c_bindings/C_LinkWireless.cpp b/lib/c_bindings/C_LinkWireless.cpp index 3f79f3b..13bd681 100644 --- a/lib/c_bindings/C_LinkWireless.cpp +++ b/lib/c_bindings/C_LinkWireless.cpp @@ -128,6 +128,10 @@ bool C_LinkWireless_isSessionActive(C_LinkWirelessHandle handle) { return static_cast(handle)->isSessionActive(); } +bool C_LinkWireless_isServerClosed(C_LinkWirelessHandle handle) { + return static_cast(handle)->isServerClosed(); +} + u8 C_LinkWireless_playerCount(C_LinkWirelessHandle handle) { return static_cast(handle)->playerCount(); } diff --git a/lib/c_bindings/C_LinkWireless.h b/lib/c_bindings/C_LinkWireless.h index 769c1e7..0dd9513 100644 --- a/lib/c_bindings/C_LinkWireless.h +++ b/lib/c_bindings/C_LinkWireless.h @@ -111,6 +111,7 @@ bool C_LinkWireless_receive(C_LinkWirelessHandle handle, C_LinkWireless_State C_LinkWireless_getState(C_LinkWirelessHandle handle); bool C_LinkWireless_isConnected(C_LinkWirelessHandle handle); bool C_LinkWireless_isSessionActive(C_LinkWirelessHandle handle); +bool C_LinkWireless_isServerClosed(C_LinkWirelessHandle handle); u8 C_LinkWireless_playerCount(C_LinkWirelessHandle handle); u8 C_LinkWireless_currentPlayerId(C_LinkWirelessHandle handle);