Просмотр исходного кода

change: ble,luat_ble_connect改成结构体传参数
change: airlink,ble,代理connect/disconnect,处理read_value的响应, 但还不能处理gatt_done消息

Wendal Chen 9 месяцев назад
Родитель
Сommit
03f72e43ef

+ 27 - 1
components/airlink/src/exec/luat_airlink_bt_exec_task.c

@@ -47,17 +47,25 @@ static void drv_ble_cb(luat_ble_t* luat_ble, luat_ble_event_t event, luat_ble_pa
     uint32_t tmp = event;
     memcpy(ptr, &tmp, 4);
     if (param) {
-        LLOGD("param %p", param);
+        // LLOGD("param %p", param);
         if (LUAT_BLE_EVENT_SCAN_REPORT == event && param->adv_req.data && param->adv_req.data_len > 0) {
             memcpy(ptr + 4 + sizeof(luat_ble_param_t), param->adv_req.data, param->adv_req.data_len);
         }
         else if (LUAT_BLE_EVENT_READ == event) {
             // 请求读, 这个事件仅能通知lua, .value的数据是要被写入的, 不是被读
         }
+        else if (LUAT_BLE_EVENT_READ_VALUE == event && param->read_req.value && param->read_req.value_len > 0) {
+            LLOGD("read resp value %d %p", param->read_req.value_len, param->read_req.value);
+            memcpy(ptr + 4 + sizeof(luat_ble_param_t), param->read_req.value, param->read_req.value_len);
+        }
         else if (LUAT_BLE_EVENT_WRITE == event && param->write_req.value_len && param->write_req.value_len > 0) {
             LLOGD("write req value %d %p", param->write_req.value_len, param->write_req.value);
             memcpy(ptr + 4 + sizeof(luat_ble_param_t), param->write_req.value, param->write_req.value_len);
         }
+        else if (LUAT_BLE_EVENT_GATT_DONE == event) {
+            // TODO 这个操作就比较复杂了
+            // 需要将gatt的内容全部拷贝到ptr中
+        }
         memcpy(ptr + 4, param, sizeof(luat_ble_param_t));
     }
 
@@ -195,6 +203,15 @@ static int drv_ble_write_value(luat_drv_ble_msg_t *msg) {
     
 }
 
+static int drv_ble_connect(luat_drv_ble_msg_t *msg) {
+    // 从数据中解析出参数, 重新组装
+    luat_ble_connect_req_t conn = {0};
+    uint16_t sizeof_conn = 0;
+    memcpy(&sizeof_conn, msg->data, 2);
+    memcpy(&conn, msg->data + 2, sizeof(luat_ble_connect_req_t));
+    return luat_ble_connect(NULL, &conn);
+}
+
 // static int drv_ble_send_read_resp(luat_drv_ble_msg_t *msg) {
 //     // 从数据中解析出参数, 重新组装
 //     luat_ble_rw_req_t write = {0};
@@ -303,6 +320,15 @@ static void drv_bt_task(void *param) {
             //     ret = drv_ble_send_read_resp(msg);
             //     LLOGD("ble send read resp %d", ret);
             //     break;
+            case LUAT_DRV_BT_CMD_BLE_CONNECT:
+                ret = drv_ble_connect(msg);
+                LLOGD("ble connect %d", ret);
+                break;
+            case LUAT_DRV_BT_CMD_BLE_DISCONNECT:
+                ret = luat_ble_disconnect(NULL);
+                LLOGD("ble disconnect %d", ret);
+                break;
+
             default:
                 LLOGD("unknow bt cmd %d", msg->cmd_id);
                 break;

+ 55 - 9
components/bluetooth/drv/luat_drv_ble_port.c

@@ -24,6 +24,16 @@ luat_ble_cb_t g_drv_ble_cb;
 #undef LLOGD
 #define LLOGD(...)
 
+// 读取wifi固件版本, 控制API适配状态
+extern luat_airlink_dev_info_t g_airlink_ext_dev_info;
+static uint32_t get_ble_version(void) {
+    uint32_t version = 0;
+    if (g_airlink_ext_dev_info.tp == 1) {
+        memcpy(&version, g_airlink_ext_dev_info.wifi.version, 4);
+    }
+    return version;
+}
+
 int luat_ble_init(void* args, luat_ble_cb_t luat_ble_cb) {
     LLOGD("执行luat_ble_init %p", luat_ble_cb);
     g_drv_ble_cb = luat_ble_cb;
@@ -508,22 +518,58 @@ int luat_ble_delete_scanning(void* args) {
 }
 
 
-int luat_ble_connect(void* args, uint8_t* adv_addr,uint8_t adv_addr_type) {
-    LLOGE("not support yet");
+int luat_ble_connect(void* args, luat_ble_connect_req_t *conn) {
+    LLOGD("执行luat_ble_connect");
+    if (get_ble_version() < 11) {
+        LLOGE("luat_ble_connect not support, ble version is %d", get_ble_version());
+        return -1;
+    }
+    uint64_t seq = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = 8 + sizeof(luat_airlink_cmd_t) + 8 + sizeof(luat_ble_connect_req_t) + 2
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
+    if (cmd == NULL) {
+        return -101;
+    }
+    luat_drv_ble_msg_t msg = { .id = seq};
+    uint16_t tmp = sizeof(luat_ble_connect_req_t);
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_CONNECT;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
+    // 然后是结构体大小
+    memcpy(cmd->data + sizeof(luat_drv_ble_msg_t), &tmp, 2);
+    // 然后是连接请求数据
+    memcpy(cmd->data + sizeof(luat_drv_ble_msg_t) + 2, conn, sizeof(luat_ble_connect_req_t));
+
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
     return -1;
 }
 
 int luat_ble_disconnect(void* args) {
-    LLOGE("not support yet");
-    return -1;
+    LLOGD("执行luat_ble_disconnect");
+    if (get_ble_version() < 11) {
+        LLOGE("luat_ble_connect not support, ble version is %d", get_ble_version());
+        return -1;
+    }
+    uint64_t seq = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = 8 + sizeof(luat_airlink_cmd_t) + sizeof(luat_drv_ble_msg_t)
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x500, item.len - sizeof(luat_airlink_cmd_t));
+    if (cmd == NULL) {
+        return -101;
+    }
+    luat_drv_ble_msg_t msg = { .id = seq};
+    msg.cmd_id = LUAT_DRV_BT_CMD_BLE_DISCONNECT;
+    memcpy(cmd->data, &msg, sizeof(luat_drv_ble_msg_t));
+
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
 }
 
 int luat_ble_read_value(luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor, uint8_t **data, uint16_t* len) {
     LLOGE("not support yet -> luat_ble_read_value");
     return -1;
 }
-
-int luat_ble_handle2uuid(uint16_t handle, luat_ble_uuid_t* uuid_service, luat_ble_uuid_t* uuid_characteristic, luat_ble_uuid_t* uuid_descriptor) {
-    LLOGE("not support yet -> luat_ble_handle2uuid");
-    return -1;
-}

+ 12 - 3
components/bluetooth/include/luat_ble.h

@@ -356,9 +356,6 @@ int luat_ble_stop_scanning(void* args);
 
 int luat_ble_delete_scanning(void* args);
 
-int luat_ble_connect(void* args, uint8_t* adv_addr,uint8_t adv_addr_type);
-
-int luat_ble_disconnect(void* args);
 
 typedef struct luat_ble_rw_req{
     uint32_t len;
@@ -368,4 +365,16 @@ typedef struct luat_ble_rw_req{
     uint8_t data[0];
 }luat_ble_rw_req_t;
 
+typedef struct luat_ble_conn_req {
+    uint8_t adv_addr_type;  /**< Advertising address type: public/random */
+    uint8_t adv_addr[6];    /**< Advertising address value */
+    uint16_t conn_interval;  /**< Connection interval */
+    uint16_t conn_latency;   /**< Connection latency */
+    uint16_t sup_to;         /**< Link supervision timeout */
+}luat_ble_connect_req_t;
+
+int luat_ble_connect(void* args, luat_ble_connect_req_t *conn);
+
+int luat_ble_disconnect(void* args);
+
 #endif

+ 3 - 0
components/bluetooth/include/luat_drv_ble.h

@@ -34,6 +34,9 @@ enum {
     LUAT_DRV_BT_CMD_BLE_WRITE_INDICATION, // 写入,带订阅的
     LUAT_DRV_BT_CMD_BLE_SEND_READ_RESP, // 发送读响应
     LUAT_DRV_BT_CMD_BLE_WRITE_VALUE, // 写入值
+    LUAT_DRV_BT_CMD_BLE_READ_REQ, // 请求读取值
+    LUAT_DRV_BT_CMD_BLE_CONNECT, // 读取值
+    LUAT_DRV_BT_CMD_BLE_DISCONNECT, // 断开连接
 
     LUAT_DRV_BT_CMD_BLE_EVENT_CB = 128, // 事件回调
 

+ 9 - 2
components/bluetooth/src/luat_lib_ble.c

@@ -956,13 +956,20 @@ BLE连接
 ble_device:connect(string.fromHex("C8478C4E027D"),0)
 */
 static int l_ble_connect(lua_State *L){
-    size_t len;
+    size_t len = 0;
+    luat_ble_connect_req_t conn = {0};
     uint8_t *adv_addr = luaL_checklstring(L, 2, &len);
     uint8_t adv_addr_type = luaL_checknumber(L, 3);
+    if (len != 6){
+        LLOGE("error adv_addr len %d", len);
+        return 0;
+    }
+    memcpy(conn.adv_addr, adv_addr, len);
+    conn.adv_addr_type = adv_addr_type;
     // LLOGD(" adv_addr_type:%d, adv_addr:%02x:%02x:%02x:%02x:%02x:%02x",
     //       adv_addr_type, adv_addr[0], adv_addr[1], adv_addr[2],
     //       adv_addr[3], adv_addr[4], adv_addr[5]);
-    lua_pushboolean(L, luat_ble_connect(NULL, adv_addr, adv_addr_type) ? 0 : 1);
+    lua_pushboolean(L, luat_ble_connect(NULL, &conn) ? 0 : 1);
     return 1;
 }