diff --git a/lib/LinkWireless.hpp b/lib/LinkWireless.hpp index 34900b3..f37a7a0 100644 --- a/lib/LinkWireless.hpp +++ b/lib/LinkWireless.hpp @@ -145,11 +145,11 @@ LINK_VERSION_TAG LINK_WIRELESS_VERSION = "vLinkWireless/v8.0.0"; #define LINK_WIRELESS_DEFAULT_INTERVAL 50 #define LINK_WIRELESS_DEFAULT_SEND_TIMER_ID 3 -#define LINK_WIRELESS_RESET_IF_NEEDED \ - if (!isEnabled) \ - return false; \ - if (linkRawWireless.getState() == State::NEEDS_RESET) \ - if (!reset()) \ +#define LINK_WIRELESS_RESET_IF_NEEDED \ + if (!isEnabled) \ + return false; \ + if (getState() == State::NEEDS_RESET) \ + if (!reset()) \ return false; /** @@ -347,8 +347,7 @@ class LinkWireless { const char* userName = "", u16 gameId = LINK_WIRELESS_MAX_GAME_ID) { LINK_WIRELESS_RESET_IF_NEEDED - if (linkRawWireless.getState() != State::AUTHENTICATED && - linkRawWireless.getState() != State::SERVING) + if (getState() != State::AUTHENTICATED && getState() != State::SERVING) return badRequest(Error::WRONG_STATE); if (Link::strlen(gameName) > LINK_WIRELESS_MAX_GAME_NAME_LENGTH) return badRequest(Error::GAME_NAME_TOO_LONG); @@ -359,14 +358,14 @@ class LinkWireless { if (isAsyncCommandActive()) return badRequest(Error::BUSY_TRY_AGAIN); - if (linkRawWireless.getState() != State::SERVING) { + if (getState() != State::SERVING) { if (!setup(config.maxPlayers)) return abort(Error::COMMAND_FAILED); } bool success = linkRawWireless.broadcast(gameName, userName, gameId, false); - if (linkRawWireless.getState() != State::SERVING) + if (getState() != State::SERVING) success = success && linkRawWireless.startHost(false); if (!success) @@ -387,7 +386,7 @@ class LinkWireless { */ bool closeServer() { LINK_WIRELESS_RESET_IF_NEEDED - if (linkRawWireless.getState() != State::SERVING || + if (getState() != State::SERVING || linkRawWireless.sessionState.isServerClosed) return badRequest(Error::WRONG_STATE); @@ -423,7 +422,7 @@ class LinkWireless { if (!isSessionActive()) return badRequest(Error::WRONG_STATE); - if (linkRawWireless.getState() == LinkRawWireless::State::SERVING) { + if (getState() == LinkRawWireless::State::SERVING) { for (u32 i = 0; i < LINK_WIRELESS_MAX_PLAYERS; i++) response.signalLevels[i] = sessionState.signalLevel.level[i]; return true; @@ -483,7 +482,7 @@ class LinkWireless { */ bool getServersAsyncStart() { LINK_WIRELESS_RESET_IF_NEEDED - if (linkRawWireless.getState() != State::AUTHENTICATED) + if (getState() != State::AUTHENTICATED) return badRequest(Error::WRONG_STATE); bool success = linkRawWireless.broadcastReadStart(); @@ -501,7 +500,7 @@ class LinkWireless { */ bool getServersAsyncEnd(Server servers[]) { LINK_WIRELESS_RESET_IF_NEEDED - if (linkRawWireless.getState() != State::SEARCHING) + if (getState() != State::SEARCHING) return badRequest(Error::WRONG_STATE); LinkRawWireless::BroadcastReadPollResponse response; @@ -540,7 +539,7 @@ class LinkWireless { */ bool connect(u16 serverId) { LINK_WIRELESS_RESET_IF_NEEDED - if (linkRawWireless.getState() != State::AUTHENTICATED) + if (getState() != State::AUTHENTICATED) return badRequest(Error::WRONG_STATE); bool success = linkRawWireless.connect(serverId); @@ -559,7 +558,7 @@ class LinkWireless { */ bool keepConnecting() { LINK_WIRELESS_RESET_IF_NEEDED - if (linkRawWireless.getState() != State::CONNECTING) + if (getState() != State::CONNECTING) return badRequest(Error::WRONG_STATE); LinkRawWireless::ConnectionStatus response; @@ -638,7 +637,9 @@ class LinkWireless { * @brief Returns the current state. * @return One of the enum values from `State`. */ - [[nodiscard]] State getState() { return linkRawWireless.getState(); } + [[nodiscard]] LINK_INLINE State getState() { + return linkRawWireless.getState(); + } /** * @brief Returns `true` if the player count is higher than `1`. @@ -651,8 +652,7 @@ class LinkWireless { * @brief Returns `true` if the state is `SERVING` or `CONNECTED`. */ [[nodiscard]] bool isSessionActive() { - return linkRawWireless.getState() == State::SERVING || - linkRawWireless.getState() == State::CONNECTED; + return getState() == State::SERVING || getState() == State::CONNECTED; } /** @@ -975,7 +975,7 @@ class LinkWireless { #ifndef LINK_WIRELESS_TWO_PLAYERS_ONLY void forwardMessageIfNeeded(Message& message) { - if (linkRawWireless.getState() == State::SERVING && config.forwarding && + if (getState() == State::SERVING && config.forwarding && linkRawWireless.sessionState.playerCount > 2) send(message.data, message.playerId); } @@ -1008,6 +1008,8 @@ class LinkWireless { : Error::COMMAND_FAILED); } + auto state = getState(); + switch (commandResult->commandId) { case LinkRawWireless::COMMAND_SIGNAL_LEVEL: { // SignalLevel (end) @@ -1031,11 +1033,11 @@ class LinkWireless { // SendData (end) #ifdef LINK_WIRELESS_USE_SEND_RECEIVE_LATCH - if (linkRawWireless.getState() == State::CONNECTED) + if (state == State::CONNECTED) sessionState.shouldWaitForServer = true; sessionState.sendReceiveLatch = !sessionState.sendReceiveLatch; #else - if (linkRawWireless.getState() == State::SERVING) { + if (state == State::SERVING) { // ReceiveData (start) sendCommandAsync(LinkRawWireless::COMMAND_RECEIVE_DATA); } @@ -1064,7 +1066,7 @@ class LinkWireless { addIncomingMessagesFromData(commandResult); #ifndef LINK_WIRELESS_USE_SEND_RECEIVE_LATCH - if (linkRawWireless.getState() == State::CONNECTED) { + if (state == State::CONNECTED) { // SendData (start) sendPendingData(); } @@ -1078,18 +1080,16 @@ class LinkWireless { } LINK_INLINE void checkConnectionsOrTransferData() { // (irq only) - if (linkRawWireless.getState() == State::SERVING && - !sessionState.signalLevelCalled) { + if (getState() == State::SERVING && !sessionState.signalLevelCalled) { // SignalLevel (start) if (sendCommandAsync(LinkRawWireless::COMMAND_SIGNAL_LEVEL)) sessionState.signalLevelCalled = true; - } else if (linkRawWireless.getState() == State::CONNECTED || - isConnected()) { + } else if (getState() == State::CONNECTED || isConnected()) { #ifdef LINK_WIRELESS_USE_SEND_RECEIVE_LATCH bool shouldReceive = !sessionState.sendReceiveLatch || sessionState.shouldWaitForServer; #else - bool shouldReceive = linkRawWireless.getState() == State::CONNECTED; + bool shouldReceive = getState() == State::CONNECTED; #endif if (shouldReceive) { @@ -1164,7 +1164,7 @@ class LinkWireless { #endif u32 checksum = header.dataChecksum; bool isPing = !config.retransmission && isConfirmation; - bool isServer = linkRawWireless.getState() == State::SERVING; + bool isServer = getState() == State::SERVING; if (checksum != buildChecksum(data)) continue; @@ -1210,7 +1210,7 @@ class LinkWireless { } bool acceptMessage(Message& message) { // (irq only) - if (linkRawWireless.getState() == State::SERVING) { + if (getState() == State::SERVING) { u32 expectedPacketId = (sessionState.lastPacketIdFromClients[message.playerId] + 1) % MAX_PACKET_IDS; @@ -1254,7 +1254,7 @@ class LinkWireless { } void addConfirmations() { // (irq only) - if (linkRawWireless.getState() == State::SERVING) { + if (getState() == State::SERVING) { #ifndef LINK_WIRELESS_TWO_PLAYERS_ONLY if (config.maxPlayers > 2 && (sessionState.lastPacketIdFromClients[1] == 0 || @@ -1287,7 +1287,7 @@ class LinkWireless { u8 remotePlayerId) { // (irq only) u32 confirmationData = (confirmation.packetId << 16) | confirmation.data; - if (linkRawWireless.getState() == State::CONNECTED) { + if (getState() == State::CONNECTED) { if (remotePlayerId == 0 && !sessionState.didReceiveLastPacketIdFromServer) { sessionState.lastPacketIdFromServer = confirmationData; @@ -1354,7 +1354,7 @@ class LinkWireless { #ifdef LINK_WIRELESS_TWO_PLAYERS_ONLY header.quickData = QUICK_SEND; #else - if (linkRawWireless.getState() == State::SERVING) { + if (getState() == State::SERVING) { header.clientCount = linkRawWireless.sessionState.playerCount - LINK_WIRELESS_MIN_PLAYERS; } else { @@ -1388,9 +1388,11 @@ class LinkWireless { } bool checkRemoteTimeouts() { // (irq only) - for (u32 i = 0; i < linkRawWireless.sessionState.playerCount; i++) { - if ((i == 0 || linkRawWireless.getState() == State::SERVING) && - sessionState.msgTimeouts[i] > config.timeout) + if (getState() == State::CONNECTED) + return false; + + for (u32 i = 1; i < linkRawWireless.sessionState.playerCount; i++) { + if (sessionState.msgTimeouts[i] > config.timeout) return false; } @@ -1399,7 +1401,7 @@ class LinkWireless { #endif u32 getDeviceTransferLength() { // (irq only) - return linkRawWireless.getState() == State::SERVING + return getState() == State::SERVING ? LINK_WIRELESS_MAX_SERVER_TRANSFER_LENGTH : LINK_WIRELESS_MAX_CLIENT_TRANSFER_LENGTH; }