diff --git a/README.md b/README.md
index 80da517..8f7a057 100644
--- a/README.md
+++ b/README.md
@@ -163,6 +163,9 @@ This library is intended to provide a quicker and easier way to get started usin
* `bool timeoutOccurred()`
Indicates whether a read timeout has occurred since the last call to `timeoutOccurred()`.
+* `uint8_t getWireErrorBits(void)`
+ Indicates what I²C transmission errors have occurred since the last call to VL53L0X API. Returns 0 if `last_status` was success, but returns value whose bit is set corresponding to error status written on [`Wire.endTransmission()` documentation](http://arduino.cc/en/Reference/WireEndTransmission).
+
## Version history
* 1.3.0 (2020 Sep 24): Added support for alternative I²C buses (thanks KurtE).
diff --git a/VL53L0X.cpp b/VL53L0X.cpp
index 6305f87..fc35a04 100644
--- a/VL53L0X.cpp
+++ b/VL53L0X.cpp
@@ -39,6 +39,7 @@ VL53L0X::VL53L0X()
, address(ADDRESS_DEFAULT)
, io_timeout(0) // no timeout
, did_timeout(false)
+ , wire_error(0)
{
}
@@ -289,6 +290,7 @@ void VL53L0X::writeReg(uint8_t reg, uint8_t value)
bus->write(reg);
bus->write(value);
last_status = bus->endTransmission();
+ setWireErrorBit();
}
// Write a 16-bit register
@@ -299,6 +301,7 @@ void VL53L0X::writeReg16Bit(uint8_t reg, uint16_t value)
bus->write((value >> 8) & 0xFF); // value high byte
bus->write( value & 0xFF); // value low byte
last_status = bus->endTransmission();
+ setWireErrorBit();
}
// Write a 32-bit register
@@ -311,6 +314,7 @@ void VL53L0X::writeReg32Bit(uint8_t reg, uint32_t value)
bus->write((value >> 8) & 0xFF);
bus->write( value & 0xFF); // value lowest byte
last_status = bus->endTransmission();
+ setWireErrorBit();
}
// Read an 8-bit register
@@ -321,6 +325,7 @@ uint8_t VL53L0X::readReg(uint8_t reg)
bus->beginTransmission(address);
bus->write(reg);
last_status = bus->endTransmission();
+ setWireErrorBit();
bus->requestFrom(address, (uint8_t)1);
value = bus->read();
@@ -336,6 +341,7 @@ uint16_t VL53L0X::readReg16Bit(uint8_t reg)
bus->beginTransmission(address);
bus->write(reg);
last_status = bus->endTransmission();
+ setWireErrorBit();
bus->requestFrom(address, (uint8_t)2);
value = (uint16_t)bus->read() << 8; // value high byte
@@ -352,6 +358,7 @@ uint32_t VL53L0X::readReg32Bit(uint8_t reg)
bus->beginTransmission(address);
bus->write(reg);
last_status = bus->endTransmission();
+ setWireErrorBit();
bus->requestFrom(address, (uint8_t)4);
value = (uint32_t)bus->read() << 24; // value highest byte
@@ -375,6 +382,7 @@ void VL53L0X::writeMulti(uint8_t reg, uint8_t const * src, uint8_t count)
}
last_status = bus->endTransmission();
+ setWireErrorBit();
}
// Read an arbitrary number of bytes from the sensor, starting at the given
@@ -384,6 +392,7 @@ void VL53L0X::readMulti(uint8_t reg, uint8_t * dst, uint8_t count)
bus->beginTransmission(address);
bus->write(reg);
last_status = bus->endTransmission();
+ setWireErrorBit();
bus->requestFrom(address, count);
@@ -873,6 +882,15 @@ bool VL53L0X::timeoutOccurred()
return tmp;
}
+// Did I2C transmission error occur in one of the read/write functions since
+// the last call to getWireErrorBits()?
+uint8_t VL53L0X::getWireErrorBits()
+{
+ const uint8_t tmp = wire_error;
+ wire_error = 0;
+ return tmp;
+}
+
// Private Methods /////////////////////////////////////////////////////////////
// Get reference SPAD (single photon avalanche diode) count and type
diff --git a/VL53L0X.h b/VL53L0X.h
index 0e861d6..20b0ae7 100644
--- a/VL53L0X.h
+++ b/VL53L0X.h
@@ -134,6 +134,7 @@ class VL53L0X
inline void setTimeout(uint16_t timeout) { io_timeout = timeout; }
inline uint16_t getTimeout() { return io_timeout; }
bool timeoutOccurred();
+ uint8_t getWireErrorBits(void);
private:
// TCC: Target CentreCheck
@@ -158,6 +159,7 @@ class VL53L0X
uint16_t io_timeout;
bool did_timeout;
uint16_t timeout_start_ms;
+ uint8_t wire_error;
uint8_t stop_variable; // read by init and used when starting measurement; is StopVariable field of VL53L0X_DevData_t structure in API
uint32_t measurement_timing_budget_us;
@@ -173,6 +175,12 @@ class VL53L0X
static uint16_t encodeTimeout(uint32_t timeout_mclks);
static uint32_t timeoutMclksToMicroseconds(uint16_t timeout_period_mclks, uint8_t vcsel_period_pclks);
static uint32_t timeoutMicrosecondsToMclks(uint32_t timeout_period_us, uint8_t vcsel_period_pclks);
+
+ inline void setWireErrorBit(void) {
+ if (last_status) {
+ bitSet(wire_error, last_status);
+ }
+ }
};
#endif