Skip to content

Commit a16938d

Browse files
authored
Merge pull request #549 from OpenEVSE/jeremypoulter/issue414
Fix for infinate loop in getNextEvent
2 parents 39dddf8 + 169c789 commit a16938d

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

src/lcd.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -324,13 +324,13 @@ LcdTask::LcdInfoLine LcdTask::getNextInfoLine(LcdInfoLine info)
324324
case LcdInfoLine::Time:
325325
return LcdInfoLine::Date;
326326
case LcdInfoLine::Date:
327-
return _scheduler->getNextEvent().isValid() ?
328-
LcdInfoLine::TimerStart :
329-
LcdInfoLine::EnergySession;
327+
if(_scheduler->getNextEvent(EvseState::Active).isValid()) {
328+
return LcdInfoLine::TimerStart;
329+
}
330330
case LcdInfoLine::TimerStart:
331-
return _scheduler->getNextEvent().isValid() ?
332-
LcdInfoLine::TimerStop :
333-
LcdInfoLine::EnergySession;
331+
if(_scheduler->getNextEvent(EvseState::Disabled).isValid()) {
332+
return LcdInfoLine::TimerStop;
333+
}
334334
default:
335335
return LcdInfoLine::EnergySession;
336336
}
@@ -353,7 +353,7 @@ LcdTask::LcdInfoLine LcdTask::getNextInfoLine(LcdInfoLine info)
353353
case LcdInfoLine::EnergyTotal:
354354
return LcdInfoLine::Temperature;
355355
case LcdInfoLine::Temperature:
356-
if(_scheduler->getNextEvent().isValid()) {
356+
if(_scheduler->getNextEvent(EvseState::Disabled).isValid()) {
357357
return LcdInfoLine::TimerStop;
358358
}
359359
case LcdInfoLine::TimerStop:
@@ -388,13 +388,13 @@ LcdTask::LcdInfoLine LcdTask::getNextInfoLine(LcdInfoLine info)
388388
case LcdInfoLine::Time:
389389
return LcdInfoLine::Date;
390390
case LcdInfoLine::Date:
391-
return _scheduler->getNextEvent().isValid() ?
392-
LcdInfoLine::TimerStart :
393-
LcdInfoLine::Time;
391+
if(_scheduler->getNextEvent(EvseState::Active).isValid()) {
392+
return LcdInfoLine::TimerStart;
393+
}
394394
case LcdInfoLine::TimerStart:
395-
return _scheduler->getNextEvent().isValid() ?
396-
LcdInfoLine::TimerStop :
397-
LcdInfoLine::Time;
395+
if(_scheduler->getNextEvent(EvseState::Disabled).isValid()) {
396+
return LcdInfoLine::TimerStop;
397+
}
398398
default:
399399
return LcdInfoLine::Time;
400400
}

src/scheduler.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
uint32_t Scheduler::Event::_next_id = 1;
1818

19+
Scheduler::EventInstance nullEventInstance;
20+
1921
const char * days_of_the_week_strings[] = {
2022
"sunday",
2123
"monday",
@@ -422,14 +424,23 @@ Scheduler::EventInstance &Scheduler::getCurrentEvent()
422424

423425
Scheduler::EventInstance &Scheduler::getNextEvent(EvseState type)
424426
{
427+
DBUGVAR(type);
425428
EventInstance *event = &_activeEvent; // Assume active event is correct
426429
if(event->isValid())
427430
{
428431
event = &event->getNext();
429432
if(EvseState::None != type)
430433
{
431-
while(event->getState() != type) {
434+
EventInstance *startEvent = event;
435+
436+
while(event->getState() != type)
437+
{
432438
event = &event->getNext();
439+
DBUGVAR((uint32_t)event, HEX);
440+
DBUGVAR((uint32_t)startEvent, HEX);
441+
if(startEvent == event) {
442+
return nullEventInstance;
443+
}
433444
}
434445
}
435446
}

0 commit comments

Comments
 (0)