From 0180f6196b5d20b2da363860163a80787f0e7719 Mon Sep 17 00:00:00 2001
From: Andreas Gattringer <andreas.gattringer@univie.ac.at>
Date: Fri, 19 Apr 2024 16:04:22 +0200
Subject: [PATCH] take a bit more care of memory consumption

---
 programs/umnp-rhtp-local.py                   | 79 +++++++++++++++++++
 programs/umnp-rhtp.py                         |  7 +-
 .../sensors/lps28dfw/__init__.py              | 28 +++----
 .../microcontroller/sensors/sht45/__init__.py | 17 ++--
 4 files changed, 107 insertions(+), 24 deletions(-)
 create mode 100644 programs/umnp-rhtp-local.py

diff --git a/programs/umnp-rhtp-local.py b/programs/umnp-rhtp-local.py
new file mode 100644
index 0000000..96d6800
--- /dev/null
+++ b/programs/umnp-rhtp-local.py
@@ -0,0 +1,79 @@
+import sys
+
+from umnp.devices import DEVICE_TYPE_RHTP
+from umnp.microcontroller.devices.network.ethernet_w5500 import EthernetW5500
+from umnp.microcontroller.measurementdevice import MeasurementDevice
+from umnp.microcontroller.sensors.lps28dfw import LPS28DFW
+from umnp.microcontroller.sensors.sht45 import SHT45
+from umnp.microcontroller.tasks.periodictask import PeriodicTask
+from umnp.protocol.data_message import DataMessage
+
+if sys.implementation.name == "micropython":
+    # noinspection PyUnresolvedReferences
+    import machine
+    import gc
+
+    # noinspection PyUnresolvedReferences
+    import uasyncio as asyncio
+else:
+    from umnp.microcontroller.umock import machine
+
+# SPI PARAMETERS
+SPI_BAUD = 2_000_000
+SPI_MOSI = machine.Pin(19)
+SPI_MISO = machine.Pin(16)
+SPI_SCK = machine.Pin(18)  # serial clock
+
+# I2C PARAMETERS
+I2C_SCL = machine.Pin(27)  # serial clock
+I2C_SDA = machine.Pin(26)  # serial data
+
+# ETHERNET PARAMETERS
+ETH_CS = machine.Pin(17)  # chip select
+ETH_RST = machine.Pin(20)  # reset
+
+ETH_IP = "192.168.0.33"  # IP of microcontroller
+ETH_SUBNET = "255.255.255.0"  # ...
+ETH_GATEWAY = "192.168.0.1"  # ...
+ETH_DNS = "192.168.0.2"  # technically not necessary
+ETH_USE_DHCP = False
+
+
+async def aggregate_and_send(
+    device: MeasurementDevice, sht45: SHT45, p_sensor: LPS28DFW
+):
+    comm = device.communicator
+    t, rh = await sht45.measure()
+    p, p_t = await p_sensor.measure()
+    data = "{:2.2f},{:2.2f},{:2.2f},{:2.2f}".format(t, rh, p, p_t)
+    print("Sending: '{}'".format(data))
+    msg = DataMessage(data, device.identifier_raw, device.device_type)
+    await comm.send_message(msg)
+    msg = None
+    gc.collect()
+
+
+async def main():
+    # configure network
+    device = MeasurementDevice(device_type=DEVICE_TYPE_RHTP)
+    spi = machine.SPI(0, SPI_BAUD, mosi=SPI_MOSI, miso=SPI_MISO, sck=SPI_SCK)
+    i2c = machine.I2C(id=1, scl=I2C_SCL, sda=I2C_SDA)
+
+    dev_mac = device.generated_mac_raw()
+    ether = EthernetW5500(spi, ETH_CS, ETH_RST, dev_mac, ETH_USE_DHCP)
+    ether.set_network(ETH_IP, ETH_SUBNET, ETH_GATEWAY, ETH_DNS)
+
+    device.add_network_adapter(ether)
+    comm = device.create_communicator()
+
+    sht45 = SHT45(i2c)
+    p_sensor = LPS28DFW(i2c, i2c_address=0x5C)
+
+    task = PeriodicTask(aggregate_and_send, None, 1000, device, sht45, p_sensor)
+    comm.add_task(task, "aggregate_and_send")
+
+    asyncio.run(comm.start())
+
+
+if __name__ == "__main__":
+    asyncio.run(main())
diff --git a/programs/umnp-rhtp.py b/programs/umnp-rhtp.py
index 4d40c71..1fd3e5f 100644
--- a/programs/umnp-rhtp.py
+++ b/programs/umnp-rhtp.py
@@ -11,6 +11,7 @@ from umnp.protocol.data_message import DataMessage
 if sys.implementation.name == "micropython":
     # noinspection PyUnresolvedReferences
     import machine
+    import gc
 
     # noinspection PyUnresolvedReferences
     import uasyncio as asyncio
