mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 14:43:51 +00:00 
			
		
		
		
	[pvvx_mithermometer] Fix race condition with BLE authentication (#10327)
This commit is contained in:
		| @@ -46,10 +46,32 @@ void PVVXDisplay::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t | ||||
|       } | ||||
|       this->connection_established_ = true; | ||||
|       this->char_handle_ = chr->handle; | ||||
| #ifdef USE_TIME | ||||
|       this->sync_time_(); | ||||
| #endif | ||||
|       this->display(); | ||||
|  | ||||
|       // Attempt to write immediately | ||||
|       // For devices without security, this will work | ||||
|       // For devices with security that are already paired, this will work | ||||
|       // For devices that need pairing, the write will be retried after auth completes | ||||
|       this->sync_time_and_display_(); | ||||
|       break; | ||||
|     } | ||||
|     default: | ||||
|       break; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void PVVXDisplay::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) { | ||||
|   switch (event) { | ||||
|     case ESP_GAP_BLE_AUTH_CMPL_EVT: { | ||||
|       if (!this->parent_->check_addr(param->ble_security.auth_cmpl.bd_addr)) | ||||
|         return; | ||||
|  | ||||
|       if (param->ble_security.auth_cmpl.success) { | ||||
|         ESP_LOGD(TAG, "[%s] Authentication successful, performing writes.", this->parent_->address_str().c_str()); | ||||
|         // Now that pairing is complete, perform the pending writes | ||||
|         this->sync_time_and_display_(); | ||||
|       } else { | ||||
|         ESP_LOGW(TAG, "[%s] Authentication failed.", this->parent_->address_str().c_str()); | ||||
|       } | ||||
|       break; | ||||
|     } | ||||
|     default: | ||||
| @@ -127,6 +149,13 @@ void PVVXDisplay::delayed_disconnect_() { | ||||
|   this->set_timeout("disconnect", this->disconnect_delay_ms_, [this]() { this->parent_->set_enabled(false); }); | ||||
| } | ||||
|  | ||||
| void PVVXDisplay::sync_time_and_display_() { | ||||
| #ifdef USE_TIME | ||||
|   this->sync_time_(); | ||||
| #endif | ||||
|   this->display(); | ||||
| } | ||||
|  | ||||
| #ifdef USE_TIME | ||||
| void PVVXDisplay::sync_time_() { | ||||
|   if (this->time_ == nullptr) | ||||
|   | ||||
| @@ -43,6 +43,7 @@ class PVVXDisplay : public ble_client::BLEClientNode, public PollingComponent { | ||||
|  | ||||
|   void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, | ||||
|                            esp_ble_gattc_cb_param_t *param) override; | ||||
|   void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override; | ||||
|  | ||||
|   /// Set validity period of the display information in seconds (1..65535) | ||||
|   void set_validity_period(uint16_t validity_period) { this->validity_period_ = validity_period; } | ||||
| @@ -112,6 +113,7 @@ class PVVXDisplay : public ble_client::BLEClientNode, public PollingComponent { | ||||
|   void setcfgbit_(uint8_t bit, bool value); | ||||
|   void send_to_setup_char_(uint8_t *blk, size_t size); | ||||
|   void delayed_disconnect_(); | ||||
|   void sync_time_and_display_(); | ||||
| #ifdef USE_TIME | ||||
|   void sync_time_(); | ||||
|   time::RealTimeClock *time_{nullptr}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user