mirror of
https://github.com/afska/gba-link-connection.git
synced 2026-10-02 13:56:42 -05:00
Moving n and phase to its own SequenceNumber struct
This commit is contained in:
@@ -210,7 +210,7 @@ class LinkWirelessMultiboot {
|
||||
if (!sendAndExpectData(
|
||||
linkWirelessOpenSDK->createServerBuffer(
|
||||
LINK_WIRELESS_MULTIBOOT_CMD_START,
|
||||
LINK_WIRELESS_MULTIBOOT_CMD_START_SIZE, 1, 0,
|
||||
LINK_WIRELESS_MULTIBOOT_CMD_START_SIZE, {1, 0},
|
||||
LinkWirelessOpenSDK::CommState::STARTING, 0, 0b0001),
|
||||
response))
|
||||
return FAILURE;
|
||||
@@ -232,12 +232,11 @@ class LinkWirelessMultiboot {
|
||||
|
||||
// ROM START
|
||||
u32 transferredBytes = 0;
|
||||
u32 n = 1;
|
||||
u32 phase = 0;
|
||||
LinkWirelessOpenSDK::SequenceNumber sequence = {.n = 1, .phase = 0};
|
||||
u32 progress = 0;
|
||||
while (transferredBytes < romSize) {
|
||||
auto sendBuffer = linkWirelessOpenSDK->createServerBuffer(
|
||||
rom, romSize, n, phase, LinkWirelessOpenSDK::CommState::COMMUNICATING,
|
||||
rom, romSize, sequence, LinkWirelessOpenSDK::CommState::COMMUNICATING,
|
||||
transferredBytes, 0b0001);
|
||||
LinkRawWireless::ReceiveDataResponse response;
|
||||
if (!sendAndExpectData(sendBuffer.data, sendBuffer.dataSize,
|
||||
@@ -249,14 +248,8 @@ class LinkWirelessMultiboot {
|
||||
|
||||
for (u32 i = 0; i < childrenData.responses[0].packetsSize; i++) {
|
||||
auto header = childrenData.responses[0].packets[i].header;
|
||||
if (header.isACK && header.n == n && header.phase == phase) {
|
||||
phase++;
|
||||
if (phase == 4) {
|
||||
phase = 0;
|
||||
n++;
|
||||
if (n == 4)
|
||||
n = 0;
|
||||
}
|
||||
if (header.isACK && header.sequence() == sequence) {
|
||||
sequence.inc();
|
||||
transferredBytes += sendBuffer.header.payloadSize;
|
||||
u32 newProgress = transferredBytes * 100 / romSize;
|
||||
if (newProgress != progress) {
|
||||
@@ -275,7 +268,7 @@ class LinkWirelessMultiboot {
|
||||
LinkRawWireless::ReceiveDataResponse response;
|
||||
if (!sendAndExpectData(
|
||||
linkWirelessOpenSDK->createServerBuffer(
|
||||
{}, 0, 0, 0, LinkWirelessOpenSDK::CommState::ENDING, 0,
|
||||
{}, 0, {0, 0}, LinkWirelessOpenSDK::CommState::ENDING, 0,
|
||||
0b0001),
|
||||
response))
|
||||
return FAILURE;
|
||||
@@ -300,7 +293,8 @@ class LinkWirelessMultiboot {
|
||||
LinkRawWireless::ReceiveDataResponse response;
|
||||
if (!sendAndExpectData(
|
||||
linkWirelessOpenSDK->createServerBuffer(
|
||||
{}, 0, 1, 0, LinkWirelessOpenSDK::CommState::OFF, 0, 0b0001),
|
||||
{}, 0, {1, 0}, LinkWirelessOpenSDK::CommState::OFF, 0,
|
||||
0b0001),
|
||||
response))
|
||||
return FAILURE;
|
||||
hasData = true;
|
||||
|
||||
@@ -54,6 +54,25 @@ class LinkWirelessOpenSDK {
|
||||
DIRECT = 4
|
||||
};
|
||||
|
||||
struct SequenceNumber {
|
||||
u32 n = 0;
|
||||
u32 phase = 0;
|
||||
|
||||
void inc() {
|
||||
phase++;
|
||||
if (phase == 4) {
|
||||
phase = 0;
|
||||
n++;
|
||||
if (n == 4)
|
||||
n = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool operator==(const SequenceNumber& other) {
|
||||
return n == other.n && phase == other.phase;
|
||||
}
|
||||
};
|
||||
|
||||
struct ServerSDKHeader {
|
||||
unsigned int payloadSize : 7;
|
||||
unsigned int _unused_ : 2;
|
||||
@@ -62,6 +81,8 @@ class LinkWirelessOpenSDK {
|
||||
unsigned int isACK : 1;
|
||||
CommState commState : 4;
|
||||
unsigned int targetSlots : 4;
|
||||
|
||||
SequenceNumber sequence() { return SequenceNumber{.n = n, .phase = phase}; }
|
||||
};
|
||||
union ServerSDKHeaderSerializer {
|
||||
ServerSDKHeader asStruct;
|
||||
@@ -85,6 +106,8 @@ class LinkWirelessOpenSDK {
|
||||
unsigned int n : 2;
|
||||
unsigned int isACK : 1;
|
||||
CommState commState : 4;
|
||||
|
||||
SequenceNumber sequence() { return SequenceNumber{.n = n, .phase = phase}; }
|
||||
};
|
||||
union ClientSDKHeaderSerializer {
|
||||
ClientSDKHeader asStruct;
|
||||
@@ -142,8 +165,7 @@ class LinkWirelessOpenSDK {
|
||||
|
||||
SendBuffer<ServerSDKHeader> createServerBuffer(const u8* fullPayload,
|
||||
u32 fullPayloadSize,
|
||||
u8 n,
|
||||
u8 phase,
|
||||
SequenceNumber sequence,
|
||||
CommState commState,
|
||||
u32 offset = 0,
|
||||
u8 targetSlots = 0b1111) {
|
||||
@@ -154,8 +176,8 @@ class LinkWirelessOpenSDK {
|
||||
buffer.header.isACK = 0;
|
||||
buffer.header.targetSlots = targetSlots;
|
||||
buffer.header.payloadSize = payloadSize;
|
||||
buffer.header.n = n;
|
||||
buffer.header.phase = phase;
|
||||
buffer.header.n = sequence.n;
|
||||
buffer.header.phase = sequence.phase;
|
||||
buffer.header.commState = commState;
|
||||
u32 headerInt = serializeServerHeader(buffer.header);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user