@@ -44,10 +45,12 @@ async def aggregate_and_send(
     comm = device.communicator
     t, rh = await sht45.measure()
     p, p_t = await p_sensor.measure()
-    data = f"{t},{rh},{p},{p_t}"
-    print(f"Sending: '{data}'")
+    data = "{:2.2f},{:2.2f},{:2.2f},{:2.2f}".format(t, rh, p, p_t)
+    print("Sending: '{}'".format(data))
     msg = DataMessage(data, device.identifier_raw, device.device_type)
     await comm.send_message(msg)
+    msg = None
+    gc.collect()
 
 
 async def main():
diff --git a/umnp/microcontroller/sensors/lps28dfw/__init__.py b/umnp/microcontroller/sensors/lps28dfw/__init__.py
index bfc86ab..2815a9f 100644
--- a/umnp/microcontroller/sensors/lps28dfw/__init__.py
+++ b/umnp/microcontroller/sensors/lps28dfw/__init__.py
@@ -7,25 +7,25 @@ try:
 except ImportError:
     from umnp.microcontroller.umock.machine import I2C
 
-LPS28DFW_DEFAULT_ADDRESS = 0x5D
-LPS28DFW_READ = 0xB9
-LPS28DFW_WRITE = 0xB8
+LPS28DFW_DEFAULT_ADDRESS = const(0x5D)
+LPS28DFW_READ = const(0xB9)
+LPS28DFW_WRITE = const(0xB8)
 
-LPS28DFW_CTRL_REG1 = 0x10
-LPS28DFW_CTRL_REG2 = 0x11
-LPS28DFW_CTRL_REG3 = 0x12
-LPS28DFW_CTRL_REG4 = 0x13
+LPS28DFW_CTRL_REG1 = const(0x10)
+LPS28DFW_CTRL_REG2 = const(0x11)
+LPS28DFW_CTRL_REG3 = const(0x12)
+LPS28DFW_CTRL_REG4 = const(0x13)
 
-LPS28DFW_WHO_AM_I = 0x0F
+LPS28DFW_WHO_AM_I = const(0x0F)
 
-LPS28DFW_TEMP_OUT_H = 0x2B
-LPS28DFW_TEMP_OUT_L = 0x2C
+LPS28DFW_TEMP_OUT_H = const(0x2B)
+LPS28DFW_TEMP_OUT_L = const(0x2C)
 
 
-LPS28DFW_PRESS_OUT_H = 0x2A
-LPS28DFW_PRESS_OUT_L = 0x29
-LPS28DFW_PRESS_OUT_XL = 0x28
-LPS28DFW_STATUS = 0x27
+LPS28DFW_PRESS_OUT_H = const(0x2A)
+LPS28DFW_PRESS_OUT_L = const(0x29)
+LPS28DFW_PRESS_OUT_XL = const(0x28)
+LPS28DFW_STATUS = const(0x27)
 
 VALID_FREQUENCIES_HZ = [0, 1, 4, 10, 25, 50, 75, 100, 200]
 VALID_AVERAGING = [4, 8, 16, 32, 64, 128, 512]
diff --git a/umnp/microcontroller/sensors/sht45/__init__.py b/umnp/microcontroller/sensors/sht45/__init__.py
index 83401c0..7b82359 100644
--- a/umnp/microcontroller/sensors/sht45/__init__.py
+++ b/umnp/microcontroller/sensors/sht45/__init__.py
@@ -6,12 +6,13 @@ except ImportError:
 import asyncio
 import time
 
-SHT45_HIRES = 0xFD
-NO_HOLD_WAIT_TIME = 18.5 / 1000 / 1000
-SHT45_WAIT_TIME_MS = 9
-SHT45_RESET_TIME_MS = 1
-SHT45_SOFT_RESET = 0x94
-SHT45_DEFAULT_ADDRESS = 0x44
+SHT45_HIRES = const(0xFD)
+NO_HOLD_WAIT_TIME = const(1.85e-05)
+SHT45_WAIT_TIME_MS = const(9)
+SHT45_RESET_TIME_MS = const(1)
+SHT45_SOFT_RESET = const(0x94)
+SHT45_DEFAULT_ADDRESS = const(0x44)
+NAN = float("NAN")
 
 
 class SHT45:
@@ -19,7 +20,7 @@ class SHT45:
         self._i2c = i2c
         self._i2c_address = i2c_address
         self._initialised = False
-        self._nan = float("NAN")
+        self._nan = NAN
 
         devices = self._i2c.scan()
 
@@ -78,7 +79,7 @@ class SHT45:
         temperature = self._nan
         rh = self._nan
         if not self.initialised:
-            return temperature, rh
+            return self._nan, self._nan
 
         cmd = bytearray(1)
         cmd[0] = SHT45_HIRES
-- 
GitLab