Skip to content

Commit 0f966c8

Browse files
committed
Split BMP180 and VCNL4000 into component sensors.
1 parent 6fa9300 commit 0f966c8

File tree

4 files changed

+77
-22
lines changed

4 files changed

+77
-22
lines changed

myDevices/devices/i2c.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@
4545
SLAVES = [None for i in range(128)]
4646

4747
class I2C(Bus):
48-
def __init__(self, slave):
48+
def __init__(self, slave, allow_duplicates=False):
4949
global SLAVES
5050

51-
if SLAVES[slave] != None:
51+
if SLAVES[slave] != None and not allow_duplicates:
5252
raise Exception("SLAVE_ADDRESS_USED")
5353

5454
self.channel = 0
@@ -63,7 +63,12 @@ def __init__(self, slave):
6363
if fcntl.ioctl(self.fd, I2C_SLAVE, self.slave):
6464
raise Exception("Error binding I2C slave 0x%02X" % self.slave)
6565

66-
SLAVES[self.slave] = self
66+
# Since we now allow duplicates, e.g. BMP180_TEMPERATURE & BMP180_PRESSURE, we might need to
67+
# change the SLAVES list to store a reference count or base class name as a way of making sure
68+
# only the same base sensor type is duplicated. That doesn't seem to be an issue currently though
69+
# so for now we just ignore the SLAVES check.
70+
if not allow_duplicates:
71+
SLAVES[self.slave] = self
6772

6873
def __str__(self):
6974
return "I2C(slave=0x%02X)" % self.slave

myDevices/devices/sensor/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,10 @@ def getHumidityPercent(self):
187187
return self.__getHumidity__() * 100
188188

189189
DRIVERS = {}
190-
DRIVERS["bmp085"] = ["BMP085", "BMP180"]
190+
DRIVERS["bmp085"] = ["BMP085", "BMP180", "BMP180_TEMPERATURE", "BMP180_PRESSURE"]
191191
DRIVERS["onewiretemp"] = ["DS1822", "DS1825", "DS18B20", "DS18S20", "DS28EA00"]
192192
DRIVERS["tmpXXX"] = ["TMP36", "TMP75", "TMP102", "TMP275"]
193193
DRIVERS["tslXXXX"] = ["TSL2561", "TSL2561CS", "TSL2561T", "TSL4531", "TSL45311", "TSL45313", "TSL45315", "TSL45317"]
194-
DRIVERS["vcnl4000"] = ["VCNL4000"]
194+
DRIVERS["vcnl4000"] = ["VCNL4000", "VCNL4000_LUMINOSITY", "VCNL4000_DISTANCE"]
195195
DRIVERS["hytXXX"] = ["HYT221"]
196196

myDevices/devices/sensor/bmp085.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818
from myDevices.devices.sensor import Temperature, Pressure
1919

2020
class BMP085(I2C, Temperature, Pressure):
21-
def __init__(self, altitude=0, external=None):
22-
I2C.__init__(self, 0x77)
23-
Pressure.__init__(self, altitude, external)
21+
def __init__(self, altitude=0, external=None, temperature=True, pressure=True):
22+
self.temperature = temperature
23+
self.pressure = pressure
24+
I2C.__init__(self, 0x77, True)
25+
if self.pressure:
26+
Pressure.__init__(self, altitude, external)
2427

2528
self.ac1 = self.readSignedInteger(0xAA)
2629
self.ac2 = self.readSignedInteger(0xAC)
@@ -38,7 +41,12 @@ def __str__(self):
3841
return "BMP085"
3942

4043
def __family__(self):
41-
return [Temperature.__family__(self), Pressure.__family__(self)]
44+
family = []
45+
if self.temperature:
46+
family.append(Temperature.__family__(self))
47+
if self.pressure:
48+
family.append(Pressure.__family__(self))
49+
return family
4250

4351
def readUnsignedInteger(self, address):
4452
d = self.readRegisters(address, 2)
@@ -100,9 +108,22 @@ def __getPascal__(self):
100108
return int(p)
101109

102110
class BMP180(BMP085):
103-
def __init__(self, altitude=0, external=None):
104-
BMP085.__init__(self, altitude, external)
111+
def __init__(self, altitude=0, external=None, temperature=True, pressure=True):
112+
BMP085.__init__(self, altitude, external, temperature, pressure)
105113

106114
def __str__(self):
107115
return "BMP180"
108116

117+
class BMP180_TEMPERATURE(BMP180):
118+
def __init__(self, altitude=0, external=None):
119+
BMP180.__init__(self, altitude, external, temperature=True, pressure=False)
120+
121+
def __str__(self):
122+
return "BMP180_TEMPERATURE"
123+
124+
class BMP180_PRESSURE(BMP180):
125+
def __init__(self, altitude=0, external=None):
126+
BMP180.__init__(self, altitude, external, temperature=False, pressure=True)
127+
128+
def __str__(self):
129+
return "BMP180_PRESSURE"

