@@ -127,6 +127,7 @@ EvseManager::EvseManager(Stream &port) :
127127 _monitor(OpenEVSE),
128128 _clients(),
129129 _evseStateListener(this ),
130+ _sessionCompleteListener(this ),
130131 _targetProperties(),
131132 _hasClaims(false ),
132133 _sleepForDisable(true ),
@@ -233,6 +234,7 @@ bool EvseManager::evaluateClaims(EvseProperties &properties)
233234void EvseManager::setup ()
234235{
235236 _monitor.onStateChange (&_evseStateListener);
237+ _monitor.onSessionComplete (&_sessionCompleteListener);
236238}
237239
238240bool EvseManager::setTargetState (EvseProperties &target)
@@ -331,9 +333,18 @@ unsigned long EvseManager::loop(MicroTasks::WakeReason reason)
331333 }
332334 }
333335
336+ DBUGVAR (_sessionCompleteListener.IsTriggered ());
337+ if (_sessionCompleteListener.IsTriggered ())
338+ {
339+ // Session complete, clear any auto release claims
340+ releaseAutoReleaseClaims ();
341+ }
342+
334343 DBUGVAR (_evaluateClaims);
335344 if (_evaluateClaims)
336345 {
346+ _evaluateClaims = false ;
347+
337348 // Work out the state we should try and get in too
338349 _hasClaims = evaluateClaims (_targetProperties);
339350
@@ -349,13 +360,13 @@ unsigned long EvseManager::loop(MicroTasks::WakeReason reason)
349360 DBUGLN (" No claims" );
350361 }
351362
352- _evaluateClaims = false ;
353363 _evaluateTargetState = true ;
354364 }
355365
356366 DBUGVAR (_evaluateTargetState);
357367 if (_evaluateTargetState)
358368 {
369+ _evaluateTargetState = false ;
359370
360371 if (!_hasClaims)
361372 {
@@ -364,7 +375,6 @@ unsigned long EvseManager::loop(MicroTasks::WakeReason reason)
364375 _targetProperties.setState (EvseState::Active);
365376 }
366377 setTargetState (_targetProperties);
367- _evaluateTargetState = false ;
368378 }
369379
370380 return MicroTask.Infinate ;
@@ -421,6 +431,19 @@ bool EvseManager::release(EvseClient client)
421431 return false ;
422432}
423433
434+ void EvseManager::releaseAutoReleaseClaims ()
435+ {
436+ for (size_t i = 0 ; i < EVSE_MANAGER_MAX_CLIENT_CLAIMS; i++)
437+ {
438+ if (_clients[i].isValid () && _clients[i].isAutoRelease ())
439+ {
440+ DBUGF (" Release claim from 0x%08x, priority %d, %s" , _clients[i].getClient (), _clients[i].getPriority (), _clients[i].getState ().toString ());
441+ _clients[i].release ();
442+ _evaluateClaims = true ;
443+ }
444+ }
445+ }
446+
424447bool EvseManager::clientHasClaim (EvseClient client) {
425448 return findClaim (client);
426449}
0 commit comments