Skip to content

Commit 1a5629a

Browse files
committed
apds9960: Auto-enable sensor when reading without active mode.
1 parent 1492c3e commit 1a5629a

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

lib/apds9960/apds9960/device.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,24 @@ def isLightAvailable(self):
230230

231231
return val == APDS9960_BIT_AVALID
232232

233+
def _ensure_light_enabled(self):
234+
enable = self.getMode()
235+
if not (enable & (1 << APDS9960_MODE_AMBIENT_LIGHT)) or not (enable & 1):
236+
self.enableLightSensor(interrupts=False)
237+
for _ in range(50):
238+
if self.isLightAvailable():
239+
return
240+
sleep_ms(10)
241+
242+
def _ensure_proximity_enabled(self):
243+
enable = self.getMode()
244+
if not (enable & (1 << APDS9960_MODE_PROXIMITY)) or not (enable & 1):
245+
self.enableProximitySensor(interrupts=False)
246+
sleep_ms(50)
247+
233248
# reads the ambient (clear) light level as a 16-bit value
234249
def readAmbientLight(self):
250+
self._ensure_light_enabled()
235251
# read value from clear channel, low byte register
236252
low = self._read_reg(APDS9960_REG_CDATAL)
237253

@@ -242,6 +258,7 @@ def readAmbientLight(self):
242258

243259
# reads the red light level as a 16-bit value
244260
def readRedLight(self):
261+
self._ensure_light_enabled()
245262
# read value from red channel, low byte register
246263
low = self._read_reg(APDS9960_REG_RDATAL)
247264

@@ -252,6 +269,7 @@ def readRedLight(self):
252269

253270
# reads the green light level as a 16-bit value
254271
def readGreenLight(self):
272+
self._ensure_light_enabled()
255273
# read value from green channel, low byte register
256274
low = self._read_reg(APDS9960_REG_GDATAL)
257275

@@ -262,6 +280,7 @@ def readGreenLight(self):
262280

263281
# reads the blue light level as a 16-bit value
264282
def readBlueLight(self):
283+
self._ensure_light_enabled()
265284
# read value from blue channel, low byte register
266285
low = self._read_reg(APDS9960_REG_BDATAL)
267286

@@ -276,6 +295,7 @@ def readBlueLight(self):
276295

277296
# reads the proximity level as an 8-bit value
278297
def readProximity(self):
298+
self._ensure_proximity_enabled()
279299
return self._read_reg(APDS9960_REG_PDATA)
280300

281301
# *******************************************************************************

tests/scenarios/apds9960.yaml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,48 @@ tests:
7979
expect: 128
8080
mode: [mock]
8181

82+
# ----- Auto-enable -----
83+
84+
- name: "Ambient light readable without explicit enable"
85+
action: script
86+
script: |
87+
dev.disableLightSensor()
88+
val = dev.readAmbientLight()
89+
result = isinstance(val, int)
90+
expect_true: true
91+
mode: [mock]
92+
93+
- name: "Proximity readable without explicit enable"
94+
action: script
95+
script: |
96+
dev.disableProximitySensor()
97+
val = dev.readProximity()
98+
result = isinstance(val, int)
99+
expect_true: true
100+
mode: [mock]
101+
102+
- name: "Red light readable after power off"
103+
action: script
104+
script: |
105+
dev.disablePower()
106+
val = dev.readRedLight()
107+
result = isinstance(val, int)
108+
expect_true: true
109+
mode: [mock]
110+
111+
- name: "No re-enable when already active"
112+
action: script
113+
script: |
114+
dev.enableLightSensor(False)
115+
i2c.clear_write_log()
116+
dev.readAmbientLight()
117+
log = i2c.get_write_log()
118+
result = len(log) == 0
119+
expect_true: true
120+
mode: [mock]
121+
122+
# ----- Hardware -----
123+
82124
- name: "Ambient light in plausible range"
83125
action: call
84126
method: readAmbientLight

0 commit comments

Comments
 (0)