From 60eb879917e4838fe693921b5733d4a8dfd422aa Mon Sep 17 00:00:00 2001 From: gtrivedi Date: Sun, 1 Jun 2014 17:00:45 -0400 Subject: [PATCH 1/4] Add gyroscope in README --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index 6203c1b11..c371bac96 100644 --- a/README.rst +++ b/README.rst @@ -27,4 +27,5 @@ Notifications X X X X X Text to speech X X X X X Email (open mail client) X Vibrator X +Gyroscope X X ================================== ============= ============= === ======= === ===== From a81a2dafdf26ad1a3a8be70c2da8c5952539787a Mon Sep 17 00:00:00 2001 From: gtrivedi Date: Sun, 1 Jun 2014 17:16:04 -0400 Subject: [PATCH 2/4] Gyroscope facade --- plyer/facades.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/plyer/facades.py b/plyer/facades.py index 2f5c10cd2..907419cc7 100644 --- a/plyer/facades.py +++ b/plyer/facades.py @@ -7,7 +7,7 @@ ''' __all__ = ('Accelerometer', 'Camera', 'GPS', 'Notification', - 'TTS', 'Email', 'Vibrator') + 'TTS', 'Email', 'Vibrator', 'Gyroscope') class Accelerometer(object): @@ -261,3 +261,38 @@ def cancel(self): def _cancel(self, **kwargs): raise NotImplementedError() + +class Gyroscope(object): + '''Gyroscope facade. + ''' + + @property + def orientation(self): + '''Property that returns values of the current Gyroscope sensors, as + a (x, y, z) tuple + ''' + return self.get_orientation() + + def enable(self): + '''Activate the Gyroscope sensor + ''' + self._enable() + + def disable(self): + '''Disable the Gyroscope sensor + ''' + self._disable() + + def get_orientation(self): + return self._get_orientation() + + # private + + def _enable(self): + raise NotImplementedError() + + def _disable(self): + raise NotImplementedError() + + def _get_orientation(self): + raise NotImplementedError() From e02fa2ae8610e96c1a2626085a677294e88323b1 Mon Sep 17 00:00:00 2001 From: gtrivedi Date: Sun, 1 Jun 2014 17:21:59 -0400 Subject: [PATCH 3/4] iOS and Android implementations --- plyer/platforms/android/gyroscope.py | 23 +++++++++++++++++++++ plyer/platforms/ios/gyroscope.py | 31 ++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 plyer/platforms/android/gyroscope.py create mode 100644 plyer/platforms/ios/gyroscope.py diff --git a/plyer/platforms/android/gyroscope.py b/plyer/platforms/android/gyroscope.py new file mode 100644 index 000000000..796d270e3 --- /dev/null +++ b/plyer/platforms/android/gyroscope.py @@ -0,0 +1,23 @@ +''' +Android Gyroscope +--------------------- +''' + +from plyer.facades import Gyroscope +from jnius import autoclass + +Hardware = autoclass('org.renpy.android.Hardware') + +class AndroidGyroscope(Gyroscope): + + def _enable(self): + Hardware.orientationSensorEnable(True) + + def _disable(self): + Hardware.orientationSensorEnable(False) + + def _get_orientation(self): + return Hardware.orientationSensorReading() + +def instance(): + return AndroidGyroscope() diff --git a/plyer/platforms/ios/gyroscope.py b/plyer/platforms/ios/gyroscope.py new file mode 100644 index 000000000..2dd99d7d4 --- /dev/null +++ b/plyer/platforms/ios/gyroscope.py @@ -0,0 +1,31 @@ +''' +iOS Gyroscope +--------------------- +''' + +from plyer.facades import Gyroscope +from jnius import autoclass + +Hardware = autoclass('org.renpy.Ios.Hardware') + +class IosGyroscope(Gyroscope): + + def __init__(self): + super(IosGyroscope, self).__init__() + self.bridge = autoclass('bridge').alloc().init() + self.bridge.motionManager.setGyroscopeUpdateInterval_(0.1) + + def _enable(self): + self.bridge.startGyroscope() + + def _disable(self): + self.bridge.stopGyroscope() + + def _get_orientation(self): + return ( + self.bridge.gy_x, + self.bridge.gy_y, + self.bridge.gy_z) + +def instance(): + return IosGyroscope() From fbd435edd4adb723620dead03ac3f342f679ff6b Mon Sep 17 00:00:00 2001 From: gtrivedi Date: Tue, 10 Jun 2014 14:23:18 -0400 Subject: [PATCH 4/4] Remove dependency on Hardware.java --- plyer/platforms/android/gyroscope.py | 48 +++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/plyer/platforms/android/gyroscope.py b/plyer/platforms/android/gyroscope.py index 796d270e3..854a6f89d 100644 --- a/plyer/platforms/android/gyroscope.py +++ b/plyer/platforms/android/gyroscope.py @@ -4,20 +4,58 @@ ''' from plyer.facades import Gyroscope -from jnius import autoclass +from jnius import PythonJavaClass, java_method, autoclass, cast +from plyer.platforms.android import activity -Hardware = autoclass('org.renpy.android.Hardware') +Context = autoclass('android.content.Context') +Sensor = autoclass('android.hardware.Sensor') +SensorManager = autoclass('android.hardware.SensorManager') + +class GyroscopeSensorListener(PythonJavaClass): + __javainterfaces__ = ['android/hardware/SensorEventListener'] + + def __init__(self): + super(GyroscopeSensorListener, self).__init__() + self.SensorManager = cast('android.hardware.SensorManager', + activity.getSystemService(Context.SENSOR_SERVICE)) + self.sensor = self.SensorManager.getDefaultSensor( + Sensor.TYPE_GYROSCOPE) + + self.values = [0, 0, 0] + + def enable(self): + self.SensorManager.registerListener(self, self.sensor, + SensorManager.SENSOR_DELAY_NORMAL) + + def disable(self): + self.SensorManager.unregisterListener(self, self.sensor) + + @java_method('()I') + def hashCode(self): + return id(self) + + @java_method('(Landroid/hardware/SensorEvent;)V') + def onSensorChanged(self, event): + self.values = event.values[:3] + + @java_method('(Landroid/hardware/Sensor;I)V') + def onAccuracyChanged(self, sensor, accuracy): + # Maybe, do something in future? + pass class AndroidGyroscope(Gyroscope): + def __init__(self): + super(AndroidGyroscope, self).__init__() + self.listener = GyroscopeSensorListener() def _enable(self): - Hardware.orientationSensorEnable(True) + self.listener.enable() def _disable(self): - Hardware.orientationSensorEnable(False) + self.listener.disable() def _get_orientation(self): - return Hardware.orientationSensorReading() + return tuple(self.listener.values) def instance(): return AndroidGyroscope()