mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	Fix InterruptLock on ESP-IDF (#2388)
This commit is contained in:
		| @@ -11,13 +11,17 @@ dallas_ns = cg.esphome_ns.namespace("dallas") | ||||
| DallasComponent = dallas_ns.class_("DallasComponent", cg.PollingComponent) | ||||
| ESPOneWire = dallas_ns.class_("ESPOneWire") | ||||
|  | ||||
| CONFIG_SCHEMA = cv.Schema( | ||||
|     { | ||||
|         cv.GenerateID(): cv.declare_id(DallasComponent), | ||||
|         cv.GenerateID(CONF_ONE_WIRE_ID): cv.declare_id(ESPOneWire), | ||||
|         cv.Required(CONF_PIN): pins.internal_gpio_output_pin_schema, | ||||
|     } | ||||
| ).extend(cv.polling_component_schema("60s")) | ||||
| CONFIG_SCHEMA = cv.All( | ||||
|     cv.Schema( | ||||
|         { | ||||
|             cv.GenerateID(): cv.declare_id(DallasComponent), | ||||
|             cv.GenerateID(CONF_ONE_WIRE_ID): cv.declare_id(ESPOneWire), | ||||
|             cv.Required(CONF_PIN): pins.internal_gpio_output_pin_schema, | ||||
|         } | ||||
|     ).extend(cv.polling_component_schema("60s")), | ||||
|     # pin_mode call logs in esp-idf, but InterruptLock is active -> crash | ||||
|     cv.only_with_arduino, | ||||
| ) | ||||
|  | ||||
|  | ||||
| async def to_code(config): | ||||
|   | ||||
| @@ -79,28 +79,27 @@ bool HOT IRAM_ATTR DHT::read_sensor_(float *temperature, float *humidity, bool r | ||||
|   int8_t i = 0; | ||||
|   uint8_t data[5] = {0, 0, 0, 0, 0}; | ||||
|  | ||||
|   this->pin_->digital_write(false); | ||||
|   this->pin_->pin_mode(gpio::FLAG_OUTPUT); | ||||
|   this->pin_->digital_write(false); | ||||
|  | ||||
|   if (this->model_ == DHT_MODEL_DHT11) { | ||||
|     delayMicroseconds(18000); | ||||
|   } else if (this->model_ == DHT_MODEL_SI7021) { | ||||
|     delayMicroseconds(500); | ||||
|     this->pin_->digital_write(true); | ||||
|     delayMicroseconds(40); | ||||
|   } else if (this->model_ == DHT_MODEL_DHT22_TYPE2) { | ||||
|     delayMicroseconds(2000); | ||||
|   } else if (this->model_ == DHT_MODEL_AM2302) { | ||||
|     delayMicroseconds(1000); | ||||
|   } else { | ||||
|     delayMicroseconds(800); | ||||
|   } | ||||
|   this->pin_->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); | ||||
|  | ||||
|   { | ||||
|     InterruptLock lock; | ||||
|  | ||||
|     this->pin_->digital_write(false); | ||||
|     this->pin_->pin_mode(gpio::FLAG_OUTPUT); | ||||
|     this->pin_->digital_write(false); | ||||
|  | ||||
|     if (this->model_ == DHT_MODEL_DHT11) { | ||||
|       delayMicroseconds(18000); | ||||
|     } else if (this->model_ == DHT_MODEL_SI7021) { | ||||
|       delayMicroseconds(500); | ||||
|       this->pin_->digital_write(true); | ||||
|       delayMicroseconds(40); | ||||
|     } else if (this->model_ == DHT_MODEL_DHT22_TYPE2) { | ||||
|       delayMicroseconds(2000); | ||||
|     } else if (this->model_ == DHT_MODEL_AM2302) { | ||||
|       delayMicroseconds(1000); | ||||
|     } else { | ||||
|       delayMicroseconds(800); | ||||
|     } | ||||
|     this->pin_->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); | ||||
|  | ||||
|     // Host pull up 20-40us then DHT response 80us | ||||
|     // Start waiting for initial rising edge at the center when we | ||||
|     // expect the DHT response (30us+40us) | ||||
|   | ||||
| @@ -350,7 +350,7 @@ std::string hexencode(const uint8_t *data, uint32_t len) { | ||||
| IRAM_ATTR InterruptLock::InterruptLock() { xt_state_ = xt_rsil(15); } | ||||
| IRAM_ATTR InterruptLock::~InterruptLock() { xt_wsr_ps(xt_state_); } | ||||
| #endif | ||||
| #ifdef USE_ESP32_FRAMEWORK_ARDUINO | ||||
| #ifdef USE_ESP32 | ||||
| IRAM_ATTR InterruptLock::InterruptLock() { portDISABLE_INTERRUPTS(); } | ||||
| IRAM_ATTR InterruptLock::~InterruptLock() { portENABLE_INTERRUPTS(); } | ||||
| #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user