#!/usr/bin/env python
-"""
-@todo Look into supporting more states
-"""
-
import logging
import gobject
def timeout(self):
return UpdateStateMachine.INFINITE_PERIOD
+ def __repr__(self):
+ return "NopStateStrategy()"
+
class ConstantStateStrategy(object):
def timeout(self):
return self._timeout
+ def __repr__(self):
+ return "ConstantStateStrategy(timeout=%r)" % self._timeout
+
class GeometricStateStrategy(object):
self._current = 0
def initialize_state(self):
- self._current = self._min / 2
+ self._current = self._min
def increment_state(self):
if self._max == UpdateStateMachine.INFINITE_PERIOD:
@property
def timeout(self):
- return self._init + self._current
+ timeout = self._init + self._current
+ return timeout
+
+ def __repr__(self):
+ return "GeometricStateStrategy(init=%r, min=%r, max=%r)" % (
+ self._init, self._min, self._max
+ )
class StateMachine(object):
# Making sure the it is initialized is finicky, be careful
INFINITE_PERIOD = -1
+ DEFAULT_MAX_TIMEOUT = to_seconds(hours=24)
_IS_DAEMON = True
- def __init__(self, updateItems, name=""):
+ def __init__(self, updateItems, name="", maxTime = DEFAULT_MAX_TIMEOUT):
self._name = name
self._updateItems = updateItems
+ self._maxTime = maxTime
self._state = self.STATE_ACTIVE
self._timeoutId = None
)
)
+ def __repr__(self):
+ return """UpdateStateMachine(
+ name=%r,
+ strategie=%r,
+)""" % (self._name, self._strategies)
+
def set_state_strategy(self, state, strategy):
self._strategies[state] = strategy
def _request_reset_timers(self, *args):
self._reset_timers()
- def _schedule_update(self):
- assert self._timeoutId is None
- self._strategy.increment_state()
- nextTimeout = self._strategy.timeout
- if nextTimeout != self.INFINITE_PERIOD:
- self._timeoutId = gobject_utils.timeout_add_seconds(nextTimeout, self._on_timeout)
- _moduleLogger.info("%s Next update in %s ms" % (self._name, nextTimeout, ))
+ def _reset_timers(self):
+ if self._timeoutId is None:
+ return # not started yet
+ self._stop_update()
+ self._strategy.initialize_state()
+ self._schedule_update()
def _stop_update(self):
if self._timeoutId is None:
gobject.source_remove(self._timeoutId)
self._timeoutId = None
- def _reset_timers(self):
- if self._timeoutId is None:
- return # not started yet
- self._stop_update()
- self._strategy.initialize_state()
- self._schedule_update()
+ def _schedule_update(self):
+ assert self._timeoutId is None
+ self._strategy.increment_state()
+ nextTimeout = self._strategy.timeout
+ if nextTimeout != self.INFINITE_PERIOD and nextTimeout < self._maxTime:
+ self._timeoutId = gobject_utils.timeout_add_seconds(nextTimeout, self._on_timeout)
+ _moduleLogger.info("%s Next update in %s seconds" % (self._name, nextTimeout, ))
@gtk_toolbox.log_exception(_moduleLogger)
def _on_timeout(self):