From 706e2b3e2127788416e6f600d918beb9e73d40e8 Mon Sep 17 00:00:00 2001 From: Rodrigo Alfonso Date: Fri, 2 Feb 2024 02:01:52 -0300 Subject: [PATCH] Moving n and phase to its own SequenceNumber struct --- lib/LinkWirelessMultiboot.hpp | 22 ++++++++-------------- lib/LinkWirelessOpenSDK.hpp | 30 ++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/lib/LinkWirelessMultiboot.hpp b/lib/LinkWirelessMultiboot.hpp index c5a1e5a..d74e705 100644 --- a/lib/LinkWirelessMultiboot.hpp +++ b/lib/LinkWirelessMultiboot.hpp @@ -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; diff --git a/lib/LinkWirelessOpenSDK.hpp b/lib/LinkWirelessOpenSDK.hpp index e627499..730fe15 100644 --- a/lib/LinkWirelessOpenSDK.hpp +++ b/lib/LinkWirelessOpenSDK.hpp @@ -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 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);