mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 00:51:49 +00:00 
			
		
		
		
	[pvvx_mithermometer] Fix race condition with BLE authentication (#10327)
This commit is contained in:
		
				
					committed by
					
						
						Jesse Hills
					
				
			
			
				
	
			
			
			
						parent
						
							03836ee2d2
						
					
				
				
					commit
					07715dd50f
				
			@@ -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