This repository has been archived by the owner on Dec 23, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 47
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added light, temperature and accelerometer on python side (#196)
- Loading branch information
Showing
11 changed files
with
373 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
from . import constants as CONSTANTS | ||
|
||
|
||
class Accelerometer: | ||
# The implementation is based off of https://microbit-micropython.readthedocs.io/en/v1.0.1/accelerometer.html. | ||
def __init__(self): | ||
self.__x = 0 | ||
self.__y = 0 | ||
self.__z = 0 | ||
self.__current_gesture = "" | ||
self.__prev_gestures = set() | ||
self.__gestures = [] | ||
|
||
def get_x(self): | ||
""" | ||
Get the acceleration measurement in the ``x`` axis, as a positive or | ||
negative integer, depending on the direction. The measurement is given in | ||
milli-g. | ||
""" | ||
return self.__x | ||
|
||
def get_y(self): | ||
""" | ||
Get the acceleration measurement in the ``y`` axis, as a positive or | ||
negative integer, depending on the direction. The measurement is given in | ||
milli-g. | ||
""" | ||
return self.__y | ||
|
||
def get_z(self): | ||
""" | ||
Get the acceleration measurement in the ``z`` axis, as a positive or | ||
negative integer, depending on the direction. The measurement is given in | ||
milli-g. | ||
""" | ||
return self.__z | ||
|
||
def get_values(self): | ||
""" | ||
Get the acceleration measurements in all axes at once, as a three-element | ||
tuple of integers ordered as X, Y, Z. | ||
""" | ||
return (self.__x, self.__y, self.__z) | ||
|
||
def current_gesture(self): | ||
""" | ||
Return the name of the current gesture. | ||
""" | ||
self.__add_current_gesture_to_gesture_lists() | ||
return self.__current_gesture | ||
|
||
def is_gesture(self, name): | ||
""" | ||
Return True or False to indicate if the named gesture is currently active. | ||
""" | ||
self.__add_current_gesture_to_gesture_lists() | ||
if name not in CONSTANTS.GESTURES: | ||
raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) | ||
return name == self.__current_gesture | ||
|
||
def was_gesture(self, name): | ||
""" | ||
Return True or False to indicate if the named gesture was active since the | ||
last [was_gesture] call. | ||
""" | ||
self.__add_current_gesture_to_gesture_lists() | ||
if name not in CONSTANTS.GESTURES: | ||
raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) | ||
was_gesture = name in self.__prev_gestures | ||
self.__prev_gestures.clear() | ||
return was_gesture | ||
|
||
def get_gestures(self): | ||
""" | ||
Return a tuple of the gesture history. The most recent is listed last. | ||
Also clears the gesture history before returning. | ||
""" | ||
self.__add_current_gesture_to_gesture_lists() | ||
gestures = tuple(self.__gestures) | ||
self.__gestures.clear() | ||
return gestures | ||
|
||
# Helpers and Hidden Functions | ||
|
||
def __get_accel(self, axis): | ||
if axis == "x": | ||
return self.get_x() | ||
elif axis == "y": | ||
return self.get_y() | ||
elif axis == "z": | ||
return self.get_z() | ||
|
||
def __set_accel(self, axis, accel): | ||
if accel < CONSTANTS.MIN_ACCELERATION or accel > CONSTANTS.MAX_ACCELERATION: | ||
raise ValueError(CONSTANTS.INVALID_ACCEL_ERR) | ||
if axis == "x": | ||
self.__x = accel | ||
elif axis == "y": | ||
self.__y = accel | ||
elif axis == "z": | ||
self.__z = accel | ||
|
||
def __set_gesture(self, gesture): | ||
if gesture in CONSTANTS.GESTURES: | ||
self.__current_gesture = gesture | ||
elif gesture == "": | ||
self.__current_gesture = "" | ||
else: | ||
raise ValueError(CONSTANTS.INVALID_GESTURE_ERR) | ||
|
||
def __add_current_gesture_to_gesture_lists(self): | ||
if self.__current_gesture in CONSTANTS.GESTURES: | ||
self.__gestures.append(self.__current_gesture) | ||
self.__prev_gestures.add(self.__current_gesture) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
import pytest | ||
from unittest import mock | ||
|
||
from ..__model.accelerometer import Accelerometer | ||
from ..__model import constants as CONSTANTS | ||
|
||
|
||
class TestAccelerometer(object): | ||
def setup_method(self): | ||
self.accelerometer = Accelerometer() | ||
|
||
@pytest.mark.parametrize( | ||
"accel", | ||
[ | ||
CONSTANTS.MIN_ACCELERATION, | ||
CONSTANTS.MIN_ACCELERATION + 1, | ||
100, | ||
CONSTANTS.MAX_ACCELERATION - 1, | ||
CONSTANTS.MAX_ACCELERATION, | ||
], | ||
) | ||
def test_x_y_z(self, accel): | ||
self.accelerometer._Accelerometer__set_accel("x", accel) | ||
assert accel == self.accelerometer.get_x() | ||
self.accelerometer._Accelerometer__set_accel("y", accel) | ||
assert accel == self.accelerometer.get_y() | ||
self.accelerometer._Accelerometer__set_accel("z", accel) | ||
assert accel == self.accelerometer.get_z() | ||
|
||
@pytest.mark.parametrize("axis", ["x", "y", "z"]) | ||
def test_x_y_z_invalid_accel(self, axis): | ||
with pytest.raises(ValueError): | ||
self.accelerometer._Accelerometer__set_accel( | ||
axis, CONSTANTS.MAX_ACCELERATION + 1 | ||
) | ||
with pytest.raises(ValueError): | ||
self.accelerometer._Accelerometer__set_accel( | ||
axis, CONSTANTS.MIN_ACCELERATION - 1 | ||
) | ||
|
||
@pytest.mark.parametrize( | ||
"accels", | ||
[ | ||
(23, 25, 26), | ||
(204, 234, -534), | ||
(CONSTANTS.MIN_ACCELERATION + 10, 234, CONSTANTS.MAX_ACCELERATION), | ||
], | ||
) | ||
def test_get_values(self, accels): | ||
self.accelerometer._Accelerometer__set_accel("x", accels[0]) | ||
self.accelerometer._Accelerometer__set_accel("y", accels[1]) | ||
self.accelerometer._Accelerometer__set_accel("z", accels[2]) | ||
assert accels == self.accelerometer.get_values() | ||
|
||
@pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) | ||
def test_current_gesture(self, gesture): | ||
self.accelerometer._Accelerometer__set_gesture(gesture) | ||
assert gesture == self.accelerometer.current_gesture() | ||
|
||
@pytest.mark.parametrize("gesture", ["up", "face down", "freefall", "8g"]) | ||
def test_is_gesture(self, gesture): | ||
self.accelerometer._Accelerometer__set_gesture(gesture) | ||
assert self.accelerometer.is_gesture(gesture) | ||
for g in CONSTANTS.GESTURES: | ||
if g != gesture: | ||
assert not self.accelerometer.is_gesture(g) | ||
|
||
def test_is_gesture_error(self): | ||
with pytest.raises(ValueError): | ||
self.accelerometer.is_gesture("sideways") | ||
|
||
def test_was_gesture(self): | ||
mock_gesture_up = "up" | ||
mock_gesture_down = "down" | ||
|
||
assert not self.accelerometer.was_gesture(mock_gesture_up) | ||
self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) | ||
self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. | ||
self.accelerometer._Accelerometer__set_gesture("") | ||
assert self.accelerometer.was_gesture(mock_gesture_up) | ||
assert not self.accelerometer.was_gesture(mock_gesture_up) | ||
|
||
def test_was_gesture_error(self): | ||
with pytest.raises(ValueError): | ||
self.accelerometer.was_gesture("sideways") | ||
|
||
def test_get_gestures(self): | ||
mock_gesture_up = "up" | ||
mock_gesture_down = "down" | ||
mock_gesture_freefall = "freefall" | ||
|
||
self.accelerometer._Accelerometer__set_gesture(mock_gesture_up) | ||
self.accelerometer.current_gesture() # Call is needed for gesture detection so it can be added to the lists. | ||
self.accelerometer._Accelerometer__set_gesture(mock_gesture_down) | ||
self.accelerometer.current_gesture() | ||
self.accelerometer._Accelerometer__set_gesture(mock_gesture_freefall) | ||
self.accelerometer.current_gesture() | ||
self.accelerometer._Accelerometer__set_gesture("") | ||
assert ( | ||
mock_gesture_up, | ||
mock_gesture_down, | ||
mock_gesture_freefall, | ||
) == self.accelerometer.get_gestures() | ||
assert () == self.accelerometer.get_gestures() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.