Skip to content

naneos_device_manager

NaneosDeviceManager

Bases: Thread

NaneosDeviceManager is a class that manages Naneos devices. It connects and disconnects automatically.

Source code in src/naneos/manager/naneos_device_manager.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
class NaneosDeviceManager(threading.Thread):
    """
    NaneosDeviceManager is a class that manages Naneos devices.
    It connects and disconnects automatically.
    """

    UPLOAD_INTERVAL_SECONDS = 15

    def __init__(self) -> None:
        super().__init__(daemon=True)
        self._stop_event = threading.Event()
        self._next_upload_time = time.time() + self.UPLOAD_INTERVAL_SECONDS

        self._manager_serial = PartectorSerialManager()
        self._manager_ble = PartectorBleManager()

        self._data: dict[int, pd.DataFrame] = {}  # Store data from both serial and BLE managers

    def run(self) -> None:
        self._manager_serial.start()
        self._manager_ble.start()

        self._loop()

        self._manager_serial.stop()
        self._manager_ble.stop()

        self._manager_serial.join()
        self._manager_ble.join()

    def stop(self) -> None:
        self._stop_event.set()

    def get_connected_serial_devices(self) -> list[str]:
        """
        Returns a list of connected serial devices.
        """
        return self._manager_serial.get_connected_device_strings()

    def get_connected_ble_devices(self) -> list[str]:
        """
        Returns a list of connected BLE devices.
        """
        return self._manager_ble.get_connected_device_strings()

    def get_seconds_until_next_upload(self) -> float:
        """
        Returns the number of seconds until the next upload.
        This is used to determine when to upload data.
        """
        return max(0, self._next_upload_time - time.time())

    def _loop(self) -> None:
        self._next_upload_time = time.time() + self.UPLOAD_INTERVAL_SECONDS

        while not self._stop_event.is_set():
            try:
                time.sleep(1)

                data_serial = self._manager_serial.get_data()
                data_ble = self._manager_ble.get_data()

                self._data = add_to_existing_naneos_data(self._data, data_serial)
                self._data = add_to_existing_naneos_data(self._data, data_ble)

                if time.time() >= self._next_upload_time:
                    self._next_upload_time = time.time() + self.UPLOAD_INTERVAL_SECONDS

                    upload_data = sort_and_clean_naneos_data(self._data)
                    self._data = {}

                    uploader = NaneosUploadThread(
                        upload_data, callback=lambda success: print(f"Upload success: {success}")
                    )
                    uploader.start()
                    uploader.join()

            except Exception as e:
                logger.exception(f"DeviceManager loop exception: {e}")

get_connected_ble_devices()

Returns a list of connected BLE devices.

Source code in src/naneos/manager/naneos_device_manager.py
57
58
59
60
61
def get_connected_ble_devices(self) -> list[str]:
    """
    Returns a list of connected BLE devices.
    """
    return self._manager_ble.get_connected_device_strings()

get_connected_serial_devices()

Returns a list of connected serial devices.

Source code in src/naneos/manager/naneos_device_manager.py
51
52
53
54
55
def get_connected_serial_devices(self) -> list[str]:
    """
    Returns a list of connected serial devices.
    """
    return self._manager_serial.get_connected_device_strings()

get_seconds_until_next_upload()

Returns the number of seconds until the next upload. This is used to determine when to upload data.

Source code in src/naneos/manager/naneos_device_manager.py
63
64
65
66
67
68
def get_seconds_until_next_upload(self) -> float:
    """
    Returns the number of seconds until the next upload.
    This is used to determine when to upload data.
    """
    return max(0, self._next_upload_time - time.time())