diff --git a/lib/apds9960/apds9960/device.py b/lib/apds9960/apds9960/device.py index e83efe82..6ace6bd8 100644 --- a/lib/apds9960/apds9960/device.py +++ b/lib/apds9960/apds9960/device.py @@ -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) + 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) @@ -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) @@ -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) @@ -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) @@ -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) # ******************************************************************************* diff --git a/tests/scenarios/apds9960.yaml b/tests/scenarios/apds9960.yaml index b19db006..b22bc617 100644 --- a/tests/scenarios/apds9960.yaml +++ b/tests/scenarios/apds9960.yaml @@ -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