def initialize_state(self):
pass
+ def reinitialize_state(self):
+ pass
+
def increment_state(self):
pass
def initialize_state(self):
pass
+ def reinitialize_state(self):
+ pass
+
def increment_state(self):
pass
class GeometricStateStrategy(object):
def __init__(self, init, min, max):
- assert 0 < init and init < max and init != UpdateStateMachine.INFINITE_PERIOD
- assert 0 < min and min != UpdateStateMachine.INFINITE_PERIOD
+ assert 0 < init and init < max or init == UpdateStateMachine.INFINITE_PERIOD
+ assert 0 < min or min == UpdateStateMachine.INFINITE_PERIOD
assert min < max or max == UpdateStateMachine.INFINITE_PERIOD
self._min = min
self._max = max
self._current = 0
def initialize_state(self):
+ self._current = self._max
+
+ def reinitialize_state(self):
self._current = self._min
def increment_state(self):
- if self._max == UpdateStateMachine.INFINITE_PERIOD:
+ if self._current == UpdateStateMachine.INFINITE_PERIOD:
+ pass
+ if self._init == UpdateStateMachine.INFINITE_PERIOD:
+ self._current = UpdateStateMachine.INFINITE_PERIOD
+ elif self._max == UpdateStateMachine.INFINITE_PERIOD:
self._current *= 2
else:
self._current = min(2 * self._current, self._max - self._init)
@property
def timeout(self):
- timeout = self._init + self._current
+ if UpdateStateMachine.INFINITE_PERIOD in (self._init, self._current):
+ timeout = UpdateStateMachine.INFINITE_PERIOD
+ else:
+ timeout = self._init + self._current
return timeout
def __repr__(self):
_moduleLogger.info("%s Transitioning from %s to %s" % (self._name, oldState, newState))
self._state = newState
- self._reset_timers()
+ self._reset_timers(initialize=True)
@property
def state(self):
return self._state
def reset_timers(self):
- _moduleLogger.info("%s Resetting State Machine" % (self._name, ))
self._reset_timers()
@property
def _request_reset_timers(self, *args):
self._reset_timers()
- def _reset_timers(self):
+ def _reset_timers(self, initialize=False):
if self._timeoutId is None:
return # not started yet
+ _moduleLogger.info("%s Resetting State Machine" % (self._name, ))
self._stop_update()
- self._strategy.initialize_state()
+ if initialize:
+ self._strategy.initialize_state()
+ else:
+ self._strategy.reinitialize_state()
self._schedule_update()
def _stop_update(self):
self._strategy.increment_state()
nextTimeout = self._strategy.timeout
if nextTimeout != self.INFINITE_PERIOD and nextTimeout < self._maxTime:
+ assert 0 < nextTimeout
self._timeoutId = gobject_utils.timeout_add_seconds(nextTimeout, self._on_timeout)
- _moduleLogger.info("%s Next update in %s seconds" % (self._name, nextTimeout, ))
+ _moduleLogger.info("%s Next update in %s seconds" % (self._name, nextTimeout, ))
+ else:
+ _moduleLogger.info("%s No further updates (timeout is %s seconds)" % (self._name, nextTimeout, ))
@gtk_toolbox.log_exception(_moduleLogger)
def _on_timeout(self):