Prechádzať zdrojové kódy

change: ble,gatt_done事件,拆分出gatt_item事件

Wendal Chen 8 mesiacov pred
rodič
commit
aab9985b5a

+ 17 - 17
components/airlink/src/exec/luat_airlink_bt_exec_task.c

@@ -68,24 +68,24 @@ static void drv_ble_cb(luat_ble_t* luat_ble, luat_ble_event_t event, luat_ble_pa
             LLOGD("write req value %d %p", param->write_req.value_len, param->write_req.value);
             memcpy(ptr + offset, param->write_req.value, param->write_req.value_len);
         }
-        else if (LUAT_BLE_EVENT_GATT_DONE == event) {
-            // TODO 这个操作就比较复杂了
-            // 需要将gatt的内容全部拷贝到ptr中
-            // LLOGI("gatt done, gatt len %d, pack now", param->gatt_done_ind.gatt_service_num);
-            for (size_t i = 0; i < param->gatt_done_ind.gatt_service_num; i++)
-            {
-                gatt = param->gatt_done_ind.gatt_service[i];
-                // LLOGD("gatt service %02X%02X", gatt->uuid[0], gatt->uuid[1]);
-                len = 0;
-                luat_ble_gatt_pack(gatt, ptr + offset, &len);
-                if (len == 0) {
-                    LLOGE("gatt pack failed, gatt %p len=0!!!", gatt);
-                    break;
-                }
-                // LLOGD("gatt service pack %d/%d", len, offset);
-                offset += len;
+        else if (LUAT_BLE_EVENT_GATT_ITEM == event) {
+            // 这个事件是gatt服务项回调, 需要将gatt的内容全部拷贝到ptr中
+            // LLOGD("gatt item %d", param->gatt_item_ind.gatt_service_num);
+            gatt = param->gatt_item_ind.gatt_service;
+            if (gatt == NULL) {
+                LLOGE("gatt item is NULL");
+                return;
+            }
+            len = 0;
+            luat_ble_gatt_pack(gatt, ptr + offset, &len);
+            if (len == 0) {
+                LLOGE("gatt pack failed, gatt %p len=0!!!", gatt);
+                return;
             }
-            // return;
+            // return; // 临时的
+        }
+        else if (LUAT_BLE_EVENT_GATT_DONE == event) {
+            // pass
         }
         memcpy(ptr + 4, param, sizeof(luat_ble_param_t));
     }

+ 32 - 29
components/airlink/src/exec/luat_airlink_cmd_exec_bluetooth.c

@@ -91,38 +91,41 @@ int luat_airlink_cmd_exec_bt_resp_cb(luat_airlink_cmd_t *cmd, void *userdata) {
         else if (event == LUAT_BLE_EVENT_READ_VALUE && param->read_req.value_len) {
             param->read_req.value = (uint8_t*)(msg->data + offset);
         }
-        else if (event == LUAT_BLE_EVENT_GATT_DONE) {
-            LLOGI("gatt done, gatt len %d, unpack now", param->gatt_done_ind.gatt_service_num);
-            
-            param->gatt_done_ind.gatt_service = s_gatts;
-            for (size_t i = 0; i < param->gatt_done_ind.gatt_service_num; i++)
-            {
-                if (param->gatt_done_ind.gatt_service[i] == NULL) {
-                    param->gatt_done_ind.gatt_service[i] = luat_heap_malloc(sizeof(luat_ble_gatt_service_t));
-                }
-                else  {
-                    gatt = param->gatt_done_ind.gatt_service[i];
-                    for (size_t ch_i = 0; ch_i < gatt->characteristics_num; ch_i++)
-                    {
-                        if (gatt->characteristics[ch_i].descriptor != NULL) {
-                            luat_heap_free(gatt->characteristics[ch_i].descriptor);
-                            gatt->characteristics[ch_i].descriptor = NULL;
-                        } 
-                    }
-                    luat_heap_free(gatt->characteristics);
-                    gatt->characteristics = NULL;
-                    gatt->characteristics_num = 0;
+        else if (event == LUAT_BLE_EVENT_GATT_ITEM) {
+            tmp = param->gatt_item_ind.gatt_service_index;
+            if (tmp >= 16) {
+                LLOGE("gatt item index %d out of range", tmp);
+                return -1;
+            }
+            if (s_gatts[tmp] == NULL) {
+                s_gatts[tmp] = luat_heap_malloc(sizeof(luat_ble_gatt_service_t));
+                if (s_gatts[tmp] == NULL) {
+                    LLOGE("out of memory when malloc gatt service");
+                    return -1;
                 }
-                // TODO 这个函数还是会有内存泄露的情况
-                luat_ble_gatt_unpack(param->gatt_done_ind.gatt_service[i], msg->data + offset, &tmplen);
-                // LLOGI("gatt service %d unpacked, len %d", i, tmplen);
-                if (tmplen == 0) {
-                    break;
+            }
+            else {
+                gatt = s_gatts[tmp];
+                for (size_t ch_i = 0; ch_i < gatt->characteristics_num; ch_i++)
+                {
+                    if (gatt->characteristics[ch_i].descriptor != NULL) {
+                        luat_heap_free(gatt->characteristics[ch_i].descriptor);
+                        gatt->characteristics[ch_i].descriptor = NULL;
+                    } 
                 }
-                offset += tmplen;
+                luat_heap_free(gatt->characteristics);
+                gatt->characteristics = NULL;
+                gatt->characteristics_num = 0;
             }
-            // 暂时还是不返回解码完成再说
-            // return 0;
+            luat_ble_gatt_unpack(s_gatts[tmp], msg->data + offset, &tmplen);
+            if (tmplen == 0) {
+                LLOGE("gatt item unpack failed, gatt %p len=0!!!", s_gatts[tmp]);
+                return -1;
+            }
+            param->gatt_item_ind.gatt_service = s_gatts[tmp];
+        }
+        else if (event == LUAT_BLE_EVENT_GATT_DONE) {
+            LLOGI("gatt done, gatt total %d", param->gatt_done_ind.gatt_service_num);
         }
         g_drv_ble_cb(NULL, event, param);
         return 0;

+ 9 - 2
components/bluetooth/include/luat_ble.h

@@ -127,6 +127,8 @@ typedef enum{
     LUAT_BLE_EVENT_READ,         // BLE从模式下,主设备读操作事件
     LUAT_BLE_EVENT_READ_VALUE,      // BLE读value数据回调
 
+    LUAT_BLE_EVENT_GATT_ITEM,      // BLE GATT服务项回调
+
     LUAT_BLE_EVENT_MAX,
 
 } luat_ble_event_t;
@@ -271,10 +273,14 @@ typedef struct luat_ble_disconn_ind{
     uint8_t reason;
 }luat_ble_disconn_ind_t;
 
+typedef struct luat_ble_gatt_item_ind{
+    uint8_t gatt_service_index;
+    uint8_t gatt_service_total_num;
+    luat_ble_gatt_service_t* gatt_service;
+}luat_ble_gatt_item_ind_t;
+
 typedef struct luat_ble_gatt_done_ind{
     uint8_t gatt_service_num;
-    luat_ble_gatt_service_t** gatt_service;
-    void* user_data;
 }luat_ble_gatt_done_ind_t;
 
 
@@ -287,6 +293,7 @@ typedef struct{
         luat_ble_conn_ind_t conn_ind;
         luat_ble_disconn_ind_t disconn_ind;
         luat_ble_gatt_done_ind_t gatt_done_ind;
+        luat_ble_gatt_item_ind_t gatt_item_ind;
         uint8_t data[256]; // 预留一个大的后备区域
     };
 } luat_ble_param_t;

+ 26 - 23
components/bluetooth/src/luat_lib_ble.c

@@ -148,33 +148,34 @@ int l_ble_callback(lua_State *L, void *ptr)
 
         lua_call(L, 3, 0);
         break;
-    }case LUAT_BLE_EVENT_GATT_DONE:{
-        luat_ble_gatt_service_t **gatt_services = param->gatt_done_ind.gatt_service;
-        uint8_t gatt_service_num = param->gatt_done_ind.gatt_service_num;
-        lua_createtable(L, gatt_service_num, 0);
-        for (size_t i = 0; i < gatt_service_num; i++){
-            luat_ble_gatt_service_t *gatt_service = gatt_services[i];
+    }case LUAT_BLE_EVENT_GATT_ITEM:{
+        luat_ble_gatt_service_t *gatt_service = param->gatt_item_ind.gatt_service;
+        lua_newtable(L);
+        // servise uuid
+        lua_pushlstring(L, (const char *)gatt_service->uuid, gatt_service->uuid_type);
+        lua_rawseti(L, -2, 1);
+        // characteristics
+        uint8_t characteristics_num = gatt_service->characteristics_num;
+        for (size_t m = 0; m < characteristics_num; m++){
+            luat_ble_gatt_chara_t *gatt_chara = &gatt_service->characteristics[m];
             lua_newtable(L);
-            // servise uuid
-            lua_pushlstring(L, (const char *)gatt_service->uuid, gatt_service->uuid_type);
-            lua_rawseti(L, -2, 1);
-            // characteristics
-            uint8_t characteristics_num = gatt_service->characteristics_num;
-            for (size_t m = 0; m < characteristics_num; m++){
-                luat_ble_gatt_chara_t *gatt_chara = &gatt_service->characteristics[m];
-                lua_newtable(L);
-                lua_pushlstring(L, (const char *)gatt_chara->uuid, gatt_chara->uuid_type);
-                lua_seti(L, -2, 1);
-                // Properties
-                lua_pushnumber(L, gatt_chara->perm);
-                lua_seti(L, -2, 2);
-
-                lua_seti(L, -2, m + 2);
-            }
-            lua_rawseti(L, -2, i + 1);
+            lua_pushlstring(L, (const char *)gatt_chara->uuid, gatt_chara->uuid_type);
+            lua_seti(L, -2, 1);
+            // Properties
+            lua_pushnumber(L, gatt_chara->perm);
+            lua_seti(L, -2, 2);
+
+            lua_seti(L, -2, m + 2);
         }
         lua_call(L, 3, 0);
         break;
+    }case LUAT_BLE_EVENT_GATT_DONE:{
+        uint8_t gatt_service_num = param->gatt_done_ind.gatt_service_num;
+        lua_newtable(L);
+        lua_pushinteger(L, gatt_service_num);
+        lua_setfield(L, -2, "service_num");
+        lua_call(L, 3, 0);
+        break;
     }case LUAT_BLE_EVENT_CONN:{
         luat_ble_conn_ind_t *conn = &(param->conn_ind);
         lua_newtable(L);
@@ -1165,6 +1166,8 @@ static const rotable_Reg_t reg_ble[] = {
     {"EVENT_READ", ROREG_INT(LUAT_BLE_EVENT_READ)},
     {"EVENT_READ_VALUE", ROREG_INT(LUAT_BLE_EVENT_READ_VALUE)},
     {"EVENT_GATT_DONE", ROREG_INT(LUAT_BLE_EVENT_GATT_DONE)},
+    {"EVENT_GATT_ITEM", ROREG_INT(LUAT_BLE_EVENT_GATT_ITEM)},
+    
 
     // ADV_ADDR_MODE
     //@const PUBLIC 控制器的公共地址

+ 3 - 4
luat/demo/airlink/air8000_ble/master/main.lua

@@ -46,11 +46,10 @@ local function ble_callback(ble_device, ble_event, ble_param)
             ble_device:scan_stop()
             ble_device:connect(ble_param.adv_addr,ble_param.addr_type)
         end
-    elseif ble_event == ble.EVENT_GATT_DONE then
+    elseif ble_event == ble.EVENT_GATT_ITEM then
         -- 读取GATT完成, 打印出来
-        for k, v in pairs(ble_param) do
-            log.info("ble", "gatt", k, v[1]:toHex())
-        end
+        log.info("ble", "gatt item", ble_param)
+    elseif ble_event == ble.EVENT_GATT_DONE then
         local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA02")}
         ble_device:write_value(wt,string.fromHex("1234"))
 

+ 13 - 3
luat/demo/airlink/air8000_ble/scan/main.lua

@@ -35,6 +35,9 @@ local function ble_callback(ble_device, ble_event, ble_param)
         --         log.info("ble", "adv data", v.len, v.tp, v.data:toHex())
         --     end
         -- end
+        -- if ble_param.data:byte(1) == 0x1A then
+        --     log.info("ble", "ibeacon数据", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
+        -- end
     elseif ble_event == ble.EVENT_SCAN_STOP then
         log.info("ble", "scan stop")
     end
@@ -62,12 +65,19 @@ sys.taskInit(function()
     log.info("开始扫描")
     ble_device:scan_start()
 
-    sys.wait(15000)
-    log.info("停止扫描")
-    ble_device:scan_stop()
+    -- sys.wait(15000)
+    -- log.info("停止扫描")
+    -- ble_device:scan_stop()
 
 end)
 
+-- sys.timerLoopStart(function()
+--     print("hi, LuatOS")
+--     print("mem.lua", rtos.meminfo())
+--     print("mem.sys", rtos.meminfo("sys"))
+--     print("mem.psram", rtos.meminfo("psram"))
+-- end, 3000)
+
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句