Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions lib/apds9960/apds9960/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,24 @@ def isLightAvailable(self):

return val == APDS9960_BIT_AVALID

def _ensure_light_enabled(self):
enable = self.getMode()
if not (enable & (1 << APDS9960_MODE_AMBIENT_LIGHT)) or not (enable & 1):
self.enableLightSensor(interrupts=False)
Comment thread
nedseb marked this conversation as resolved.
for _ in range(50):
if self.isLightAvailable():
return
sleep_ms(10)

def _ensure_proximity_enabled(self):
enable = self.getMode()
if not (enable & (1 << APDS9960_MODE_PROXIMITY)) or not (enable & 1):
self.enableProximitySensor(interrupts=False)
sleep_ms(50)
Comment thread
nedseb marked this conversation as resolved.
Outdated

# reads the ambient (clear) light level as a 16-bit value
def readAmbientLight(self):
self._ensure_light_enabled()
# read value from clear channel, low byte register
low = self._read_reg(APDS9960_REG_CDATAL)

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

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

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

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

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

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

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

# reads the proximity level as an 8-bit value
def readProximity(self):
self._ensure_proximity_enabled()
return self._read_reg(APDS9960_REG_PDATA)

# *******************************************************************************
Expand Down
42 changes: 42 additions & 0 deletions tests/scenarios/apds9960.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,48 @@ tests:
expect: 128
mode: [mock]

# ----- Auto-enable -----

- name: "Ambient light readable without explicit enable"
action: script
script: |
dev.disableLightSensor()
val = dev.readAmbientLight()
result = isinstance(val, int)
expect_true: true
mode: [mock]

- name: "Proximity readable without explicit enable"
action: script
script: |
dev.disableProximitySensor()
val = dev.readProximity()
result = isinstance(val, int)
Comment thread
nedseb marked this conversation as resolved.
Outdated
expect_true: true
mode: [mock]

- name: "Red light readable after power off"
action: script
script: |
dev.disablePower()
val = dev.readRedLight()
result = isinstance(val, int)
Comment thread
nedseb marked this conversation as resolved.
Outdated
Comment thread
nedseb marked this conversation as resolved.
Outdated
expect_true: true
mode: [mock]

- name: "No re-enable when already active"
action: script
script: |
dev.enableLightSensor(False)
i2c.clear_write_log()
dev.readAmbientLight()
log = i2c.get_write_log()
result = len(log) == 0
expect_true: true
mode: [mock]

# ----- Hardware -----

- name: "Ambient light in plausible range"
action: call
method: readAmbientLight
Expand Down
Loading