Skip to content

Commit 6b9051a

Browse files
committed
Keep i2c error as bit flag which TwoWire::endTransmission() returns
last_status is reasonable solution to get the last status of i2c trnasmittion, but in some cases, the last_status is overwritten by calling read/write register API more than once. For instance, init(), startContinuous(), etc. Especially on Arduino IDE 1.8.13, new error code `5` (i2c timeout) is added to Wire.endTransmission() by merging this PR arduino/ArduinoCore-avr#107 . You can distinguish what error occurs and use them depending on the situation.
1 parent 9f3fa14 commit 6b9051a

File tree

3 files changed

+29
-0
lines changed

3 files changed

+29
-0
lines changed

Diff for: README.md

+3
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ This library is intended to provide a quicker and easier way to get started usin
163163
* `bool timeoutOccurred()`<br>
164164
Indicates whether a read timeout has occurred since the last call to `timeoutOccurred()`.
165165

166+
* `uint8_t getWireErrorBits(void)`<br>
167+
Indicates what I&sup2;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).
168+
166169
## Version history
167170

168171
* 1.3.0 (2020 Sep 24): Added support for alternative I&sup2;C buses (thanks KurtE).

Diff for: VL53L0X.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ VL53L0X::VL53L0X()
3939
, address(ADDRESS_DEFAULT)
4040
, io_timeout(0) // no timeout
4141
, did_timeout(false)
42+
, wire_error(0)
4243
{
4344
}
4445

@@ -289,6 +290,7 @@ void VL53L0X::writeReg(uint8_t reg, uint8_t value)
289290
bus->write(reg);
290291
bus->write(value);
291292
last_status = bus->endTransmission();
293+
setWireErrorBit();
292294
}
293295

294296
// Write a 16-bit register
@@ -299,6 +301,7 @@ void VL53L0X::writeReg16Bit(uint8_t reg, uint16_t value)
299301
bus->write((value >> 8) & 0xFF); // value high byte
300302
bus->write( value & 0xFF); // value low byte
301303
last_status = bus->endTransmission();
304+
setWireErrorBit();
302305
}
303306

304307
// Write a 32-bit register
@@ -311,6 +314,7 @@ void VL53L0X::writeReg32Bit(uint8_t reg, uint32_t value)
311314
bus->write((value >> 8) & 0xFF);
312315
bus->write( value & 0xFF); // value lowest byte
313316
last_status = bus->endTransmission();
317+
setWireErrorBit();
314318
}
315319

316320
// Read an 8-bit register
@@ -321,6 +325,7 @@ uint8_t VL53L0X::readReg(uint8_t reg)
321325
bus->beginTransmission(address);
322326
bus->write(reg);
323327
last_status = bus->endTransmission();
328+
setWireErrorBit();
324329

325330
bus->requestFrom(address, (uint8_t)1);
326331
value = bus->read();
@@ -336,6 +341,7 @@ uint16_t VL53L0X::readReg16Bit(uint8_t reg)
336341
bus->beginTransmission(address);
337342
bus->write(reg);
338343
last_status = bus->endTransmission();
344+
setWireErrorBit();
339345

340346
bus->requestFrom(address, (uint8_t)2);
341347
value = (uint16_t)bus->read() << 8; // value high byte
@@ -352,6 +358,7 @@ uint32_t VL53L0X::readReg32Bit(uint8_t reg)
352358
bus->beginTransmission(address);
353359
bus->write(reg);
354360
last_status = bus->endTransmission();
361+
setWireErrorBit();
355362

356363
bus->requestFrom(address, (uint8_t)4);
357364
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)
375382
}
376383

377384
last_status = bus->endTransmission();
385+
setWireErrorBit();
378386
}
379387

380388
// 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)
384392
bus->beginTransmission(address);
385393
bus->write(reg);
386394
last_status = bus->endTransmission();
395+
setWireErrorBit();
387396

388397
bus->requestFrom(address, count);
389398

@@ -873,6 +882,15 @@ bool VL53L0X::timeoutOccurred()
873882
return tmp;
874883
}
875884

885+
// Did I2C transmission error occur in one of the read/write functions since
886+
// the last call to getWireErrorBits()?
887+
uint8_t VL53L0X::getWireErrorBits()
888+
{
889+
const uint8_t tmp = wire_error;
890+
wire_error = 0;
891+
return tmp;
892+
}
893+
876894
// Private Methods /////////////////////////////////////////////////////////////
877895

878896
// Get reference SPAD (single photon avalanche diode) count and type

Diff for: VL53L0X.h

+8
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class VL53L0X
134134
inline void setTimeout(uint16_t timeout) { io_timeout = timeout; }
135135
inline uint16_t getTimeout() { return io_timeout; }
136136
bool timeoutOccurred();
137+
uint8_t getWireErrorBits(void);
137138

138139
private:
139140
// TCC: Target CentreCheck
@@ -158,6 +159,7 @@ class VL53L0X
158159
uint16_t io_timeout;
159160
bool did_timeout;
160161
uint16_t timeout_start_ms;
162+
uint8_t wire_error;
161163

162164
uint8_t stop_variable; // read by init and used when starting measurement; is StopVariable field of VL53L0X_DevData_t structure in API
163165
uint32_t measurement_timing_budget_us;
@@ -173,6 +175,12 @@ class VL53L0X
173175
static uint16_t encodeTimeout(uint32_t timeout_mclks);
174176
static uint32_t timeoutMclksToMicroseconds(uint16_t timeout_period_mclks, uint8_t vcsel_period_pclks);
175177
static uint32_t timeoutMicrosecondsToMclks(uint32_t timeout_period_us, uint8_t vcsel_period_pclks);
178+
179+
inline void setWireErrorBit(void) {
180+
if (last_status) {
181+
bitSet(wire_error, last_status);
182+
}
183+
}
176184
};
177185

178186
#endif

0 commit comments

Comments
 (0)