# -*- coding: utf-8 -*- import argparse import asyncio import logging import struct import time from bleak import BleakClient, BleakScanner from bleak.backends.characteristic import BleakGATTCharacteristic from bleak.uuids import normalize_uuid_str from ble_interface import ble_interface import dearpygui.dearpygui as dpg import myUUIDs from ble_interface import ble_interface logger = logging.getLogger(__name__) loop: asyncio.AbstractEventLoop device: ble_interface current_meas = {} start_time = None def on_connect_handler(device: ble_interface): device.subscribe_to(device.CURRENT) def current_meas_handler(device: ble_interface, input_handle: int, newval: int): value = newval handle = input_handle logger.info("%s: %f", handle, value * 1.0e-6) global start_time global current_meas if(start_time is None): start_time = time.monotonic_ns() start_time += 1 if(not handle in current_meas): logger.info("%d %s", handle, current_meas) current_meas[handle] = [] dpg.add_line_series([], [], label=f"{handle}", parent="y_axis", tag=f"serie{handle}") current_meas[handle].append(((time.monotonic_ns() - start_time) * 1e-9, value * 1e-6)) dpg.set_value(f"serie{handle}", [ [v[0] for v in current_meas[handle]], [v[1] for v in current_meas[handle]] ]) # dpg.fit_axis_data("x_axis") # dpg.fit_axis_data("y_axis") def update_refresh_rate(sender, app_data): logger.info("refresh rate %d", app_data) device.update_refresh_delay(app_data) async def init_gui(): dpg.create_context() dpg.create_viewport() dpg.setup_dearpygui() with dpg.window(label="Controls", pos = [0, 0], width = dpg.get_viewport_width(), height = 100): dpg.add_button(label="Connect", callback=device.connect) dpg.add_input_int(label="Refresh Delay", callback=update_refresh_rate, on_enter=True, tag="refresh delay") with dpg.window(label="Graphs", pos = [0, 100], width = dpg.get_viewport_width(), height = 500): with dpg.plot(label="Current", width = -1, height = -1): dpg.add_plot_legend() dpg.add_plot_axis(dpg.mvXAxis, label="x", tag="x_axis") dpg.add_plot_axis(dpg.mvYAxis, label="y", tag="y_axis") dpg.set_axis_limits_auto("x_axis") dpg.set_axis_limits_auto("y_axis") dpg.show_viewport() while dpg.is_dearpygui_running(): dpg.render_dearpygui_frame() await asyncio.sleep(0) dpg.destroy_context() if __name__ == "__main__": logging.basicConfig( level="INFO", format="%(asctime)-15s %(name)-8s %(levelname)s: %(message)s", ) loop = asyncio.get_event_loop() device = ble_interface("84:F7:03:1B:C6:A2", loop, logger) device.add_callback(device.ON_CONNECT, on_connect_handler) device.add_callback(device.CURRENT, current_meas_handler) loop.create_task(init_gui()) loop.run_forever()