0120e8f35eb4db947051634c8cf93d426ccdf366
[~helmut/onoff.git] / onoff / common.py
1 """
2 Defined states:
3  * 0: The device is inactive.
4  * ST_ACTIVE|ST_TRANSITION: The device is transitioning from inactive to active.
5  * ST_ACTIVE: The device is active.
6  * ST_TRANSITION: The device is transitioning from active to inactive.
7 """
8
9 ST_ACTIVE = 1
10 ST_TRANSITION = 2
11
12 class OnoffDevice(object):
13     """
14     @type notify: {int -> None}
15     @ivar notify: A set of functions taking a changed state.
16
17     @type state: int
18     @ivar state: is a read-only attribute to retrieve the current state
19     """
20     def __init__(self):
21         self.notify = set()
22
23     def changestate(self, state):
24         """Tell interested parties that the state has changed to the given
25         state."""
26         for func in self.notify:
27             func(state)
28
29     def activate(self):
30         """Ask the device to power on."""
31         raise NotImplementedError
32
33     def deactivate(self):
34         """Ask the device to power off."""
35         raise NotImplementedError
36
37     def close(self):
38         """Release resources acquired by the constructor."""
39         pass
40
41 class InvertedDevice(OnoffDevice):
42     def __init__(self, device):
43         OnoffDevice.__init__(self)
44         self.device = device
45         self.device.activate()
46         self.device.notify.add(self.changestate)
47
48     def changestate(self, state):
49         OnoffDevice.changestate(self, state ^ ST_ACTIVE)
50
51     @property
52     def state(self):
53         return self.device.state ^ ST_ACTIVE
54
55     def activate(self):
56         self.device.deactivate()
57
58     def deactivate(self):
59         self.device.activate()
60
61     def close(self):
62         self.device.notify.remove(self.changestate)
63         self.device.close()