Skip to content

Commit d1f9127

Browse files
committed
Made corrections to TransmissionScheduler to fix some edge cases
1 parent 7b5424c commit d1f9127

2 files changed

Lines changed: 153 additions & 28 deletions

File tree

src/coreLib/TransmissionScheduler.cpp

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,33 @@ TransmittionScheduler::~TransmittionScheduler() {}
77

88
uint32_t TransmittionScheduler::add(std::shared_ptr<Transmission> tx)
99
{
10-
std::list<std::shared_ptr<Transmission>>::const_iterator iter = mSchedule.cend();
11-
if (iter != mSchedule.cbegin())
10+
// Keep iterating until correct position is found
11+
// For this to be the right position, it either needs to start and end before the next
12+
// packet or starts before the next packet and is higher or same priority.
13+
std::list<std::shared_ptr<Transmission>>::const_iterator iter = mSchedule.cbegin();
14+
while(iter != mSchedule.cend())
1215
{
13-
std::list<std::shared_ptr<Transmission>>::const_iterator iterNext = iter;
14-
--iterNext;
15-
// Keep iterating until correct position is found
16-
// For this to be the right position, it either needs to start and end before the next
17-
// packet or starts before the next packet and is higher or same priority.
18-
while(iter != mSchedule.cbegin()
19-
&& ((*iterNext)->nextTxTimeUs > tx->getNextCompletionTime()
20-
|| (
21-
(*iterNext)->getNextCompletionTime() > tx->nextTxTimeUs
22-
&& ((
23-
tx->nextTxTimeUs < (*iterNext)->nextTxTimeUs
24-
&& (*iterNext)->priority == tx->priority
25-
)
26-
|| (*iterNext)->priority > tx->priority)
27-
)
28-
)
29-
)
16+
// If this transmission starts before this element...
17+
if (tx->nextTxTimeUs < (*iter)->nextTxTimeUs)
3018
{
31-
--iter;
32-
--iterNext;
19+
// if this transmission also ends before this element starts
20+
// or is of higher or same priority...
21+
if (tx->getNextCompletionTime() < (*iter)->nextTxTimeUs
22+
|| tx->priority <= (*iter)->priority)
23+
{
24+
// Stop here
25+
break;
26+
}
3327
}
28+
// If this transmission starts before this element completes
29+
// and is higher priority...
30+
else if (tx->nextTxTimeUs < (*iter)->getNextCompletionTime()
31+
&& tx->priority < (*iter)->priority)
32+
{
33+
// Stop here
34+
break;
35+
}
36+
++iter;
3437
}
3538

3639
mSchedule.insert(iter, tx);
@@ -87,7 +90,22 @@ std::shared_ptr<const TransmittionScheduler::Transmission> TransmittionScheduler
8790
}
8891
else
8992
{
90-
// TODO: See if a item down the schedule could start now and end before mSchedule.begin()
93+
// See if a item down the schedule could start now and end before mSchedule.begin().
94+
// It's easier to check here than to rearrange schedule every time a higher priority
95+
// transmission preempts a lower priority one.
96+
std::list<std::shared_ptr<Transmission>>::iterator iter = mSchedule.begin();
97+
++iter;
98+
while(iter != mSchedule.end())
99+
{
100+
if (time >= (*iter)->nextTxTimeUs
101+
&& (*iter)->getNextCompletionTime() < (*mSchedule.begin())->nextTxTimeUs)
102+
{
103+
item = (*iter);
104+
mSchedule.erase(iter);
105+
break;
106+
}
107+
++iter;
108+
}
91109
}
92110
}
93111
return item;

src/test/TransmissionSchedulerTests.cpp

Lines changed: 113 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,62 @@ TEST_F(TransmissionScheduleTest, multiAddBoundary2)
203203
EXPECT_EQ((*iter++)->transmissionId, 2);
204204
}
205205

206-
class TransmissionSchedulePopTest : public TransmissionScheduleTest
206+
TEST_F(TransmissionScheduleTest, multiAddBoundary3)
207+
{
208+
uint8_t priority = 255;
209+
uint64_t txTime = 1;
210+
MaplePacket packet1(0x11, 0x01, 0x99887766);
211+
bool expectResponse = true;
212+
uint32_t expectedResponseNumPayloadWords = 10;
213+
uint32_t autoRepeatUs = 0;
214+
uint32_t readTimeoutUs = 8675309;
215+
uint32_t id1 = scheduler.add(priority,
216+
txTime,
217+
packet1,
218+
expectResponse,
219+
expectedResponseNumPayloadWords,
220+
autoRepeatUs,
221+
readTimeoutUs);
222+
EXPECT_EQ(id1, 0);
223+
224+
txTime = 2;
225+
expectedResponseNumPayloadWords = 3; // 267 us
226+
MaplePacket packet2(0x22, 0x02, 0x99887766);
227+
uint32_t id2 = scheduler.add(priority,
228+
txTime,
229+
packet2,
230+
expectResponse,
231+
expectedResponseNumPayloadWords,
232+
autoRepeatUs,
233+
readTimeoutUs);
234+
EXPECT_EQ(id2, 1);
235+
236+
priority = 0;
237+
txTime = 2 + 300;
238+
expectedResponseNumPayloadWords = 0;
239+
MaplePacket packet3(0x33, 0x02, 0x99887766);
240+
uint32_t id3 = scheduler.add(priority,
241+
txTime,
242+
packet3,
243+
expectResponse,
244+
expectedResponseNumPayloadWords,
245+
autoRepeatUs,
246+
readTimeoutUs);
247+
EXPECT_EQ(id3, 2);
248+
249+
const std::list<std::shared_ptr<TransmittionScheduler::Transmission>> schedule = scheduler.getSchedule();
250+
251+
ASSERT_EQ(schedule.size(), 3);
252+
std::list<std::shared_ptr<TransmittionScheduler::Transmission>>::const_iterator iter = schedule.cbegin();
253+
EXPECT_EQ((*iter++)->transmissionId, 2);
254+
EXPECT_EQ((*iter++)->transmissionId, 0);
255+
EXPECT_EQ((*iter++)->transmissionId, 1);
256+
}
257+
258+
class TransmissionSchedulePopTestA : public TransmissionScheduleTest
207259
{
208260
public:
209-
TransmissionSchedulePopTest() {}
261+
TransmissionSchedulePopTestA() {}
210262

211263
protected:
212264
virtual void SetUp()
@@ -247,7 +299,7 @@ class TransmissionSchedulePopTest : public TransmissionScheduleTest
247299
}
248300
};
249301

