Skip to content

Commit 8fdff05

Browse files
committed
ism330dl: Auto-trigger conversion when reading after power down.
1 parent d505f38 commit 8fdff05

2 files changed

Lines changed: 66 additions & 0 deletions

File tree

lib/ism330dl/ism330dl/device.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ def __init__(self, i2c, address=ISM330DL_I2C_DEFAULT_ADDR):
1414
self._buffer_1 = bytearray(1)
1515

1616
self._accel_scale = ACCEL_FS_2G
17+
self._accel_odr = ACCEL_ODR_104HZ
1718
self._gyro_scale = GYRO_FS_250DPS
19+
self._gyro_odr = GYRO_ODR_104HZ
1820

1921
self._temp_gain = 1.0
2022
self._temp_offset = 0.0
@@ -101,6 +103,8 @@ def configure_accel(self, odr, scale):
101103
if scale not in ACCEL_FS_BITS:
102104
raise ISM330DLConfigError("Invalid accel scale")
103105
self._accel_scale = scale
106+
if odr != ACCEL_ODR_POWER_DOWN:
107+
self._accel_odr = odr
104108
value = (odr << 4) | (ACCEL_FS_BITS[scale] << 2)
105109
self._write_u8(REG_CTRL1_XL, value)
106110

@@ -114,19 +118,41 @@ def configure_gyro(self, odr, scale):
114118
raise ISM330DLConfigError("Invalid gyro scale")
115119
value = (odr << 4) | (GYRO_FS_BITS[scale] << 2)
116120
self._gyro_scale = scale
121+
if odr != GYRO_ODR_POWER_DOWN:
122+
self._gyro_odr = odr
117123
self._write_u8(REG_CTRL2_G, value)
118124

125+
# --------------------------------------------------
126+
# Auto-trigger
127+
# --------------------------------------------------
128+
129+
def _is_power_down(self):
130+
"""Return True if both accel and gyro ODR are 0 (power-down)."""
131+
ctrl1 = self._read_u8(REG_CTRL1_XL)
132+
ctrl2 = self._read_u8(REG_CTRL2_G)
133+
return (ctrl1 & 0xF0) == 0 and (ctrl2 & 0xF0) == 0
134+
135+
def _ensure_data(self):
136+
"""Restore previous ODR and wait for data if in power-down mode."""
137+
if self._is_power_down():
138+
self.configure_accel(self._accel_odr, self._accel_scale)
139+
self.configure_gyro(self._gyro_odr, self._gyro_scale)
140+
sleep_ms(100)
141+
119142
# --------------------------------------------------
120143
# Raw readings
121144
# --------------------------------------------------
122145

123146
def acceleration_raw(self):
147+
self._ensure_data()
124148
return self._read_vector(REG_OUTX_L_XL)
125149

126150
def gyroscope_raw(self):
151+
self._ensure_data()
127152
return self._read_vector(REG_OUTX_L_G)
128153

129154
def temperature_raw(self):
155+
self._ensure_data()
130156
return self._read_i16(REG_OUT_TEMP_L)
131157

132158
# --------------------------------------------------

tests/scenarios/ism330dl.yaml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,46 @@ tests:
297297
expect_true: true
298298
mode: [mock]
299299

300+
# ----- Auto-trigger -----
301+
302+
- name: "Acceleration readable after power down"
303+
action: script
304+
script: |
305+
dev.power_down()
306+
ax, ay, az = dev.acceleration_g()
307+
result = isinstance(ax, float) and isinstance(ay, float) and isinstance(az, float)
308+
expect_true: true
309+
mode: [mock]
310+
311+
- name: "Gyroscope readable after power down"
312+
action: script
313+
script: |
314+
dev.power_down()
315+
gx, gy, gz = dev.gyroscope_dps()
316+
result = isinstance(gx, float) and isinstance(gy, float) and isinstance(gz, float)
317+
expect_true: true
318+
mode: [mock]
319+
320+
- name: "Temperature readable after power down"
321+
action: script
322+
script: |
323+
dev.power_down()
324+
t = dev.temperature_c()
325+
result = isinstance(t, float)
326+
expect_true: true
327+
mode: [mock]
328+
329+
- name: "Auto-trigger restores ODR after power down"
330+
action: script
331+
script: |
332+
dev.power_down()
333+
dev.acceleration_raw()
334+
ctrl1 = i2c.readfrom_mem(dev.address, 0x10, 1)[0]
335+
ctrl2 = i2c.readfrom_mem(dev.address, 0x11, 1)[0]
336+
result = (ctrl1 & 0xF0) != 0 and (ctrl2 & 0xF0) != 0
337+
expect_true: true
338+
mode: [mock]
339+
300340
# ----- Hardware manual -----
301341

302342
- name: "Sensor readings feel correct"

0 commit comments

Comments
 (0)