Browse Source

Fix hot-unplug-plug test for Dallas sensor

softuart
Xose Pérez 6 years ago
parent
commit
90c51552c7
1 changed files with 16 additions and 16 deletions
  1. +16
    -16
      code/espurna/sensors/DallasSensor.h

+ 16
- 16
code/espurna/sensors/DallasSensor.h View File

@ -18,15 +18,13 @@
#define DS_CHIP_DS18B20 0x28 #define DS_CHIP_DS18B20 0x28
#define DS_CHIP_DS1825 0x3B #define DS_CHIP_DS1825 0x3B
#define DS_DATA_SIZE 9
#define DS_PARASITE 1 #define DS_PARASITE 1
#define DS_DISCONNECTED -127 #define DS_DISCONNECTED -127
#define DS_CMD_START_CONVERSION 0x44 #define DS_CMD_START_CONVERSION 0x44
#define DS_CMD_READ_SCRATCHPAD 0xBE #define DS_CMD_READ_SCRATCHPAD 0xBE
#define DS_ERROR_FAILED_RESET -2
#define DS_ERROR_FAILED_READ -3
class DallasSensor : public BaseSensor { class DallasSensor : public BaseSensor {
public: public:
@ -121,38 +119,35 @@ class DallasSensor : public BaseSensor {
// Read scratchpad // Read scratchpad
if (_wire->reset() == 0) { if (_wire->reset() == 0) {
_error = DS_ERROR_FAILED_RESET;
// Force a CRC check error
_devices[index].data[0] = _devices[index].data[0] + 1;
return; return;
} }
_wire->select(_devices[index].address); _wire->select(_devices[index].address);
_wire->write(DS_CMD_READ_SCRATCHPAD); _wire->write(DS_CMD_READ_SCRATCHPAD);
uint8_t data[9];
for (unsigned char i = 0; i < 9; i++) {
uint8_t data[DS_DATA_SIZE];
for (unsigned char i = 0; i < DS_DATA_SIZE; i++) {
data[i] = _wire->read(); data[i] = _wire->read();
} }
#if false #if false
Serial.printf("[DS18B20] Data = "); Serial.printf("[DS18B20] Data = ");
for (unsigned char i = 0; i < 9; i++) {
for (unsigned char i = 0; i < DS_DATA_SIZE; i++) {
Serial.printf("%02X ", data[i]); Serial.printf("%02X ", data[i]);
} }
Serial.printf(" CRC = %02X\n", OneWire::crc8(data, 8));
Serial.printf(" CRC = %02X\n", OneWire::crc8(data, DS_DATA_SIZE-1));
#endif #endif
if (_wire->reset() != 1) { if (_wire->reset() != 1) {
_error = DS_ERROR_FAILED_READ;
return;
}
if (OneWire::crc8(data, 8) != data[8]) {
_error = SENSOR_ERROR_CRC;
// Force a CRC check error
_devices[index].data[0] = _devices[index].data[0] + 1;
return; return;
} }
memcpy(_devices[index].data, data, 9);
memcpy(_devices[index].data, data, DS_DATA_SIZE);
} }
@ -217,6 +212,11 @@ class DallasSensor : public BaseSensor {
uint8_t * data = _devices[index].data; uint8_t * data = _devices[index].data;
if (OneWire::crc8(data, DS_DATA_SIZE-1) != data[DS_DATA_SIZE-1]) {
_error = SENSOR_ERROR_CRC;
return 0;
}
// Registers // Registers
// byte 0: temperature LSB // byte 0: temperature LSB
// byte 1: temperature MSB // byte 1: temperature MSB
@ -305,7 +305,7 @@ class DallasSensor : public BaseSensor {
typedef struct { typedef struct {
uint8_t address[8]; uint8_t address[8];
uint8_t data[9];
uint8_t data[DS_DATA_SIZE];
} ds_device_t; } ds_device_t;
std::vector<ds_device_t> _devices; std::vector<ds_device_t> _devices;


Loading…
Cancel
Save