]> granicus.if.org Git - esp-idf/commitdiff
Component/bt: blufi add custom data cmd
authorzhiweijian <zhiweijian@espressif.com>
Tue, 6 Mar 2018 08:18:38 +0000 (16:18 +0800)
committerzhiweijian <zhiweijian@espressif.com>
Thu, 8 Mar 2018 09:38:44 +0000 (17:38 +0800)
components/bt/bluedroid/api/esp_blufi_api.c
components/bt/bluedroid/api/include/esp_blufi_api.h
components/bt/bluedroid/btc/profile/esp/blufi/blufi_prf.c
components/bt/bluedroid/btc/profile/esp/blufi/blufi_protocol.c
components/bt/bluedroid/btc/profile/esp/blufi/include/blufi_int.h
components/bt/bluedroid/btc/profile/esp/include/btc_blufi_prf.h
examples/bluetooth/blufi/main/blufi_example_main.c

index 833228a4dc0089ddc2ccc52ab7b952646f9e4616..4ecb6f006150ac6fb3b55d3ef15e10caef0070fe 100644 (file)
@@ -142,3 +142,23 @@ esp_err_t esp_blufi_send_error_info(esp_blufi_error_state_t state)
 
     return (btc_transfer_context(&msg, &arg, sizeof(btc_blufi_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
 }
+
+esp_err_t esp_blufi_send_custom_data(uint8_t *data, uint32_t data_len)
+{
+    btc_msg_t msg;
+    btc_blufi_args_t arg;
+    if(data == NULL || data_len == 0) {
+        return ESP_ERR_INVALID_ARG;
+    }
+    if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
+        return ESP_ERR_INVALID_STATE;
+    }
+
+    msg.sig = BTC_SIG_API_CALL;
+    msg.pid = BTC_PID_BLUFI;
+    msg.act = BTC_BLUFI_ACT_SEND_CUSTOM_DATA;
+    arg.custom_data.data = data;
+    arg.custom_data.data_len = data_len;
+
+    return (btc_transfer_context(&msg, &arg, sizeof(btc_blufi_args_t), btc_blufi_call_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
+}
index a826ddfb4159b286eda916b8d1d4b8afb30228fb..6905187485b61a36751de184a91881f2bf8183d4 100644 (file)
@@ -52,6 +52,7 @@ typedef enum {
     ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE,           /*<! When Phone send Disconnect key to ESP32, this event happen */
     ESP_BLUFI_EVENT_GET_WIFI_LIST,                       /*<! When Phone send get wifi list command to ESP32, this event happen */
     ESP_BLUFI_EVENT_REPORT_ERROR,                        /*<! When Blufi report error, this event happen */
+    ESP_BLUFI_EVENT_RECV_CUSTOM_DATA,                    /*<! When Phone send custom data to ESP32, this event happen */
 } esp_blufi_cb_event_t;
 
 /// BLUFI config status
@@ -273,8 +274,15 @@ typedef union {
      */
     struct blufi_get_error_evt_param {
         esp_blufi_error_state_t state;              /*!< Blufi error state */
-    } report_error;                                    /*!< Blufi callback param of ESP_BLUFI_EVENT_REPORT_ERROR */
-
+    } report_error;                                 /*!< Blufi callback param of ESP_BLUFI_EVENT_REPORT_ERROR */
+    /**
+     * @brief 
+     * ESP_BLUFI_EVENT_RECV_CUSTOM_DATA
+     */
+    struct blufi_recv_custom_data_evt_param {
+        uint8_t *data;                              /*!< Custom data */
+        uint32_t data_len;                          /*!< Custom data Length */
+    } custom_data;                                  /*!< Blufi callback param of ESP_BLUFI_EVENT_RECV_CUSTOM_DATA */
 } esp_blufi_cb_param_t;
 
 /**
@@ -416,6 +424,16 @@ esp_err_t esp_blufi_close(esp_gatt_if_t gatts_if, uint16_t conn_id);
  *
  */
 esp_err_t esp_blufi_send_error_info(esp_blufi_error_state_t state);
+/**
+ *
+ * @brief           This function is called to custom data
+ * @param data :  custom data value
+ * @param data_len :  the length of custom data
+ *
+ * @return          ESP_OK - success, other - failed
+ *
+ */
+esp_err_t esp_blufi_send_custom_data(uint8_t *data, uint32_t data_len);
 #ifdef __cplusplus
 }
 #endif
index 9fc0b5e899c5024ec575781314d2d0ccea40532e..08b9e8287c737016a2a07361730c8ed039d402e7 100644 (file)
@@ -660,6 +660,23 @@ static void btc_blufi_send_error_info(uint8_t state)
     osi_free(data);
 }
 