250-
TEST_F(TransmissionSchedulePopTest, popTestNull)
302+
TEST_F(TransmissionSchedulePopTestA, popTestNull)
251303
{
252304
EXPECT_EQ(scheduler.popNext(0), nullptr);
253305

@@ -260,7 +312,7 @@ TEST_F(TransmissionSchedulePopTest, popTestNull)
260312
EXPECT_EQ((*iter++)->transmissionId, 2);
261313
}
262314

263-
TEST_F(TransmissionSchedulePopTest, popTestAutoReload1)
315+
TEST_F(TransmissionSchedulePopTestA, popTestAutoReload1)
264316
{
265317
std::shared_ptr<const TransmittionScheduler::Transmission> item = scheduler.popNext(1);
266318
ASSERT_NE(item, nullptr);
@@ -279,7 +331,7 @@ TEST_F(TransmissionSchedulePopTest, popTestAutoReload1)
279331
EXPECT_EQ((*iter)->nextTxTimeUs, 16002);
280332
}
281333

282-
TEST_F(TransmissionSchedulePopTest, popTestAutoReload2)
334+
TEST_F(TransmissionSchedulePopTestA, popTestAutoReload2)
283335
{
284336
std::shared_ptr<const TransmittionScheduler::Transmission> item = scheduler.popNext(1);
285337
ASSERT_NE(item, nullptr);
@@ -299,7 +351,62 @@ TEST_F(TransmissionSchedulePopTest, popTestAutoReload2)
299351
EXPECT_EQ((*iter)->nextTxTimeUs, 32002);
300352
}
301353

302-
class TransmissionScheduleCancelTest : public TransmissionSchedulePopTest
354+
class TransmissionSchedulePopTestB : public TransmissionScheduleTest
355+
{
356+
public:
357+
TransmissionSchedulePopTestB() {}
358+
359+
protected:
360+
virtual void SetUp()
361+
{
362+
uint8_t priority = 255;
363+
uint64_t txTime = 1;
364+
MaplePacket packet1(0x11, 0x01, 0x99887766);
365+
bool expectResponse = true;
366+
uint32_t expectedResponseNumPayloadWords = 10;
367+
uint32_t autoRepeatUs = 0;
368+
uint32_t readTimeoutUs = 8675309;
369+
scheduler.add(priority,
370+
txTime,
371+
packet1,
372+
expectResponse,
373+
expectedResponseNumPayloadWords,
374+
autoRepeatUs,
375+
readTimeoutUs);
376+
priority = 0;
377+
txTime = 2 + 300;
378+
expectedResponseNumPayloadWords = 0;
379+
MaplePacket packet3(0x22, 0x02, 0x99887766);
380+
scheduler.add(priority,
381+
txTime,
382+
packet3,
383+
expectResponse,
384+
expectedResponseNumPayloadWords,
385+
autoRepeatUs,
386+
readTimeoutUs);
387+
priority = 255;
388+
txTime = 2;
389+
expectedResponseNumPayloadWords = 3; // 267 us
390+
MaplePacket packet2(0x33, 0x02, 0x99887766);
391+
scheduler.add(priority,
392+
txTime,
393+
packet2,
394+
expectResponse,
395+
expectedResponseNumPayloadWords,
396+
autoRepeatUs,
397+
readTimeoutUs);
398+
}
399+
};
400+
401+
TEST_F(TransmissionSchedulePopTestB, popTestAutoReload2)
402+
{
403+
// Transmission 2 should be bumped up to be executed before 0 because 0 yeileded to 1
404+
std::shared_ptr<const TransmittionScheduler::Transmission> item = scheduler.popNext(2);
405+
ASSERT_NE(item, nullptr);
406+
EXPECT_EQ(item->transmissionId, 2);
407+
}
408+
409+
class TransmissionScheduleCancelTest : public TransmissionSchedulePopTestA
303410
{
304411
public:
305412
TransmissionScheduleCancelTest() {}

0 commit comments

Comments
 (0)