Moving n and phase to its own SequenceNumber struct

This commit is contained in:
Rodrigo Alfonso
2024-02-02 02:01:52 -03:00
parent ca823cae71
commit 706e2b3e21
2 changed files with 34 additions and 18 deletions

View File

@@ -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;

View File

@@ -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);