Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
29 changes: 29 additions & 0 deletions lib/apds9960/apds9960/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,33 @@ def isLightAvailable(self):

return val == APDS9960_BIT_AVALID

def isProximityAvailable(self):
val = self._read_reg(APDS9960_REG_STATUS)
return (val & APDS9960_BIT_PVALID) == APDS9960_BIT_PVALID

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

def _ensure_proximity_enabled(self):
enable = self.getMode()
if not (enable & (1 << APDS9960_MODE_PROXIMITY)) or not (enable & APDS9960_BIT_PON):
self.enableProximitySensor(interrupts=False)
for _ in range(50):
if self.isProximityAvailable():
return
sleep_ms(10)
raise OSError("APDS9960 proximity data ready timeout")

# 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 +267,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 +278,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 +289,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 +304,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
60 changes: 60 additions & 0 deletions tests/scenarios/apds9960.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,66 @@ tests:
expect: 128
mode: [mock]

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

- name: "Auto-enable writes ENABLE register for light"
action: script
script: |
dev.disableLightSensor()
i2c.clear_write_log()
dev.readAmbientLight()
log = i2c.get_write_log()
wrote_enable = any(reg == 0x80 for reg, data in log)
enable_val = dev.getMode()
has_pon = bool(enable_val & 0x01)
has_aen = bool(enable_val & 0x02)
result = wrote_enable and has_pon and has_aen
expect_true: true
mode: [mock]

- name: "Auto-enable writes ENABLE register for proximity"
action: script
script: |
dev.disableProximitySensor()
i2c.clear_write_log()
dev.readProximity()
log = i2c.get_write_log()
wrote_enable = any(reg == 0x80 for reg, data in log)
enable_val = dev.getMode()
has_pon = bool(enable_val & 0x01)
has_pen = bool(enable_val & 0x04)
result = wrote_enable and has_pon and has_pen
expect_true: true
mode: [mock]

- name: "Auto-enable restores power for light read"
action: script
script: |
dev.disablePower()
i2c.clear_write_log()
dev.readRedLight()
log = i2c.get_write_log()
wrote_enable = any(reg == 0x80 for reg, data in log)
enable_val = dev.getMode()
has_pon = bool(enable_val & 0x01)
has_aen = bool(enable_val & 0x02)
result = wrote_enable and has_pon and has_aen
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