Skip to content

Commit 663c1c0

Browse files
committed
lis2mdl: Auto-trigger single conversion in idle mode.
1 parent 1492c3e commit 663c1c0

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

lib/lis2mdl/lis2mdl/device.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,15 @@ def set_hw_offsets(self, x: int, y: int, z: int):
168168
# --- READ functions ---
169169
##
170170

171+
def _ensure_data(self):
172+
"""Trigger a single conversion if the sensor is in idle mode."""
173+
if self.is_idle():
174+
self.set_mode("single")
175+
for _ in range(50):
176+
if self.data_ready():
177+
return
178+
sleep_ms(2)
179+
171180
def read_magnet_raw(self):
172181
"""Reads the raw magnetic field (LSB). Same as read_magnet(), but more explicit."""
173182
return self.read_magnet() # (x,y,z) int16 LSB
@@ -222,6 +231,7 @@ def _to_int16(v):
222231

223232
def read_magnet(self):
224233
# Read the raw magnetic field data (X, Y, Z) from the sensor.
234+
self._ensure_data()
225235
buf = self.i2c.readfrom_mem(self.address, LIS2MDL_OUTX_L_REG | 0x80, 6)
226236
x = self._to_int16((buf[1] << 8) | buf[0])
227237
y = self._to_int16((buf[3] << 8) | buf[2])
@@ -232,6 +242,7 @@ def read_magnet(self):
232242

233243
def read_temperature_raw(self) -> int:
234244
"""Reads the raw temperature (LSB), 8 LSB/°C, absolute offset not guaranteed."""
245+
self._ensure_data()
235246
lo = self._read_reg(LIS2MDL_TEMP_OUT_L_REG)
236247
hi = self._read_reg(LIS2MDL_TEMP_OUT_H_REG)
237248
v = (hi << 8) | lo

tests/scenarios/lis2mdl.yaml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,57 @@ tests:
8686
expect_range: [19.0, 21.0]
8787
mode: [mock]
8888

89+
# ----- Auto-trigger -----
90+
91+
- name: "Magnetic field readable after power down"
92+
action: script
93+
script: |
94+
dev.power_down()
95+
x, y, z = dev.read_magnet()
96+
result = isinstance(x, int) and isinstance(y, int) and isinstance(z, int)
97+
expect_true: true
98+
mode: [mock]
99+
100+
- name: "Temperature readable after power down"
101+
action: script
102+
script: |
103+
dev.power_down()
104+
t = dev.read_temperature_c()
105+
result = isinstance(t, float)
106+
expect_true: true
107+
mode: [mock]
108+
109+
- name: "No auto-trigger when already active"
110+
action: script
111+
script: |
112+
dev.read_magnet()
113+
i2c.clear_write_log()
114+
dev.read_magnet()
115+
log = i2c.get_write_log()
116+
result = len(log) == 0
117+
expect_true: true
118+
mode: [mock]
119+
120+
- name: "Fresh magnitude after power down"
121+
action: script
122+
script: |
123+
dev.power_down()
124+
mag = dev.magnitude_uT()
125+
result = 10.0 < mag < 300.0
126+
expect_true: true
127+
mode: [hardware]
128+
129+
- name: "Fresh temperature after power down"
130+
action: script
131+
script: |
132+
dev.power_down()
133+
t = dev.read_temperature_c()
134+
result = 10.0 < t < 45.0
135+
expect_true: true
136+
mode: [hardware]
137+
138+
# ----- Hardware -----
139+
89140
- name: "Magnitude in plausible range"
90141
action: call
91142
method: magnitude_uT

0 commit comments

Comments
 (0)