Ticket #435: fso_triggers.py

File fso_triggers.py, 8.0 KB (added by khiraly, 3 years ago)

/usr/lib/python2.6/site-packages/framework/subsystems/oeventsd/fso_triggers.py

Line 
1# -*- coding: UTF-8 -*-
2"""
3The freesmartphone Events Module - Python Implementation
4
5(C) 2008 Michael 'Mickey' Lauer <mlauer@vanille-media.de>
6(C) 2008 Jan 'Shoragan' LÃŒbbe <jluebbe@lasnet.de>
7(C) 2008 Guillaume 'Charlie' Chereau
8(C) 2008 Openmoko, Inc.
9GPLv2 or later
10
11Package: oeventsd
12Module: fso_triggers
13"""
14
15from trigger import DBusTrigger
16from rule import WhileRule
17
18import dbus
19
20import logging
21logger = logging.getLogger('oeventsd.fso_triggers')
22
23#============================================================================#
24class CallStatusTrigger(DBusTrigger):
25#============================================================================#
26    """Just a sugar trigger for a GSM call status change"""
27
28    function_name = 'CallStatus'
29
30    def __init__(self):
31        bus = dbus.SystemBus()
32        super(CallStatusTrigger, self).__init__(
33            bus,
34            'org.freesmartphone.ogsmd',
35            '/org/freesmartphone/GSM/Device',
36            'org.freesmartphone.GSM.Call',
37            'CallStatus'
38        )
39    def on_signal(self, id, status, properties):
40        logger.info("Receive CallStatus, status = %s", status)
41        self._trigger(id=id, status=status, properties=properties)
42
43    def __repr__(self):
44        return "CallStatus"
45       
46# TODO: Maybe this should be an instance of a special class (Condition ?)
47#============================================================================#
48class CallListContains(WhileRule):
49#============================================================================#
50    """This rule keep track of all the calls, and can be used to check for a given status in one of them"""
51    function_name = "CallListContains"
52   
53    def __init__(self, status):
54        logger.debug("CallListContains.__init__(%s), type: %s", status, type(status))
55        self.status = status
56        self.calls = {} # The list of current call object
57        super(CallListContains, self).__init__(CallStatusTrigger())
58       
59    def trigger(self, id=None, status=None, properties=None, **kargs):
60        logger.debug("Trigger %s", self)
61        logger.debug("CallListContains.trigger(id=%s, status=%s, properties=%s, **kargs), self.status: %s", id, status, properties, self.status)
62        self.calls[id] = status
63        if self.status in self.calls.values():
64            logger.debug("self.status: %s in self.calls.values(): %s", self.status, self.calls.values())
65            super(CallListContains, self).trigger()
66        else:
67            logger.debug("self.status: %s NOT in self.calls.values(): %s", self.status, self.calls.values())
68            super(CallListContains, self).untrigger()
69           
70    def __repr__(self):
71        return "CallListContains(%s)" % self.status
72
73#============================================================================#
74class BTHeadsetConnectedTrigger(DBusTrigger):
75#============================================================================#
76    function_name = 'BTHeadsetConnected'
77
78    def __init__(self):
79        bus = dbus.SystemBus()
80        super(BTHeadsetConnectedTrigger, self).__init__(
81            bus,
82            'org.freesmartphone.ophoned',
83            '/org/freesmartphone/Phone',
84            'org.freesmartphone.Phone',
85            'BTHeadsetConnected'
86        )
87    def on_signal(self, status):
88        logger.info("Receive BTConnectedEnabled, status = %s", status)
89        self._trigger(status=status)
90
91    def __repr__(self):
92        return "BTHeadsetConnected"
93
94#============================================================================#
95class BTHeadsetIsConnected(WhileRule):
96#============================================================================#
97    function_name = "BTHeadsetIsConnected"
98
99    def __init__(self):
100        super(BTHeadsetIsConnected, self).__init__(BTHeadsetConnectedTrigger())
101
102    def trigger(self, status=None, **kargs):
103        logger.debug("Trigger %s", self)
104        if status:
105            super(BTHeadsetIsConnected, self).trigger()
106        else:
107            super(BTHeadsetIsConnected, self).untrigger()
108
109    def __repr__(self):
110        return "BTHeadsetIsConnected()"
111
112#============================================================================#
113class IncomingMessageTrigger(DBusTrigger):
114#============================================================================#
115    """
116    A custom dbus trigger for org.freesmartphone.GSM.SIM.IncomingStoredMessage
117    """
118
119    function_name = 'IncomingMessage'
120
121    def __init__(self):
122        bus = dbus.SystemBus()
123        super(IncomingMessageTrigger, self).__init__(
124            bus,
125            'org.freesmartphone.ogsmd',
126            '/org/freesmartphone/GSM/Device',
127            'org.freesmartphone.GSM.SIM',
128            'IncomingStoredMessage'
129        )
130    def on_signal(self, index):
131        logger.info("Receive IncomingMessage on index = %s" % index)
132        self._trigger(index=index)
133
134    def __repr__(self):
135        return "IncomingMessage"
136
137#============================================================================#
138class PowerStatusTrigger(DBusTrigger):
139#============================================================================#
140    """
141    A dbus trigger for org.freesmartphone.Device.PowerSupply.PowerStatus
142    """
143
144    function_name = 'PowerStatus'
145
146    def __init__(self):
147        bus = dbus.SystemBus()
148        super(PowerStatusTrigger, self).__init__(
149            bus,
150            'org.freesmartphone.odeviced',
151            None,
152            'org.freesmartphone.Device.PowerSupply',
153            'PowerStatus'
154        )
155    def on_signal(self, status):
156        logger.info("Receive PowerStatus, status = %s", status)
157        self._trigger(status=status)
158
159    def __repr__(self):
160        return "PowerStatus"
161
162#============================================================================#
163class IdleStateTrigger(DBusTrigger):
164#============================================================================#
165    """
166    A dbus trigger for org.freesmartphone.Device.IdleNotifier.State
167    """
168
169    function_name = 'IdleState'
170
171    def __init__(self):
172        bus = dbus.SystemBus()
173        super(IdleStateTrigger, self).__init__(
174            bus,
175            'org.freesmartphone.odeviced',
176            None,
177            'org.freesmartphone.Device.IdleNotifier',
178            'State'
179        )
180    def on_signal(self, status):
181        logger.info("Receive IdleState, status = %s", status)
182        self._trigger(status=status)
183
184    def __repr__(self):
185        return "IdleState"
186
187#============================================================================#
188class TimeTrigger(DBusTrigger):
189#============================================================================#
190    """
191    A dbus trigger for org.freesmartphone.Time.Minute
192    """
193
194    function_name = 'Time'
195
196    def __init__(self, hour, minute):
197        self.hour = hour
198        self.minute = minute
199        bus = dbus.SystemBus()
200        super(TimeTrigger, self).__init__(
201            bus,
202            'org.freesmartphone.otimed',
203            '/org/freesmartphone/Time',
204            'org.freesmartphone.Time',
205            'Minute'
206        )
207    def on_signal(self, year, mon, day, hour, min, sec, wday, yday, isdst):
208        if self.hour == hour and self.minute == min:
209            logger.debug("%s triggered", self)
210            self._trigger()
211
212    def __repr__(self):
213        return "Time(%d:%d)" % (self.hour, self.minute)
214
215#============================================================================#
216class InputTrigger(DBusTrigger):
217#============================================================================#
218    """
219    A dbus trigger for org.freesmartphone.Input.Event
220    """
221
222    function_name = 'InputEvent'
223
224    def __init__(self):
225        bus = dbus.SystemBus()
226        super(InputTrigger, self).__init__(
227            bus,
228            'org.freesmartphone.odeviced',
229            '/org/freesmartphone/Device/Input',
230            'org.freesmartphone.Device.Input',
231            'Event'
232        )
233    def on_signal(self, switch, event, duration):
234        logger.debug("%s triggered", self)
235        self._trigger(switch=switch, event=event, duration=duration)
236
237    def __repr__(self):
238        return "InputTrigger"