Skip to content
Snippets Groups Projects
Select Git revision
  • 5093cff4ca9dcfc27bf10ff0a6fc1786881cbaa4
  • master default
  • analog_clock
  • mem_usage
  • longint_issue
  • more_fonts
  • more_fonts_ng
  • utime_time_ms
  • genofire/ble-personal_state
  • ios-workarounds
  • schneider/maxim-sdk-update
  • rahix/simple_menu
  • ch3/splashscreen
  • koalo/bhi160-works-but-dirty
  • koalo/wip/i2c-for-python
  • renze/safe_mode
  • renze/hatchery_apps
  • schneider/fundamental-test
  • koalo/factory-reset
  • msgctl/gfx_rle
  • msgctl/faultscreen
  • v1.4
  • v1.3
  • v1.2
  • v1.1
  • v1.0
  • release-1
  • bootloader-v1
  • v0.0
29 results

api_dispatcher.c

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)