From a007c82272b800c153a8e5188a714eb6cfea094c Mon Sep 17 00:00:00 2001 From: FoamyGuy Date: Mon, 4 May 2020 18:35:33 -0500 Subject: [PATCH 1/4] adding rotation modifier for gestures --- adafruit_apds9960/apds9960.py | 30 +++++++++++++++++++++++-- examples/apds9960_gesture_simpletest.py | 3 +++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/adafruit_apds9960/apds9960.py b/adafruit_apds9960/apds9960.py index 2e3ed69..9cd8349 100644 --- a/adafruit_apds9960/apds9960.py +++ b/adafruit_apds9960/apds9960.py @@ -108,7 +108,14 @@ class APDS9960: _proximity_persistance = RWBits(4, APDS9960_PERS, 4) def __init__( - self, i2c, *, interrupt_pin=None, address=0x39, integration_time=0x01, gain=0x01 + self, + i2c, + *, + interrupt_pin=None, + address=0x39, + integration_time=0x01, + gain=0x01, + rotation=0 ): self.buf129 = None @@ -125,6 +132,7 @@ def __init__( self.enable_gesture = False self.enable_proximity = False self.enable_color = False + self._rotation = rotation self.enable_proximity_interrupt = False self.clear_interrupt() @@ -169,6 +177,17 @@ def _reset_counts(self): """Proximity interrupt enable flag. True if enabled, False to disable""" + ## GESTURE ROTATION + @property + def rotation(self): + """Gesture rotation offset""" + return self._rotation + + @rotation.setter + def rotation(self, new_rotation): + if new_rotation in [0, 90, 180, 270]: + self._rotation = new_rotation + ## GESTURE DETECTION @property def enable_gesture(self): @@ -263,7 +282,14 @@ def gesture(self): # pylint: disable-msg=too-many-branches if gesture_received or time.monotonic() - time_mark > 0.300: self._reset_counts() break - + if gesture_received != 0: + if self._rotation != 0: + directions = [1, 4, 2, 3] + new_index = ( + directions.index(gesture_received) + self._rotation // 90 + ) % 4 + modified_gesture = directions[new_index] + return modified_gesture return gesture_received @property diff --git a/examples/apds9960_gesture_simpletest.py b/examples/apds9960_gesture_simpletest.py index fcac7ad..c487e9f 100644 --- a/examples/apds9960_gesture_simpletest.py +++ b/examples/apds9960_gesture_simpletest.py @@ -8,6 +8,9 @@ apds.enable_proximity = True apds.enable_gesture = True +# Uncomment and set the rotation if depending on how your sensor is mounted. +# apds.rotation = 270 # 270 for CLUE + while True: gesture = apds.gesture() From 9f26602e6e81a8308e0dba9954fa2f65333d71bf Mon Sep 17 00:00:00 2001 From: FoamyGuy Date: Mon, 4 May 2020 18:45:54 -0500 Subject: [PATCH 2/4] refactor rotated_gesture into function --- adafruit_apds9960/apds9960.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/adafruit_apds9960/apds9960.py b/adafruit_apds9960/apds9960.py index 9cd8349..12b3e0f 100644 --- a/adafruit_apds9960/apds9960.py +++ b/adafruit_apds9960/apds9960.py @@ -201,6 +201,11 @@ def enable_gesture(self, enable_flag): self._gesture_mode = False self._gesture_enable = enable_flag + def rotated_gesture(self, original_gesture): + directions = [1, 4, 2, 3] + new_index = (directions.index(original_gesture) + self._rotation // 90) % 4 + return directions[new_index] + def gesture(self): # pylint: disable-msg=too-many-branches """Returns gesture code if detected. =0 if no gesture detected =1 if an UP, =2 if a DOWN, =3 if an LEFT, =4 if a RIGHT @@ -284,12 +289,7 @@ def gesture(self): # pylint: disable-msg=too-many-branches break if gesture_received != 0: if self._rotation != 0: - directions = [1, 4, 2, 3] - new_index = ( - directions.index(gesture_received) + self._rotation // 90 - ) % 4 - modified_gesture = directions[new_index] - return modified_gesture + return self.rotated_gesture(gesture_received) return gesture_received @property From b3a5a368ddf3c458edf707029e838719d9c1d83d Mon Sep 17 00:00:00 2001 From: FoamyGuy Date: Mon, 4 May 2020 18:49:04 -0500 Subject: [PATCH 3/4] adding doc comment to new function --- adafruit_apds9960/apds9960.py | 1 + 1 file changed, 1 insertion(+) diff --git a/adafruit_apds9960/apds9960.py b/adafruit_apds9960/apds9960.py index 12b3e0f..eb6aa57 100644 --- a/adafruit_apds9960/apds9960.py +++ b/adafruit_apds9960/apds9960.py @@ -202,6 +202,7 @@ def enable_gesture(self, enable_flag): self._gesture_enable = enable_flag def rotated_gesture(self, original_gesture): + """Applies rotation offset to the given gesture direction and returns the result""" directions = [1, 4, 2, 3] new_index = (directions.index(original_gesture) + self._rotation // 90) % 4 return directions[new_index] From b392639d648413ab99c95bfca2e62c54a61efddb Mon Sep 17 00:00:00 2001 From: FoamyGuy Date: Wed, 10 Jun 2020 19:37:27 -0500 Subject: [PATCH 4/4] raise Value error if invalid rotation value is supplied. Indicate acceptable values in docstring. --- adafruit_apds9960/apds9960.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/adafruit_apds9960/apds9960.py b/adafruit_apds9960/apds9960.py index eb6aa57..997610f 100644 --- a/adafruit_apds9960/apds9960.py +++ b/adafruit_apds9960/apds9960.py @@ -180,13 +180,15 @@ def _reset_counts(self): ## GESTURE ROTATION @property def rotation(self): - """Gesture rotation offset""" + """Gesture rotation offset. Acceptable values are 0, 90, 180, 270.""" return self._rotation @rotation.setter def rotation(self, new_rotation): if new_rotation in [0, 90, 180, 270]: self._rotation = new_rotation + else: + raise ValueError("Rotation value must be one of: 0, 90, 180, 270") ## GESTURE DETECTION @property