55#include < unity.h>
66#include < iostream>
77#include < bitset>
8+ #include " helpers.h"
89
910StubbornSender sender (ELRS_TELEMETRY_MAX_PACKAGES);
1011StubbornReceiver receiver (ELRS_TELEMETRY_MAX_PACKAGES);
@@ -284,7 +285,7 @@ void test_stubborn_link_sends_data_until_confirmation(void)
284285 receiver.ResetState ();
285286 receiver.SetDataToReceive (sizeof (buffer), buffer, 1 );
286287
287- for (int i = 0 ; i < 100 ; i++)
288+ for (int i = 0 ; i < sender. GetMaxPacketsBeforeResync () ; i++)
288289 {
289290 sender.GetCurrentPayload (&packageIndex, &maxLength, &data);
290291 TEST_ASSERT_EQUAL (1 , packageIndex);
@@ -328,6 +329,54 @@ void test_stubborn_link_multiple_packages(void)
328329
329330}
330331
332+ static void test_stubborn_link_resync_then_send (void )
333+ {
334+ uint8_t testSequence1[] = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 };
335+ uint8_t testSequence2[] = {11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 };
336+ uint8_t buffer[100 ];
337+ uint8_t *data;
338+ uint8_t maxLength;
339+ uint8_t packageIndex;
340+
341+ receiver.ResetState ();
342+ receiver.SetDataToReceive (sizeof (buffer), buffer, 1 );
343+
344+ sender.ResetState ();
345+ sender.SetDataToTransmit (sizeof (testSequence1), testSequence1, 1 );
346+
347+ // send and confirm two packages
348+ sender.GetCurrentPayload (&packageIndex, &maxLength, &data);
349+ receiver.ReceiveData (packageIndex, data);
350+ sender.ConfirmCurrentPayload (receiver.GetCurrentConfirm ());
351+
352+ sender.GetCurrentPayload (&packageIndex, &maxLength, &data);
353+ receiver.ReceiveData (packageIndex, data);
354+ sender.ConfirmCurrentPayload (receiver.GetCurrentConfirm ());
355+
356+ // Abort the transfer by changing the payload
357+ sender.SetDataToTransmit (sizeof (testSequence2), testSequence2, 1 );
358+
359+ // Send next packet, which should be a RESYNC
360+ sender.GetCurrentPayload (&packageIndex, &maxLength, &data);
361+ TEST_ASSERT_EQUAL (ELRS_TELEMETRY_MAX_PACKAGES, packageIndex);
362+ receiver.ReceiveData (packageIndex, data);
363+ sender.ConfirmCurrentPayload (receiver.GetCurrentConfirm ());
364+
365+ // Complete the transfer
366+ int maxSends = ELRS_TELEMETRY_MAX_PACKAGES + 1 ;
367+ while (!receiver.HasFinishedData () && maxSends)
368+ {
369+ sender.GetCurrentPayload (&packageIndex, &maxLength, &data);
370+ receiver.ReceiveData (packageIndex, data);
371+ sender.ConfirmCurrentPayload (receiver.GetCurrentConfirm ());
372+ }
373+
374+ // Should not have exhausted all the sends to get the package to go
375+ TEST_ASSERT_NOT_EQUAL (0 , maxSends);
376+ // Make sure the second package was received, not the first
377+ TEST_ASSERT_EQUAL_UINT8_ARRAY (testSequence2, buffer, ARRAY_SIZE (testSequence2));
378+ }
379+
331380int main (int argc, char **argv)
332381{
333382 UNITY_BEGIN ();
@@ -341,6 +390,7 @@ int main(int argc, char **argv)
341390 RUN_TEST (test_stubborn_link_sends_data_until_confirmation);
342391 RUN_TEST (test_stubborn_link_multiple_packages);
343392 RUN_TEST (test_stubborn_link_resyncs_during_last_confirm);
393+ RUN_TEST (test_stubborn_link_resync_then_send);
344394 UNITY_END ();
345395
346396 return 0 ;
0 commit comments