GuyCarver-MicroPython/lib/apds2.py

117 wiersze
3.2 KiB
Python

import pyb
class apds:
_ADDRESS = const(0x39)
# Register addresses
REG_ENABLE = 0x80
REG_ATIME = 0x81
REG_WTIME = 0x83
REG_AILTL = 0x84
REG_AILTH = 0x85
REG_AIHTL = 0x86
REG_AIHTH = 0x87
REG_PILT = 0x89
REG_PIHT = 0x8B
REG_PERS = 0x8C
REG_CONFIG1 = 0x8D
REG_PPULSE = 0x8E
REG_CONTROL = 0x8F
REG_CONFIG2 = 0x90
REG_ID = 0x92
REG_STATUS = 0x93
REG_CDATAL = 0x94
REG_CDATAH = 0x95
REG_RDATAL = 0x96
REG_RDATAH = 0x97
REG_GDATAL = 0x98
REG_GDATAH = 0x99
REG_BDATAL = 0x9A
REG_BDATAH = 0x9B
REG_PDATA = 0x9C
REG_POFFSET_UR = 0x9D
REG_POFFSET_DL = 0x9E
REG_CONFIG3 = 0x9F
REG_GPENTH = 0xA0
REG_GEXTH = 0xA1
REG_GCONF1 = 0xA2
REG_GCONF2 = 0xA3
REG_GOFFSET_U = 0xA4
REG_GOFFSET_D = 0xA5
REG_GOFFSET_L = 0xA7
REG_GOFFSET_R = 0xA9
REG_GPULSE = 0xA6
REG_GCONF3 = 0xAA
REG_GCONF4 = 0xAB
REG_GFLVL = 0xAE
REG_GSTATUS = 0xAF
REG_IFORCE = 0xE4
REG_PICLEAR = 0xE5
REG_CICLEAR = 0xE6
REG_AICLEAR = 0xE7
REG_GFIFO_U = 0xFC
REG_GFIFO_D = 0xFD
REG_GFIFO_L = 0xFE
REG_GFIFO_R = 0xFF
# Enable register bits
ENABLE_GEN = 0b01000000 # Gesture enable
ENABLE_PIEN = 0b00100000 # Proximity Interrupt Enable
ENABLE_AIEN = 0b00010000 # ALS Interrupt Enable
ENABLE_WEN = 0b00001000 # Wait Enable
ENABLE_PEN = 0b00000100 # Proximity Enable
ENABLE_AEN = 0b00000010 # ALS Enable
ENABLE_PON = 0b00000001 # Power ON
# Congiguration register 2
CONFIG2_LEDBOOST_150 = (1 << 4) # LED boost 150%
CONFIG2_LEDBOOST_200 = (2 << 4) # LED boost 200%
CONFIG2_LEDBOOST_300 = (3 << 4) # LED boost 300%
GCONFIG3_GDIMS_LR = 2
GCONFIG3_GDIMS_UD = 1 # 01
GCONFIG4_GMODE = 1 # Gesture mode
def __init__( self, aLoc ) :
self.i2c = pyb.I2C(aLoc, pyb.I2C.MASTER)
self._b1 = bytearray(1)
self.init()
def read( self, aLoc ) :
"""Read 8 bit value and return."""
self.i2c.mem_read(self._b1, _ADDRESS, aLoc)
# print('Read {:02x} from {:02x}.'.format(self._b1[0], aLoc))
return self._b1[0]
def write( self, aLoc, aVal ) :
"""Write 8 bit value to given address. aVal may be an int buffer."""
self.i2c.mem_write(aVal, _ADDRESS, aLoc)
# print('write {:02x} to {:02x}.'.format(aVal, aLoc))
def init( self ) :
if self.get_device_id() != 0xAB :
return False
self.write(self.REG_ENABLE, self.ENABLE_PON | self.ENABLE_PEN | self.ENABLE_GEN)
self.write(self.REG_CONFIG2, self.CONFIG2_LEDBOOST_300)
self.write(self.REG_GPENTH, 10)
self.write(self.REG_GEXTH, 5)
self.write(self.REG_GOFFSET_U, 0) #70)
self.write(self.REG_GOFFSET_D, 0)
self.write(self.REG_GOFFSET_L, 0) #10)
self.write(self.REG_GOFFSET_R, 0) #34)
self.write(self.REG_GCONF3, self.GCONFIG3_GDIMS_UD | self.GCONFIG3_GDIMS_LR)
self.write(self.REG_GCONF4, self.GCONFIG4_GMODE)
def get_device_id( self ) :
return self.read(self.REG_ID)
def readgesture( self ) :
level = self.read(self.REG_GFLVL)
if level == 0 :
return # no data
fifo_u = self.read(self.REG_GFIFO_U)
fifo_d = self.read(self.REG_GFIFO_D)
fifo_l = self.read(self.REG_GFIFO_L)
fifo_r = self.read(self.REG_GFIFO_R)
return (fifo_u, fifo_d, fifo_l, fifo_r)