From e26e3578ec79ea173118f6227270c6e5a2591a5e Mon Sep 17 00:00:00 2001 From: raceking37 Date: Wed, 15 Jun 2022 13:50:02 +0200 Subject: [PATCH 1/2] Added more bit fields, removed a couple of semicolons in device.py, added isLightAvailable() method to device.py and used in the test_ambient.py example. --- apds9960/const.py | 7 +++ apds9960/device.py | 111 ++++++++++++++++++++++++-------------------- rpi/test_ambient.py | 15 +++--- 3 files changed, 75 insertions(+), 58 deletions(-) diff --git a/apds9960/const.py b/apds9960/const.py index 6bae54c..b389197 100644 --- a/apds9960/const.py +++ b/apds9960/const.py @@ -72,6 +72,13 @@ APDS9960_BIT_PIEN = 0b00100000 APDS9960_BIT_GEN = 0b01000000 APDS9960_BIT_GVALID = 0b00000001 +APDS9960_BIT_AVALID = 0b00000001 +APDS9960_BIT_PVALID = 0b00000010 +APDS9960_BIT_GINT = 0b00000100 +APDS9960_BIT_AINT = 0b00010000 +APDS9960_BIT_PINT = 0b00100000 +APDS9960_BIT_PGSAT = 0b01000000 +APDS9960_BIT_CPSAT = 0b10000000 # APDS9960 modes APDS9960_MODE_POWER = 0 diff --git a/apds9960/device.py b/apds9960/device.py index 4128238..ca93d8c 100644 --- a/apds9960/device.py +++ b/apds9960/device.py @@ -23,23 +23,23 @@ def __init__(self, bus, address=APDS9960_I2C_ADDR, valid_id=APDS9960_DEV_ID): # instance variables for gesture detection self.gesture_ud_delta_ = 0 self.gesture_lr_delta_ = 0 - + self.gesture_ud_count_ = 0 self.gesture_lr_count_ = 0 - + self.gesture_near_count_ = 0 self.gesture_far_count_ = 0 - + self.gesture_state_ = 0 self.gesture_motion_ = APDS9960_DIR_NONE self.gesture_data_ = APDS9960.GestureData() - + # check device id self.dev_id = self._read_byte_data(APDS9960_REG_ID) if not self.dev_id in valid_id: raise ADPS9960InvalidDevId(self.dev_id, valid_id) - + # disable all features self.setMode(APDS9960_MODE_ALL, False) @@ -57,11 +57,11 @@ def __init__(self, bus, address=APDS9960_I2C_ADDR, valid_id=APDS9960_DEV_ID): self.setProxIntHighThresh(APDS9960_DEFAULT_PIHT) self.setLightIntLowThreshold(APDS9960_DEFAULT_AILT) self.setLightIntHighThreshold(APDS9960_DEFAULT_AIHT) - + self._write_byte_data(APDS9960_REG_PERS, APDS9960_DEFAULT_PERS) self._write_byte_data(APDS9960_REG_CONFIG2, APDS9960_DEFAULT_CONFIG2) self._write_byte_data(APDS9960_REG_CONFIG3, APDS9960_DEFAULT_CONFIG3) - + # set default values for gesture sense registers self.setGestureEnterThresh(APDS9960_DEFAULT_GPENTH) self.setGestureExitThresh(APDS9960_DEFAULT_GEXTH) @@ -81,14 +81,14 @@ def __init__(self, bus, address=APDS9960_I2C_ADDR, valid_id=APDS9960_DEV_ID): def getMode(self): return self._read_byte_data(APDS9960_REG_ENABLE) - + def setMode(self, mode, enable=True): # read ENABLE register reg_val = self.getMode() - + if mode < 0 or mode > APDS9960_MODE_ALL: raise ADPS9960InvalidMode(mode) - + # change bit(s) in ENABLE register */ if mode == APDS9960_MODE_ALL: if enable: @@ -97,10 +97,10 @@ def setMode(self, mode, enable=True): reg_val = 0x00 else: if enable: - reg_val |= (1 << mode); + reg_val |= (1 << mode) else: - reg_val &= ~(1 << mode); - + reg_val &= ~(1 << mode) + # write value to ENABLE register self._write_byte_data(APDS9960_REG_ENABLE, reg_val) @@ -156,10 +156,10 @@ def disableGestureSensor(self): # check if there is a gesture available def isGestureAvailable(self): val = self._read_byte_data(APDS9960_REG_GSTATUS) - + # shift and mask out GVALID bit - val &= APDS9960_BIT_GVALID; - + val &= APDS9960_BIT_GVALID + return (val == APDS9960_BIT_GVALID) @@ -168,11 +168,11 @@ def readGesture(self): fifo_level = 0 bytes_read = 0 fifo_data = [] - + # make sure that power and gesture is on and data is valid if not (self.getMode() & 0b01000001) or not self.isGestureAvailable(): return APDS9960_DIR_NONE - + # keep looping as long as gesture data is valid while(self.isGestureAvailable()): # read the current FIFO level @@ -231,11 +231,20 @@ def disablePower(self): # ambient light and color sensor controls # ******************************************************************************* + # check if there is new light data available + def isLightAvailable(self): + val = self._read_byte_data(APDS9960_REG_STATUS) + + # shift and mask out AVALID bit + val &= APDS9960_BIT_AVALID + + return (val == APDS9960_BIT_AVALID) + # reads the ambient (clear) light level as a 16-bit value def readAmbientLight(self): # read value from clear channel, low byte register l = self._read_byte_data(APDS9960_REG_CDATAL) - + # read value from clear channel, high byte register h = self._read_byte_data(APDS9960_REG_CDATAH) @@ -245,7 +254,7 @@ def readAmbientLight(self): def readRedLight(self): # read value from red channel, low byte register l = self._read_byte_data(APDS9960_REG_RDATAL) - + # read value from red channel, high byte register h = self._read_byte_data(APDS9960_REG_RDATAH) @@ -255,7 +264,7 @@ def readRedLight(self): def readGreenLight(self): # read value from green channel, low byte register l = self._read_byte_data(APDS9960_REG_GDATAL) - + # read value from green channel, high byte register h = self._read_byte_data(APDS9960_REG_GDATAH) @@ -265,7 +274,7 @@ def readGreenLight(self): def readBlueLight(self): # read value from blue channel, low byte register l = self._read_byte_data(APDS9960_REG_BDATAL) - + # read value from blue channel, high byte register h = self._read_byte_data(APDS9960_REG_BDATAH) @@ -427,7 +436,7 @@ def decodeGesture(self): if self.gesture_state_ == APDS9960_STATE_FAR: self.gesture_motion_ = APDS9960_DIR_FAR return True - + # determine swipe direction if self.gesture_ud_count_ == -1 and self.gesture_lr_count_ == 0: self.gesture_motion_ = APDS9960_DIR_UP @@ -459,7 +468,7 @@ def decodeGesture(self): self.gesture_motion_ = APDS9960_DIR_RIGHT else: return False - + return True @@ -502,7 +511,7 @@ def getLEDDrive(self): int: the value of the LED drive strength """ val = self._read_byte_data(APDS9960_REG_CONTROL) - + # shift and mask out LED drive bits return (val >> 6) & 0b00000011 @@ -519,13 +528,13 @@ def setLEDDrive(self, drive): drive (int): value for the LED drive strength """ val = self._read_byte_data(APDS9960_REG_CONTROL) - + # set bits in register to given value drive &= 0b00000011 drive = drive << 6 val &= 0b00111111 val |= drive - + self._write_byte_data(APDS9960_REG_CONTROL, val) @@ -565,7 +574,7 @@ def setProximityGain(self, drive): drive = drive << 2 val &= 0b11110011 val |= drive - + self._write_byte_data(APDS9960_REG_CONTROL, val) @@ -582,7 +591,7 @@ def getAmbientLightGain(self): int: the value of the ALS gain """ val = self._read_byte_data(APDS9960_REG_CONTROL) - + # shift and mask out ADRIVE bits return (val & 0b00000011) @@ -599,12 +608,12 @@ def setAmbientLightGain(self, drive): drive (int): value for the ALS gain """ val = self._read_byte_data(APDS9960_REG_CONTROL) - + # set bits in register to given value drive &= 0b00000011 val &= 0b11111100 val |= drive - + self._write_byte_data(APDS9960_REG_CONTROL, val) @@ -621,7 +630,7 @@ def getLEDBoost(self): int: the LED boost value """ val = self._read_byte_data(APDS9960_REG_CONFIG2) - + # shift and mask out LED_BOOST bits return (val >> 4) & 0b00000011 @@ -638,13 +647,13 @@ def setLEDBoost(self, boost): boost (int): value for the LED boost """ val = self._read_byte_data(APDS9960_REG_CONFIG2) - + # set bits in register to given value boost &= 0b00000011 boost = boost << 4 val &= 0b11001111 val |= boost - + self._write_byte_data(APDS9960_REG_CONFIG2, val) @@ -655,7 +664,7 @@ def getProxGainCompEnable(self): bool: True if compensation is enabled, False if not """ val = self._read_byte_data(APDS9960_REG_CONFIG3) - + # Shift and mask out PCMP bits val = (val >> 5) & 0b00000001 return val == 1 @@ -667,12 +676,12 @@ def setProxGainCompEnable(self, enable): enable (bool): True to enable compensation, False to disable """ val = self._read_byte_data(APDS9960_REG_CONFIG3) - + # set bits in register to given value val &= 0b11011111 if enable: val |= 0b00100000 - + self._write_byte_data(APDS9960_REG_CONFIG3, val) @@ -691,7 +700,7 @@ def getProxPhotoMask(self): int: Current proximity mask for photodiodes. """ val = self._read_byte_data(APDS9960_REG_CONFIG3) - + # mask out photodiode enable mask bits return val & 0b00001111 @@ -710,12 +719,12 @@ def setProxPhotoMask(self, mask): mask (int): 4-bit mask value """ val = self._read_byte_data(APDS9960_REG_CONFIG3) - + # set bits in register to given value mask &= 0b00001111 val &= 0b11110000 val |= mask - + self._write_byte_data(APDS9960_REG_CONFIG3, val) @@ -789,7 +798,7 @@ def setGestureGain(self, gain): gain = gain << 5 val &= 0b10011111 val |= gain - + self._write_byte_data(APDS9960_REG_GCONF2, val) @@ -806,7 +815,7 @@ def getGestureLEDDrive(self): int: the LED drive current value """ val = self._read_byte_data(APDS9960_REG_GCONF2) - + # shift and mask out LED drive bits return (val >> 3) & 0b00000011 @@ -823,13 +832,13 @@ def setGestureLEDDrive(self, drive): drive (int): value for the LED drive current """ val = self._read_byte_data(APDS9960_REG_GCONF2) - + # set bits in register to given value - drive &= 0b00000011; - drive = drive << 3; - val &= 0b11100111; - val |= drive; - + drive &= 0b00000011 + drive = drive << 3 + val &= 0b11100111 + val |= drive + self._write_byte_data(APDS9960_REG_GCONF2, val) @@ -850,7 +859,7 @@ def getGestureWaitTime(self): int: the current wait time between gestures """ val = self._read_byte_data(APDS9960_REG_GCONF2) - + # shift and mask out LED drive bits return val & 0b00000111 @@ -970,7 +979,7 @@ def setAmbientLightIntEnable(self, enable): val = self._read_byte_data(APDS9960_REG_ENABLE) # set bits in register to given value - val &= 0b11101111; + val &= 0b11101111 if enable: val |= 0b00010000 @@ -995,7 +1004,7 @@ def setProximityIntEnable(self, enable): val = self._read_byte_data(APDS9960_REG_ENABLE) # set bits in register to given value - val &= 0b11011111; + val &= 0b11011111 if enable: val |= 0b00100000 diff --git a/rpi/test_ambient.py b/rpi/test_ambient.py index a1e4c8a..62379e7 100644 --- a/rpi/test_ambient.py +++ b/rpi/test_ambient.py @@ -24,13 +24,14 @@ def intH(channel): oval = -1 while True: sleep(0.25) - val = apds.readAmbientLight() - r = apds.readRedLight() - g = apds.readGreenLight() - b = apds.readBlueLight() - if val != oval: - print("AmbientLight={} (R: {}, G: {}, B: {})".format(val, r, g, b)) - oval = val + if apds.isLightAvailable(): + val = apds.readAmbientLight() + r = apds.readRedLight() + g = apds.readGreenLight() + b = apds.readBlueLight() + if val != oval: + print("AmbientLight={} (R: {}, G: {}, B: {})".format(val, r, g, b)) + oval = val finally: GPIO.cleanup() From 0bedcb3b76e42e51051fdecaf25b1a0586c1028e Mon Sep 17 00:00:00 2001 From: raceking37 Date: Sun, 31 Jul 2022 22:25:41 +0200 Subject: [PATCH 2/2] Cleanup whitespaces --- apds9960/device.py | 90 +++++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/apds9960/device.py b/apds9960/device.py index ca93d8c..8b3c7df 100644 --- a/apds9960/device.py +++ b/apds9960/device.py @@ -23,23 +23,23 @@ def __init__(self, bus, address=APDS9960_I2C_ADDR, valid_id=APDS9960_DEV_ID): # instance variables for gesture detection self.gesture_ud_delta_ = 0 self.gesture_lr_delta_ = 0 - + self.gesture_ud_count_ = 0 self.gesture_lr_count_ = 0 - + self.gesture_near_count_ = 0 self.gesture_far_count_ = 0 - + self.gesture_state_ = 0 self.gesture_motion_ = APDS9960_DIR_NONE self.gesture_data_ = APDS9960.GestureData() - + # check device id self.dev_id = self._read_byte_data(APDS9960_REG_ID) if not self.dev_id in valid_id: raise ADPS9960InvalidDevId(self.dev_id, valid_id) - + # disable all features self.setMode(APDS9960_MODE_ALL, False) @@ -57,11 +57,11 @@ def __init__(self, bus, address=APDS9960_I2C_ADDR, valid_id=APDS9960_DEV_ID): self.setProxIntHighThresh(APDS9960_DEFAULT_PIHT) self.setLightIntLowThreshold(APDS9960_DEFAULT_AILT) self.setLightIntHighThreshold(APDS9960_DEFAULT_AIHT) - + self._write_byte_data(APDS9960_REG_PERS, APDS9960_DEFAULT_PERS) self._write_byte_data(APDS9960_REG_CONFIG2, APDS9960_DEFAULT_CONFIG2) self._write_byte_data(APDS9960_REG_CONFIG3, APDS9960_DEFAULT_CONFIG3) - + # set default values for gesture sense registers self.setGestureEnterThresh(APDS9960_DEFAULT_GPENTH) self.setGestureExitThresh(APDS9960_DEFAULT_GEXTH) @@ -81,14 +81,14 @@ def __init__(self, bus, address=APDS9960_I2C_ADDR, valid_id=APDS9960_DEV_ID): def getMode(self): return self._read_byte_data(APDS9960_REG_ENABLE) - + def setMode(self, mode, enable=True): # read ENABLE register reg_val = self.getMode() - + if mode < 0 or mode > APDS9960_MODE_ALL: raise ADPS9960InvalidMode(mode) - + # change bit(s) in ENABLE register */ if mode == APDS9960_MODE_ALL: if enable: @@ -100,7 +100,7 @@ def setMode(self, mode, enable=True): reg_val |= (1 << mode) else: reg_val &= ~(1 << mode) - + # write value to ENABLE register self._write_byte_data(APDS9960_REG_ENABLE, reg_val) @@ -156,10 +156,10 @@ def disableGestureSensor(self): # check if there is a gesture available def isGestureAvailable(self): val = self._read_byte_data(APDS9960_REG_GSTATUS) - + # shift and mask out GVALID bit val &= APDS9960_BIT_GVALID - + return (val == APDS9960_BIT_GVALID) @@ -168,11 +168,11 @@ def readGesture(self): fifo_level = 0 bytes_read = 0 fifo_data = [] - + # make sure that power and gesture is on and data is valid if not (self.getMode() & 0b01000001) or not self.isGestureAvailable(): return APDS9960_DIR_NONE - + # keep looping as long as gesture data is valid while(self.isGestureAvailable()): # read the current FIFO level @@ -234,17 +234,17 @@ def disablePower(self): # check if there is new light data available def isLightAvailable(self): val = self._read_byte_data(APDS9960_REG_STATUS) - + # shift and mask out AVALID bit val &= APDS9960_BIT_AVALID - + return (val == APDS9960_BIT_AVALID) # reads the ambient (clear) light level as a 16-bit value def readAmbientLight(self): # read value from clear channel, low byte register l = self._read_byte_data(APDS9960_REG_CDATAL) - + # read value from clear channel, high byte register h = self._read_byte_data(APDS9960_REG_CDATAH) @@ -254,7 +254,7 @@ def readAmbientLight(self): def readRedLight(self): # read value from red channel, low byte register l = self._read_byte_data(APDS9960_REG_RDATAL) - + # read value from red channel, high byte register h = self._read_byte_data(APDS9960_REG_RDATAH) @@ -264,7 +264,7 @@ def readRedLight(self): def readGreenLight(self): # read value from green channel, low byte register l = self._read_byte_data(APDS9960_REG_GDATAL) - + # read value from green channel, high byte register h = self._read_byte_data(APDS9960_REG_GDATAH) @@ -274,7 +274,7 @@ def readGreenLight(self): def readBlueLight(self): # read value from blue channel, low byte register l = self._read_byte_data(APDS9960_REG_BDATAL) - + # read value from blue channel, high byte register h = self._read_byte_data(APDS9960_REG_BDATAH) @@ -436,7 +436,7 @@ def decodeGesture(self): if self.gesture_state_ == APDS9960_STATE_FAR: self.gesture_motion_ = APDS9960_DIR_FAR return True - + # determine swipe direction if self.gesture_ud_count_ == -1 and self.gesture_lr_count_ == 0: self.gesture_motion_ = APDS9960_DIR_UP @@ -468,7 +468,7 @@ def decodeGesture(self): self.gesture_motion_ = APDS9960_DIR_RIGHT else: return False - + return True @@ -511,7 +511,7 @@ def getLEDDrive(self): int: the value of the LED drive strength """ val = self._read_byte_data(APDS9960_REG_CONTROL) - + # shift and mask out LED drive bits return (val >> 6) & 0b00000011 @@ -528,13 +528,13 @@ def setLEDDrive(self, drive): drive (int): value for the LED drive strength """ val = self._read_byte_data(APDS9960_REG_CONTROL) - + # set bits in register to given value drive &= 0b00000011 drive = drive << 6 val &= 0b00111111 val |= drive - + self._write_byte_data(APDS9960_REG_CONTROL, val) @@ -574,7 +574,7 @@ def setProximityGain(self, drive): drive = drive << 2 val &= 0b11110011 val |= drive - + self._write_byte_data(APDS9960_REG_CONTROL, val) @@ -591,7 +591,7 @@ def getAmbientLightGain(self): int: the value of the ALS gain """ val = self._read_byte_data(APDS9960_REG_CONTROL) - + # shift and mask out ADRIVE bits return (val & 0b00000011) @@ -608,12 +608,12 @@ def setAmbientLightGain(self, drive): drive (int): value for the ALS gain """ val = self._read_byte_data(APDS9960_REG_CONTROL) - + # set bits in register to given value drive &= 0b00000011 val &= 0b11111100 val |= drive - + self._write_byte_data(APDS9960_REG_CONTROL, val) @@ -630,7 +630,7 @@ def getLEDBoost(self): int: the LED boost value """ val = self._read_byte_data(APDS9960_REG_CONFIG2) - + # shift and mask out LED_BOOST bits return (val >> 4) & 0b00000011 @@ -647,13 +647,13 @@ def setLEDBoost(self, boost): boost (int): value for the LED boost """ val = self._read_byte_data(APDS9960_REG_CONFIG2) - + # set bits in register to given value boost &= 0b00000011 boost = boost << 4 val &= 0b11001111 val |= boost - + self._write_byte_data(APDS9960_REG_CONFIG2, val) @@ -664,7 +664,7 @@ def getProxGainCompEnable(self): bool: True if compensation is enabled, False if not """ val = self._read_byte_data(APDS9960_REG_CONFIG3) - + # Shift and mask out PCMP bits val = (val >> 5) & 0b00000001 return val == 1 @@ -676,12 +676,12 @@ def setProxGainCompEnable(self, enable): enable (bool): True to enable compensation, False to disable """ val = self._read_byte_data(APDS9960_REG_CONFIG3) - + # set bits in register to given value val &= 0b11011111 if enable: val |= 0b00100000 - + self._write_byte_data(APDS9960_REG_CONFIG3, val) @@ -700,7 +700,7 @@ def getProxPhotoMask(self): int: Current proximity mask for photodiodes. """ val = self._read_byte_data(APDS9960_REG_CONFIG3) - + # mask out photodiode enable mask bits return val & 0b00001111 @@ -719,12 +719,12 @@ def setProxPhotoMask(self, mask): mask (int): 4-bit mask value """ val = self._read_byte_data(APDS9960_REG_CONFIG3) - + # set bits in register to given value mask &= 0b00001111 val &= 0b11110000 val |= mask - + self._write_byte_data(APDS9960_REG_CONFIG3, val) @@ -798,7 +798,7 @@ def setGestureGain(self, gain): gain = gain << 5 val &= 0b10011111 val |= gain - + self._write_byte_data(APDS9960_REG_GCONF2, val) @@ -815,7 +815,7 @@ def getGestureLEDDrive(self): int: the LED drive current value """ val = self._read_byte_data(APDS9960_REG_GCONF2) - + # shift and mask out LED drive bits return (val >> 3) & 0b00000011 @@ -832,13 +832,13 @@ def setGestureLEDDrive(self, drive): drive (int): value for the LED drive current """ val = self._read_byte_data(APDS9960_REG_GCONF2) - + # set bits in register to given value drive &= 0b00000011 drive = drive << 3 val &= 0b11100111 val |= drive - + self._write_byte_data(APDS9960_REG_GCONF2, val) @@ -859,7 +859,7 @@ def getGestureWaitTime(self): int: the current wait time between gestures """ val = self._read_byte_data(APDS9960_REG_GCONF2) - + # shift and mask out LED drive bits return val & 0b00000111 @@ -1070,7 +1070,7 @@ def setGestureMode(self, enable): if enable: val |= 0b00000001 - self._write_byte_data(APDS9960_REG_GCONF4, val) + self._write_byte_data(APDS9960_REG_GCONF4, val) # *******************************************************************************