+static void btc_blufi_send_custom_data(uint8_t *value, uint32_t value_len)
+{
+    if(value == NULL || value_len == 0) {
+        LOG_ERROR("%s value or value len error", __func__);
+        return;
+    }
+    uint8_t *data = osi_malloc(value_len);
+    if (data == NULL) {
+        LOG_ERROR("%s mem malloc error", __func__);
+        return;
+    }
+    uint8_t type = BLUFI_BUILD_TYPE(BLUFI_TYPE_DATA, BLUFI_TYPE_DATA_SUBTYPE_CUSTOM_DATA);
+    memcpy(data, value, value_len);
+    btc_blufi_send_encap(type, data, value_len);
+    osi_free(data);
+}
+
 void btc_blufi_cb_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src)
 {
     esp_blufi_cb_param_t *dst = (esp_blufi_cb_param_t *) p_dest;
@@ -736,6 +753,14 @@ void btc_blufi_cb_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src)
         }
         memcpy(dst->server_pkey.pkey, src->server_pkey.pkey, src->server_pkey.pkey_len);
         break;
+    case ESP_BLUFI_EVENT_RECV_CUSTOM_DATA:
+         dst->custom_data.data = osi_malloc(src->custom_data.data_len);
+        if (dst->custom_data.data == NULL) {
+            LOG_ERROR("%s %d no mem\n", __func__, msg->act);
+            break;
+        }
+        memcpy(dst->custom_data.data, src->custom_data.data, src->custom_data.data_len);
+        break;
     default:
         break;
     }
@@ -776,6 +801,9 @@ void btc_blufi_cb_deep_free(btc_msg_t *msg)
     case ESP_BLUFI_EVENT_RECV_SERVER_PRIV_KEY:
         osi_free(param->server_pkey.pkey);
         break;
+    case ESP_BLUFI_EVENT_RECV_CUSTOM_DATA:
+        osi_free(param->custom_data.data);
+        break;
     default:
         break;
     }
@@ -866,6 +894,9 @@ void btc_blufi_cb_handler(btc_msg_t *msg)
     case ESP_BLUFI_EVENT_REPORT_ERROR:
         btc_blufi_cb_to_app(ESP_BLUFI_EVENT_REPORT_ERROR, param);
         break;
+    case ESP_BLUFI_EVENT_RECV_CUSTOM_DATA:
+        btc_blufi_cb_to_app(ESP_BLUFI_EVENT_RECV_CUSTOM_DATA, param);
+        break;
     default:
         LOG_ERROR("%s UNKNOWN %d\n", __func__, msg->act);
         break;
@@ -961,6 +992,20 @@ void btc_blufi_call_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src)
         memcpy(dst->wifi_list.list, list, sizeof(esp_blufi_ap_record_t) * src->wifi_list.apCount);
         break;
     }
+    case BTC_BLUFI_ACT_SEND_CUSTOM_DATA:{
+        uint8_t *data = src->custom_data.data;
+        if(data == NULL) {
+            LOG_ERROR("custom data is NULL\n");
+            break;
+        }
+        dst->custom_data.data = osi_malloc(src->custom_data.data_len);
+        if(dst->custom_data.data == NULL) {
+            LOG_ERROR("custom data malloc error\n");
+            break;
+        }
+        memcpy(dst->custom_data.data, src->custom_data.data, src->custom_data.data_len);
+        break;
+    }
     default:
         break;
     }
@@ -999,6 +1044,13 @@ void btc_blufi_call_deep_free(btc_msg_t *msg)
         }
         break;
     }
+    case BTC_BLUFI_ACT_SEND_CUSTOM_DATA:{
+        uint8_t *data = arg->custom_data.data;
+        if(data) {
+            osi_free(data);    
+        }
+        break;
+    }
     default:
         break;
     }
@@ -1029,6 +1081,9 @@ void btc_blufi_call_handler(btc_msg_t *msg)
     case BTC_BLUFI_ACT_SEND_ERR_INFO:
         btc_blufi_send_error_info(arg->blufi_err_infor.state);
         break;
