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

fix: Air8000/Air8101 ble central代码定时器bug

wangshihao 6 месяцев назад
Родитель
Сommit
4d069bd49d

+ 2 - 0
module/Air8000/demo/ble/central/ble_client_sender.lua

@@ -104,6 +104,7 @@ local function ble_client_sender_task_func()
         -- BLE连接成功
         -- msg[3]表示ble_device对象
         if msg[2] == "CONNECT_OK" then
+            sys.publish("BLE_CONNECT_STATUS", true)
             ble_device = msg[3]
             -- 发送send_queue中的数据
             send_item = send_item_func(ble_device)
@@ -125,6 +126,7 @@ local function ble_client_sender_task_func()
 
         -- BLE断开连接
         elseif msg[2] == "DISCONNECTED" then
+            sys.publish("BLE_CONNECT_STATUS", false)
             -- 清空ble_device对象
             ble_device = nil
             -- 如果存在正在等待发送结果的发送项,执行回调函数通知发送方失败

+ 21 - 6
module/Air8000/demo/ble/central/ble_timer_app.lua

@@ -58,10 +58,25 @@ local function read_data_req_timer_cbfunc()
     sys.sendMsg(BLE_TASK_NAME,"BLE_EVENT","READ_REQ",server_uuid,read_char_uuid)
 end
 
--- 启动5秒的循环定时器用于发送数据
-sys.timerLoopStart(send_data_req_timer_cbfunc, 5000)
-log.info("TIMER_APP", "已启动发送数据循环定时器,间隔: 5000ms")
+local function ble_connect_status_handler(status)
+    if status then
+        -- 蓝牙连接成功,启动定时器
+        -- 启动5秒的循环定时器用于发送数据
+        sys.timerLoopStart(send_data_req_timer_cbfunc, 5000)
+        log.info("TIMER_APP", "已启动发送数据循环定时器,间隔: 5000ms")
 
--- 启动5秒的循环定时器用于读取数据
-sys.timerLoopStart(read_data_req_timer_cbfunc, 5000)
-log.info("TIMER_APP", "已启动读取数据循环定时器,间隔: 5000ms")
+        -- 启动5秒的循环定时器用于读取数据
+        sys.timerLoopStart(read_data_req_timer_cbfunc, 5000)
+        log.info("TIMER_APP", "已启动读取数据循环定时器,间隔: 5000ms")
+    else
+        -- 蓝牙断开连接,停止定时器
+        sys.timerStop(send_data_req_timer_cbfunc)
+        log.info("TIMER_APP", "已停止发送数据循环定时器")
+
+        sys.timerStop(read_data_req_timer_cbfunc)
+        log.info("TIMER_APP", "已停止读取数据循环定时器")
+    end
+end
+
+-- 订阅BLE_CONNECT_STATUS事件
+sys.subscribe("BLE_CONNECT_STATUS", ble_connect_status_handler)

+ 2 - 0
module/Air8101/demo/ble/central/ble_client_sender.lua

@@ -104,6 +104,7 @@ local function ble_client_sender_task_func()
         -- BLE连接成功
         -- msg[3]表示ble_device对象
         if msg[2] == "CONNECT_OK" then
+            sys.publish("BLE_CONNECT_STATUS", true)
             ble_device = msg[3]
             -- 发送send_queue中的数据
             send_item = send_item_func(ble_device)
@@ -125,6 +126,7 @@ local function ble_client_sender_task_func()
 
         -- BLE断开连接
         elseif msg[2] == "DISCONNECTED" then
+            sys.publish("BLE_CONNECT_STATUS", false)
             -- 清空ble_device对象
             ble_device = nil
             -- 如果存在正在等待发送结果的发送项,执行回调函数通知发送方失败

+ 21 - 6
module/Air8101/demo/ble/central/ble_timer_app.lua

@@ -58,10 +58,25 @@ local function read_data_req_timer_cbfunc()
     sys.sendMsg(BLE_TASK_NAME,"BLE_EVENT","READ_REQ",server_uuid,read_char_uuid)
 end
 
--- 启动5秒的循环定时器用于发送数据
-sys.timerLoopStart(send_data_req_timer_cbfunc, 5000)
-log.info("TIMER_APP", "已启动发送数据循环定时器,间隔: 5000ms")
+local function ble_connect_status_handler(status)
+    if status then
+        -- 蓝牙连接成功,启动定时器
+        -- 启动5秒的循环定时器用于发送数据
+        sys.timerLoopStart(send_data_req_timer_cbfunc, 5000)
+        log.info("TIMER_APP", "已启动发送数据循环定时器,间隔: 5000ms")
 
--- 启动5秒的循环定时器用于读取数据
-sys.timerLoopStart(read_data_req_timer_cbfunc, 5000)
-log.info("TIMER_APP", "已启动读取数据循环定时器,间隔: 5000ms")
+        -- 启动5秒的循环定时器用于读取数据
+        sys.timerLoopStart(read_data_req_timer_cbfunc, 5000)
+        log.info("TIMER_APP", "已启动读取数据循环定时器,间隔: 5000ms")
+    else
+        -- 蓝牙断开连接,停止定时器
+        sys.timerStop(send_data_req_timer_cbfunc)
+        log.info("TIMER_APP", "已停止发送数据循环定时器")
+
+        sys.timerStop(read_data_req_timer_cbfunc)
+        log.info("TIMER_APP", "已停止读取数据循环定时器")
+    end
+end
+
+-- 订阅BLE_CONNECT_STATUS事件
+sys.subscribe("BLE_CONNECT_STATUS", ble_connect_status_handler)