mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 23:21:54 +00:00 
			
		
		
		
	fix race
This commit is contained in:
		| @@ -46,10 +46,35 @@ void PVVXDisplay::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t | |||||||
|       } |       } | ||||||
|       this->connection_established_ = true; |       this->connection_established_ = true; | ||||||
|       this->char_handle_ = chr->handle; |       this->char_handle_ = chr->handle; | ||||||
| #ifdef USE_TIME |  | ||||||
|       this->sync_time_(); |       // Check if already paired - if not, writes will be deferred to next update cycle | ||||||
| #endif |       if (this->parent_->is_paired()) { | ||||||
|       this->display(); |         ESP_LOGD(TAG, "[%s] Device is paired, writing immediately.", this->parent_->address_str().c_str()); | ||||||
|  |         this->sync_time_and_display_(); | ||||||
|  |       } else { | ||||||
|  |         ESP_LOGD(TAG, "[%s] Device not paired yet, deferring writes until authentication completes.", | ||||||
|  |                  this->parent_->address_str().c_str()); | ||||||
|  |       } | ||||||
|  |       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; |       break; | ||||||
|     } |     } | ||||||
|     default: |     default: | ||||||
| @@ -81,6 +106,11 @@ void PVVXDisplay::display() { | |||||||
|              this->parent_->address_str().c_str()); |              this->parent_->address_str().c_str()); | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |   // Check if authentication is required and not complete | ||||||
|  |   if (!this->parent_->is_paired()) { | ||||||
|  |     ESP_LOGD(TAG, "[%s] Waiting for pairing to complete before writing.", this->parent_->address_str().c_str()); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|   ESP_LOGD(TAG, "[%s] Send to display: bignum %d, smallnum: %d, cfg: 0x%02x, validity period: %u.", |   ESP_LOGD(TAG, "[%s] Send to display: bignum %d, smallnum: %d, cfg: 0x%02x, validity period: %u.", | ||||||
|            this->parent_->address_str().c_str(), this->bignum_, this->smallnum_, this->cfg_, this->validity_period_); |            this->parent_->address_str().c_str(), this->bignum_, this->smallnum_, this->cfg_, this->validity_period_); | ||||||
|   uint8_t blk[8] = {}; |   uint8_t blk[8] = {}; | ||||||
| @@ -109,6 +139,10 @@ void PVVXDisplay::send_to_setup_char_(uint8_t *blk, size_t size) { | |||||||
|     ESP_LOGW(TAG, "[%s] Not connected to BLE client.", this->parent_->address_str().c_str()); |     ESP_LOGW(TAG, "[%s] Not connected to BLE client.", this->parent_->address_str().c_str()); | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |   if (!this->parent_->is_paired()) { | ||||||
|  |     ESP_LOGW(TAG, "[%s] Cannot write - authentication not complete.", this->parent_->address_str().c_str()); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|   auto status = |   auto status = | ||||||
|       esp_ble_gattc_write_char(this->parent_->get_gattc_if(), this->parent_->get_conn_id(), this->char_handle_, size, |       esp_ble_gattc_write_char(this->parent_->get_gattc_if(), this->parent_->get_conn_id(), this->char_handle_, size, | ||||||
|                                blk, ESP_GATT_WRITE_TYPE_NO_RSP, ESP_GATT_AUTH_REQ_NONE); |                                blk, ESP_GATT_WRITE_TYPE_NO_RSP, ESP_GATT_AUTH_REQ_NONE); | ||||||
| @@ -127,6 +161,13 @@ void PVVXDisplay::delayed_disconnect_() { | |||||||
|   this->set_timeout("disconnect", this->disconnect_delay_ms_, [this]() { this->parent_->set_enabled(false); }); |   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 | #ifdef USE_TIME | ||||||
| void PVVXDisplay::sync_time_() { | void PVVXDisplay::sync_time_() { | ||||||
|   if (this->time_ == nullptr) |   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, |   void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, | ||||||
|                            esp_ble_gattc_cb_param_t *param) override; |                            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) |   /// Set validity period of the display information in seconds (1..65535) | ||||||
|   void set_validity_period(uint16_t validity_period) { this->validity_period_ = validity_period; } |   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 setcfgbit_(uint8_t bit, bool value); | ||||||
|   void send_to_setup_char_(uint8_t *blk, size_t size); |   void send_to_setup_char_(uint8_t *blk, size_t size); | ||||||
|   void delayed_disconnect_(); |   void delayed_disconnect_(); | ||||||
|  |   void sync_time_and_display_(); | ||||||
| #ifdef USE_TIME | #ifdef USE_TIME | ||||||
|   void sync_time_(); |   void sync_time_(); | ||||||
|   time::RealTimeClock *time_{nullptr}; |   time::RealTimeClock *time_{nullptr}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user