bluedroid 0.3.7

A wrapper for the ESP32 Bluedroid Bluetooth stack.
use esp_idf_sys::{
    esp_ble_gap_cb_param_t, esp_ble_gap_start_advertising, esp_bt_status_t_ESP_BT_STATUS_SUCCESS,
    esp_gap_ble_cb_event_t, esp_gap_ble_cb_event_t_ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT,
    esp_gap_ble_cb_event_t_ESP_GAP_BLE_ADV_START_COMPLETE_EVT,
    esp_gap_ble_cb_event_t_ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT,
    esp_gap_ble_cb_event_t_ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT,
    esp_gap_ble_cb_event_t_ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT, esp_nofail,
};

use log::{debug, info, warn};

use super::GattServer;
use crate::leaky_box_raw;

impl GattServer {
    pub(crate) extern "C" fn gap_event_handler(
        &mut self,
        event: esp_gap_ble_cb_event_t,
        param: *mut esp_ble_gap_cb_param_t,
    ) {
        #[allow(non_upper_case_globals)]
        match event {
            esp_gap_ble_cb_event_t_ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT => {
                debug!("BLE GAP advertisement data set complete.");
                info!("Starting BLE GAP advertisement.");

                unsafe {
                    esp_nofail!(esp_ble_gap_start_advertising(leaky_box_raw!(
                        self.advertisement_parameters
                    )));
                }
            }
            esp_gap_ble_cb_event_t_ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT => {
                debug!("BLE GAP scan response data set complete.");
                info!("Starting BLE GAP response advertisement.");

                unsafe {
                    esp_nofail!(esp_ble_gap_start_advertising(leaky_box_raw!(
                        self.advertisement_parameters
                    )));
                }
            }
            esp_gap_ble_cb_event_t_ESP_GAP_BLE_ADV_START_COMPLETE_EVT => {
                let param = unsafe { (*param).adv_data_cmpl };
                if param.status == esp_bt_status_t_ESP_BT_STATUS_SUCCESS {
                    debug!("BLE GAP advertisement started.");
                } else {
                    warn!("BLE GAP advertisement start failed.");
                }
            }
            esp_gap_ble_cb_event_t_ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT => {
                let param = unsafe { (*param).adv_data_cmpl };
                if param.status == esp_bt_status_t_ESP_BT_STATUS_SUCCESS {
                    debug!("BLE GAP advertisement stopped.");
                } else {
                    warn!("BLE GAP advertisement stop failed.");
                }
            }
            esp_gap_ble_cb_event_t_ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT => {
                let param = unsafe { (*param).update_conn_params };
                info!("Connection parameters updated: {:?}", param);
            }
            _ => {
                warn!("Unhandled GAP event: {:?}", event);
            }
        }
    }
}