diff --git a/preload/apps/bhi160/__init__.py b/preload/apps/bhi160/__init__.py index 988af93764d04ec35108da50b3dd73cb52541115..c1f4325092a83b4b23975f9057bec7b2caee3e67 100644 --- a/preload/apps/bhi160/__init__.py +++ b/preload/apps/bhi160/__init__.py @@ -1,47 +1,49 @@ import bhi160 -import display -import utime import buttons - -disp = display.open() -sensor = 0 - -sensors = [ - {"sensor": bhi160.BHI160Orientation(), "name": "Orientation"}, - {"sensor": bhi160.BHI160Accelerometer(), "name": "Accelerometer"}, - {"sensor": bhi160.BHI160Gyroscope(), "name": "Gyroscope"}, - {"sensor": bhi160.BHI160Magnetometer(), "name": "Magnetometer"}, +import color +import contextlib +import display +import itertools +import simple_menu + +STATUS_COLORS = [ + color.RED, + # Orange + color.RED * 0.5 + color.YELLOW * 0.5, + color.YELLOW, + color.GREEN, ] -while True: - # Read and print sample - samples = sensors[sensor]["sensor"].read() - if len(samples) > 0: - disp.clear() - sample = samples[0] +with contextlib.ExitStack() as cx: + disp = cx.enter_context(display.open()) - color = [255, 0, 0] - if sample.status == 1: - color = [255, 128, 0] - elif sample.status == 2: - color = [255, 255, 0] - elif sample.status == 3: - color = [0, 200, 0] + args = {"sample_rate": 10, "sample_buffer_len": 20} - disp.print(sensors[sensor]["name"], posy=0) - disp.print("X: %f" % sample.x, posy=20, fg=color) - disp.print("Y: %f" % sample.y, posy=40, fg=color) - disp.print("Z: %f" % sample.z, posy=60, fg=color) + sensor_iter = itertools.cycle( + [ + (cx.enter_context(bhi160.BHI160Orientation(**args)), "Orientation"), + (cx.enter_context(bhi160.BHI160Accelerometer(**args)), "Accel"), + (cx.enter_context(bhi160.BHI160Gyroscope(**args)), "Gyro"), + (cx.enter_context(bhi160.BHI160Magnetometer(**args)), "Magnetic"), + ] + ) + sensor, sensor_name = next(sensor_iter) - disp.update() + for ev in simple_menu.button_events(timeout=0.1): + # Pressing the bottom right button cycles through sensors + if ev == buttons.BOTTOM_RIGHT: + sensor, sensor_name = next(sensor_iter) - # Read button - v = buttons.read(buttons.BOTTOM_RIGHT) - if v == 0: - button_pressed = False + samples = sensor.read() + if not samples: + continue - if not button_pressed and v & buttons.BOTTOM_RIGHT != 0: - button_pressed = True - sensor = (sensor + 1) % len(sensors) + sample = samples[-1] + col = STATUS_COLORS[sample.status] - utime.sleep(0.1) + disp.clear() + disp.print("{:^11s}".format(sensor_name), posy=0, posx=3) + disp.print("X:{: 9.4f}".format(sample.x), posy=20, fg=col) + disp.print("Y:{: 9.4f}".format(sample.y), posy=40, fg=col) + disp.print("Z:{: 9.4f}".format(sample.z), posy=60, fg=col) + disp.update()