+    case BTC_BLUFI_ACT_SEND_CUSTOM_DATA:
+        btc_blufi_send_custom_data(arg->custom_data.data, arg->custom_data.data_len);
+        break;
     default:
         LOG_ERROR("%s UNKNOWN %d\n", __func__, msg->act);
         break;
index 23dcdfc01c0434e168858460fafa2a384690775c..50e8d275ef59729670ac032d5959da2875a61b5d 100644 (file)
@@ -249,6 +249,14 @@ void btc_blufi_protocol_handler(uint8_t type, uint8_t *data, int len)
             param.client_pkey.pkey = &data[0];
             param.client_pkey.pkey_len = len;
 
+            btc_transfer_context(&msg, &param, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy);
+            break;
+        case BLUFI_TYPE_DATA_SUBTYPE_CUSTOM_DATA:
+            msg.sig = BTC_SIG_API_CB;
+            msg.pid = BTC_PID_BLUFI;
+            msg.act = ESP_BLUFI_EVENT_RECV_CUSTOM_DATA;
+            param.custom_data.data = &data[0];
+            param.custom_data.data_len = len;
             btc_transfer_context(&msg, &param, sizeof(esp_blufi_cb_param_t), btc_blufi_cb_deep_copy);
             break;
         default:
index 102142979d699f976c9d4778550a32b2df43e7a0..eab51ad85c48b3fe3dbcb95a13d1907b226b7d06 100644 (file)
@@ -16,7 +16,7 @@
 #define __BLUFI_INT_H__
 
 #define BTC_BLUFI_GREAT_VER   0x01  //Version + Subversion
-#define BTC_BLUFI_SUB_VER     0x01  //Version + Subversion
+#define BTC_BLUFI_SUB_VER     0x02  //Version + Subversion
 #define BTC_BLUFI_VERSION     ((BTC_BLUFI_GREAT_VER<<8)|BTC_BLUFI_SUB_VER)  //Version + Subversion
 
 /* service engine control block */
@@ -115,6 +115,7 @@ typedef struct blufi_frag_hdr blufi_frag_hdr_t;
 #define BLUFI_TYPE_DATA_SUBTYPE_REPLY_VERSION           0x10
 #define BLUFI_TYPE_DATA_SUBTYPE_WIFI_LIST               0x11
 #define BLUFI_TYPE_DATA_SUBTYPE_ERROR_INFO              0x12
+#define BLUFI_TYPE_DATA_SUBTYPE_CUSTOM_DATA             0x13
 #define BLUFI_TYPE_IS_CTRL(type)        (BLUFI_GET_TYPE((type)) == BLUFI_TYPE_CTRL)
 #define BLUFI_TYPE_IS_DATA(type)        (BLUFI_GET_TYPE((type)) == BLUFI_TYPE_DATA)
 
index 9cb27da2720cef1fba6aaeb5688913900aa957e8..06154673a89ab9cbd13aac4d1fdc3d38531f49ff 100644 (file)
@@ -25,6 +25,7 @@ typedef enum {
     BTC_BLUFI_ACT_SEND_CFG_REPORT,
     BTC_BLUFI_ACT_SEND_WIFI_LIST,
     BTC_BLUFI_ACT_SEND_ERR_INFO,
+    BTC_BLUFI_ACT_SEND_CUSTOM_DATA,
 } btc_blufi_act_t;
 
 typedef union {
@@ -48,6 +49,13 @@ typedef union {
     struct blufi_error_infor {
         esp_blufi_error_state_t state;
     } blufi_err_infor;
+    /*
+        BTC_BLUFI_ACT_SEND_CUSTOM_DATA
+    */
+    struct blufi_custom_data {
+         uint8_t *data;
+         uint32_t data_len;
+    } custom_data;
 } btc_blufi_args_t;
 
 void btc_blufi_cb_handler(btc_msg_t *msg);
index afe6fb6bc7ed918bc4c7f5967871f33bcb798d16..c16aa38d6ec619409c7597042bcf43a363d49328 100644 (file)
@@ -323,6 +323,10 @@ static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_para
         ESP_ERROR_CHECK(esp_wifi_scan_start(&scanConf, true));
         break;
     }
+    case ESP_BLUFI_EVENT_RECV_CUSTOM_DATA:
+        BLUFI_INFO("Recv Custom Data %d\n", param->custom_data.data_len);
+        esp_log_buffer_hex("Custom Data", param->custom_data.data, param->custom_data.data_len);
+        break;
        case ESP_BLUFI_EVENT_RECV_USERNAME:
         /* Not handle currently */
         break;