myDevices/devices/sensor/vcnl4000.py

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from myDevices.devices.i2c import I2C
2424
from myDevices.devices.sensor import Luminosity, Distance
2525
from myDevices.utils.types import toint
26-
from myDevices.utils.logger import debug
26+
from myDevices.utils.logger import debug
2727

2828
class VCNL4000(I2C, Luminosity, Distance):
2929
REG_COMMAND = 0x80
@@ -52,8 +52,10 @@ class VCNL4000(I2C, Luminosity, Distance):
5252
MASK_PROX_READY = 0b00100000
5353
MASK_AMB_READY = 0b01000000
5454

55-
def __init__(self, slave=0b0010011, current=20, frequency=781, prox_threshold=15, prox_cycles=10, cal_cycles= 5):
56-
I2C.__init__(self, toint(slave))
55+
def __init__(self, slave=0b0010011, current=20, frequency=781, prox_threshold=15, prox_cycles=10, cal_cycles=5, luminosity=True, distance=True):
56+
self.luminosity = luminosity
57+
self.distance = distance
58+
I2C.__init__(self, toint(slave), True)
5759
self.setCurrent(toint(current))
5860
self.setFrequency(toint(frequency))
5961
self.prox_threshold = toint(prox_threshold)
@@ -68,7 +70,12 @@ def __str__(self):
6870
return "VCNL4000(slave=0x%02X)" % self.slave
6971

7072
def __family__(self):
71-
return [Luminosity.__family__(self), Distance.__family__(self)]
73+
family = []
74+
if self.luminosity:
75+
family.append(Luminosity.__family__(self))
76+
if self.distance:
77+
family.append(Distance.__family__(self))
78+
return family
7279

7380
def __setProximityTiming__(self):
7481
self.writeRegister(self.REG_PROX_ADJUST, self.VAL_MOD_TIMING_DEF)
@@ -85,12 +92,10 @@ def calibrate(self):
8592
self.offset = self.__measureOffset__()
8693
debug ("VCNL4000: offset = %d" % (self.offset))
8794
return self.offset
88-
8995

9096
def setCurrent(self, current):
9197
self.current = current
9298
self.__setCurrent__()
93-
9499

95100
def getCurrent(self):
96101
return self.__getCurrent__()
@@ -141,9 +146,20 @@ def __getCurrent__(self):
141146
return bits_current * 10
142147

143148
def __getLux__(self):
144-
self.writeRegister(self.REG_COMMAND, self.VAL_START_AMB)
145-
while not (self.readRegister(self.REG_COMMAND) & self.MASK_AMB_READY):
146-
time.sleep(0.001)
149+
count = 0
150+
while count < 5:
151+
# This try catch loop is a hacky fix for issues when making an initial ambient light reading
152+
# using a VCNL4010 sensor. It should be removed when true VCNL4010 support is added.
153+
try:
154+
self.writeRegister(self.REG_COMMAND, self.VAL_START_AMB)
155+
while not (self.readRegister(self.REG_COMMAND) & self.MASK_AMB_READY):
156+
time.sleep(0.001)
157+
count = 10
158+
except OSError as ex:
159+
count = count + 1
160+
time.sleep(0.05)
161+
if count >= 5:
162+
raise ex
147163
light_bytes = self.readRegisters(self.REG_AMB_RESULT_HIGH, 2)
148164
light_word = light_bytes[0] << 8 | light_bytes[1]
149165
return self.__calculateLux__(light_word)
@@ -206,6 +222,19 @@ def __readProximityCounts__(self):
206222
while not (self.readRegister(self.REG_COMMAND) & self.MASK_PROX_READY):
207223
time.sleep(0.001)
208224
proximity_bytes = self.readRegisters(self.REG_PROX_RESULT_HIGH, 2)
209-
debug ("VCNL4000: prox raw value = %d" % (proximity_bytes[0] << 8 | proximity_bytes[1]))
225+
debug("VCNL4000: prox raw value = %d" % (proximity_bytes[0] << 8 | proximity_bytes[1]))
210226
return (proximity_bytes[0] << 8 | proximity_bytes[1])
211-
227+
228+
class VCNL4000_LUMINOSITY(VCNL4000):
229+
def __init__(self):
230+
VCNL4000.__init__(self, luminosity=True, distance=False)
231+
232+
def __str__(self):
233+
return "VCNL4000_LUMINOSITY"
234+
235+
class VCNL4000_DISTANCE(VCNL4000):
236+
def __init__(self):
237+
VCNL4000.__init__(self, luminosity=False, distance=True)
238+
239+
def __str__(self):
240+
return "VCNL4000_DISTANCE"

0 commit comments

Comments
 (0)