Skip to content
Snippets Groups Projects
Select Git revision
  • fd6c28aba1b982fbe0afcafaf24e4619d1d61348
  • master default protected
  • button_gestures
  • ecg-button-gestures
  • fix-bhi160-axes
  • ecg-bpm-counter
  • patch-1
  • genofire/leds_rgb_get_state
  • genofire/rockets-state
  • genofire/ble-follow-py
  • hauke/ble-cleanups
  • plaetzchen/ios-workaround
  • blinkisync-as-preload
  • genofire/haule-ble-fs-deactive
  • schneider/max30001-pycardium
  • schneider/max30001-epicaridum
  • schneider/max30001
  • schneider/stream-locks
  • ios-workarounds
  • schneider/fundamental-test
  • schneider/ble-buffers
  • v1.8
  • v1.7
  • v1.6
  • v1.5
  • v1.4
  • v1.3
  • v1.2
  • v1.1
  • v1.0
  • release-1
  • bootloader-v1
  • v0.0
33 results

bhi160.py

Blame
  • Forked from card10 / firmware
    Source project has a limited visibility.
    bhi160.py 4.23 KiB
    import sys_bhi160
    import interrupt
    import ucollections
    
    DataVector = ucollections.namedtuple("DataVector", ["x", "y", "z", "status"])
    
    
    def disable_all_sensors():
        """
        Disable all sensor also if they are already deactivated.
    
        :returns: None
        """
        sys_bhi160.disable_all_sensors()
    
    
    class BHI160:
        def enable_sensor(self):
            interrupt.disable_callback(self.interrupt_id)
            interrupt.set_callback(self.interrupt_id, self._interrupt)
            self.stream_id = sys_bhi160.enable_sensor(
                self.sensor_id, self.sample_buffer_len, self.sample_rate, self.dynamic_range
            )
    
            if self.stream_id < 0:
                raise ValueError("Enable sensor returned %i", self.stream_id)
    
            self.active = True
    
            if self._callback:
                interrupt.enable_callback(self.interrupt_id)
    
        def __enter__(self):
            return self
    
        def __exit__(self, _et, _ev, _t):
            self.close()
    
        def close(self):
            if self.active:
                self.active = False
                ret = sys_bhi160.disable_sensor(self.sensor_id)
    
                if ret < 0:
                    raise ValueError("Disable sensor returned %i", ret)
    
                interrupt.disable_callback(self.interrupt_id)
                interrupt.set_callback(self.interrupt_id, None)
    
        def read(self):
            result = []
            if self.active:
                for sample in sys_bhi160.read_sensor(self.stream_id):
                    result.append(self.convert(sample))
            return result
    
        def _interrupt(self, _):
            if self.active:
                data = self.read()
                if self._callback:
                    self._callback(data)
    
        def convert_data_vector(self, sample):
            return DataVector(
                self.convert_single(sample[0]),
                self.convert_single(sample[1]),
                self.convert_single(sample[2]),
                sample[3],
            )
    
    
    class BHI160Accelerometer(BHI160):
        def __init__(
            self, sample_rate=4, dynamic_range=2, callback=None, sample_buffer_len=200
        ):
            self.sample_rate = sample_rate
            self.dynamic_range = dynamic_range
            self.callback = callback
            self.sample_buffer_len = sample_buffer_len
            self.sensor_id = 0
            self.interrupt_id = interrupt.BHI160_ACCELEROMETER
            self._callback = callback
            self.enable_sensor()
    
        def convert_single(self, value):
            return 2 * value / 32768.0
    
        def convert(self, sample):
            return self.convert_data_vector(sample)
    
    
    class BHI160Gyroscope(BHI160):
        def __init__(
            self, sample_rate=4, dynamic_range=2, callback=None, sample_buffer_len=200
        ):
            self.sample_rate = sample_rate
            self.dynamic_range = dynamic_range
            self.callback = callback
            self.sample_buffer_len = sample_buffer_len
            self.sensor_id = 3
            self.interrupt_id = interrupt.BHI160_GYROSCOPE
            self._callback = callback
            self.enable_sensor()
    
        def convert_single(self, value):
            return 360 * value / 32768.0
    
        def convert(self, sample):
            return self.convert_data_vector(sample)
    
    
    class BHI160Orientation(BHI160):
        def __init__(
            self, sample_rate=4, dynamic_range=2, callback=None, sample_buffer_len=200
        ):
            self.sample_rate = sample_rate
            self.dynamic_range = dynamic_range
            self.callback = callback
            self.sample_buffer_len = sample_buffer_len
            self.sensor_id = 2
            self.interrupt_id = interrupt.BHI160_ORIENTATION
            self._callback = callback
            self.enable_sensor()
    
        def convert_single(self, value):
            return 360 * value / 32768.0
    
        def convert(self, sample):
            return self.convert_data_vector(sample)
    
    
    class BHI160Magnetometer(BHI160):
        def __init__(
            self, sample_rate=4, dynamic_range=1, callback=None, sample_buffer_len=200
        ):
            self.sample_rate = sample_rate
            self.dynamic_range = dynamic_range
            self.callback = callback
            self.sample_buffer_len = sample_buffer_len
            self.sensor_id = 1
            self.interrupt_id = interrupt.BHI160_MAGNETOMETER
            self._callback = callback
            self.enable_sensor()
    
        def convert_single(self, value):
            return 1000 * value / 32768.0
    
        def convert(self, sample):
            return self.convert_data_vector(sample)