mirror of
https://github.com/afska/gba-link-connection.git
synced 2026-10-01 21:36:53 -05:00
Renaming queues with more descriptive names and adding developer notes
This commit is contained in:
@@ -229,7 +229,7 @@ class LinkCable {
|
||||
LINK_CABLE_BARRIER;
|
||||
|
||||
for (u32 i = 0; i < LINK_CABLE_MAX_PLAYERS; i++)
|
||||
move(_state.pendingMessages[i], state.incomingMessages[i]);
|
||||
move(_state.readyToSyncMessages[i], state.syncedIncomingMessages[i]);
|
||||
|
||||
LINK_CABLE_BARRIER;
|
||||
isReadingMessages = false;
|
||||
@@ -276,7 +276,7 @@ class LinkCable {
|
||||
* until you *fetch new data* with `sync()`.
|
||||
*/
|
||||
[[nodiscard]] bool canRead(u8 playerId) {
|
||||
return !state.incomingMessages[playerId].isEmpty();
|
||||
return !state.syncedIncomingMessages[playerId].isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -284,7 +284,7 @@ class LinkCable {
|
||||
* @param playerId A player ID.
|
||||
* \warning If there's no data from that player, a `0` will be returned.
|
||||
*/
|
||||
u16 read(u8 playerId) { return state.incomingMessages[playerId].pop(); }
|
||||
u16 read(u8 playerId) { return state.syncedIncomingMessages[playerId].pop(); }
|
||||
|
||||
/**
|
||||
* @brief Returns the next message from player #`playerId` without dequeuing
|
||||
@@ -293,7 +293,7 @@ class LinkCable {
|
||||
* \warning If there's no data from that player, a `0` will be returned.
|
||||
*/
|
||||
[[nodiscard]] u16 peek(u8 playerId) {
|
||||
return state.incomingMessages[playerId].peek();
|
||||
return state.syncedIncomingMessages[playerId].peek();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -418,14 +418,14 @@ class LinkCable {
|
||||
|
||||
private:
|
||||
struct ExternalState {
|
||||
U16Queue incomingMessages[LINK_CABLE_MAX_PLAYERS];
|
||||
U16Queue syncedIncomingMessages[LINK_CABLE_MAX_PLAYERS];
|
||||
u8 playerCount;
|
||||
u8 currentPlayerId;
|
||||
};
|
||||
|
||||
struct InternalState {
|
||||
U16Queue outgoingMessages;
|
||||
U16Queue pendingMessages[LINK_CABLE_MAX_PLAYERS];
|
||||
U16Queue readyToSyncMessages[LINK_CABLE_MAX_PLAYERS];
|
||||
U16Queue newMessages[LINK_CABLE_MAX_PLAYERS];
|
||||
int timeouts[LINK_CABLE_MAX_PLAYERS];
|
||||
bool IRQFlag;
|
||||
@@ -478,7 +478,7 @@ class LinkCable {
|
||||
|
||||
for (u32 i = 0; i < LINK_CABLE_MAX_PLAYERS; i++) {
|
||||
if (!isReadingMessages)
|
||||
_state.pendingMessages[i].clear();
|
||||
_state.readyToSyncMessages[i].clear();
|
||||
|
||||
_state.newMessages[i].clear();
|
||||
setOffline(i);
|
||||
@@ -511,7 +511,7 @@ class LinkCable {
|
||||
|
||||
void clearIncomingMessages() {
|
||||
for (u32 i = 0; i < LINK_CABLE_MAX_PLAYERS; i++)
|
||||
state.incomingMessages[i].clear();
|
||||
state.syncedIncomingMessages[i].clear();
|
||||
}
|
||||
|
||||
void copyState() {
|
||||
@@ -520,9 +520,9 @@ class LinkCable {
|
||||
|
||||
for (u32 i = 0; i < LINK_CABLE_MAX_PLAYERS; i++) {
|
||||
if (isOnline(i))
|
||||
move(_state.newMessages[i], _state.pendingMessages[i]);
|
||||
move(_state.newMessages[i], _state.readyToSyncMessages[i]);
|
||||
else
|
||||
_state.pendingMessages[i].clear();
|
||||
_state.readyToSyncMessages[i].clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -581,4 +581,21 @@ inline void LINK_CABLE_ISR_TIMER() {
|
||||
linkCable->_onTimer();
|
||||
}
|
||||
|
||||
/**
|
||||
* NOTES:
|
||||
* For end users:
|
||||
* - `sync()` fills an incoming queue (`syncedIncomingMessages`).
|
||||
* - `read(...)` pops one message from that queue.
|
||||
* - `send(...)` pushes one message to an outgoing queue (`outgoingMessages`).
|
||||
* Behind the curtains:
|
||||
* - On each SERIAL IRQ:
|
||||
* -> Each new message is pushed to `newMessages`.
|
||||
* - On each VBLANK, SERIAL, or TIMER IRQ:
|
||||
* -> **If the user is not syncing**:
|
||||
* -> All `newMessages` are moved to `readyToSyncMessages`.
|
||||
* -> **If the user is not sending**:
|
||||
* -> Pops one message from `outgoingMessages` and transfers it.
|
||||
* - `sync()` moves all `readyToSyncMessages` to `syncedIncomingMessages`.
|
||||
*/
|
||||
|
||||
#endif // LINK_CABLE_H
|
||||
|
||||
@@ -602,14 +602,14 @@ class LinkWireless {
|
||||
isAddingMessage = true;
|
||||
LINK_WIRELESS_BARRIER;
|
||||
|
||||
sessionState.tmpMessagesToSend.push(message);
|
||||
sessionState.newOutgoingMessages.push(message);
|
||||
|
||||
LINK_WIRELESS_BARRIER;
|
||||
isAddingMessage = false;
|
||||
LINK_WIRELESS_BARRIER;
|
||||
|
||||
if (isPendingClearActive) {
|
||||
sessionState.tmpMessagesToSend.clear();
|
||||
sessionState.newOutgoingMessages.clear();
|
||||
isPendingClearActive = false;
|
||||
}
|
||||
|
||||
@@ -1009,10 +1009,10 @@ class LinkWireless {
|
||||
};
|
||||
|
||||
struct SessionState {
|
||||
MessageQueue incomingMessages; // read by user, write by irq&user
|
||||
MessageQueue outgoingMessages; // read and write by irq
|
||||
MessageQueue tmpMessagesToReceive; // read and write by irq
|
||||
MessageQueue tmpMessagesToSend; // read by irq, write by user&irq
|
||||
MessageQueue incomingMessages; // read by user, write by irq&user
|
||||
MessageQueue outgoingMessages; // read and write by irq
|
||||
MessageQueue newIncomingMessages; // read and write by irq
|
||||
MessageQueue newOutgoingMessages; // read by irq, write by user&irq
|
||||
u32 timeouts[LINK_WIRELESS_MAX_PLAYERS];
|
||||
u32 recvTimeout = 0;
|
||||
u32 frameRecvCount = 0;
|
||||
@@ -1281,7 +1281,7 @@ class LinkWireless {
|
||||
if (!handleConfirmation(message))
|
||||
continue;
|
||||
} else {
|
||||
sessionState.tmpMessagesToReceive.push(message);
|
||||
sessionState.newIncomingMessages.push(message);
|
||||
}
|
||||
}
|
||||
copyIncomingState();
|
||||
@@ -1467,11 +1467,11 @@ class LinkWireless {
|
||||
if (isAddingMessage)
|
||||
return;
|
||||
|
||||
while (!sessionState.tmpMessagesToSend.isEmpty()) {
|
||||
while (!sessionState.newOutgoingMessages.isEmpty()) {
|
||||
if (!_canSend())
|
||||
break;
|
||||
|
||||
auto message = sessionState.tmpMessagesToSend.pop();
|
||||
auto message = sessionState.newOutgoingMessages.pop();
|
||||
message.packetId = newPacketId();
|
||||
sessionState.outgoingMessages.push(message);
|
||||
}
|
||||
@@ -1481,8 +1481,8 @@ class LinkWireless {
|
||||
if (isReadingMessages)
|
||||
return;
|
||||
|
||||
while (!sessionState.tmpMessagesToReceive.isEmpty()) {
|
||||
auto message = sessionState.tmpMessagesToReceive.pop();
|
||||
while (!sessionState.newIncomingMessages.isEmpty()) {
|
||||
auto message = sessionState.newIncomingMessages.pop();
|
||||
sessionState.incomingMessages.push(message);
|
||||
}
|
||||
}
|
||||
@@ -1574,9 +1574,9 @@ class LinkWireless {
|
||||
this->sessionState.incomingMessages.clear();
|
||||
this->sessionState.outgoingMessages.clear();
|
||||
|
||||
this->sessionState.tmpMessagesToReceive.clear();
|
||||
this->sessionState.newIncomingMessages.clear();
|
||||
if (!isAddingMessage)
|
||||
this->sessionState.tmpMessagesToSend.clear();
|
||||
this->sessionState.newOutgoingMessages.clear();
|
||||
else
|
||||
isPendingClearActive = true;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user