diff --git a/umnp/microcontroller/measurementdevice.py b/umnp/microcontroller/measurementdevice.py index 56d587bb6ab3809a81024aec064813f19558e9b0..3e00519c85013978158f2ede5c34a937544a5b07 100644 --- a/umnp/microcontroller/measurementdevice.py +++ b/umnp/microcontroller/measurementdevice.py @@ -2,6 +2,13 @@ import binascii import sys import time +from umnp.microcontroller.communication.udp_communicator import UDPCommunicator +from umnp.microcontroller.devices.network.udp import ( + UDPSender, + UDPReceiver, + DEFAULT_UMNP_DATA_IN_PORT, + DEFAULT_UMNP_COMMAND_IN_PORT, +) from umnp.protocol.constants import MSG_STRING_ENCODING if sys.implementation.name == "micropython": @@ -15,8 +22,13 @@ class MeasurementDevice: def __init__(self): self._boot_time = time.time() self._identifier_raw = machine.unique_id() - self._identifier = binascii.hexlify(self.identifier_raw).decode(MSG_STRING_ENCODING) + self._identifier = binascii.hexlify(self.identifier_raw).decode( + MSG_STRING_ENCODING + ) self._network = None + self._sender = None + self._receiver = None + self._communicator = None @property def boot_time(self): @@ -27,7 +39,7 @@ class MeasurementDevice: def generated_mac_string(self) -> str: machine_id = self.identifier_raw[:6] - return ':'.join(f'{digit:02x}' for digit in machine_id) + return ":".join(f"{digit:02x}" for digit in machine_id) def generated_mac_raw(self) -> bytes: return self.identifier_raw[:6] @@ -39,3 +51,36 @@ class MeasurementDevice: @property def identifier(self) -> str: return self._identifier + + def create_sender(self, port: int = DEFAULT_UMNP_DATA_IN_PORT): + if not self._network: + raise ValueError("No network adapter added") + if not self._sender: + self._sender = UDPSender( + self._network.ip, self._network.netmask, send_to_port=port + ) + return self._sender + + def create_receiver(self, port: int = DEFAULT_UMNP_COMMAND_IN_PORT): + if not self._network: + raise ValueError("No network adapter added") + if not self._receiver: + self._receiver = UDPReceiver(self._network.ip, listen_port=port) + return self._receiver + + def create_communicator( + self, + data_port: int = DEFAULT_UMNP_DATA_IN_PORT, + cmd_port: int = DEFAULT_UMNP_COMMAND_IN_PORT, + ): + if not self._communicator: + s = self.create_sender(port=data_port) + r = self.create_receiver(port=cmd_port) + self._communicator = UDPCommunicator( + receiver=r, sender=s, device_id=self.identifier + ) + return self._communicator + + @property + def communicator(self) -> UDPCommunicator | None: + return self._communicator