-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathsensor.py
71 lines (56 loc) · 2.44 KB
/
sensor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
__all__ = ('SensorNotFound', 'SensorListener', 'sensortypes')
from jnius import PythonJavaClass, java_method, autoclass, cast
PythonActivity = autoclass('org.renpy.android.PythonActivity')
Context = autoclass('android.content.Context')
Sensor = autoclass('android.hardware.Sensor')
SensorManager = autoclass('android.hardware.SensorManager')
sensortypes = {
'accelerometer': Sensor.TYPE_ACCELEROMETER,
'magnetic-field': Sensor.TYPE_MAGNETIC_FIELD,
'gyroscope': Sensor.TYPE_GYROSCOPE,
'light': Sensor.TYPE_LIGHT,
'pressure': Sensor.TYPE_PRESSURE,
'proximity': Sensor.TYPE_PROXIMITY,
'linear-acceleration': Sensor.TYPE_LINEAR_ACCELERATION,
#'rotation-vector': Sensor.TYPE_ROTATION_VECTOR, #API 9
'orientation': Sensor.TYPE_ORIENTATION,
#'humidity': Sensor.TYPE_RELATIVE_HUMDITY, #API 14
'ambient-temperature': Sensor.TYPE_AMBIENT_TEMPERATURE }
class SensorNotFound(Exception):
pass
class SensorListener(PythonJavaClass):
__javainterfaces__ = ['android/hardware/SensorEventListener']
def __init__(self, sensortype, callback):
super(SensorListener, self).__init__()
self.callback = callback
assert(sensortype in sensortypes)
self.manager = cast('android.hardware.SensorManager',
PythonActivity.mActivity.getSystemService(Context.SENSOR_SERVICE))
self.do_stop = False
java_sensortype = sensortypes[sensortype]
self.sensortype = java_sensortype
self.sensor = self.manager.getDefaultSensor(java_sensortype)
if self.sensor is None:
raise SensorNotFound()
def start(self):
self.do_stop = False
self.manager.registerListener(self, self.sensor,
SensorManager.SENSOR_DELAY_NORMAL)
def stop(self):
self.do_stop = True
self.manager.unregisterListener(self, self.sensor)
@java_method('()I')
def hashCode(self):
return id(self)
@java_method('(Landroid/hardware/Sensor;I)V')
def onAccuracyChanged(self, sensor, accuracy):
if self.do_stop:
print 'sensor avoided accuracy-changed, stop has been called.'
return
self.callback(self, 'accuracy-changed', sensor, accuracy)
@java_method('(Landroid/hardware/SensorEvent;)V')
def onSensorChanged(self, event):
if self.do_stop:
print 'sensor avoided sensor-changed, stop has been called.'
return
self.callback(self, 'sensor-changed', event)