Skip to content

Commit ea08fc3

Browse files
authored
Merge pull request #222 from Andersama/request-timestamps
Handle requests using timestamps
2 parents f484fe9 + 8004027 commit ea08fc3

File tree

2 files changed

+45
-18
lines changed

2 files changed

+45
-18
lines changed

DallasTemperature.cpp

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -414,49 +414,53 @@ bool DallasTemperature::isConversionComplete() {
414414
}
415415

416416
// sends command for all devices on the bus to perform a temperature conversion
417-
void DallasTemperature::requestTemperatures() {
417+
DallasTemperature::request_t DallasTemperature::requestTemperatures() {
418+
DallasTemperature::request_t req = {};
419+
req.result = true;
418420

419421
_wire->reset();
420422
_wire->skip();
421423
_wire->write(STARTCONVO, parasite);
422424

423425
// ASYNC mode?
426+
req.timestamp = millis();
424427
if (!waitForConversion)
425-
return;
426-
blockTillConversionComplete(bitResolution);
427-
428+
return req;
429+
blockTillConversionComplete(bitResolution, req.timestamp);
430+
return req;
428431
}
429432

430433
// sends command for one device to perform a temperature by address
431434
// returns FALSE if device is disconnected
432435
// returns TRUE otherwise
433-
bool DallasTemperature::requestTemperaturesByAddress(const uint8_t* deviceAddress) {
434-
436+
DallasTemperature::request_t DallasTemperature::requestTemperaturesByAddress(const uint8_t* deviceAddress) {
437+
DallasTemperature::request_t req = {};
435438
uint8_t bitResolution = getResolution(deviceAddress);
436439
if (bitResolution == 0) {
437-
return false; //Device disconnected
440+
req.result = false;
441+
return req; //Device disconnected
438442
}
439443

440444
_wire->reset();
441445
_wire->select(deviceAddress);
442446
_wire->write(STARTCONVO, parasite);
443447

448+
req.timestamp = millis();
444449
// ASYNC mode?
450+
req.result = true;
445451
if (!waitForConversion)
446-
return true;
452+
return req;
447453

448-
blockTillConversionComplete(bitResolution);
454+
blockTillConversionComplete(bitResolution, req.timestamp);
449455

450-
return true;
456+
return req;
451457

452458
}
453459

454460
// Continue to check if the IC has responded with a temperature
455-
void DallasTemperature::blockTillConversionComplete(uint8_t bitResolution) {
456-
461+
void DallasTemperature::blockTillConversionComplete(uint8_t bitResolution, unsigned long start) {
457462
if (checkForConversion && !parasite) {
458-
unsigned long start = millis();
459-
while (!isConversionComplete() && (millis() - start < MAX_CONVERSION_TIMEOUT ))
463+
while (!isConversionComplete() && (millis() - start < MAX_CONVERSION_TIMEOUT))
460464
yield();
461465
} else {
462466
unsigned long delms = millisToWaitForConversion(bitResolution);
@@ -467,6 +471,18 @@ void DallasTemperature::blockTillConversionComplete(uint8_t bitResolution) {
467471

468472
}
469473

474+
// Continue to check if the IC has responded with a temperature
475+
void DallasTemperature::blockTillConversionComplete(uint8_t bitResolution) {
476+
unsigned long start = millis();
477+
blockTillConversionComplete(bitResolution, start);
478+
}
479+
480+
// Continue to check if the IC has responded with a temperature
481+
void DallasTemperature::blockTillConversionComplete(uint8_t bitResolution, DallasTemperature::request_t req) {
482+
if (req.result)
483+
blockTillConversionComplete(bitResolution, req.timestamp);
484+
}
485+
470486
// returns number of milliseconds to wait till conversion is complete (based on IC datasheet)
471487
uint16_t DallasTemperature::millisToWaitForConversion(uint8_t bitResolution) {
472488

@@ -587,7 +603,7 @@ void DallasTemperature::deactivateExternalPullup() {
587603
}
588604

589605
// sends command for one device to perform a temp conversion by index
590-
bool DallasTemperature::requestTemperaturesByIndex(uint8_t deviceIndex) {
606+
DallasTemperature::request_t DallasTemperature::requestTemperaturesByIndex(uint8_t deviceIndex) {
591607

592608
DeviceAddress deviceAddress;
593609
getAddress(deviceAddress, deviceIndex);

DallasTemperature.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,23 @@ class DallasTemperature {
139139
void setCheckForConversion(bool);
140140
bool getCheckForConversion(void);
141141

142+
struct request_t {
143+
bool result;
144+
unsigned long timestamp;
145+
146+
operator bool() {
147+
return result;
148+
}
149+
};
150+
142151
// sends command for all devices on the bus to perform a temperature conversion
143-
void requestTemperatures(void);
152+
request_t requestTemperatures(void);
144153

145154
// sends command for one device to perform a temperature conversion by address
146-
bool requestTemperaturesByAddress(const uint8_t*);
155+
request_t requestTemperaturesByAddress(const uint8_t*);
147156

148157
// sends command for one device to perform a temperature conversion by index
149-
bool requestTemperaturesByIndex(uint8_t);
158+
request_t requestTemperaturesByIndex(uint8_t);
150159

151160
// returns temperature raw value (12 bit integer of 1/128 degrees C)
152161
int32_t getTemp(const uint8_t*);
@@ -274,6 +283,8 @@ class DallasTemperature {
274283
#endif
275284

276285
void blockTillConversionComplete(uint8_t);
286+
void blockTillConversionComplete(uint8_t, unsigned long);
287+
void blockTillConversionComplete(uint8_t, request_t);
277288

278289
private:
279290
typedef uint8_t ScratchPad[9];

0 commit comments

Comments
 (0)