From 768f33b07cd0f09ad9da7fc6e8b82d61fff91548 Mon Sep 17 00:00:00 2001 From: Kathryn Lingel Date: Mon, 25 Feb 2019 16:39:56 -0800 Subject: [PATCH 1/6] Add calibration offsets and radii as properties on BNO055 library --- adafruit_bno055.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/adafruit_bno055.py b/adafruit_bno055.py index a32e9fe..84ab36b 100644 --- a/adafruit_bno055.py +++ b/adafruit_bno055.py @@ -62,6 +62,11 @@ _MODE_REGISTER = const(0x3d) _PAGE_REGISTER = const(0x07) _CALIBRATION_REGISTER = const(0x35) +_OFFSET_ACCEL_REGISTER = const(0x55) +_OFFSET_MAGNET_REGISTER = const(0x5b) +_OFFSET_GYRO_REGISTER = const(0x61) +_RADIUS_ACCEL_REGISTER = const(0x67) +_RADIUS_MAGNET_REGISTER = const(0x69) _TRIGGER_REGISTER = const(0x3f) _POWER_REGISTER = const(0x3e) _ID_REGISTER = const(0x00) @@ -213,6 +218,52 @@ def calibrated(self): sys, gyro, accel, mag = self.calibration_status return sys == gyro == accel == mag == 0x03 + _offsets_accelerometer = Struct(_OFFSET_ACCEL_REGISTER, ' Date: Tue, 12 Mar 2019 12:29:12 -0400 Subject: [PATCH 2/6] Add docstrings to calibration value properties --- adafruit_bno055.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/adafruit_bno055.py b/adafruit_bno055.py index 84ab36b..d3033ad 100644 --- a/adafruit_bno055.py +++ b/adafruit_bno055.py @@ -226,6 +226,7 @@ def calibrated(self): @property def offsets_accelerometer(self): + """Returns a 3-value Struct with the (x, y, z) accelerometer calibration offsets""" last_mode = self.mode self.mode = CONFIG_MODE vector = self._offsets_accelerometer @@ -234,6 +235,7 @@ def offsets_accelerometer(self): @property def offsets_magnetometer(self): + """Returns a 3-value Struct with the (x, y, z) magnetometer calibration offsets""" last_mode = self.mode self.mode = CONFIG_MODE vector = self._offsets_magnetometer @@ -242,6 +244,7 @@ def offsets_magnetometer(self): @property def offsets_gyroscope(self): + """Returns a 3-value Struct with the (x, y, z) gyroscope calibration offsets""" last_mode = self.mode self.mode = CONFIG_MODE vector = self._offsets_gyroscope @@ -250,6 +253,7 @@ def offsets_gyroscope(self): @property def radius_accelerometer(self): + """Returns the current accelerometer calibration radius""" last_mode = self.mode self.mode = CONFIG_MODE vector = self._radius_accelerometer @@ -258,6 +262,7 @@ def radius_accelerometer(self): @property def radius_magnetometer(self): + """Returns the current magnetometer calibration radius""" last_mode = self.mode self.mode = CONFIG_MODE vector = self._radius_magnetometer From a85d9c1b65c1d9bdb002298e04253a00e2ece763 Mon Sep 17 00:00:00 2001 From: Scott Irwin Date: Mon, 6 May 2019 15:53:56 -0400 Subject: [PATCH 3/6] add a mode aware Struct (as suggested by @deshipu) and use that to expose calibration and radii as r/w properties on BNO055 --- adafruit_bno055.py | 81 +++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 51 deletions(-) diff --git a/adafruit_bno055.py b/adafruit_bno055.py index d3033ad..3cf37a2 100644 --- a/adafruit_bno055.py +++ b/adafruit_bno055.py @@ -90,6 +90,24 @@ class _ReadOnlyUnaryStruct(UnaryStruct): # pylint: disable=too-few-public-method def __set__(self, obj, value): raise NotImplementedError() +class _ModeStruct(Struct): # pylint: disable=too-few-public-methods + def __init__(self, register_address, struct_format, mode): + super().__init__(register_address, struct_format) + self.mode = mode + + def __get__(self, obj, objtype=None): + last_mode = obj.mode + obj.mode = self.mode + result = super().__get__(obj, objtype) + obj.mode = last_mode + return result + + def __set__(self, obj, value): + last_mode = obj.mode + obj.mode = self.mode + super().__set__(obj, value) + obj.mode = last_mode + time.sleep(0.01) class BNO055: """ @@ -123,6 +141,18 @@ class BNO055: gravity = _ScaledReadOnlyStruct(0x2e, ' Date: Tue, 7 May 2019 09:59:34 -0400 Subject: [PATCH 4/6] as suggested, remove sleep from set method in ModeStruct --- adafruit_bno055.py | 1 - 1 file changed, 1 deletion(-) diff --git a/adafruit_bno055.py b/adafruit_bno055.py index 3cf37a2..4042136 100644 --- a/adafruit_bno055.py +++ b/adafruit_bno055.py @@ -107,7 +107,6 @@ def __set__(self, obj, value): obj.mode = self.mode super().__set__(obj, value) obj.mode = last_mode - time.sleep(0.01) class BNO055: """ From 28c6685a9d551bebfc6adac4e979d8ba05aa2543 Mon Sep 17 00:00:00 2001 From: Scott Irwin Date: Sun, 12 May 2019 15:30:52 -0400 Subject: [PATCH 5/6] more natural behavior for single value entities --- adafruit_bno055.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/adafruit_bno055.py b/adafruit_bno055.py index 4042136..6d9f22b 100644 --- a/adafruit_bno055.py +++ b/adafruit_bno055.py @@ -100,12 +100,15 @@ def __get__(self, obj, objtype=None): obj.mode = self.mode result = super().__get__(obj, objtype) obj.mode = last_mode - return result + # single value comes back as a one-element tuple + return result[0] if type(result) == tuple and len(result) == 1 else result def __set__(self, obj, value): last_mode = obj.mode obj.mode = self.mode - super().__set__(obj, value) + # underlying __set__() expects a tuple + set_val = (value,) if type(value) != tuple else value + super().__set__(obj, set_val) obj.mode = last_mode class BNO055: From 77a8abed444fd3ff51852e7c5660a0bda36a49b7 Mon Sep 17 00:00:00 2001 From: Scott Irwin Date: Wed, 15 May 2019 09:20:06 -0400 Subject: [PATCH 6/6] use isinstance() instead of type() check --- adafruit_bno055.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_bno055.py b/adafruit_bno055.py index 6d9f22b..38e701c 100644 --- a/adafruit_bno055.py +++ b/adafruit_bno055.py @@ -101,13 +101,13 @@ def __get__(self, obj, objtype=None): result = super().__get__(obj, objtype) obj.mode = last_mode # single value comes back as a one-element tuple - return result[0] if type(result) == tuple and len(result) == 1 else result + return result[0] if isinstance(result, tuple) and len(result) == 1 else result def __set__(self, obj, value): last_mode = obj.mode obj.mode = self.mode # underlying __set__() expects a tuple - set_val = (value,) if type(value) != tuple else value + set_val = value if isinstance(value, tuple) else (value,) super().__set__(obj, set_val) obj.mode = last_mode